Ошибка из-за ограниченной точности float и double - PullRequest
3 голосов
/ 09 октября 2011

В C ++ я использую следующий код, чтобы определить порядок величины ошибки из-за ограниченной точности float и double:

 float n=1;
 float dec  = 1;

 while(n!=(n-dec)) {
    dec = dec/10;
 }
 cout << dec << endl;

(в двойном случае все, что я делаю, это exchangefloat с double в строках 1 и 2)

Теперь, когда я компилирую и запускаю это с помощью g ++ в системе Unix, получаются

Float  10^-8
Double 10^-17

Однако, когда я компилирую и запускаю его сMinGW на Windows 7, результаты

Float  10^-20
Double 10^-20

В чем причина?

Ответы [ 3 ]

2 голосов
/ 09 октября 2011

Полагаю, я сделаю свой комментарий ответом и остановлюсь на нем. Это моя гипотеза, я могу ошибаться.

MinGW в Windows, вероятно, пытается сохранить точность, повышая промежуточные выражения до полной 80-битной точности x86.

Поэтому обе стороны выражения n != (n-dec) оцениваются с точностью до 64 бит (80-битная FP имеет 64-битную мантиссу).

2^-64 ~ 10^-20

Так что числа имеют смысл.1011 *

Visual Studio также (по умолчанию) будет продвигать промежуточные звенья.Но только с двойной точностью.

0 голосов
/ 09 октября 2011

Это просто показывает, что в разных средах для float и double используются разные размеры.

В соответствии со спецификацией C ++, double должно быть не меньше размера float.Если вы хотите узнать, насколько велики типы в вашей системе, используйте sizeof.

То, что ваши тесты показывают, что g ++ использует отдельные размеры для float и double (32 и 64 бита соответственно)в то время как MinGW32 в вашей системе Windows использует одинаковый размер для обоих.Обе версии соответствуют стандарту, и ни на одно поведение нельзя полагаться вообще.

0 голосов
/ 09 октября 2011

Почему бы вам не проверить размер float и double в обеих ОС?

...