2014-09-11 10 views
5

Napotkałem pewne dziwne zachowanie, przynajmniej w moim własnym umyśle, podczas debugowania kodu zaangażowanego w ustalenie, czy operacja dodawania zmniejszyłaby liczbę podwójną. Oto przykładowy program demonstrujący to, co znalazłem.Czy występuje błąd numeric_limits, czy jestem po prostu zdezorientowany?

#include <iostream> 
#include <limits> 

using std::cout; 
using std::endl; 
using std::numeric_limits; 

int main() 
{ 
    double lowest = numeric_limits<double>::lowest(); 
    bool truth = (lowest + 10000) == lowest; 
    cout << truth << endl; 
} 

Po uruchomieniu tego kodu uzyskujemy wynik. Czy to jest błąd, czy po prostu jestem pozbawiony snu?

Odpowiedz

15

Najmniejszy jest podwójna:

-1.7976931348623157e+308 

Dodawanie 10000, lub 1E4, to musiałby tylko zauważalny efekt jeśli podwaja miał ponad 300 cyfr precyzji, które z całą pewnością nie. Podwójki mogą zawierać tylko 15-17 znaczących cyfr.

Różnica w wielkości między tymi dwoma liczbami jest tak duża, że ​​dodanie 10 000 nie powoduje wygenerowania nowego numeru. W rzeczywistości minimalna liczba podwójna to taka ogromna liczba (że tak powiem), że można dodać do niej googol - to 1, po którym następuje sto zer - i to się nie zmieni.

+0

OP (np. Matthew) powinien bezwzględnie przeczytać http://floating-point-gui.de/ –

+1

@MatthewPapageorge również: [Format podwójnej precyzji zmiennoprzecinkowej] (http://en.wikipedia.org/ wiki/Double-precision_floating-point_format) – Rimas

+0

Dzięki za szybką i jasną odpowiedź, John. Bardzo to doceniam. Dziękuję Basile i Rimasowi za lekturę. –

Powiązane problemy