Pytanie Które jest bardziej dokładne? java.lang.Math.E lub Math.exp (1.0)


Czytając Javadocs, widzę, że Math.E to "Podwójna wartość, która jest bliższa niż jakakolwiek e, podstawa logarytmów naturalnych."Wydrukowana wartość dla Math.E to 2.718281828459045, a wartość Math.exp (1.0), która powinna być taka sama, wynosi: 2.7182818284590455 (jedno więcej 5 na końcu).

Z dokumentacji wynika, że ​​bity w Math.E zostały "ręcznie dostosowane", aby zbliżyć się do rzeczywistej wartości e niż obliczenia wykonane przez Math.exp (1.0). Czy to jest poprawne, czy też czytam dokumenty niepoprawnie?

Jeśli to prawda, to jest użycie Math.pow (Math.E, n) bardziej dokładne niż Math.exp (n), lub mniej? Przeszukałem Google i przeszukałem SO, ale nie mogę znaleźć niczego w tym konkretnym problemie.


18
2017-09-11 17:18


pochodzenie


Math.exp(n) będzie bardziej precyzyjny. Nie zapominaj, że masz do czynienia z ograniczonymi reprezentacjami IEEE754, a więc koniecznością "dostosowania". - Denys Séguret
Są równie dokładne, jeden jest dokładniejszy od drugiego. Widzieć en.wikipedia.org/wiki/Accuracy_and_precision - Steve Kuo


Odpowiedzi:


Rzeczywista wartość do 16 miejsc po przecinku to 2,7182818284590452; 2 jest bliższe 0 niż 5, więc stała jest bliżej.

Zwróć uwagę, że podczas wykonywania obliczeń zmiennoprzecinkowych z dowolną liczbą jest całkiem prawdopodobne, że błąd w reprezentacji zmiennoprzecinkowej twojej odpowiedzi spowoduje, że użyjesz go w dużym stopniu bez znaczenia.


18
2017-09-11 17:23





Math.E

2,718281828459045

Math.exp (1.0)

2.7182818284590455

Oto wartość z Wikipedii, 2.7182818284590452  Jedyną różnicą, jaką widzę, jest błąd zaokrąglania ostatniej cyfry Math.exp (1.0), gdzie wartość wynosi 5 zamiast 2. Więc mówiąc ściśle Math.E jest dokładniejsza, ale chyba robisz naprawdę szalone rzeczy nie ma znaczenia dla precyzji.

Mogą istnieć względy dotyczące szybkości użycia wstępnie obliczonego Math.E zamiast Math.exp (1.0). Możesz również to sprawdzić.


6
2017-09-11 17:28