2012-03-31 8 views
5

Ich mache gerade ein Programm, das Testvektoren generiert, die in einer VHDL-Testbench verwendet werden. Die Testbench testet im Wesentlichen eine Hardware, die als Gleitkommaaddierer mit einfacher Genauigkeit arbeitet, so dass die Vektoren dem IEEE 754-Standard entsprechen.Ist es gefährlich, von float zu BigDecimal zu konvertieren, dann zurück?

Wie auch immer, ist mein derzeitiger Plan für die Generierung Float-Werte in BigDecimal zu konvertieren, das notwendige arithmatic zu tun, dann zurück zu Float zu konvertieren. Ist das gefährlich? Wird die Genauigkeit verloren gehen, was zu einem möglicherweise ungenauen Ergebnis im Testvektor führt? Ich möchte zu BigDecimal konvertieren, damit ich Rundungsprobleme vermeiden kann.

Also würde dies das Ergebnis verkürzen?

BigDecimal repA = new BigDecimal(Float.toString(A)); 
BigDecimal repB = new BigDecimal(Float.toString(B)); 
BigDecimal repResult = repA.add(repB); 
float result = repResult.floatValue(); 

Wo A und B sind einige float.

+0

Sie werden definitiv einige Genauigkeit verlieren, da ein Float nicht alle möglichen Bruchzahlen darstellen kann. – anubhava

+0

Gibt es eine Möglichkeit, dies zu erreichen, indem ich keine Präzision verliere? – Franklin

+1

Wie genau denken Sie, dass Sie es brauchen? –

Antwort

5

Wenn es Ihr Ziel ist, genaue 32-Bit Float-Vektoren innerhalb der erwarteten Grenzen eines Floats zu haben, dann mag ich Ihren Ansatz. Sie konvertieren zuerst von 32-Bit-Gleitkommazahl in ein Objekt mit höherer Genauigkeit, führen mehrere Schritte zur Berechnung durch und konvertieren dann wieder in 32-Bit-Gleitkommazahl. Am Ende wären Ihre Rundungsfehler wahrscheinlich geringer, als wenn Sie die gleiche Reihe von Schritten nativ in Ihren 32-Bit-Gleitkommazahlen ausgeführt hätten. Wenn Sie die erwarteten Ergebnisse einer Hardware, die nativ Berechnungen mit 32-Bit-Gleitkommazahlen ausführt, exakt simulieren möchten, besteht die Gefahr, dass Sie fälschlicherweise einen Testfehler melden, weil Ihre Berechnungen mit höherer Genauigkeit durchgeführt werden als die zu testende Hardware.

+0

Ich habe meine Frage bearbeitet. Denke ich richtig? – Franklin

+0

Anhand Ihres Beispiels sehe ich nicht, dass Sie Rundungsfehler vermieden haben. Wenn Sie Vektoren zufällig als Floats generieren, sie in Strings konvertieren, Strings in BigDecimal konvertieren, dann addieren und dann zurück in Floats konvertieren, dann sind Sie nicht besser dran, als nur die Floats hinzuzufügen. – phatfingers

+0

Sehen Sie sich an, dass das Stück, das modelliert wurde, die Werte im Gegensatz zu runden schneidet. Ein Teil meiner Software besteht also darin, zufällige Vektoren zusammen mit Randfällen zu erzeugen. Ich kann das Ergebnis nicht runden lassen, sonst werden die Tests nutzlos, da die Hardware abgeschnitten wird. – Franklin