Frage

(int)(33.46639 * 1000000) kehrt 33466389

Warum geschieht das?

War es hilfreich?

Lösung

Punkt math Schwimmdock ist nicht perfekt. Was sollte jeder Programmierer darüber wissen.

  

Gleitkomma-Arithmetik ist ein esoterisches Thema von vielen Menschen betrachtet. Das ist ziemlich überraschend, da Gleitkommazahlen in Computersystemen allgegenwärtig ist. Fast jede Sprache einen Gleitkomma- Datentyp; Computer von PCs zu Supercomputern haben Gleitkommazahlen Beschleuniger; die meisten Compiler wird aufgerufen werden, Floating-Point-Algorithmen von Zeit zu Zeit zu kompilieren; und praktisch muss jedes Betriebssystem reagiert auf Gleitkommazahlen Ausnahmen wie Überlauf. Dieser Beitrag stellt ein Tutorial über die Aspekte der Gleitkommazahlen, die einen direkten Einfluss auf die Designer von Computersystemen haben. Es beginnt mit Hintergrund auf Gleitkommadarstellung und Rundungsfehlern, weiterhin mit einer Diskussion über den IEEE Floating-Point-Standard und schließt mit zahlreichen Beispielen, wie Computerbauer besser Gleitkommazahlen unterstützen kann.

     

...

     

Quetschen unendlich viele reelle Zahlen in eine endliche Anzahl von Bits erfordert eine ungefähre Darstellung. Zwar gibt es unendlich viele Zahlen, in den meisten Programmen kann das Ergebnis der Integer-Berechnungen in 32 Bits gespeichert werden. Im Gegensatz dazu jede feste Anzahl von Bits gegeben, die meisten Berechnungen mit reellen Zahlen werden Mengen produzieren, die nicht genau, dass viele Bits verwendet dargestellt werden kann. Daher ist das Ergebnis einer Berechnung Gleitkommazahlen müssen oft abgerundet, um sein in seine endliche Darstellung zurück zu passen. Dieser Rundungsfehler ist das charakteristische Merkmal der Fließpunktberechnung.

Andere Tipps

doppelte Genauigkeit nicht exakt ist, so intern 33,46639 tatsächlich als 33,466389 gespeichert

Edit: Wie Richard sagte, es Gleitkommadaten, (binär in einer endlichen Menge von Bits gespeichert), so ist es nicht genau das) ....

Es war Silvester am Ende des Jahres 1994 Andy Grove, CEO von Intel, kam ein großes Jahr, was mit dem Pentium-Prozessor herauskommt und da er ein großer Hit aus. So ging er in eine Bar und bestellte einen doppelten Schuss von Johnnie Walker Green Label.

Der Barkeeper serviert sie auf und sagte: "Das $ 20, Herr werden."

Grove legte einen zwanzig Dollar-Schein auf den Tresen, sah einen Moment lang an sie und sagte: „Halten Sie die Änderung.“

http://en.wikipedia.org/wiki/Pentium_FDIV_bug

Der Grund dafür ist, dass 33,46639 wird als etwas etwas weniger als diese Zahl dargestellt werden.

Multiplying von 1000000 wird Ihnen 33.466.389,99999999.

Type-Casting mit (int) wird dann wieder nur den ganzzahligen Teil (33.466.389).

Wenn Sie die "richtige" Zahl, versucht round () vor type casting.

Wenn Sie sich fragen, warum es nicht 33466390 worden ist, ist es, weil doubles hat keine unendliche Präzision, und die Zahl kann nicht genau in binär ausgedrückt werden.

Wenn Sie ersetzen die double mit einem decimal ((int)(33.46639m * 1000000)), es gleich 33466390, weil decimals in der Basis berechnet 10.

Da 33,46639 nicht exakt in einer endlichen Anzahl von binären Ziffern ausgedrückt werden. Das tatsächliche Ergebnis von 33,46639 * 1000000 ist 33.466.389,9999999962747097015380859375. Die Besetzung kürzt es 33.466.389.

Der Grund, warum Sie ein anderes Ergebnis bekam, ist die Tatsache, dass Sie ein gebrauchtes ' Besetzung

(int)(33.46639 * 1000000) returns 33466389
^^^^^

das Ergebnis auf eine Art von ‚int‘ zu werfen ..., die entweder auf- oder abgerundet vom integralen Typ, wenn multipled zusammen und dann auf ‚int‘ umgewandelt .... verlassen Sie sich nicht Punkt auf schwimmendem genau genug zu sein .... Skeet erzielte eine hervorragende Einführung auf seiner Website hier und hier ...

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