2012-12-03 8 views
23

Wenn ich ein int habe, wandle es in ein double um, dann wandle das double zurück in ein int, bekomme ich garantiert den gleichen Wert zurück, mit dem ich angefangen habe? Mit anderen Worten, diese Funktion gegeben:Ist int-> double-> int garantiert werthaltig?

int passThroughDouble(int input) 
{ 
    double d = input; 
    return d; 
} 

Am garantiert, dass ich passThroughDouble(x) == x für alle int s x?

+0

Es hängt von der Größe von int, z. für 64 bit ints wird das definitiv nicht funktionieren. Bei 32 Bit wird es * wahrscheinlich * funktionieren. –

+1

'Assert (std :: numeric_limits :: Ziffern <= std :: numeric_limits :: Ziffern);' - http://en.cppreference.com/w/cpp/types/numeric_limits/digits – sehe

+1

@sehe: Sicherlich Du meinst 'static_assert'. : P – GManNickG

Antwort

30

Nein ist es nicht. Die Norm sagt nichts über die relativen Größen von int und double aus.

Wenn int eine 64-Bit-Ganzzahl ist und double die Standard-IEEE-Doppelpräzision ist, dann wird es bereits für Zahlen größer als 2^53 fehlschlagen.


Das heißt, int noch 32-Bit auf den meisten Umgebungen heute. So wird es in vielen Fällen immer noch halten.

+0

in welchem ​​System hat int 64 Bit? Windows und Linux haben beide bei 32bit. –

+0

Ich denke nicht, C sagt IEEE doppelte Präzision. Es sagt nur doppelte Genauigkeit; bedeutet doppelt so genau wie Float. Also 64 bit int könnte genau in double passen (klar nicht garantiert tho) – pm100

+0

@ JohannesSchaub-litb Ich habe von einigen Linux-Distributionen gehört, die 64-bit 'int's haben. Aber das waren Informationen aus zweiter Hand, die ich aus der Lounge bekam. – Mysticial

12

Wenn wir die Betrachtung auf die "traditionelle" IEEE-754-artige Darstellung von Fließkommatypen beschränken, dann können Sie erwarten, dass diese Umwandlung nur dann wertschonend ist, wenn die Mantisse vom Typ double so viele Bits hat da es keine Zeichenbits vom Typ int gibt.

Mantisse eines klassischen IEEE-754 double Typ ist 53-Bit breit (einschließlich der "implizierten" führenden Bit), was bedeutet, dass Sie ganze Zahlen in [-2^53, +2^53] Bereich genau darstellen können. Alles außerhalb dieses Bereichs wird im Allgemeinen an Genauigkeit verlieren.

Es hängt also davon ab, wie breit Ihr int im Vergleich zu Ihrem double ist. Die Antwort hängt von der spezifischen Plattform ab. Bei 32-Bit int und IEEE-754 double sollte die Gleichheit gelten.

+0

Digitale Audiosysteme hängen von Integer- oder Fließkomma-zu-Integer-Konvertierungen ab, um zu funktionieren, oder "die Welt würde aufhören, sich zu drehen". Als jemand, der sich in die Theorie des Themas vertiefen und einige praktische Experimente durchführen musste, kann ich nur sagen, dass dies die richtige Antwort ist. – Izhaki

Verwandte Themen