0.0 == -0.0?
-
Tim schrieb:
Sollen wir jetzt für alle genannte Sprachen was für dich basteln?
Ich will mal sehen, wie du das in Java oder C# machen willst, aber muss nicht sein
Viel wichtiger ist mir eigentlich, dass der Standard IEEE 754 diese Funktion nicht hat. Das von C99 ist somit eine inoffizielle Erweiterung, welche auch noch gar nicht so alt ist. Der Standard wurde verabschiedet ohne diese Funktion, also sah man ein sinnvolles Einsatzgebiet ohne diese Funktion? Da würde es mich schwer wundernehmen welches und wie gross (sinnvoll?) dieses tatsächlich ist?Weiss jemand eigentlich wie das im Standard IEEE 754r ist? Wurde dieser Standard schon überhaupt irgendwo vollständig eingeführt?
Grüssli
-
Dravere schrieb:
Wie gesagt wären Beispiele da ganz interessant und wie oft sowas tatsächlich benötigt wurde. Unteranderem dann auch die Frage, ob sich sowas nicht durch die Berechnung bereits früher ergeben haben könnte?
Ich hab doch ein Beispiel genannt.
Dravere schrieb:
In C++, C#, Java und vor allem IEEE 754 nicht vorhanden.
In C++0x ist es dabei und im Notfall kann man es ja schnell selbst basteln. Laut der Manpage ist es aus IEEE754:
This function is defined in IEC 559 (and the appendix with recom-
mended functions in IEEE 754/IEEE 854).Java hat eh keine richtigen IEEE754 Floatingpoints.
-
rüdiger schrieb:
Ich hab doch ein Beispiel genannt.
Ich habe eine andere Definition von Beispiel. Das war für mich eher ein theoretisches Konstrukt.
rüdiger schrieb:
Laut der Manpage ist es aus IEEE754:
This function is defined in IEC 559 (and the appendix with recom-
mended functions in IEEE 754/IEEE 854).Klingt eher nach IEEE 754r, da dort IEEE 754 und IEEE 854 zusammengeführt wurden.
Grüssli
-
Dravere schrieb:
Tim schrieb:
Sollen wir jetzt für alle genannte Sprachen was für dich basteln?
Ich will mal sehen, wie du das in Java oder C# machen willst, aber muss nicht sein
Bei Java würde ich spontan sowas wie floatToIntBits(x)>>>31 nehmen. Die MSDN ist mir mittlerweile zu fremd als dass ich da noch irgendwas finden würde.
-
Dravere schrieb:
rüdiger schrieb:
Ich hab doch ein Beispiel genannt.
Ich habe eine andere Definition von Beispiel. Das war für mich eher ein theoretisches Konstrukt.
Das ist kein theoretisches Konstrukt. Zumindest hatte ich neulich erst eine längere Unterhaltung mit jemanden darüber, der dass in seinen FEM-Sachen/Devicesimulationen einsetzt.
-
-
Also ich denke false, weil:
Nehmen wir das Beispiel 0 und -0 mit dem Variablentyp Byte (8 Bit mit Vorzeichen).
0 wäre dann: 00000000
-0 wäre dann: 10000000was ja nicht das gleiche ist...
Natürlich könnte ich völlig auf dem Holzweg sein ^^
-
Samyboy schrieb:
Nehmen wir das Beispiel 0 und -0 mit dem Variablentyp Byte (8 Bit mit Vorzeichen).
0 wäre dann: 00000000
-0 wäre dann: 10000000Und wo bringst du da die Nachkommastellen unter?
-
Float wird, wenn ich micht nicht irre, als Exponent gespeichert.
Die länge beträgt deshalb nur 4 bits. (zu prüfen with sizeof(float)).Ach ganz nebenbei:
true
74%
74% [ 68 ]
false
25%
25% [ 23 ]
Stimmen insgesamt : 9174 + 25 = 100
-
Tim06TR schrieb:
Float wird, wenn ich micht nicht irre, als Exponent gespeichert.
Die länge beträgt deshalb nur 4 bits. (zu prüfen with sizeof(float)).Bytes, Bytes! Oder auch mehr als 4, oder auch weniger. Das ist aber eher unüblich.
Float wird gespeichert als ein Vorzeichen, ein Exponent zu einer bestimmten Basis, und eine Summe von gewichteten Stellen zu einer bestimmten Zahlen-System-Basis. So kann's natürlich vorkommen, dass, wie du richtig bemerkt hat, die einzelnen Rundungen einen minimalen Fehler anstreben, und dann ihre Summe ein wenig von der exakten Summe abweicht.
-
Tim06TR schrieb:
Float wird, wenn ich micht nicht irre, als Exponent gespeichert.
Die länge beträgt deshalb nur 4 bits. (zu prüfen with sizeof(float)).Das ergibt für mich so richtig gar keinen Sinn
Mal ganz abgesehen davon dass du Bytes mit Bits verwechselst.
Aber was soll "float wird als Exponent gespeichert" heissen?
Float wird als Mantisse + Exponent gespeichert, wobei sich der Wert dann ausMantisse + 2 ^ (K + Exponent)
ergibt. Bei float ist das Vorzeichen IIRC teil der Mantisse. Bei double gibt's ein eigenes Vorzeichen Bit.Ich hoffe das stimmt jetzt
-
hustbaer schrieb:
Float wird als Mantisse + Exponent gespeichert, wobei sich der Wert dann aus
Mantisse + 2 ^ (K + Exponent)
ergibt. Bei float ist das Vorzeichen IIRC teil der Mantisse. Bei double gibt's ein eigenes Vorzeichen Bit.float und double sind identisch aufgebaut. Nur Mantisse und Exponent haben bei double etwas mehr Bits. Ein separates Vorzeichenbit haben beide.
Eine Fließkomma-Zahl nach IEEE754 besteht aus Vorzeichenbit, Mantisse und Exponent. Die Mantisse ist (normalerweise) normiert auf "1.<nachkommastellen>" (abgesehen von ein paar Spezialfällen). Weil die führende 1 immer gleich ist, wird die nicht gespeichert. Die gespeicherte Mantisse ist damit eine Zahl zwischen 0 und 1, stellt aber eine Zahl zwischen 1 und 2 dar.
Der Exponent kann auch negativ sein, aber eine 2er-Komplement- oder Vorzeichen-Betrag-Darstellung wird dafür nicht genutzt. Es wird nur eine Konstante draufaddiert. Ich habe mal gehört, dass das praktischer sein soll für verschiedene Berechnungen, vor allem auch für den größer-als-Vergleich.
Der Wert einer normalisierten IEEE754-Fließkommazahl ist zusammen:
Wert = Vorzeichen * (1 + Mantisse) * 2^{exponent - bias}
-
hustbaer schrieb:
Tim06TR schrieb:
Float wird, wenn ich micht nicht irre, als Exponent gespeichert.
Die länge beträgt deshalb nur 4 bits. (zu prüfen with sizeof(float)).Mal ganz abgesehen davon dass du Bytes mit Bits verwechselst.
Aber was soll "float wird als Exponent gespeichert" heissen?
Float wird als Mantisse + Exponent gespeichert, wobei sich der Wert dann ausMantisse + 2 ^ (K + Exponent)
ergibt. Bei float ist das Vorzeichen IIRC teil der Mantisse. Bei double gibt's ein eigenes Vorzeichen Bit.Ich hoffe das stimmt jetzt
Ok ja, ist mir gar nicht aufgefallen, dass mit der Bit, Byte sache.