IEEE754 in Software implementieren



  • Hallo

    Ich implementiere gerade IEEE754 floats in Software. Als Unit Tests habe ich zufällige floats generiert und dann einmal auf der Hardware und einem auf der Software verrechnet (hier: addiert). Nun gibt es aber einige Fälle, in denen das Ergebnis nicht übereinstimmt, z.B.: (c=a+b)

    a: 0 01111110 01110011101100010001111	A: 1.01110011101100010001111 * 2^-1
    b: 0 01111110 11111101001101110111010	B: 1.11111101001101110111010 * 2^-1
    c: 0 01111111 10111000011101000100100	C: 1.10111000011101000100101 * 2^0
    

    (links HW, rechts SW)

    Ich sehe gerade nicht, wie das Ergebnis der Hardware hier korrekt sein kann. 😕
    Betrachtet man nur die 7 letzten Bits: 0001111 + 0111010 = 1001001 und weil die Mantissa overflowed, teilt man sie durch 2, wobei das hinterste 1 aufgerundet wird, also verbleibt man mit 100101.

    Ich hatte dann den Einfall, dass die Hardware vll. einfach nicht mathematisch korrekt rundet, sondern einfach abschneidet. Als ich das dann implementiert habe, gab es wieder Diskrepanzen:

    a: 0 01111110 01100011110111000000000	A: 1.01100011110111000000000 * 2^-1
    b: 0 01111110 10010101011010011110011	B: 1.10010101011010011110011 * 2^-1
    c: 0 01111111 01111100101000101111010	C: 1.01111100101000101111001 * 2^0
    

    Also die Hardware rechnet 001 / 2 = 000 aber 011 / 2 = 010 ?? Wo ist hier die Systematik?
    Kann mich jemand erleuchten, was hier vorgeht? 🙂

    LG



  • Es gibt ja nicht nur kaufmännisch- und abrunden. Kann es sein, dass IEEE754 sowas abstruses wie runden zur nächsten geraden Zahl oder so implementiert?

    edit: siehe https://en.wikipedia.org/wiki/IEEE_754#Rounding_rules - es gibt verschiedene Möglichkeiten. Jetzt musst Du nur noch rausfinden, welche davon Deine Hardware implementiert :p



  • Es ist leider schon eine Weile her, das ich mich damit befasst hatte. Aber ich bin bisher immer davon aus gegangen, das die Hardware einfach abschneidet. Aber da PC Hardware normalerweise mit mehr Bits arbeitet (ich glaube es sind 80) und da immer noch Software dazwischen sitzt, kann ich das nicht nachprüfen.

    ... und weil die Mantissa overflowed, teilt man sie durch 2...

    Ich denke nicht, das es ein "overflow" ist, es wird ja auch erkannt. Ich denke es ist nur die Normalisierung der Mantisse, also einfach rechts schieben.

    BTW, die Darstellungen sind nicht einfach zu vergleichen, da der Exponent einmal binär und einmal dezimal dargestellt wird. Hat mich einige Sekunden gekostet das zu überprüfen.

    Aber die Division konnte ich jetzt nicht überprüfen. Das geht so glaube ich nicht, da es sich um Binärbrüche handelt. Ich müsste dazu im Keller nach meinen Vorlesungsunterlagen suchen. Das geht momentan aber nicht, da die Suche nach Unterlagen für's Finanzamt Vorrang hat ...


Log in to reply