2016-08-03 47 views
0

Ich implementiere einen Hardware-Doppelpräzisions-Addierer mit Verilog. Während der Verifikationsphase, als ich meine Hardware-Ausgabe mit MATLAB (oder C) doppelt präzisen Additionsausgaben verglichen habe, habe ich einige seltsame Fälle gefunden, in denen das LSB nicht übereinstimmt, wobei ich den gleichen Rundungsmodus verwende (Runde zur nächsten geraden) . Meine Frage betrifft die Genauigkeit der C-Berechnung, ist sie wirklich genau beim Runden oder ist sie auf eine CPU-Architektur (32 oder 64 Bits) beschränkt?Gleitkomma-Addition mit LSB-Fehler

Hier ist ein Beispiel,

A = 0x62a5a1c59bd10037 = 1.5944933396238637e + 167

B = 0x62724bc40659bf0c = 1.685748657333889e + 166 = 0.1685748657333889e + 167

Die richtige Ausgabe (nur durch den Zusatz tun manuell die obigen reellen Zahlen)

= 1.7630682053572526e + 167 = 0x62a7eb3e1c9c3819 (dies entspricht meine Hardware)

Wenn ich versuche, A + B in C zu tun, ist das Ergebnis gleich

= 1.7630682053572525e + 167 = 0x62a7eb3e1c9c3818

Wenn ich diese Anwendung versuchen, die Zwischenoperationen http://www.ecs.umass.edu/ece/koren/arith/simulator/FPAdd/

kann ich überprüfen von der Mantissen-Addition sieht man, dass C die Rundung nicht korrekt durchführt (auf die nächste gerade Runde). In diesem Fall sollte die Mantisse durch Hinzufügen von Eins abgerundet werden. Irgendeine Idee, warum das passiert?

Antwort

0

Der Betrieb von http://www.ecs.umass.edu/ece/koren/arith/simulator/FPAdd/ ist korrekt. Die letzte Runde bis zum nächsten geraden Wert ergibt eine Abwärtsrundung:

A+B + 1.0111111010110011111000011100100111000011100000011000|10 *2^555 
                  ^
                  | 
to forget the |10 part (exactly in the middle), the result chooses 0 (even) instead of 1