2012-03-31 14 views
5

Jestem w trakcie tworzenia programu, który generuje wektory testowe do użycia w testerze VHDL. Testbench w zasadzie testuje kawałek sprzętu, który działa jako sumator zmiennoprzecinkowy o pojedynczej dokładności, więc wektory będą zgodne ze standardem IEEE 754.Czy jest niebezpieczna konwersja z formatu float na BigDecimal, a następnie z powrotem?

W każdym razie, moim obecnym planem generowania jest konwersja wartości zmiennoprzecinkowych na BigDecimal, wykonaj niezbędne operacje arytmetyczne, a następnie przekonwertuj z powrotem na zmienną. Czy to jest niebezpieczne? Czy precyzja zostanie utracona, powodując potencjalnie niedokładny wynik w wektorze testowym? Chcę przekonwertować na BigDecimal, aby uniknąć problemów z zaokrąglaniem.

Czy to spowoduje obcięcie wyniku?

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

Gdzie A i B są trochę zmiennoprzecinkowe.

+0

Na pewno stracisz precyzję, ponieważ zmienna nie może reprezentować wszystkich możliwych liczb ułamkowych. – anubhava

+0

Czy istnieje sposób, w jaki mogę to osiągnąć, nie tracąc precyzji? – Franklin

+1

Jaka jest dokładność, według Ciebie, jakiej potrzebujesz? –

Odpowiedz

5

Jeśli twoim celem jest posiadanie dokładnych 32-bitowych wektorów swobodnych w ramach spodziewanych ograniczeń pływaka, to lubię twoje podejście. Najpierw konwertujesz z 32-bitowego float na obiekt z większą precyzją, wykonując kilka kroków do matematyki, a następnie przekształcając z powrotem w 32-bitową zmiennoprzecinkową. W rezultacie błędy zaokrąglania będą prawdopodobnie mniejsze niż w przypadku wykonywania tej samej serii kroków w 32-bitowych ruchach.

Jeśli Twoim celem jest dokładna symulacja oczekiwanych wyników sprzętu wykonującego obliczenia natywnie za pomocą 32-bitowych ruchów zmiennych, możesz ryzykować fałszywe zgłoszenie niepowodzenia testu, ponieważ Twoje obliczenia są wykonywane z większą dokładnością niż testowany sprzęt.

+0

Edytowałem moje pytanie. Czy ja myślę dobrze? – Franklin

+0

Na podstawie Twojego przykładu nie widzę, aby uniknąć problemów z zaokrąglaniem. Jeśli po prostu generujesz wektory jako zmiennoprzecinkowe, konwertując je na ciągi, konwertując łańcuchy na bigdecymalne, dodając, a następnie konwertując z powrotem na zmienne, to nie będziesz miał nic lepszego niż tylko dodawanie zmiennoprzecinkowych. – phatfingers

+0

Zobacz element sprzętowy, który został zmodelowany, obcina wartości w przeciwieństwie do rundy. Dlatego częścią mojego oprogramowania jest generowanie losowych wektorów wraz z przypadkami brzegowymi. Nie mogę uzyskać wyniku zaokrąglonego, bo inaczej testy będą bezużyteczne, ponieważ sprzęt zostanie obcięty. – Franklin

Powiązane problemy