Visual Studio 2015 Exp результаты отличаются - PullRequest
2 голосов
/ 28 мая 2019

У меня есть код C ++ в Visual Studio 2015 C ++ 11. Код делает EXP

val = 7.3526137268510955991

double myCalulatedEXP= EXP(val);
//Lets print
std::cout.precision(20);
std::cout<<myCalulatedEXP;

На одной машине я получаю 1560.269320753015 3359, а на другой я получаю 1560.269320753015 1085 Смотри, что последние 4 цифры не совпадают, что доставляет мне неприятности. Хотя разница невелика, она умножается и в дальнейшем увеличивается.

Обе машины имеют одинаковый идентификатор процессора.

PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 63 Stepping 2, GenuineIntel

Обе машины имеют одинаковую ОС через

 `systeminfo | findstr /B /C:"OS Name" /C:"OS Version"`


OS Name:                   Microsoft Windows Server 2012 R2 Standard
OS Version:                6.3.9600 N/A Build 9600

Обе машины Windows Server 2012. Я запустил средство проверки зависимостей, чтобы проверить, связаны ли у них разные версии dll. Оба абсолютно одинаковы.

Пожалуйста, предложите

1) Чем могут быть вызваны такие различия?

2) Как я могу избежать таких различий?

3) Если процессор, ОС, библиотеки DLL одинаковы, можно ли ожидать других результатов?

1 Ответ

0 голосов
/ 28 мая 2019

Если вы посмотрите на двоичный формат IEEE 754 для double, то это: 53 значащих двоичных разряда / 15,95 значащих десятичных разрядов плюс 11 экспонентных битов. (вики: https://en.wikipedia.org/wiki/IEEE_754)

Это означает, что если вы печатаете double в формате, который показывает более 16 значащих цифр, дополнительные цифры могут быть мусором.

Не всегда, например,% .20f может быть совершенно точным, если показатель числа равен -4.

53 бит точности - лучший случай. Цепочка операций с числами разных величин может потерять точность, например (1,23 e + 20) + (0,45 e-30).

std::cout.precision(20);

Поскольку максимальная точность double составляет 16 цифр, это может включать неопределенные цифры.

Лучший ответ на этот вопрос предполагает использование 17 цифр: Как вывести двойное значение с полной точностью, используя cout?

Дополнительные примечания в комментариях указывают на теорему 15 в этом аннотации Что должен знать каждый ученый-компьютерщик об арифметике с плавающей точкой , автор David Goldberg - https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

...