Я смел бы говорить, что числовые значения, вычисленные Фортраном и 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, я чувствую себя склонным рассмотреть его результаты как 'корректные', учитывая его законную репутацию цифродробилки. Однако я заинтригован о причине этого различия между вычисленными значениями. Кто-либо знает, какова причина этого несоответствия могла быть?
В Фортране по умолчанию литералы с плавающей запятой имеют одинарную точность, тогда как в C / C ++ они имеют двойную точность.
Таким образом, в вашем коде Fortran выражение для вычисления NUMERATOR выполняется с одинарной точностью; он преобразуется в двойную точность только при присвоении окончательного результата переменной NUMERATOR.
То же самое и с выражением, вычисляющим значение, присвоенное переменной DENOMINATOR.