2012-08-23 14 views
5

W przerwie obiadowej zaczęliśmy debatować nad precyzją typu wartości double.Precyzja podwójnego po przecinku

Mój kolega myśli, że zawsze ma 15 miejsc po przecinku.

Moim zdaniem nie można powiedzieć, bo IEEE 754 nie czyni założeń o tym i to zależy od tego, gdzie pierwsze 1 jest w binarnym reprezentacji. (tzn. rozmiar liczby przed przecinkiem również się liczy)

Jak można uzyskać bardziej kwalifikowane oświadczenie?

+0

Czy rozumujesz w kategoriach bezwzględnych lub zgodnie z notacją naukową?Jak oceniasz liczbę taką jak 0.001e5? –

+0

Rozmawialiśmy właśnie o tym. Mój kolega nalega na 15 miejsc po przecinku. Moja opinia jest taka, że ​​masz 53-bitową mantysę dla wszystkich miejsc. Ale wydaje się, że trudno to wytłumaczyć w odpowiedni sposób. –

+0

Po prostu, aby było bardziej jasne: Jest to szczególnie problem z C#. Jeśli wewnętrzna reprezentacja C# nie jest IEEE 754, ale 15 miejsc po przecinku, jest to wyjątkowo interesujące. –

Odpowiedz

3

Jak podaje C# reference, dokładność wynosi od 15 do 16 cyfr (w zależności od reprezentowanych wartości dziesiętnych) przed przecinkiem dziesiętnym lub po nim.

Krótko mówiąc, masz rację, zależy to od wartości przed i po przecinku.

Na przykład:

  • 12345678.1234567D // Następna cyfra Zeby dostać zaokrąglana
  • 1234567.12345678D // Następna cyfra po prawej stronie będą się zaokrąglana

Pełna próbki pod adresem: http://ideone.com/eXvz3

Również próba myślenia o wartości double jako ustalonej wartości dziesiętnej nie jest dobrym pomysłem.

+2

Wystarczy wskazać, oznacza to 15 cyfr w _total_, a nie tylko _ po kropce dziesiętnej. –

-1

C# podwójna przedstawiono w standardzie IEEE 754 z 53 bitów mantysy p (lub mantysy) i 11 bitów wykładnika e, który ma zakres od -1022 i 1023. Ich wartość zatem

p * 2^e 

Znaczenie ma zawsze jedną cyfrę przed kropką dziesiętną, więc precyzja jego części ułamkowej jest stała. Z drugiej strony liczba cyfr po kropce dziesiętnej w podwójnym zależy również od jego wykładnika; liczby, których wykładnik przekracza liczbę cyfr w części ułamkowej znacznika i nie mają części ułamkowej.

What Every Computer Scientist Should Know About Floating-Point Arithmetic to prawdopodobnie najbardziej znana publikacja na ten temat.

4

Obaj jesteście w błędzie. Normalny double ma 53 bitów precyzji. Jest to w przybliżeniu odpowiednik 16 cyfr dziesiętnych, ale myślenie o wartościach liczb dziesiętnych prowadzi do końca nieporozumień i najlepiej go unikać.

Powiedziawszy, jesteś o wiele bliższy poprawności niż twój kolega - precyzja jest względna do reprezentowanej wartości; wystarczająco duże double s mają ułamkowe cyfry precyzji.

Na przykład następne podwójne większe niż 4503599627370496.0 to 4503599627370497.0.