Próbuję zmierzyć dokładność obliczonego wyniku (jako podwójnego) w porównaniu z BigDecimal ze znanym poprawnym wynikiem z dowolną precyzją. Chcę się upewnić, że jest poprawny do x miejsc po przecinku. Myślę, że można to zrobić tak:

(rząd wielkości poprawnego wyniku) - (rząd wielkości różnicy) > x

Mam problem ze znalezieniem prostego sposobu obliczenia rzędu wielkości BigDecimal. Jakieś pomysły?

Jeśli to zły sposób mierzenia dokładności, byłbym otwarty na inne techniki.

1
Bridger Maxwell 24 czerwiec 2011, 18:39

2 odpowiedzi

Najlepsza odpowiedź

Aby sprawdzić liczbę prawidłowych miejsc po przecinku, potrzebujesz tylko rzędu wielkości różnicy, a nie rzędu wielkości prawidłowego wyniku. Przypuszczam więc, że musisz przekonwertować obliczony wynik double na BigDecimal, odjąć dokładny wynik, a następnie przekonwertować z powrotem do double i wziąć logarytm o podstawie 10.

Lub jeśli chcesz tylko sprawdzić, czy wynik jest dokładny do x miejsc po przecinku, po prostu sprawdź, czy różnica jest większa niż 0,5 * 10^(-x) lub równoważnie:

int x = 3; // number of decimal places required
BigDecimal difference = accurateResult.subtract(new BigDecimal(approxResult));
BigDecimal testStat = difference.movePointRight(x).abs();
boolean ok = testStat.compareTo(new BigDecimal(0.5)) <= 0;

Właściwie to prawdopodobnie nie jest właściwe, w zależności od tego, co dokładnie rozumiesz przez „popraw do x miejsc po przecinku” i jak rygorystycznie musisz być. Można powiedzieć, że 0,15001 i 0,24999 są równe 1 miejscu po przecinku (oba zaokrąglone do 0,2), ale 0,19999 i 0,25001 nie są równe, mimo że różnica jest mniejsza. Jeśli pójdziesz w ten sposób, myślę, że musisz po prostu wyraźnie zaokrąglić obie liczby do x miejsc po przecinku, a następnie porównać.

3
Ben 24 czerwiec 2011, 19:47

Ponieważ wydaje Ci się, że interesuje Cię tylko przybliżone oszacowanie: powinieneś porównać log_10 obu wartości, co wskazuje rząd wielkości błędu... Możesz uzyskać dobre przybliżenie log_10 BigInteger, patrząc na długość jego reprezentacji dziesiętnej toString(10).length()

0
dcn 24 czerwiec 2011, 18:42