2011-06-06 17 views
8

numeric_limits::espilon zwraca różnicę między 1 a następnym podwójnym. Czy powinienem zrozumieć, że odległość między dwoma sąsiadującymi sobowtórami nie zawsze jest taka sama, na przykład między 2 a następnym podwójnym?std: numeric_limits <double> :: definicja epsilon

A jeśli tak, czy mogę podać wyjaśnienie?

Odpowiedz

16

„Gęstość” liczb zmiennoprzecinkowych zmniejsza dużo jak masz dalej od zera.

Dzieje się tak dlatego, że zmiennoprzecinkowe IEEE są zapisywane zasadniczo jako notacja naukowa, więc zakres jest preferowany w stosunku do jednolitej precyzji. (Jeśli to była jednolita precyzja, byłoby stałym punktem, nie zmiennoprzecinkową.)

Innymi słowy, numery są przechowywane w postaci mantysy * 2 wykładnik, więc jeśli wykładnik dostaje duży, mała zmiana w znaczeniu i powoduje dużą zmianę liczby (i na odwrót).

Więc nie, nie można zakładać, że różnica między 2 a następnym podwójnym jest taka sama jak epsilon; nie jest.

+2

Warto zwrócić uwagę, że jest to świadomy wybór projektu: często przydaje się wysoka precyzja w pobliżu zera, podczas gdy jesteśmy bardziej wyrozumiali przy większych liczbach. Tak więc float/double jest miłym, wszechstronnym typem danych, który jest * często * wystarczająco dobry w dokładnych, małych liczbach i na dużych, ale mniej precyzyjnych. Jest to próba uczynienia prostego 32- lub 64-bitowego typu danych możliwie jak najbardziej użyteczną. W każdym razie +1 ode mnie – jalf

2

Podwaja są liczbami zmiennoprzecinkowymi. Składają się z signum, significand i exponent.

Im wyższy wykładnik, tym większa różnica między podwójnym a jego następcą.

Im niższy wykładnik, tym mniejsza różnica między podwójnym i jego następcą.

Powiązane problemy