2009-10-17 10 views
7

Wiadomo, że w .NET rozmiar długi i podwójny jest 8 bajtów. Jednak podwójne może przechowywać znacznie większą liczbę niż długo. Jak to możliwe, biorąc pod uwagę, że podwójne musi również przechowywać dane na cyfrach po przecinku?Maksymalna wartość vs rozmiar długich i podwójnych w .NET

Krótsza wersja pytanie:

Math.pow (2, 64) == long.MaxValue Math.pow (2, 64) < double.MaxValue

+0

Podwójny ma mniejszą dokładność niż dziesiętną. –

+0

http://pl.wikipedia.org/wiki/Double_precision –

+0

http://pl.wikipedia.org/wiki/Powtarzanie_punkt_z_zachro%C5%B3%C5%BCy_numeru liczbowego –

Odpowiedz

17

Krótka odpowiedź podwójna tylko przechowuje najbardziej znacząca cyfra, a nie wszystkie cyfry, które mogłyby znajdować się w liczbie. na przykład jeśli masz podwójną> maksymalną wartość długości, nie będzie przechowywana żadna informacja dla cyfr po przecinku dziesiętnym ani żadna z figur po lewej stronie punktu decyaml.

Dla wszystkich szczegółów patrz What every computer scientist should know about Floating-Point Arithmetic

+1

Wyjaśnione w prostych terminach do zrozumienia dla każdego :) – Konstantin

+0

Początkowo użyłem tego tekstu około roku temu i okazało się to bardzo pomocne. – LJM

0

jest dwukrotnie liczbę zmiennoprzecinkową. Whitch bassicaly mówi, że gdy liczba przechowywana w podwójnej jest większa, to jest rzucana, a najmniej znacząca część jest odrzucana.

Na przykład podwójnie, gdy masz liczbę 100 miliardów. Może to być dokładnie 100 000 000 000 lub może być 100 000 000 000 000 000 000 000 000 001

+0

Chociaż nie jest to błędem, nie ma głównego powodu, dla którego double ma większy zasięg niż int lub long, a mianowicie jest to liczba zmiennoprzecinkowa reprezentowana przez significand i wykładnik. –

1

Typy oparte na liczbie całkowitej mają zakresy od -2^(n-1) 2 ... 2^(n -1) -1 (podpis), lub 0 ... 2^n-1 (bez znaku).

Stałe zmienne punktowe są takie same jak typy oparte na liczbach całkowitych, tylko ze stałym współczynnikiem (np. Dla 0,01: 0,01 * (0 ... 2^n-1)).

Zmienne zmiennoprzecinkowe (zmiennoprzecinkowe i podwójne) w dowolnym języku używają kilku bitów dla wykładnika i reszty dla liczby przed wykładnikiem. Są mniej dokładne (x + 1 może równać się x, jest x to bardzo duża liczba), ale mają znacznie większy zasięg.

+1

Btw, "liczba przed wykładnikiem" nazywa się mantysa lub (lepiej) significand, patrz http://pl.wikipedia.org/wiki/Significand. –

Powiązane problemy