Nehmen wir an, ich habe zwei arithmetische Typen, eine ganze Zahl, I
, und eine Fließkommazahl, F
. Ich nehme auch an, dass std::numeric_limits<I>::max()
kleiner ist als std::numeric_limits<F>::max()
.Ist das Floating-Point-Round-Trip-Verhalten immer definiert, wenn der Gleitkommabereich größer ist?
Nun sagen wir, ich habe einen positiven ganzzahligen Wert i
. Da der darstellbare Bereich von F
größer ist als I
, sollte F(i)
immer Verhalten definiert werden.
Allerdings, wenn ich einen Gleitkommawert f
haben, so dass f == F(i)
, ist I(f)
gut definiert? Mit anderen Worten, ist I(F(i))
immer definiert Verhalten?
entsprechenden Abschnitt aus dem Standard-14 ++ C:
4,9 Gleitpunktarithmetik integrales Konvertierungen[conv.fpint]
- A prvalue eines Gleitkommatyps kann in einen prvalue eines Integer-Typs konvertiert werden. Die Konvertierung wird abgebrochen. das heißt, der Bruchteil wird verworfen. Das Verhalten ist nicht definiert, wenn der abgeschnittene Wert nicht im Zieltyp darstellen kann. [Hinweis: Wenn der Zieltyp
bool
ist, siehe 4.12. - Endnote]- Ein Prvalue eines Integer-Typs oder eines nicht gekürzten Aufzählungstyps kann in einen Prvalue eines schwebenden Punkttyps konvertiert werden. Das Ergebnis ist möglichst genau. Wenn der Wert, der konvertiert wird, in dem Bereich von Werten liegt, die dargestellt werden können, aber der Wert nicht genau dargestellt werden kann, ist es eine implementierungsdefinierte Wahl von entweder dem nächst niedrigeren oder höheren darstellbaren Wert. [Hinweis: Genauigkeitsverlust tritt auf, wenn der Integralwert nicht genau als Wert des Floating-Typs dargestellt werden kann. - Endnote] Wenn der konvertierte Wert außerhalb von den Bereich der Werte darstellt, die dargestellt werden können, ist das Verhalten nicht definiert. Wenn der Quelltyp
bool
ist, wird der Wertfalse
in Null konvertiert und der Werttrue
wird in eins konvertiert.
@vsoftco Sie müssen das umformulieren. 'I <= i 'macht keinen Sinn - Sie vergleichen einen Typ mit einem Wert. – orlp
[Nein] (http://coliru.stacked-crooked.com/a/e58cd5864d532045). –
Stellen Sie sich vor, dass 'I' und' F' die gleiche Größe haben, sagen wir 32 Bit. Dann nimm die größte ganze Zahl. Es wird zwangsläufig verlustbehaftet in einen Wert vom Typ "F" konvertiert. Wenn der darstellbare Wert, der ausgewählt wird, größer als die nächste Ganzzahl ist, führt die Rückumwandlung zu UB. –