Мне нужно преобразовать код Fortran в C ++, и у меня есть следующая проблема:
Я пытаюсь вычислить двойное значение с именем R12
с языками Fortran 77 и C ++, но я получил два значения, очень близких друг к другу, но с двумя разными значениями точности. вот мой код на Фортране:
R12 = sqrt(95699.68D0+1123.6D0*flx) - 408.99D0
с double flx = 192.9D0
, Значение, которое я получаю R12 = 149.97522253177789
Я делаю то же самое с C ++:
R12 = sqrt(95699.68+1123.6*flx) - 408.99 ;
Значение, которое я получаю здесь R12 = 149.97522253177794
,
Не могли бы вы, ребята, помочь мне выяснить, откуда эта разница, потому что для моей работы очень важно иметь точную точность
С двойной точностью у вас есть 52 бита (примерно 15 десятичных знаков) значения и точности. В вашем случае это:
Fortran:
0.14997522253177789e3
^
C ++
0.14997522253177794e3
^
Вы можете видеть, что оба результата идентичны до 15-й цифры. Я предполагаю, что C ++ и Fortran применяют различное преобразование (округление) к десятичной системе.
В Fortran 2003+ вы можете дать ROUND
спецификатор для write
:
program test
write(*,*) 'Default ', sqrt(95699.68D0+1123.6D0*192.9D0) - 408.99D0
write(*,*,round='UP') 'UP ', sqrt(95699.68D0+1123.6D0*192.9D0) - 408.99D0
write(*,*,round='DOWN') 'DOWN ', sqrt(95699.68D0+1123.6D0*192.9D0) - 408.99D0
write(*,*,round='ZERO') 'ZERO ', sqrt(95699.68D0+1123.6D0*192.9D0) - 408.99D0
write(*,*,round='NEAREST') 'NEAREST ', sqrt(95699.68D0+1123.6D0*192.9D0) - 408.99D0
end program
результаты в
Default 149.97522253177794
UP 149.97522253177795
DOWN 149.97522253177794
ZERO 149.97522253177794
NEAREST 149.97522253177794