У нас были какие-то странные сбои в некотором коде Intel FORTRAN, и я в конце концов отследил строку до:
L_F = EXP(-L_B2*L_BETASQ*L_DS)
Где значение -L_B2*L_BETASQ*L_DS равно примерно -230. Как это бывает, EXP(-230) оценивается примерно в 1e-100. Во всех других известных случаях L_DS намного меньше, в результате чего наименьший (известный) возврат от EXP составляет около 1e-50, что не вызывает ошибки.
Как только FORTRAN оценит предложение EXP(-230), вы получите:
forrtl: severe (157): Program Exception - access violation
Image PC Routine Line Source
Но никакой другой информации.
Исключение 157 обычно связано с функциональной совместимостью, и вы не можете выполнить отладку в EXP на FORTRAN, поскольку он не может найти конкретный файл .c, что предположительно означает, что EXP реализован в C (что я нахожу удивительным).
Моя гипотеза состоит в том, что FORTRAN реализовал EXP в C, но интерфейс не может преобразовать числа с плавающей запятой, которые меньше 1e-100, в REAL(4). Поскольку я ранее считал, что числа с плавающей запятой и REAL(4) идентичны по байтам, я не могу подтвердить эту гипотезу — и нигде не могу найти ничего об этом.
Прежде чем я закрою эту ошибку, может ли кто-нибудь подтвердить или опровергнуть мою гипотезу или предоставить мне другую?
С наилучшими пожеланиями,
Майк
РЕДАКТИРОВАТЬ: я собираюсь отметить этот вопрос как ответ, так как High Performance Mark ответил на непосредственный вопрос.
Моя гипотеза, к сожалению, неверна - я пытался поймать проблему, сделав это:
L_ARG = L_B2*L_BETASQ*L_DS
IF (L_ARG .GT. 230.0) THEN
L_F = 0.0
ELSE
L_F = EXP(-L_ARG)
ENDIF
К сожалению, теперь исключение (очевидно) происходит в L_ARG .GT. пункт 230.0. Это либо означает, что отладка в режиме Release хуже, чем я думал, либо это какая-то «сохраненная» ошибка с плавающей запятой (см. invalid-operation-when-inputting-float-to-a-stringstream">Недопустимая операция с плавающей запятой при вводе float в строковый поток).
/Qftz
наifort
. - person Hristo Iliev   schedule 16.01.2013