Несоответствие между значениями, вычисленными Фортраном и C++

Я смел бы говорить, что числовые значения, вычисленные Фортраном и C++, были бы более подобным путем. Однако от того, что я испытываю, оказывается, что расчетные числа начинают отличаться после очень небольшого числа десятичных цифр. Я столкнулся с этой проблемой во время процесса портирования некоторого унаследованного кода от бывшего языка до последнего. Исходный Фортран 77 кодов...

  INTEGER M, ROUND
  DOUBLE PRECISION NUMERATOR, DENOMINATOR

  M = 2
  ROUND = 1
  NUMERATOR=5./((M-1+(1.3**M))**1.8)
  DENOMINATOR = 0.7714+0.2286*(ROUND**3.82)
  WRITE (*, '(F20.15)') NUMERATOR/DENOMINATOR
  STOP

... выводы 0.842201471328735, в то время как его эквивалентный C++...

int m = 2;
int round = 1;
long double numerator = 5.0 / pow((m-1)+pow(1.3, m), 1.8);
long double denominator = 0.7714 + 0.2286 * pow(round, 3.82);
std::cout << std::setiosflags(std::ios::fixed) << std::setprecision(15)
          << numerator/denominator << std::endl;
exit(1);

... возвраты 0.842201286195064. Таким образом, вычисленные значения равны только до шестого десятичного числа. Хотя не особенно Фортран advocator, я чувствую себя склонным рассмотреть его результаты как 'корректные', учитывая его законную репутацию цифродробилки. Однако я заинтригован о причине этого различия между вычисленными значениями. Кто-либо знает, какова причина этого несоответствия могла быть?

6
задан plok 3 May 2010 в 10:36
поделиться

1 ответ

В Фортране по умолчанию литералы с плавающей запятой имеют одинарную точность, тогда как в C / C ++ они имеют двойную точность.

Таким образом, в вашем коде Fortran выражение для вычисления NUMERATOR выполняется с одинарной точностью; он преобразуется в двойную точность только при присвоении окончательного результата переменной NUMERATOR.

То же самое и с выражением, вычисляющим значение, присвоенное переменной DENOMINATOR.

11
ответ дан 9 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: