Frage

Ich bin wahrscheinlich völlig falsch und weiß nichts darüber, aber ich habe eine Frage zu Dezimalzahl -Datentypen in Programmiersprachen. Ich verstehe, dass Schwimmer nicht völlig präzise sind, weil sie in binärer Leistung oder so in binär gespeichert sind, aber ich habe mich immer gefragt, warum die Datentypen der Dezimalzahl nicht nur eine Zahl speichern, als ob es keine Dezimalstelle gäbe. Wenn es keine Dezimalstelle gab, und dann fügen Sie es nach dem hinzu. Wie in dieser Situation:

2.159 * 3.507 --> 2159 * 3507 = 7571613
  ^^^     ^^^
  123     456

6 decimals in total... 7571613 -> 7.571613
                        ^^^^^^
                        654321

Also 2.159 * 3,507 = 7,571613

Warum kann es nicht einfach so funktionieren?

War es hilfreich?

Lösung

Genau das tun sie. Eine Gleitkommazahl wird in Exponentform gespeichert. Nehmen wir an, wir arbeiten an einem dezimalbasierten Computer, damit ich nicht all diese Zahlen in binär ändern muss.

Du multiplizierst 2.159 * 3.507, aber in Wirklichkeit 2.159 wird aufbewahrt als 2159 * 10^-3 und 3.507 wird aufbewahrt als 3507 * 10^-3. Da wir an einem dezimalbasierten System arbeiten, die 10 wird angenommen, also müssen wir nur wirklich lagern -3 ohne das 10, so was: 2159,-3 oder 3507,-3. Das -3 ist die Position des "schwimmenden Punktes": Wenn sich der Punkt bewegt, nimmt der schwimmende Punkt ab (ab.3507 wird aufbewahrt als 3507,-4) und wenn sich der Punkt rechts bewegt, nimmt der schwimmende Punkt zu (35.07 wird aufbewahrt als 3507,-2).

Wenn Sie die beiden miteinander multiplizieren, ist die Dezimalzahl (oder die Binärzahl auf einem binären Computer) das einzige, was sich multipliziert. Der schwimmende Punkt wird hinzugefügt! Hinter den Kulissen passiert also:

2.159 * 3.507
2159,-3 * 3507,-3
2159 * 3507,-3 + -3
7571613,-6

7571613,-6 ist nur 7571613 * 10^-6 (Denken Sie daran, wir können das annehmen 10 Weil wir an einem Dezimalcomputer arbeiten), was gleich ist wie 7.571613.

Natürlich muss der schwimmende Punkt nicht sein -3, Es könnte alles sein, was in den Speicher passt:

21590 * .3507
2159,1 * 3507,-4
2159 * 3507,1 + -4
7571613,-3
7571.613

Und natürlich speichern die meisten Computer Dinge nicht in Dezimalal, daher wären die tatsächlichen Zahlen in binär 2^-9 -> -9 statt 10^-3 -> -3. Aber Sie haben die Idee.

Andere Tipps

Das nennt man "Fixpunktarithmetik"Die Leute machen es die ganze Zeit.

Sehen http://gameprogrammer.com/4-fixed.html

Es gibt einige Implementierungen von Festpunktarithmetik. Wir haben jedoch oft die Dezimalstellen sehr, sehr schnell mit fester Punktspeicher aus. Es ist ideal für Geldtransaktionen, bei denen wir wissen, dass wir uns nicht um irrationale Zahlen speichern/kümmern.

Darüber hinaus ist die Festpunktarithmetik für viele andere Dinge den Overhead einfach nicht wert. Der schwimmende Punkt ist einfach viel schneller.

Sachen zum Lesen:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top