Umwandlung von Double in unsigned int

7

Ich stehe vor einem Problem mit der Umwandlung des Wertes von Double nach int. Ich versuche den folgenden Code auszuführen:

%Vor%

Die Umwandlung von double in int kann den Dezimalteil entfernen, aber der ganzzahlige Teil sollte erhalten bleiben wie es ist?

Die Ausgabe, die ich bekomme, ist: 16000 15999

Warum ist das o / p hier anders? Dies geschieht nur auf Fedora. Unter Windows und Ubuntu funktioniert es gut. (Beide Ausgänge sind 16000)

Ich habe den obigen Code optimiert und die folgenden Ergebnisse erhalten:

%Vor%

NEUER AUSGANG ist 16000 16000 16000

    
Dexter 06.09.2012, 11:11
quelle

3 Antworten

15

Wenn der Quelltext "6.25e-05" als Dezimalzahl interpretiert und in double konvertiert wird, ist er nicht genau darstellbar, da Gleitkommawerte eine begrenzte Genauigkeit haben und jedes Bit einen Wert von einer Potenz von hat zwei, keine Dezimalziffer. Der IEEE 754-Wert für die doppelte Genauigkeit, der 6,25e-5 am nächsten liegt, ist 6.25000000000000013010426069826053208089433610439300537109375e-05 oder im hexadezimalen Fließkommawert 0x1.0624dd2f1a9fcp-14.

Wenn der Kehrwert davon genommen wird, ist das exakte mathematische Ergebnis wieder nicht genau darstellbar, also muss es wieder gerundet werden. Der nächste Wert für die doppelte Genauigkeit ist 16000 oder 0x1.f4p + 13.

Der C ++ - Standard ermöglicht Implementierungen, Gleitkommaausdrücke mit höherer Genauigkeit als dem Nominaltyp zu berechnen. Einige Implementierungen verwenden erweiterte Genauigkeit, insbesondere den 80-Bit-Gleitkommatyp von Intel, der eine 64-Bit-Signifikanz aufweist. (Reguläre doppelte Genauigkeit hat eine 53-Bit-Signifikanz.) In dieser erweiterten Genauigkeit ist der Kehrwert 0xf.9ffffffffffffff89p + 10 oder 15999.99999999999966693309261245303787291049957275390625.

Offensichtlich ist das Ergebnis 15999, wenn das Ergebnis der erweiterten Genauigkeit auf eine Ganzzahl gekürzt wird.

Wenn Sie das long-double-Ergebnis auf double runden, würde dies 16000 ergeben. (Dies kann mit einer expliziten Umwandlung zum Verdoppeln erfolgen; Sie müssen den Zwischenwert keinem doppelten Objekt zuweisen.)

    
Eric Postpischil 06.09.2012, 13:18
quelle
6

Unterschied in der Rundung .

  1. (1 / val_d) - double wird auf die nächste mögliche Zahl gerundet kann mit doppelter Genauigkeit dargestellt werden; (zB: 3.6999999999999999 == 3.7)
  2. (unsigned int) (1 / val_d) - wenn auf Dezimalteil umgerechnet wird truncated, das ergibt sich bei Abrundung (zB: int (3.6) == 3
spin_eight 06.09.2012 11:33
quelle
1

Wenn Sie einen Fließkommawert in einen ganzzahligen Wert umwandeln, wird der Nachkommaanteil entfernt, sofern das Ergebnis im ganzzahligen Typ dargestellt werden kann (d. h. der Wert ist nicht zu groß für die Anpassung). Beim Einfügen in einen Stream rundet den Wert ab, was zu einem anderen Ergebnis führen kann.

    
Pete Becker 06.09.2012 11:13
quelle

Tags und Links