Фортран компилятор 4 против 11 - PullRequest
2 голосов
/ 06 октября 2009

Я портирую приложение с более старой версии (4.0) на новую версию (11.0). При портировании я сталкиваюсь с некоторыми проблемами с реальными * 4 переменными:

real*4 a,b,c

a=0.9876875
b=0.6754345

c=a*b

значение для c в старом компиляторе 0.667118, что является правильным значением. Но с новым компилятором я получаю небольшое изменение от вывода (переменная c), как 0.667120. Хотя это небольшая вариация, я использую эти значения в некоторых других расчетах. Таким образом, общий результат имеет огромную разницу. Как преодолеть эту проблему?

Ответы [ 3 ]

2 голосов
/ 06 октября 2009

Я предполагаю, что вы переходите с Microsoft Fortran Powerstation 4 на Intel Visual Fortran 11.xx?

В любом случае, попробуйте это:

program test32

integer, parameter :: iwp = selected_real_kind(15,300)

real(iwp) :: a,b,c

a=0.9876875
b=0.6754345

c=a*b
write(*,'(3f12.8)')a,b,c

end program test32

, который выдает:

0.98768753  0.67543453  0.66711826

Я не буду объяснять selected_real_kind не потому, что не желаю, а потому, что помощь, вероятно, сделает это намного лучше. Но спросите, если что-то здесь не ясно.

p.s. Представление вещественного * 4 или любого типа вещественного зависит от процессора и от компилятора, и это одна из причин, по которой вы получаете разные результаты.

2 голосов
/ 06 октября 2009

Обсуждение изменений в компиляторе Intel Visual Fortran версии 11 здесь:

http://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/68587/

В результате более старые версии компилятора Fortran неявно повышают значения одинарной точности до двойной точности перед выполнением операции. Поведение по умолчанию в версии 11 заключается в выполнении операции с одинарной точностью. Существуют опции компилятора (/arch:ia32) для включения старого поведения в новом компиляторе.

0 голосов
/ 06 октября 2009

Я предполагаю, что вы используете Intel. Попробуйте скомпилировать без оптимизации ..

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