beispielsweise sind 0, 0,5, 0,15625, 1, 2, 3 ... Werte, die von IEEE 754 konvertiert wurden. Ist ihre Hardcode-Version genau?
zum Beispiel:
ist
%Vor%immer wahr zurück? anderes Beispiel:
%Vor%ist a * b immer gleich 0,125 und a * b == c immer wahr? Und noch ein Beispiel:
%Vor%ist a * b immer 61,5? oder im Allgemeinen, ist ganzzahlige Multiplikation durch IEEE 754 binär float präzise?
Oder eine allgemeinere Frage: Wenn der Wert Hardcode ist und sowohl der Wert als auch das Ergebnis in IEEE 754 durch Binärformat dargestellt werden können (z. B. 0,5 - 0,125), ist der Wert genau?
beispielsweise sind 0, 0,5, 0,15625, 1, 2, 3 ... Werte, die von IEEE 754 konvertiert wurden. Ist ihre Hardcode-Version genau?
zum Beispiel:
ist
%Vor%immer wahr zurück? anderes Beispiel:
%Vor%ist a * b immer gleich 0,125 und a * b == c immer wahr? Und noch ein Beispiel:
%Vor%ist a * b immer 61,5? oder im Allgemeinen, ist ganzzahlige Multiplikation durch IEEE 754 binär float präzise?
Oder eine allgemeinere Frage: Wenn der Wert Hardcode ist und sowohl der Wert als auch das Ergebnis in IEEE 754 durch Binärformat dargestellt werden können (z. B. 0,5 - 0,125), ist der Wert genau?
Nein, aber wie Thomas Padron-McCarthy sagt, können einige Zahlen exakt mit Binärzahlen dargestellt werden, aber nicht alle von ihnen.
So erkläre ich es den Nicht-Entwicklern, mit denen ich arbeite (wie Mahmut Ali arbeite ich auch an einem sehr alten Finanzpaket): Stellen Sie sich vor, Sie hätten einen sehr großen Kuchen, der in 256 Scheiben geschnitten ist. Jetzt können Sie 1 Person den ganzen Kuchen, 2 Personen die Hälfte der Scheiben geben, aber sobald Sie sich entscheiden, es zwischen 3 zu teilen, können Sie nicht - es ist entweder 85 oder 86 - Sie können den Kuchen nicht weiter teilen. Das gleiche gilt für Gleitkomma. Sie können nur genaue Zahlen für einige Darstellungen erhalten - einige Zahlen können nur annähernd angenähert werden.
C ++ benötigt keine binäre Gleitkommadarstellung. Eingebaute Ganzzahlen müssen eine binäre Darstellung haben, üblicherweise Zweierkomplement, aber das Einerkomplement und das Vorzeichen und die Größe werden ebenfalls unterstützt. Der Gleitpunkt kann jedoch z.B. dezimal.
Dies lässt die Frage offen, ob der C ++ - Gleitpunkt eine Radix haben kann, die nicht 2 als Primfaktor hat, wie 2 und 10. Sind andere Radixes erlaubt? Ich weiß es nicht, und das letzte Mal, als ich das überprüfen wollte, habe ich versagt.
Wenn vorausgesetzt wird, dass die Radix 2 oder 10 sein muss, dann beziehen sich alle Beispiele auf Werte, die Potenzen von 2 sind und daher genau dargestellt werden können.
Dies bedeutet, dass die einzige Antwort auf die meisten Ihrer Fragen "Ja" ist. Die Ausnahme ist die Frage "is integer multiple by IEEE 754 binär float [exact]". Wenn das Ergebnis die verfügbare Genauigkeit übersteigt, kann es nicht genau sein, aber ansonsten ist es.
Siehe den Klassiker "Was jeder Informatiker über Gleitkommaarithmetik wissen sollte" für Hintergrundinformationen über Gleitkommadarstellung & amp; Eigenschaften im Allgemeinen.
Wenn ein Wert in 32-Bit- oder 64-Bit-IEEE 754 genau dargestellt werden kann, bedeutet das nicht, dass er genau mit einer anderen Gleitkommadarstellung dargestellt werden kann. Das liegt daran, dass verschiedene 32-Bit-Darstellungen und verschiedene 64-Bit-Darstellungen eine unterschiedliche Anzahl von Bits verwenden, um die Mantisse zu halten, und unterschiedliche Exponentenbereiche haben. So kann eine Zahl, die genau auf eine Art dargestellt werden kann, über die Genauigkeit oder den Bereich einer anderen Darstellung hinausgehen.
Sie können %code% verwenden (wobei z. B. %code% ist %code% ), um zu überprüfen, ob Ihre Implementierung IEEE 754-kompatibel ist. Wenn jedoch Gleitkomma-Optimierungen eingeschaltet werden, behauptet zumindest der g ++ - Compiler (1) fälschlicherweise, IEEE 754 zu sein, während er z. NaN-Werte entsprechen diesem Standard korrekt. In der Tat sagt das %code% nur, ob die Zahl Darstellung IEEE 754 ist, und nicht, ob die Semantik konform ist.
(1) Im Wesentlichen versuchen gcc und g ++, verschiedene Semantiken über Compiler-Optionen unterzubringen, anstatt unterschiedliche Typen für verschiedene Semantiken bereitzustellen. Und mit separater Kompilierung von Teilen eines Programms, das nicht dem C ++ - Standard entsprechen kann.
Dies sollte prinzipiell möglich sein. Wenn Sie sich auf genau diese Klasse von Zahlen mit einer endlichen 2-Potenz-Darstellung beschränken.
Aber es ist gefährlich: Was passiert, wenn jemand Ihren Code nimmt und Ihre %code% zu %code% oder Ihre %code% zu %code% ändert, aus welchen Gründen auch immer? Dann ist dein Code kaputt. Und nein, selbst übertriebene Kommentare helfen dabei nicht - jemand wird sie immer ignorieren.
Es gibt keine inhärente Unschärfe in Fließkommazahlen. Es ist nur so, dass einige, aber nicht alle, reellen Zahlen nicht genau dargestellt werden können.
Vergleiche mit einer Dezimaldarstellung mit fester Breite, sagen wir mit drei Ziffern. Die ganze Zahl 1 kann dargestellt werden, wobei 1,00 verwendet wird, und 1/10 kann unter Verwendung von 0,10 dargestellt werden, aber 1/3 kann nur unter Verwendung von 0,33 angenähert werden.
Wenn wir stattdessen Binärziffern verwenden, wird die Ganzzahl 1 als 1,00 (Binärziffern) dargestellt, 1/2 als 0,10, 1/4 als 0,01, aber 1/3 kann (wieder) nur angenähert werden.
Es gibt jedoch einige Dinge zu beachten:
(Meine Meinung ist, dass es eigentlich eine vernünftige erste Näherung ist, zu sagen, dass Gleitkommazahlen von Natur aus unscharf sind. Wenn Sie also nicht sicher sind, ob Ihre spezielle Anwendung damit umgehen kann, halten Sie sich von ihnen fern .)
Für mehr Details als Sie wahrscheinlich brauchen oder wollen, lesen Sie die berühmte Was jeder Computerwissenschaftler Sollte über Floating-Point-Arithmetik wissen . Auch diese etwas zugänglichere Webseite: Der Floating-Point Guide .
Nein, aber wie Thomas Padron-McCarthy sagt, können einige Zahlen exakt mit Binärzahlen dargestellt werden, aber nicht alle von ihnen.
So erkläre ich es den Nicht-Entwicklern, mit denen ich arbeite (wie Mahmut Ali arbeite ich auch an einem sehr alten Finanzpaket): Stellen Sie sich vor, Sie hätten einen sehr großen Kuchen, der in 256 Scheiben geschnitten ist. Jetzt können Sie 1 Person den ganzen Kuchen, 2 Personen die Hälfte der Scheiben geben, aber sobald Sie sich entscheiden, es zwischen 3 zu teilen, können Sie nicht - es ist entweder 85 oder 86 - Sie können den Kuchen nicht weiter teilen. Das gleiche gilt für Gleitkomma. Sie können nur genaue Zahlen für einige Darstellungen erhalten - einige Zahlen können nur annähernd angenähert werden.
beispielsweise sind 0, 0,5, 0,15625, 1, 2, 3 ... Werte, die von IEEE 754 konvertiert wurden. Ist ihre Hardcode-Version genau?
zum Beispiel:
ist
%Vor%immer wahr zurück? anderes Beispiel:
%Vor%ist a * b immer gleich 0,125 und a * b == c immer wahr? Und noch ein Beispiel:
%Vor%ist a * b immer 61,5? oder im Allgemeinen, ist ganzzahlige Multiplikation durch IEEE 754 binär float präzise?
Oder eine allgemeinere Frage: Wenn der Wert Hardcode ist und sowohl der Wert als auch das Ergebnis in IEEE 754 durch Binärformat dargestellt werden können (z. B. 0,5 - 0,125), ist der Wert genau?
Nein, aber wie Thomas Padron-McCarthy sagt, können einige Zahlen exakt mit Binärzahlen dargestellt werden, aber nicht alle von ihnen.
So erkläre ich es den Nicht-Entwicklern, mit denen ich arbeite (wie Mahmut Ali arbeite ich auch an einem sehr alten Finanzpaket): Stellen Sie sich vor, Sie hätten einen sehr großen Kuchen, der in 256 Scheiben geschnitten ist. Jetzt können Sie 1 Person den ganzen Kuchen, 2 Personen die Hälfte der Scheiben geben, aber sobald Sie sich entscheiden, es zwischen 3 zu teilen, können Sie nicht - es ist entweder 85 oder 86 - Sie können den Kuchen nicht weiter teilen. Das gleiche gilt für Gleitkomma. Sie können nur genaue Zahlen für einige Darstellungen erhalten - einige Zahlen können nur annähernd angenähert werden.
C ++ benötigt keine binäre Gleitkommadarstellung. Eingebaute Ganzzahlen müssen eine binäre Darstellung haben, üblicherweise Zweierkomplement, aber das Einerkomplement und das Vorzeichen und die Größe werden ebenfalls unterstützt. Der Gleitpunkt kann jedoch z.B. dezimal.
Dies lässt die Frage offen, ob der C ++ - Gleitpunkt eine Radix haben kann, die nicht 2 als Primfaktor hat, wie 2 und 10. Sind andere Radixes erlaubt? Ich weiß es nicht, und das letzte Mal, als ich das überprüfen wollte, habe ich versagt.
Wenn vorausgesetzt wird, dass die Radix 2 oder 10 sein muss, dann beziehen sich alle Beispiele auf Werte, die Potenzen von 2 sind und daher genau dargestellt werden können.
Dies bedeutet, dass die einzige Antwort auf die meisten Ihrer Fragen "Ja" ist. Die Ausnahme ist die Frage "is integer multiple by IEEE 754 binär float [exact]". Wenn das Ergebnis die verfügbare Genauigkeit übersteigt, kann es nicht genau sein, aber ansonsten ist es.
Siehe den Klassiker "Was jeder Informatiker über Gleitkommaarithmetik wissen sollte" für Hintergrundinformationen über Gleitkommadarstellung & amp; Eigenschaften im Allgemeinen.
Wenn ein Wert in 32-Bit- oder 64-Bit-IEEE 754 genau dargestellt werden kann, bedeutet das nicht, dass er genau mit einer anderen Gleitkommadarstellung dargestellt werden kann. Das liegt daran, dass verschiedene 32-Bit-Darstellungen und verschiedene 64-Bit-Darstellungen eine unterschiedliche Anzahl von Bits verwenden, um die Mantisse zu halten, und unterschiedliche Exponentenbereiche haben. So kann eine Zahl, die genau auf eine Art dargestellt werden kann, über die Genauigkeit oder den Bereich einer anderen Darstellung hinausgehen.
Sie können std::numeric_limits<T>::is_iec559
verwenden (wobei z. B. T
ist double
), um zu überprüfen, ob Ihre Implementierung IEEE 754-kompatibel ist. Wenn jedoch Gleitkomma-Optimierungen eingeschaltet werden, behauptet zumindest der g ++ - Compiler (1) fälschlicherweise, IEEE 754 zu sein, während er z. NaN-Werte entsprechen diesem Standard korrekt. In der Tat sagt das is_iec559
nur, ob die Zahl Darstellung IEEE 754 ist, und nicht, ob die Semantik konform ist.
(1) Im Wesentlichen versuchen gcc und g ++, verschiedene Semantiken über Compiler-Optionen unterzubringen, anstatt unterschiedliche Typen für verschiedene Semantiken bereitzustellen. Und mit separater Kompilierung von Teilen eines Programms, das nicht dem C ++ - Standard entsprechen kann.
Dies sollte prinzipiell möglich sein. Wenn Sie sich auf genau diese Klasse von Zahlen mit einer endlichen 2-Potenz-Darstellung beschränken.
Aber es ist gefährlich: Was passiert, wenn jemand Ihren Code nimmt und Ihre %code% zu %code% oder Ihre %code% zu %code% ändert, aus welchen Gründen auch immer? Dann ist dein Code kaputt. Und nein, selbst übertriebene Kommentare helfen dabei nicht - jemand wird sie immer ignorieren.
Es gibt keine inhärente Unschärfe in Fließkommazahlen. Es ist nur so, dass einige, aber nicht alle, reellen Zahlen nicht genau dargestellt werden können.
Vergleiche mit einer Dezimaldarstellung mit fester Breite, sagen wir mit drei Ziffern. Die ganze Zahl 1 kann dargestellt werden, wobei 1,00 verwendet wird, und 1/10 kann unter Verwendung von 0,10 dargestellt werden, aber 1/3 kann nur unter Verwendung von 0,33 angenähert werden.
Wenn wir stattdessen Binärziffern verwenden, wird die Ganzzahl 1 als 1,00 (Binärziffern) dargestellt, 1/2 als 0,10, 1/4 als 0,01, aber 1/3 kann (wieder) nur angenähert werden.
Es gibt jedoch einige Dinge zu beachten:
(Meine Meinung ist, dass es eigentlich eine vernünftige erste Näherung ist, zu sagen, dass Gleitkommazahlen von Natur aus unscharf sind. Wenn Sie also nicht sicher sind, ob Ihre spezielle Anwendung damit umgehen kann, halten Sie sich von ihnen fern .)
Für mehr Details als Sie wahrscheinlich brauchen oder wollen, lesen Sie die berühmte Was jeder Computerwissenschaftler Sollte über Floating-Point-Arithmetik wissen . Auch diese etwas zugänglichere Webseite: Der Floating-Point Guide .
beispielsweise sind 0, 0,5, 0,15625, 1, 2, 3 ... Werte, die von IEEE 754 konvertiert wurden. Ist ihre Hardcode-Version genau?
zum Beispiel:
ist
%Vor%immer wahr zurück? anderes Beispiel:
%Vor%ist a * b immer gleich 0,125 und a * b == c immer wahr? Und noch ein Beispiel:
%Vor%ist a * b immer 61,5? oder im Allgemeinen, ist ganzzahlige Multiplikation durch IEEE 754 binär float präzise?
Oder eine allgemeinere Frage: Wenn der Wert Hardcode ist und sowohl der Wert als auch das Ergebnis in IEEE 754 durch Binärformat dargestellt werden können (z. B. 0,5 - 0,125), ist der Wert genau?
Nein, aber wie Thomas Padron-McCarthy sagt, können einige Zahlen exakt mit Binärzahlen dargestellt werden, aber nicht alle von ihnen.
So erkläre ich es den Nicht-Entwicklern, mit denen ich arbeite (wie Mahmut Ali arbeite ich auch an einem sehr alten Finanzpaket): Stellen Sie sich vor, Sie hätten einen sehr großen Kuchen, der in 256 Scheiben geschnitten ist. Jetzt können Sie 1 Person den ganzen Kuchen, 2 Personen die Hälfte der Scheiben geben, aber sobald Sie sich entscheiden, es zwischen 3 zu teilen, können Sie nicht - es ist entweder 85 oder 86 - Sie können den Kuchen nicht weiter teilen. Das gleiche gilt für Gleitkomma. Sie können nur genaue Zahlen für einige Darstellungen erhalten - einige Zahlen können nur annähernd angenähert werden.
C ++ benötigt keine binäre Gleitkommadarstellung. Eingebaute Ganzzahlen müssen eine binäre Darstellung haben, üblicherweise Zweierkomplement, aber das Einerkomplement und das Vorzeichen und die Größe werden ebenfalls unterstützt. Der Gleitpunkt kann jedoch z.B. dezimal.
Dies lässt die Frage offen, ob der C ++ - Gleitpunkt eine Radix haben kann, die nicht 2 als Primfaktor hat, wie 2 und 10. Sind andere Radixes erlaubt? Ich weiß es nicht, und das letzte Mal, als ich das überprüfen wollte, habe ich versagt.
Wenn vorausgesetzt wird, dass die Radix 2 oder 10 sein muss, dann beziehen sich alle Beispiele auf Werte, die Potenzen von 2 sind und daher genau dargestellt werden können.
Dies bedeutet, dass die einzige Antwort auf die meisten Ihrer Fragen "Ja" ist. Die Ausnahme ist die Frage "is integer multiple by IEEE 754 binär float [exact]". Wenn das Ergebnis die verfügbare Genauigkeit übersteigt, kann es nicht genau sein, aber ansonsten ist es.
Siehe den Klassiker "Was jeder Informatiker über Gleitkommaarithmetik wissen sollte" für Hintergrundinformationen über Gleitkommadarstellung & amp; Eigenschaften im Allgemeinen.
Wenn ein Wert in 32-Bit- oder 64-Bit-IEEE 754 genau dargestellt werden kann, bedeutet das nicht, dass er genau mit einer anderen Gleitkommadarstellung dargestellt werden kann. Das liegt daran, dass verschiedene 32-Bit-Darstellungen und verschiedene 64-Bit-Darstellungen eine unterschiedliche Anzahl von Bits verwenden, um die Mantisse zu halten, und unterschiedliche Exponentenbereiche haben. So kann eine Zahl, die genau auf eine Art dargestellt werden kann, über die Genauigkeit oder den Bereich einer anderen Darstellung hinausgehen.
Sie können 0.5
verwenden (wobei z. B. 0.4
ist .0625
), um zu überprüfen, ob Ihre Implementierung IEEE 754-kompatibel ist. Wenn jedoch Gleitkomma-Optimierungen eingeschaltet werden, behauptet zumindest der g ++ - Compiler (1) fälschlicherweise, IEEE 754 zu sein, während er z. NaN-Werte entsprechen diesem Standard korrekt. In der Tat sagt das .065
nur, ob die Zahl Darstellung IEEE 754 ist, und nicht, ob die Semantik konform ist.
(1) Im Wesentlichen versuchen gcc und g ++, verschiedene Semantiken über Compiler-Optionen unterzubringen, anstatt unterschiedliche Typen für verschiedene Semantiken bereitzustellen. Und mit separater Kompilierung von Teilen eines Programms, das nicht dem C ++ - Standard entsprechen kann.
Dies sollte prinzipiell möglich sein. Wenn Sie sich auf genau diese Klasse von Zahlen mit einer endlichen 2-Potenz-Darstellung beschränken.
Aber es ist gefährlich: Was passiert, wenn jemand Ihren Code nimmt und Ihre %code% zu %code% oder Ihre %code% zu %code% ändert, aus welchen Gründen auch immer? Dann ist dein Code kaputt. Und nein, selbst übertriebene Kommentare helfen dabei nicht - jemand wird sie immer ignorieren.
Es gibt keine inhärente Unschärfe in Fließkommazahlen. Es ist nur so, dass einige, aber nicht alle, reellen Zahlen nicht genau dargestellt werden können.
Vergleiche mit einer Dezimaldarstellung mit fester Breite, sagen wir mit drei Ziffern. Die ganze Zahl 1 kann dargestellt werden, wobei 1,00 verwendet wird, und 1/10 kann unter Verwendung von 0,10 dargestellt werden, aber 1/3 kann nur unter Verwendung von 0,33 angenähert werden.
Wenn wir stattdessen Binärziffern verwenden, wird die Ganzzahl 1 als 1,00 (Binärziffern) dargestellt, 1/2 als 0,10, 1/4 als 0,01, aber 1/3 kann (wieder) nur angenähert werden.
Es gibt jedoch einige Dinge zu beachten:
(Meine Meinung ist, dass es eigentlich eine vernünftige erste Näherung ist, zu sagen, dass Gleitkommazahlen von Natur aus unscharf sind. Wenn Sie also nicht sicher sind, ob Ihre spezielle Anwendung damit umgehen kann, halten Sie sich von ihnen fern .)
Für mehr Details als Sie wahrscheinlich brauchen oder wollen, lesen Sie die berühmte Was jeder Computerwissenschaftler Sollte über Floating-Point-Arithmetik wissen . Auch diese etwas zugänglichere Webseite: Der Floating-Point Guide .
Tags und Links c c++ floating-point precision floating-accuracy