[C++] wczytywanie danych float nieprecyzyjne?


(Sheaker) #1

Witam serdecznie. Mam wielką nadzieję że jest to jakaś moja nieznajomość podstaw...


(SystemError) #2

Float to 32 bity ułożonych według specyfikacji IEEE-754 (zobacz na Wikipedii artykuł o tym IEEE-754). Stąd wynika, że części liczb dziesiętnych nie da się przedstawić dokładnie mając 32 bity. Stąd zaokrąglenie do 711.965027 (bo ta wartość jest już możliwa do przedstawienia w float 32 IEEE-754.

 


(enedil) #3

Za pomocą liczby zmiennoprzecinkowej możesz tylko przedstawić skończoną liczbę liczb. A liczb wymiernych jest nieskończenie wiele - co znaczy, że nie da się każdej liczby zapisać w komputerze dokładnie.

 

Co więcej, zauważ, że

711.965000

w systemie dwójkowym nie ma skończonej reprezentacji, wobec czego jest to z pewnością jedna z liczb, ktorej dokładnie nie zapiszesz.


(Sheaker) #4

Dobrze, dziękuję.


(SystemError) #5

Jeśli możesz zagwarantować, że dane wejściowe składają się z liczb o pewnej maksymalnej dokładności i że te 195000 linijek zsumuje się bez przepełnienia do np.ULONG_MAX/1000, to możesz się tak bawić z mnożeniem i dzieleniem. Szczególnie, że możesz też użyć “unsigned long long”. Tylko wtedy możesz zapanować nad błędami wynikającymi z braku binarnej reprezentacji danej liczby w float lub double.

Tak się swoją drogą dość często postępuje w branżach związanych z wszelakim liczeniem pieniędzy.


(Sheaker) #6

Dokładnie jest tak że są to wyniki symulacji numerycznych. Między innymi temperatura w Kelwinach dla której występuje błąd. Obszar obliczeniowy jest podzielony na cztery części i muszę sumować je razem i równolegle. (Są cztery pliki log.)