Dlaczego liczby dziesiętne nie mogą być reprezentowane dokładnie w postaci binarnej?

Pojawiło się kilka pytań dotyczących SO o reprezentacji zmiennoprzecinkowej. Na przykład liczba dziesiętna 0.1 nie ma dokładnej reprezentacji binarnej, więc niebezpieczne jest użycie operatora == do porównania go z inną liczbą zmiennoprzecinkową. Rozumiem zasady reprezentacji zmiennoprzecinkowej.

Nie rozumiem, dlaczego z matematycznego punktu widzenia liczby po prawej stronie kropki dziesiętnej są bardziej „specjalne” niż te po lewej?

Na przykład liczba 61.0 ma dokładną reprezentację binarną, ponieważ integralna część dowolnej liczby jest zawsze dokładna. Ale liczba 6.10 nie jest dokładna. Wszystko, co zrobiłem, to przesunięcie jednego miejsca dziesiętnego i nagle przeszedłem z Exactopii do Inexactville. Matematycznie nie powinno być żadnej wewnętrznej różnicy między tymi dwoma liczbami - są to tylko liczby.

Dla kontrastu, jeśli przesunę dziesiętne o jedno miejsce w drugim kierunku, aby uzyskać liczbę 610, nadal jestem w Exactopii. Mogę iść dalej w tym kierunku (6100, 610000000, 610000000000000) i nadal są dokładne, dokładne, dokładne. Ale gdy tylko dziesiętny przekroczy pewien próg, liczby nie są już dokładne.

Co się dzieje?

Edytuj: aby wyjaśnić, chcę trzymać się z dala od dyskusji na temat reprezentacji branżowych, takich jak IEEE, i trzymać się tego, co uważam za matematycznie „czysty”. W bazie 10 wartości pozycyjne to:

... 1000  100   10    1   1/10  1/100 ...

W wersji binarnej byłyby to:

... 8    4    2    1    1/2  1/4  1/8 ...

Nie ma również żadnych arbitralnych ograniczeń dla tych numerów. Pozycje zwiększają się w nieskończoność w lewo i w prawo.

questionAnswers(20)

yourAnswerToTheQuestion