Czytałem o różnicy między podwójną precyzją a pojedynczą precyzją. Jednak w większości przypadków, float
i double
wydają się być wymienne, tj. użycie jednego lub drugiego nie wpływa na wyniki. Czy tak jest w rzeczywistości? Kiedy float i double są wymienne? Jakie są między nimi różnice?
Oto co mówią standardy C99 (ISO-IEC 9899 6.2.5 §10) lub C++2003 (ISO-IEC 14882-2003 3.1.9 §8):
Istnieją trzy typy zmiennoprzecinkowe:
float
,double
ilong double
. Typdouble
zapewnia co najmniej taką samą precyzję jakfloat
, a typlong double
zapewnia co najmniej taką samą precyzję jakdouble
. Zbiór wartości typufloat
jest podzbiorem zbioru wartości typudouble
; zbiór wartości typudouble
jest podzbiorem zbioru wartości typulong double
.
Standard C++ dodaje:
Reprezentacja wartości typów zmiennoprzecinkowych jest definiowana przez implementację.
Sugerowałbym zajrzenie do doskonałej książki What Every Computer Scientist Should Know About Floating-Point Arithmetic, która dogłębnie omawia standard zmiennoprzecinkowy IEEE. Dowiesz się o szczegółach reprezentacji i zdasz sobie sprawę, że istnieje kompromis między wielkością a precyzją. Precyzja reprezentacji zmiennoprzecinkowej rośnie wraz ze spadkiem wielkości, stąd liczby zmiennoprzecinkowe pomiędzy -1 a 1 są tymi o największej precyzji.
Pływaki mają mniejszą precyzję niż podwójne. Chociaż już wiesz, przeczytaj What WE Should Know About Floating-Point Arithmetic dla lepszego zrozumienia.