Konvertierung von double nach unsigned int
Stehe ich vor einem problem mit der Umwandlung der Wert von Double in int. Ich versuche, führen Sie den folgenden code :
int main()
{
double val_d= 6.25e-05;
cout << (1/val_d) << endl;
unsigned int val_ui = (unsigned int ) (1/val_d);
cout << val_ui << endl;
}
Umwandlung von double zu int zu löschen, die Dezimalstellen haben, aber integer-Teil bleiben sollte
wie es ist ?
Die Ausgabe die ich bekomme ist :
16000
15999
also warum ist die o/p hier anders ?
Dies geschieht nur auf fedora. Unter windows und Ubuntu funktioniert es einwandfrei. ( Beide Ausgaben sind 16000)
Ich Zwickte den obigen code, und erhielt die folgenden Ergebnisse :
int main()
{
double val_d= 6.25e-05;
cout << (1/val_d) << endl;
double val_intermediate = (1/val_d) ;
cout << val_intermediate << endl;
unsigned int val_ui = (unsigned int ) val_intermediate;
cout << val_ui << endl;
}
NEUEN AUSGABE ist
16000
16000
16000
- Was bedeutet es Ausgabe? Und was ist Ihre erwartete Ausgabe? Ist das nicht das, was Sie bekommen : ideone.com/0eXhl
- Ich weiß nicht wirklich sehen, hier eine Frage. Ist etwas schiefgegangen? Was ist das problem, das Sie konfrontiert sind? Ist der code nicht funktioniert wie man es erwarten würde?
- Es ist nicht klar, was Ihre eigentliche problem für mich ist. Funktioniert das nicht, wie Sie es erwarten? Was tut Sie und was erwarten Sie, es zu tun?
- Es scheint, verhält sich wie erwartet: ideone.com/VkTov 16000 gibt für beide Ausgänge.
- Standard-Antwort für diese und viele andere ähnliche Missverständnisse über Gleitkomma-Arithmetik: docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
- Ich bekomme 15999 16000 und auch mit Embarcadero C++ Builder. Welchen compiler benutzt du?
- <strike>Compiler-Implementierungen. GCC zeigt 1600 für alle Fälle. Demo 1 Demo 2</strike> Oh nur in fedora. Ich bin mir nicht sicher. Was für eine CPU und was für virtuelle Maschinen verwenden Sie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn der Ausgangstext "6.25 e-05" wird interpretiert als eine dezimal-Zahl umgewandelt und Doppel, es ist nicht exakt darstellbar, da die floating-point-Werte haben nur begrenzte Genauigkeit, und jedes bit hat einen Wert, der eine Potenz von zwei, nicht einer Dezimalziffer. Der IEEE 754 double-precision-Wert am nächsten ist 6,25 e-5 ist 6.25000000000000013010426069826053208089433610439300537109375 e-05 oder, in hexadezimal Fließkomma-0x1.0624dd2f1a9fcp-14.
Wenn die Gegenseitigkeit dieser ist getroffen, der genaue mathematische Ergebnis ist wieder nicht genau darstellbar ist, es muss also gerundet werden wieder. Der nächste double-precision-Wert 16000 oder 0x1.f4p+13.
Den C++ - standard erlaubt es, Implementierungen zu bewerten Gleitkomma-Ausdrücke mit mehr Präzision als die nominalen Typs erfordert. Einige Implementierungen verwenden extended-precision, insbesondere Intel ' s 80-bit-floating-point-Typ, die eine 64-bit Mantisse. (Regelmäßige Doppel-Präzision hat einen 53-bit-Mantisse.) In dieser erweiterten Präzision, der Kehrwert ist 0xf.9fffffffffffe89p+10 oder 15999.99999999999966693309261245303787291049957275390625.
Offensichtlich, wenn das extended-precision-Ergebnis wird gekürzt auf integer, das Ergebnis ist 15999.
Rundung der long double Ergebnis zu verdoppeln produzieren würde 16000. (Sie können dies tun, mit einem expliziten cast auf double; brauchen Sie nicht zu zuweisen, den Zwischenwert auf ein double-Objekt.)
Unterschied in Rundung.
dargestellt werden kann mit double precision; (ex.: 3.6999999999999999
== 3.7)
abgeschnitten, dass die Ergebnisse auf Rundung nach unten (ex.: int(3.6) == 3
Converting a floating-point-Wert ein fester Wert entfernt den gebrochenen Teil, sofern das Ergebnis dargestellt werden kann und die integraler Typ (d.h. der Wert ist nicht zu groß, um zu passen). Einfügen in einen Strom Runden den Wert, die produzieren kann ein anderes Ergebnis.