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

0

Witam

Mam problem z Math.sqrt().

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?

3

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

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.

2

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

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.

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).

0

no i wszystko co ciemne stalo sie jasne 😁

dziekuje za wyczerpujace wypowiedzi 😉

0
kixe52 napisał(a):

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

@kixe52: jeszcze inaczej :D

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1