Отрицательные экспоненты, бросающие NaN в Фортран - PullRequest
3 голосов
/ 29 ноября 2011

Очень простой вопрос на Фортране. Следующая функция возвращает NaN, и я не могу понять, почему:

F_diameter = 1. - (2.71828**(-1.0*((-1. / 30.)**1.4)))

Я скормил 2,71 ... вместо того, чтобы использовать exp(), но оба они терпят неудачу одинаково Я заметил, что я получаю NaN только тогда, когда дробная часть (-1 / 30) отрицательна. Позитивы оценивают ок.

Большое спасибо

Ответы [ 2 ]

10 голосов
/ 29 ноября 2011

Проблема в том, что вы берете корень из отрицательного числа, что даст вам сложный ответ. Это более очевидно, если представить, например,

(-1) ** (3/2)

, что эквивалентно

(1/sqrt(-1))**3

Другими словами, ваш дробный показатель не может тривиально работать с отрицательным числом.

0 голосов
/ 20 марта 2017

Есть еще один интересный момент, о котором я узнал сегодня и хочу добавить к ответу ire_and_curses: Компилятор fortran, похоже, вычисляет степени с целыми числами с последовательными умножениями.Например,

      PROGRAM Test
      PRINT *, (-23) ** 6
      END PROGRAM

работает нормально и выдает 148035889 в качестве ответа.

Но для показателей REAL компилятор использует логарифмы: y**x = 10**(x * log(y)) (возможно, компиляторы сегодня делают иначе,но моя книга так говорит)Теперь, когда отрицательные логарифмы дают сложный результат, это не работает:

      PROGRAM Test
      PRINT *, (-23) ** 6.1
      END PROGRAM

и даже дает ошибку компилятора:

Error: Raising a negative REAL at (1) to a REAL power is prohibited

С математической точки зрения эта проблема кажется такжебыть довольно интересным: https://math.stackexchange.com/questions/1211/non-integer-powers-of-negative-numbers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...