web-dev-qa-db-ja.com

JavaScript:数値のn番目のルートを計算する

JavaScriptを使用して数値のn番目のルートを取得しようとしていますが、組み込みのMathオブジェクトを使用して実行する方法がわかりません。私は何かを見落としていますか?
そうでない場合...

この機能を持つ数学ライブラリを使用できますか?
そうでない場合...

自分でこれを行うのに最適なアルゴリズムは何ですか?

69
Nathan

このようなものを使用できますか?

Math.pow(n, 1/root);

例えば。

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

nxth番目のルートは、x1/nの累乗と同じです。単にMath.powを使用できます:

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

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){}
}
11
mplungjan

使用できます

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

nx番目のルートは、r1/nの累乗がrであるような数値xです。

実数では、いくつかのサブケースがあります。

  • xが正でrが偶数の場合、2つの解決策があります(反対の符号を持つ同じ値)。
  • xが正で、rが奇数の場合、1つの正解があります。
  • xが負で、rが奇数の場合、1つの負のソリューションがあります。
  • 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)
3
Oriol

平方根と立方根の特別な場合には、ネイティブ関数 Math.sqrt および Math.cbrt それぞれ。

ES7以降、 指数演算子** は、n番目のルートを計算するために使用できます。 1/n非負の底のべき乗:

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

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

ただし、これは負のベースでは機能しません。

let root3 = (-32) ** 5;         // NaN
3
GOTO 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;
    }
0
SwiftNinjaPro