Gibt es Zahlen, die in der Basis 10 nicht darstellbar sind, aber in der Basis 2 dargestellt werden können?


42

C#hat den decimalTyp, der für Zahlen verwendet wird, die in der Basis 10 genau dargestellt werden müssen. 0.1Kann beispielsweise nicht in der Basis 2 dargestellt werden (z. B. floatund double) und ist immer eine Näherung, wenn sie in Variablen dieser Typen gespeichert werden.

Ich fragte mich, ob die umgekehrte Tatsache auch möglich war. Gibt es Zahlen, die in der Basis 10 nicht darstellbar sind, aber in der Basis 2 dargestellt werden können (in welchem ​​Fall möchte ich ein floatanstelle von einem verwenden decimal, um damit umzugehen)?


14
+1 auf die Frage, aber ist das c # -Tag hier wirklich anwendbar? Andere Sprachen haben ebenfalls den Dezimaltyp.
Patrick M

1
@Max: Als Übung kann man sich vorstellen, eine Zahl zur Basis 2 von Hand in eine Zahl zur Basis 10 umzuwandeln. Um zB den Wert von zu berechnen 0.11_b2, schreiben Sie ihn als 0.5 + 0.5 * 0.5. Gibt es einen Schritt, der fehlschlagen oder zu einer wiederholten Dezimalstelle führen könnte? Persönlich finde ich, dass diese Übung großartige Arbeit leistet, um eine Vorstellung von Zahlen zur Basis 2 zu vermitteln. Ich nehme an, man könnte noch einen Schritt weiter gehen und diese Übung in einen konstruktiven Beweis verwandeln.
Brian

Ah, aber du liegst falsch. 1/1010
Xavier J

3
@Ramhound Angesichts von Speicherbeschränkungen kann Binär 0.0999999....998..genau, aber nicht die vollständige Zahl darstellen. 0.1Näherungen wie das Runden auf Hunderte von Stellen 0.100sind ein Problem bei der Implementierung, bei dem nicht alle Stellen angezeigt und stattdessen gerundet werden.
Izkata

1
Nun, es ist möglich, einen FP-Codierungsmechanismus zu entwickeln, mit dem '0.1' genau dargestellt werden kann. Eine solche Codierung verschiebt sich lediglich um die Sätze von FP-Nummernbereichen, als dargestellt werden kann und nicht.
Martin James

Antworten:


104

Hier ist der Schlüssel zu Ihrem Dilemma: 10ist das Produkt von 2und 5. Sie können beliebig viele genau in der Basis 10 Dezimalzahlen darstellen , die k * 1/2 n * 1/5 m , wo k, nund mganze Zahlen sind.

Alternativ formuliert - Wenn die Zahl nin 1 / n einen Faktor enthält, der nicht Teil der Faktoren der Basis ist, kann die Zahl in der binären / dezimalen / beliebigen Erweiterung nicht genau mit einer festen Anzahl von Ziffern dargestellt werden number - es wird einen sich wiederholenden Teil haben. Zum Beispiel 1/15 = 0.0666666666 .... weil 3 (15 = 3 * 5) kein Faktor von 10 ist.

Somit kann alles, was in der Basis 2 genau dargestellt werden kann (k · 1/2 n ), in der Basis 10 genau dargestellt werden.

Darüber hinaus gibt es die Frage, wie viele Stellen / Bits Sie zur Darstellung der Zahl verwenden. Es gibt einige Zahlen, die in einer Basis exakt dargestellt werden können, aber es sind mehr als einige Ziffern / Bits erforderlich, um dies zu tun.


In der Binärdarstellung kann die Zahl 1/10, die günstigerweise 0,1 dezimal ist, nicht als Zahl dargestellt werden, die in einer festen Anzahl von Bits in der Binärdarstellung dargestellt werden kann. Stattdessen lautet die Nummer 0.00011001100110011 ... 2 (wobei sich der 0011-Teil für immer wiederholt).

Lets Blick auf der Nummer 1 2 /1010 2 einen engen Bit.

          ____                  
       0,00011                  
     + ---------                 
1010 | 1.00000                  
       0                        
       -                       
       1 0                      
         0                      
       ----                     
       1 00 --------- +          
          0 |          
       ----- |          
       1 000 |          
           0 |          
       ------ | wiederholen
       1 0000 | Block    
         1010 |          
       ------ |          
          1100 |          
          1010 |          
          ---- |          
            100 ---- +          

Dies ist genau die gleiche Art von Dingen, die Sie erhalten, wenn Sie versuchen, die lange Division für 1/3 durchzuführen.

1/10, wenn berücksichtigt, ist 1 / (2 1 * 5 1 ). Für die Basis 10 (oder ein Vielfaches von 10) endet diese Nummer und wird als reguläre Nummer bezeichnet . Eine sich wiederholende Dezimalerweiterung wird als sich wiederholende Dezimalzahl bezeichnet , und diese Zahlen, die für immer ohne Wiederholung weitergehen, sind irrationale Zahlen.

Die Mathematik dahinter befasst sich mit Fermats kleinem Theorem ... und sobald Sie anfangen, Fermat oder Theorem zu sagen, wird es zu einer Math.SE-Frage .

Gibt es Zahlen, die in der Basis 10 nicht darstellbar sind, aber in der Basis 2 dargestellt werden können?

Die Antwort ist nein'.

An dieser Stelle sollte uns allen klar sein, dass jede binäre Expansion einer rationalen Zahl mit fester Länge als dezimale Expansion mit fester Länge dargestellt werden kann.


Lets Blick stärker auf das Dezimalsystem in C # , die uns führt Gleitpunktberechnungen in .NET und den Autor gegeben, werde ich , dass das ist , akzeptieren , wie es funktioniert.

Der Dezimaltyp hat die gleichen Komponenten wie jede andere Gleitkommazahl: eine Mantisse, einen Exponenten und ein Vorzeichen. Wie üblich ist das Vorzeichen nur ein einzelnes Bit, aber es gibt 96 Bits Mantisse und 5 Bits Exponent. Es sind jedoch nicht alle Exponentenkombinationen gültig. Es funktionieren nur die Werte 0-28, und sie sind praktisch alle negativ: Der numerische Wert ist . Dies bedeutet, dass die Maximal- und Minimalwerte des Typs +/- (2 96 -1) sind und die kleinste Zahl ungleich Null, ausgedrückt als absolute Größe, 10 -28 beträgt .sign * mantissa / 10exponent

Ich werde gleich darauf hinweisen, dass es aufgrund dieser Implementierung Zahlen in dem doubleTyp gibt, die nicht dargestellt werden können decimal- solche, die außerhalb des Bereichs liegen. Double.Epsilonist , 4.94065645841247e-324die in einem nicht dargestellt werden können decimal, sondern in einem double.

Innerhalb des Bereichs, den die Dezimalzahl darstellen kann, hat sie jedoch eine höhere Genauigkeit als andere native Typen und kann sie fehlerfrei darstellen.

Es gibt einige andere Typen, die herumschweben. In C # gibt es eine BigInteger- Zahl, die eine beliebig große Ganzzahl darstellen kann. Es gibt kein Äquivalent zu Java BigDecimal (die Zahlen nach oben mit Dezimalstellen von bis zu 2 darstellen kann 32 Ziffern lang - das ist eine beträchtliche Reichweite ist) genau . Wenn Sie jedoch ein wenig herumstöbern, finden Sie handgerollte Implementierungen.

Es gibt einige Sprachen, die auch einen rationalen Datentyp haben , mit dem Sie Rationales genau darstellen können (so dass 1/3 tatsächlich 1/3 ist).


Speziell für C # und die Wahl zwischen Float und Rational werde ich mich von dem Pint Decimal Floating in .NET an Jon Skeet wenden :

Die meisten Geschäftsanwendungen sollten wahrscheinlich dezimal statt float oder double verwenden. Meine Faustregel ist, dass künstliche Werte wie die Währung normalerweise besser mit Dezimal-Fließkomma dargestellt werden: Das Konzept von genau 1,25 Dollar ist zum Beispiel völlig vernünftig. Bei Werten aus der Natur wie Längen und Gewichten sind binäre Gleitkommatypen sinnvoller. Obwohl es theoretisch "genau 1,25 Meter" gibt, wird es in der Realität nie vorkommen: Sie werden mit Sicherheit nie in der Lage sein, exakte Längen zu messen, und es ist unwahrscheinlich, dass sie überhaupt auf atomarer Ebene existieren. Wir sind daran gewöhnt, dass es um eine gewisse Toleranz geht.


+1 für eine klare und präzise mathematische Erklärung. Um die allgemeinere Version der im Titel gestellten Frage zu beantworten, ist ein Beispiel für eine Zahl, die in der Basis 10 nicht darstellbar ist, 1/3.
Doval

@Doval Ich vermute, dass meine Überlegungen oder Erklärungen einen Fehler enthalten, auf den eine mathematisch orientierte Person hinweisen könnte ... aber ich denke, ich bin auf dem richtigen Weg, wenn dies der Fall ist.

"Relativ prim" bedeutet in diesem Fall nur "kein Faktor von", oder? Gibt es eine tiefere mathematische Beziehung, die mir fehlt?
Patrick M

1
Ah, so wie ich es verstehe, n = 15und b = 10sind nicht relativ prim ("teile keine gemeinsamen positiven Faktoren (Teiler) außer 1"), weil sie 5 als Faktor teilen. Der Schlüssel ist, dass nicht alle Faktoren von 15 (5 und 3) auch Faktoren von 10 sind. (Abgesehen davon: Gibt es ein Wort, das Zahlen angibt, die alle gemeinsamen Faktoren teilen oder nicht?) Ich denke, das ist ordentlich in deine k, n, mGleichung eingewickelt , aber um meinen Kopf wirklich darum zu wickeln, müsste ich einen 3D-Plot sehen. Unabhängig davon, gut verdient +1 für Sie.
Patrick M

1
@PatrickM: "Nebenbei: Gibt es ein Wort, das Zahlen angibt, die alle gemeinsamen Faktoren gemeinsam haben oder nicht?": Jede ganze Zahl ist ein Faktor für sich. Wenn also alle Faktoren von m Faktoren von n sind , folgt dies trivial m ist ein Faktor von n . Ein Begriff dafür ist, wie Sie sicher wissen, der Faktor . Ein anderer ist der Teiler .
Ruakh

6

Sobald Sie den zulässigen Wertebereich verlassen haben, lautet die Antwort "Ja". Das heißt, fast alles innerhalb des Bereichs wird eine Darstellung haben. C # -Dezimalreferenz Obwohl in der Spezifikation nicht angegeben, können irrationale Zahlen nicht genau dargestellt werden (z. B. e 1 , pi, Quadratwurzel von 2 usw.).

Das Dezimalschlüsselwort bezeichnet einen 128-Bit-Datentyp. Im Vergleich zu Gleitkommatypen hat der Dezimaltyp eine größere Genauigkeit und einen kleineren Bereich, wodurch er für Finanz- und Währungsberechnungen geeignet ist. Der ungefähre Bereich und die Genauigkeit für den Dezimaltyp sind in der folgenden Tabelle aufgeführt.

Präzision: 28-29 signifikante Stellen

1 Danke an MichaelT, der mich an eine andere irrationale Zahl erinnert hat.


2
@Magus betrachte die irrationale Zahl e(2.71 ...). Das natürliche log - ln (x) ist die logarithmische Basis e. Somit existieren irrationale Grundlagen und sind nützlich. Die besondere Nützlichkeit von Basis-Pi weiß ich nicht genau - aber das heißt nicht, dass es nicht irgendwo verwendet wird.

6
@Max du verirrst dich immer mehr in mathematische Fragen. Möglicherweise finden Sie: Wenn eine Zahl in Basis 10 irrational ist, ist sie in anderen Basen irrational? Eine nützliche Lektüre und ein Ausgangspunkt für weitere Fragen zur Zahlentheorie.

2
1/3 ist nicht irrational.
Adam Zuckerman

2
Das OP erkundigte sich nach der Basis 10 (zehn). Wenn Sie eine Zahlensystembasis aus irgendetwas erstellen, können Sie alles mit 10 ausdrücken. Basierend auf dem Wikipedia-Artikel ist die Verwendung einer irrationalen Zahl als Basis nicht rational. Rationale Zahlen können als ganze Zahlen sowohl für den Zähler als auch für den Nenner ausgedrückt werden, wobei sich Zahlen in einer Dezimalzahl wiederholen oder Zahlen in einer Dezimalzahl endlich terminiert werden.
Adam Zuckerman

5
@FrustratedWithFormsDesigner Irrationalität hat überhaupt nichts mit Basen zu tun. Nun, das ist eine Übertreibung, aber es ist eine Irrationalität, die Auswirkungen auf die Darstellung der Zahl in verschiedenen Basen hat (z. B. ob sie unendlich viele sich nicht wiederholende Ziffern hat), nicht umgekehrt. Lesen Sie die oben verlinkte math.se-Frage: math.stackexchange.com/questions/625473/…

1

Ein Gleitkommatyp mit Basis zwei könnte viele Werte präzise darstellen, die ein Typ mit Basis zehn derselben Größe nicht darstellen könnte. Jeder Wert, der durch einen Basis-2-Typ einer bestimmten Größe genau darstellbar wäre, wäre in einem Basis-10-Typ einer ausreichenden Größe genau darstellbar. Die erforderliche Größe für einen reinen Zehnerbasistyp zur Darstellung aller Werte einer binären Gleitkommazahl hängt vom Exponentenbereich des binären Typs ab. Hunderte von Bits für a floatoder Tausende für a double.

Abgesehen davon ist der DecimalTyp groß genug, um ihn als "universellen" Typ nutzbar zu machen, der den Wert eines anderen numerischen Grundelements aufnehmen und einige andere zusätzliche Merkmale bereitstellen kann (wenn nichts anderes, verwenden Sie ein Bit) Um anzuzeigen, ob der gespeicherte Wert das Ergebnis der Konvertierung von a ist double, und wenn dieses Bit gesetzt ist, verwenden Sie 64 Bit, um den betreffenden Wert zu speichern . Microsoft hat sich jedoch dagegen entschieden. Infolgedessen schlägt die Konvertierung von a doublezu Decimalfür große Werte vollständig fehl und kleine Werte werden auf die nächste 1E-28 gerundet. Weiterhin auch im Dynamikbereich vondecimalwird die Konvertierungsmethode nicht "Roundtrip". Wenn Sie beispielsweise 1,0 / 3,0 als doppelt auswerten, erhalten Sie 0,3333333333333333148, wenn Sie dies jedoch in dezimal umwandeln, erhalten Sie 0,3333333333333m, und wenn Sie dies zurück in doppelt umwandeln, erhalten Sie 0,33333333333329818.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.