Ist Hardcode float präzise, ​​wenn es in IEEE 754 durch Binärformat dargestellt werden kann?

8

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?

    
ggrr 11.11.2015, 07:44
quelle

4 Antworten

7
___ qstntxt ___

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?

    
___ qstnhdr ___ Ist Hardcode float präzise, ​​wenn es in IEEE 754 durch Binärformat dargestellt werden kann? ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer33646520 ___

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.

    
___ tag123floatingpoint ___ Fließkommazahlen sind Näherungen reeller Zahlen, die größere Bereiche als Ganzzahlen darstellen können, aber die gleiche Menge an Speicher verwenden, auf Kosten geringerer Genauigkeit. Wenn es sich bei Ihrer Frage um kleine arithmetische Fehler (z. B. warum 0,2 + 0,1 ist gleich 0,300000001?) Oder um Dezimalwandlungsfehler handelt, lesen Sie bitte die unten verlinkte Seite "info" vor dem Posten. ___ answer336546555 ___

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.

    
___ tag123floatingaccuracy ___ Über die Genauigkeit von Operationen, die an Fließkommazahlen ausgeführt werden. ___ tag123precision ___ Für Fragen zur numerischen Genauigkeit in der Programmierung. ___ answer3366491 ___

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.

    
___ answer3366508 ___

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:

  • Es sind nicht die gleichen Nummern wie bei den Dezimalziffern. 1/10 kann sein genau wie 0,1 mit Dezimalziffern geschrieben, aber nicht binär Ziffern, egal wie viele Sie verwenden (kurz vor Unendlichkeit).
  • In der Praxis ist es schwierig, den Überblick zu behalten, welche Zahlen man sein kann dargestellt und was nicht kann. 0,5 kann, aber 0,4 kann nicht. Also wenn du brauchst Genaue Zahlen, wie (oft) wenn man mit Geld arbeitet, sollte man nicht Verwenden Sie Gleitkommazahlen.
  • Laut einigen Quellen machen manche Prozessoren seltsame Dinge intern bei Fließkommaberechnungen für Zahlen das kann nicht genau dargestellt werden, was zu unterschiedlichen Ergebnissen führt das ist in der Praxis unvorhersehbar.

(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 .

    
___
Thomas Padron-McCarthy 11.11.2015, 08:12
quelle
2

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.

    
graham.reeds 11.11.2015 08:13
quelle
1
___ qstntxt ___

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?

    
___ qstnhdr ___ Ist Hardcode float präzise, ​​wenn es in IEEE 754 durch Binärformat dargestellt werden kann? ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer33646520 ___

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.

    
___ tag123floatingpoint ___ Fließkommazahlen sind Näherungen reeller Zahlen, die größere Bereiche als Ganzzahlen darstellen können, aber die gleiche Menge an Speicher verwenden, auf Kosten geringerer Genauigkeit. Wenn es sich bei Ihrer Frage um kleine arithmetische Fehler (z. B. warum 0,2 + 0,1 ist gleich 0,300000001?) Oder um Dezimalwandlungsfehler handelt, lesen Sie bitte die unten verlinkte Seite "info" vor dem Posten. ___ answer336546555 ___

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.

    
___ tag123floatingaccuracy ___ Über die Genauigkeit von Operationen, die an Fließkommazahlen ausgeführt werden. ___ tag123precision ___ Für Fragen zur numerischen Genauigkeit in der Programmierung. ___ answer3366491 ___

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.

    
___ answer3366508 ___

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:

  • Es sind nicht die gleichen Nummern wie bei den Dezimalziffern. 1/10 kann sein genau wie 0,1 mit Dezimalziffern geschrieben, aber nicht binär Ziffern, egal wie viele Sie verwenden (kurz vor Unendlichkeit).
  • In der Praxis ist es schwierig, den Überblick zu behalten, welche Zahlen man sein kann dargestellt und was nicht kann. 0,5 kann, aber 0,4 kann nicht. Also wenn du brauchst Genaue Zahlen, wie (oft) wenn man mit Geld arbeitet, sollte man nicht Verwenden Sie Gleitkommazahlen.
  • Laut einigen Quellen machen manche Prozessoren seltsame Dinge intern bei Fließkommaberechnungen für Zahlen das kann nicht genau dargestellt werden, was zu unterschiedlichen Ergebnissen führt das ist in der Praxis unvorhersehbar.

(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 .

    
___
Cheers and hth. - Alf 11.11.2015 08:16
quelle
0
___ qstntxt ___

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?

    
___ qstnhdr ___ Ist Hardcode float präzise, ​​wenn es in IEEE 754 durch Binärformat dargestellt werden kann? ___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer33646520 ___

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.

    
___ tag123floatingpoint ___ Fließkommazahlen sind Näherungen reeller Zahlen, die größere Bereiche als Ganzzahlen darstellen können, aber die gleiche Menge an Speicher verwenden, auf Kosten geringerer Genauigkeit. Wenn es sich bei Ihrer Frage um kleine arithmetische Fehler (z. B. warum 0,2 + 0,1 ist gleich 0,300000001?) Oder um Dezimalwandlungsfehler handelt, lesen Sie bitte die unten verlinkte Seite "info" vor dem Posten. ___ answer336546555 ___

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.

    
___ tag123floatingaccuracy ___ Über die Genauigkeit von Operationen, die an Fließkommazahlen ausgeführt werden. ___ tag123precision ___ Für Fragen zur numerischen Genauigkeit in der Programmierung. ___ answer3366491 ___

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.

    
___ answer3366508 ___

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:

  • Es sind nicht die gleichen Nummern wie bei den Dezimalziffern. 1/10 kann sein genau wie 0,1 mit Dezimalziffern geschrieben, aber nicht binär Ziffern, egal wie viele Sie verwenden (kurz vor Unendlichkeit).
  • In der Praxis ist es schwierig, den Überblick zu behalten, welche Zahlen man sein kann dargestellt und was nicht kann. 0,5 kann, aber 0,4 kann nicht. Also wenn du brauchst Genaue Zahlen, wie (oft) wenn man mit Geld arbeitet, sollte man nicht Verwenden Sie Gleitkommazahlen.
  • Laut einigen Quellen machen manche Prozessoren seltsame Dinge intern bei Fließkommaberechnungen für Zahlen das kann nicht genau dargestellt werden, was zu unterschiedlichen Ergebnissen führt das ist in der Praxis unvorhersehbar.

(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 .

    
___
glglgl 11.11.2015 08:11
quelle