Precyzja w Math.sqrt() - o co chodzi?

Precyzja w Math.sqrt() - o co chodzi?
P2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

Witam

Mam problem z Math.sqrt().

Kopiuj
package test;

public class test {

  public static void main(String[] args) {
  
  double a = Math.sqrt(2);
  
  System.out.println(a*a);
  System.out.println(a);
  System.out.println(1.4142135623730951*1.4142135623730951) ;
  }
}

kiedy mnoze dwa identyczne pierwiastki przez siebie powinienem dostac liczbe ktora znajduje sie pod tym pierwiastkiem. Jednak jesli robie to tak jak widac wyzej to wynik zamiast 2 jest 2.000000000000004. Dlaczego tak jest?

K5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1005
3

A jakbyś na papierze pomnożył te wartości to co byś otrzymał?

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1452
11

Liczby rzeczywiste są reprezentowane domyslnie z ograniczoną dokładnością. Jeśli chcesz mieć dokładne wartości przy takich działaniach musiałbyś korzystać z jakiejś biblioteki do obliczeń symbolicznych.

Poczytaj jakie ograniczenia wprowadza floating point arithmetic. Standard opisujący to zachowanie to IEEE754.

aolo23
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 186
2

Do super dokładnych obliczeń matematycznych w javie możesz użyć: https://github.com/eobermuhlner/big-math

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
PL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 104
Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
4

To trochę jakbys pytał czemu jak pomnożysz 1/3 razy 3 to nie wyjdzie ci 1 na papierze. Komputer ma skończoną precyzje, więc wyobraź sobie że możesz wykonywać działania ale masz tylko 3 miejsca po przecinku. Robisz 1/3 = 0.333 i teraz jak to pomnożysz przez 3 to dostajesz 0.999 a nie 1.

LukeJL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8487
5

kiedy mnoze dwa identyczne pierwiastki przez siebie powinienem dostac liczbe ktora znajduje sie pod tym pierwiastkiem. Jednak jesli robie to tak jak widac wyzej to wynik zamiast 2 jest 2.000000000000004. Dlaczego tak jest?

Pomijając kwestie informatyczne, to ktoś przespał chyba lekcje matmy w szkole. Pierwiastek z 2 jest liczbą niewymierną. Wcale nie mnożysz pierwiastków z 2, tylko mnożysz liczbę 1.4142135623730951 przez siebie (która pierwiastkiem z 2 wcale nie jest, tak samo jak pi nie równa się 3.141592653589793, tylko jest to przybliżenie).

P2
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6
0

no i wszystko co ciemne stalo sie jasne 😁

dziekuje za wyczerpujace wypowiedzi 😉

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0
kixe52 napisał(a):

A jakbyś na papierze pomnożył te wartości to co byś otrzymał?

@kixe52: jeszcze inaczej :D

Kopiuj
azarien@santosa:/$ dc
1.4142135623730951
1.4142135623730951
*f
2.0000000000000001

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.