Oto klucz do twojego rozterki: 10
jest produktem 2
i 5
. Można reprezentować dowolną liczbę dokładnie w bazie 10 dziesiętne to k * 1/2 n * 1/5 m , gdzie k
, n
i m
są liczbami całkowitymi.
Alternatywnie - jeśli liczba n
w 1 / n zawiera czynnik, który nie jest częścią czynników podstawy, liczby nie będzie można przedstawić dokładnie w stałej liczbie cyfr w systemie binarnym / dziesiętnym / jakimkolwiek rozszerzeniu tego liczba - będzie miała część powtarzalną. Na przykład 1/15 = 0,0666666666 .... ponieważ 3 (15 = 3 * 5) nie jest współczynnikiem 10.
Zatem wszystko, co można dokładnie przedstawić w podstawie 2 (k * 1/2 n ), może być dokładnie przedstawione w podstawie 10.
Poza tym istnieje kwestia liczby cyfr / bitów używanych do przedstawienia liczby. Istnieje kilka liczb, które można dokładnie przedstawić w jakiejś bazie, ale zajmuje to więcej niż pewną liczbę cyfr / bitów.
W systemie dwójkowym liczba 1/10, która dogodnie wynosi 0,1 w systemie dziesiętnym, nie może być reprezentowana jako liczba, która może być reprezentowana przez stałą liczbę bitów w systemie dwójkowym. Zamiast tego jest to 0,00011001100110011 ... 2 (z częścią 0011 powtarzającą się na zawsze).
Spójrzmy na numer 1 2 /1010 2 nieco bliżej.
____
0,00011
+ ---------
1010 | 1,00000
0
-
1 0
0
----
1 00 --------- +
0 |
----- |
1 000 |
0 |
------ | powtórzenie
1 0000 | blok
1010 |
------ |
1100 |
1010 |
---- |
100 ---- +
Jest to dokładnie ten sam rodzaj rzeczy, który dostajesz, gdy próbujesz wykonać długi podział na 1/3.
1/10, gdy uwzględniono 1 / (2 1 * 5 1 ). W przypadku podstawy 10 (lub dowolnej wielokrotności 10) liczba ta kończy się i jest znana jako liczba zwykła . Rozwinięcie dziesiętne, które się powtarza, znane jest jako powtarzanie dziesiętne , a liczby, które trwają wiecznie bez powtarzania, są liczbami niewymiernymi.
Matematyki za tego zagłębia się małe twierdzenie Fermata ... i po uruchomieniu mówiąc Fermat lub twierdzenie, staje się pytanie Math.SE .
Czy istnieją liczby, które nie są reprezentowalne w bazie 10, ale mogą być reprezentowane w bazie 2?
Odpowiedź brzmi nie'.
Zatem w tym miejscu wszyscy powinniśmy wyjaśnić, że każde rozwinięcie binarne o stałej długości liczby wymiernej może być reprezentowane jako rozwinięcie dziesiętne o stałej długości.
Pozwala zapoznać się bliżej po przecinku w C # , który prowadzi nas do dziesiętny zmiennoprzecinkowych w .NET i danego autora, to zgadzam się, że to jak to działa.
Typ dziesiętny ma takie same składniki, jak każda inna liczba zmiennoprzecinkowa: mantysa, wykładnik potęgowy i znak. Jak zwykle znak jest tylko jednym bitem, ale jest 96 bitów mantysy i 5 bitów wykładnika potęgi. Jednak nie wszystkie kombinacje wykładników są prawidłowe. Działają tylko wartości 0–28 i wszystkie są faktycznie ujemne: wartością liczbową jest . Oznacza to, że maksymalne i minimalne wartości tego typu wynoszą +/- (2 96 -1), a najmniejsza liczba niezerowa pod względem wielkości bezwzględnej wynosi 10-28 .sign * mantissa / 10exponent
Od razu zaznaczę, że z powodu tej implementacji istnieją liczby w double
typie, w których nie można reprezentować decimal
- te, które są poza zakresem. Double.Epsilon
jest to, 4.94065645841247e-324
co nie może być reprezentowane w decimal
, ale może w double
.
Jednak w zakresie, który może reprezentować dziesiętny, ma więcej bitów dokładności niż w przypadku innych rodzimych typów i może reprezentować je bez błędów.
Istnieje kilka innych typów. W języku C # istnieje BigInteger, która może reprezentować dowolnie dużą liczbę całkowitą. Nie ma odpowiednik Java BigDecimal (który może reprezentować liczby z cyfr dziesiętnych do wysokości 2 32 cyfr - co jest sporym zasięgu) dokładnie . Jeśli jednak trochę się przekręcisz, możesz znaleźć ręcznie wdrażane implementacje.
Istnieje kilka języków, które mają również racjonalny typ danych, który pozwala dokładnie reprezentować racjonalne (tak, że 1/3 to w rzeczywistości 1/3).
Specjalnie dla C # i wyboru liczby zmiennoprzecinkowej lub wymiernej, odłożę się do Jona Skeeta z pływającego kufla dziesiętnego w .NET :
Większość aplikacji biznesowych prawdopodobnie powinna używać liczb dziesiętnych zamiast liczb zmiennoprzecinkowych lub podwójnych. Moja ogólna zasada jest taka, że wartości stworzone przez człowieka, takie jak waluta, są zwykle lepiej reprezentowane przez zmiennoprzecinkowe dziesiętne: na przykład koncepcja dokładnie 1,25 dolara jest całkowicie rozsądna. W przypadku wartości ze świata przyrody, takich jak długości i masy, binarne typy zmiennoprzecinkowe mają większy sens. Chociaż istnieje teoretyczna „dokładnie 1,25 metra”, tak naprawdę nigdy się nie wydarzy: z pewnością nigdy nie będziesz w stanie zmierzyć dokładnych długości i prawdopodobnie nie będą istnieć nawet na poziomie atomowym. Jesteśmy przyzwyczajeni do pewnej tolerancji.