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

Precyzja w Math.sqrt() - o co chodzi?
P2
  • Rejestracja:około 3 lata
  • Ostatnio:ponad 2 lata
  • 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?

edytowany 3x, ostatnio: Riddle
K5
  • Rejestracja:około 6 lat
  • Ostatnio:2 dni
  • Postów:1002
3

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

SA
  • Rejestracja:ponad 12 lat
  • Ostatnio:dzień
  • Postów:1436
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.

edytowany 1x, ostatnio: Saalin
aolo23
  • Rejestracja:ponad 7 lat
  • Ostatnio:3 miesiące
  • Postów:186
2

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


Exception oznacza więcej niż tysiąc słów.
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Postów:4944
1

edytowany 1x, ostatnio: lion137
aolo23
bo ja piszę o super dokładnych :P
lion137
Aaa, prawda, BigDecimal ma ogranczoną długość, do longa chyba?
aolo23
nie pamiętam :(
PL
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 2 lata
  • Postów:104
1
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • 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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 6 godzin
  • Postów:8423
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:około 3 lata
  • Ostatnio:ponad 2 lata
  • Postów:6
0

no i wszystko co ciemne stalo sie jasne 😁

dziekuje za wyczerpujace wypowiedzi 😉

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 5 godzin
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.