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.
2 odpowiedzi
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ć.
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()
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].