Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Math.pow nie zawsze działa?
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
PaFaT
Witam,

Od razu mówię, że nie jest to zbyt pilna sprawa, ale pytam z czystej ciekawości.

Otóż ostatnio trochę wykorzystywałem JavaScript do wykonywania różnego rodzaju obliczeń.
Bardzo zastanowiło mnie, jak najłatwiej wyliczyć pierwiastek dowolnego stopnia.

Jako że JS nie posiada wbudowanej funkcji, która spełniałaby to (jakże trudne wink.gif ) zadanie, postanowiłem użyć

[JAVASCRIPT] pobierz, plaintext
  1. Math.pow(podstawa, (1 / wykładnik))
[JAVASCRIPT] pobierz, plaintext


Dopóki obracałem się wśród liczb nieujemnych, wszystko działało bez zarzutu.
Kiedy jednak usiłuję tym sposobem obliczyć np. pierwiastek sześcienny z -1, wychodzi NaN.

[JAVASCRIPT] pobierz, plaintext
  1. Math.pow(-1, (1 / 3)) => NaN
  2. Math.cbrt(-1) => -1
[JAVASCRIPT] pobierz, plaintext


Podejrzewam, że może być to związane z niedokładnością przy obliczaniu wykładnika potęgi.

I tu chciałem zapytać: czy istnieje jakiś inny, lepszy sposób na liczenie pierwiastków nawet z liczb ujemnych?
O ile z sześciennymi nie ma problemu, co zrobić np. z pierwiastkiem siódmego stopnia?

Math.pow(-1, (1 / 7)) => NaN

Z góry dziękuję za pomoc,

PaFaT
Crozin
https://developer.mozilla.org/en-US/docs/We...bjects/Math/pow
[JAVASCRIPT] pobierz, plaintext
  1. Math.pow(-7, 0.5); // NaN (negative numbers don't have a real square root)
  2. // due to "even" and "odd" roots laying close to each other,
  3. // and limits in the floating number precision,
  4. // negative bases with fractional exponents always return NaN
  5. Math.pow(-7, 1/3); // NaN
[JAVASCRIPT] pobierz, plaintext
PaFaT
Bardzo dziękuję, Crozin!

Czyli wygląda na to, że będzie trzeba niejako obejść to ograniczenie:

[JAVASCRIPT] pobierz, plaintext
  1. Math.prototype.root = function(liczba, stopien)
  2. {
  3. if(liczba >= 0) return Math.pow(liczba, 1/stopien);
  4. else return (stopien % 2) ? -Math.pow(-liczba, 1/stopien) : NaN;
  5. }
[JAVASCRIPT] pobierz, plaintext


Wprawdzie nie obsłuży ułamkowych stopni, ale z całkowitymi da sobie radę.
Comandeer
A w ES7 jest operator ** smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.