JavaScript : 숫자의 n 번째 근을 계산합니다.


81

JavaScript를 사용하여 숫자의 n 번째 루트를 얻으려고하는데 내장 Math객체를 사용하여 수행하는 방법이 보이지 않습니다 . 내가 뭔가를 간과하고 있습니까?
그렇지 않다면 ...

이 기능이있는 수학 라이브러리를 사용할 수 있습니까?
그렇지 않다면 ...

이 작업을 직접 수행하는 가장 좋은 알고리즘은 무엇입니까?


얼마나 많은 뿌리를 원하십니까? 가장 명백한 단 하나뿐입니까, 아니면 모두입니까?
Ignacio Vazquez-Abrams 2011 년

답변:


146

이와 같은 것을 사용할 수 있습니까?

Math.pow(n, 1/root);

예.

Math.pow(25, 1/2) == 5

1
pow 함수가 분수 지수를 취할 수 있으면 작동합니다. 확실하지,하지만 해야합니다 :)
리처드 H

2
음수를 처리하지만 처리하지 않습니다
mplungjan

2
작은 메모. pow 함수는 답을 근사합니다. 따라서 큰 값의 경우이 근사는 매우 잘못된 숫자를 반환 할 수 있습니다. [참조 ]. JS 구현도 마찬가지입니다. REF
Debosmit 레이

2
처리하는 방법 Math.pow(-32, 1/5)?
Qian Chen

20

nth 루트는 의 거듭 제곱과 x동일 합니다. 다음을 간단히 사용할 수 있습니다 .x1/nMath.pow

var original = 1000;
var fourthRoot = Math.pow(original, 1/4);
original == Math.pow(fourthRoot, 4); // (ignoring floating-point error)

1
Math.pow (-32, 1/5)는 어떻습니까?
Qian Chen

12

Math.pow () 사용

부정적인 것을 잘 처리하지 않는다는 점에 유의하십시오. 여기에 토론과 일부 코드가 있습니다.

http://cwestblog.com/2011/05/06/cube-root-an-beyond/

function nthroot(x, n) {
  try {
    var negate = n % 2 == 1 && x < 0;
    if(negate)
      x = -x;
    var possible = Math.pow(x, 1 / n);
    n = Math.pow(possible, n);
    if(Math.abs(x - n) < 1 && (x > 0 == n > 0))
      return negate ? -possible : possible;
  } catch(e){}
}

8

당신은 사용할 수 있습니다

Math.nthroot = function(x,n) {
    //if x is negative function returns NaN
    return this.exp((1/n)*this.log(x));
}
//call using Math.nthroot();

4

n의 번째 루트는 x숫자입니다 r있도록 r전원의가 1/n있다 x.

실수에는 몇 가지 하위 사례가 있습니다.

  • x양수이고 r짝수 일 때 두 가지 솔루션 (반대 부호가있는 동일한 값) 이 있습니다.
  • x긍정적이고 r홀수 일 때 하나의 긍정적 인 해결책이 있습니다 .
  • x음수이고 r홀수 일 때 하나의 음수 솔루션이 있습니다 .
  • x음수이고 균등할 때는 해결책이 없습니다 r.

Math.pow정수가 아닌 지수를 가진 음수를 좋아하지 않기 때문에 다음을 사용할 수 있습니다.

function nthRoot(x, n) {
  if(x < 0 && n%2 != 1) return NaN; // Not well defined
  return (x < 0 ? -1 : 1) * Math.pow(Math.abs(x), 1/n);
}

예 :

nthRoot(+4, 2); // 2 (the positive is chosen, but -2 is a solution too)
nthRoot(+8, 3); // 2 (this is the only solution)
nthRoot(-8, 3); // -2 (this is the only solution)
nthRoot(-4, 2); // NaN (there is no solution)

음 ... 이상하지 실제 숫자; "nthRoot은 (-4, 2) // NaN이는 (해결책이 없다)"
모리츠

본 후 stackoverflow.com/a/46268374/205696을 나는 몇 가지 최적화를 발견 nthRoot. 이후 Math.pow(-4, 1/2)반환 NaN우리는 필요하기 때문에 Math.abs부정적인 번호를, 우리가 사용할 수있는 Math.abs부정적으로 만 홀수 (하지 않도록 후자는 최적화입니다). 그래서 한 줄로 :let nthRoot = (x, n) => n % 2 === 1 && x < 0 ? -(Math.abs(x) ** (1/n)) : x ** (1/n)
dotnetCarpenter

4

광장과 입방 루트의 특별한 경우를 들어, 기본 기능을 사용하는 것이 가장 좋습니다 Math.sqrtMath.cbrt각각.

ES7부터 지수 연산자** 를 사용하여 음이 아닌 밑 의 1 / n 제곱으로 n 번째 루트 를 계산할 수 있습니다 .

let root1 = Math.PI ** (1 / 3); // cube root of π

let root2 = 81 ** 0.25;         // 4th root of 81

그러나 이것은 음의 염기에서는 작동하지 않습니다.

let root3 = (-32) ** 5;         // NaN

0

허수를 반환하는 함수가 있습니다. 또한 몇 가지 일반적인 사항을 먼저 확인합니다. 예 : 0 또는 1의 제곱근을 얻거나 숫자 x의 0 번째 루트를 얻는 경우

function root(x, n){
        if(x == 1){
          return 1;
        }else if(x == 0 && n > 0){
          return 0;
        }else if(x == 0 && n < 0){
          return Infinity;
        }else if(n == 1){
          return x;
        }else if(n == 0 && x > 1){
          return Infinity;
        }else if(n == 0 && x == 1){
          return 1;
        }else if(n == 0 && x < 1 && x > -1){
          return 0;
        }else if(n == 0){
          return NaN;
        }
        var result = false;
        var num = x;
        var neg = false;
        if(num < 0){
            //not using Math.abs because I need the function to remember if the number was positive or negative
            num = num*-1;
            neg = true;
        }
        if(n == 2){
            //better to use square root if we can
            result = Math.sqrt(num);
        }else if(n == 3){
            //better to use cube root if we can
            result = Math.cbrt(num);
        }else if(n > 3){
            //the method Digital Plane suggested
            result = Math.pow(num, 1/n);
        }else if(n < 0){
            //the method Digital Plane suggested
            result = Math.pow(num, 1/n);
        }
        if(neg && n == 2){
            //if square root, you can just add the imaginary number "i=√-1" to a string answer
            //you should check if the functions return value contains i, before continuing any calculations
            result += 'i';
        }else if(neg && n % 2 !== 0 && n > 0){
            //if the nth root is an odd number, you don't get an imaginary number
            //neg*neg=pos, but neg*neg*neg=neg
            //so you can simply make an odd nth root of a negative number, a negative number
            result = result*-1;
        }else if(neg){
            //if the nth root is an even number that is not 2, things get more complex
            //if someone wants to calculate this further, they can
            //i'm just going to stop at *n√-1 (times the nth root of -1)
            //you should also check if the functions return value contains * or √, before continuing any calculations
            result += '*'+n+√+'-1';
        }
        return result;
    }

switch 문을 사용하십시오
Mattia S.

0

글쎄, 나는 이것이 오래된 질문이라는 것을 안다. 그러나 SwiftNinjaPro의 답변에 따라 기능을 단순화하고 일부 NaN 문제를 수정했습니다. 참고 :이 함수는 ES6 기능, 화살표 함수 및 템플릿 문자열, 지수를 사용했습니다. 따라서 이전 브라우저에서는 작동하지 않을 수 있습니다.

Math.numberRoot = (x, n) => {
  return (((x > 1 || x < -1) && n == 0) ? Infinity : ((x > 0 || x < 0) && n == 0) ? 1 : (x < 0 && n % 2 == 0) ? `${((x < 0 ? -x : x) ** (1 / n))}${"i"}` : (n == 3 && x < 0) ? -Math.cbrt(-x) : (x < 0) ? -((x < 0 ? -x : x) ** (1 / n)) : (n == 3 && x > 0 ? Math.cbrt(x) : (x < 0 ? -x : x) ** (1 / n)));
};

예:

Math.numberRoot(-64, 3); // Returns -4

예 (가수 결과) :

Math.numberRoot(-729, 6); // Returns a string containing "3i".

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.