Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Math.pow nie zawsze działa?
PaFaT
post 1.06.2016, 22:13:00
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 3
Dołączył: 27.03.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Crozin
post 2.06.2016, 07:21:54
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
PaFaT
post 2.06.2016, 11:51:12
Post #3





Grupa: Zarejestrowani
Postów: 30
Pomógł: 3
Dołączył: 27.03.2012

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post
Comandeer
post 2.06.2016, 14:34:07
Post #4





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


A w ES7 jest operator ** smile.gif


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 10:38