неправильная точность для двойных значений

Мне нужно преобразовать код 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,

Не могли бы вы, ребята, помочь мне выяснить, откуда эта разница, потому что для моей работы очень важно иметь точную точность

0

Решение

С двойной точностью у вас есть 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
5

Другие решения


По вопросам рекламы [email protected]