2011-09-05 32 views
52

Tôi đang cố gắng lấy gốc thứ n của một số bằng JavaScript, nhưng tôi không thấy cách nào để thực hiện nó bằng cách sử dụng đối tượng được xây dựng trong Math. Tôi có nhìn cái gì không?
Nếu không ...JavaScript: Tính gốc thứ n của một số

Có thư viện toán học nào tôi có thể sử dụng có chức năng này không?
Nếu không ...

Thuật toán tốt nhất để tự làm điều này là gì?

+0

Bạn muốn bao nhiêu rễ? Chỉ đơn giản nhất, hoặc tất cả chúng? –

Trả lời

92

Bạn có thể sử dụng cái gì như thế này không?

Math.pow(n, 1/root); 

ví dụ:

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

Điều này sẽ hoạt động nếu hàm pow có thể lấy số mũ phân số. Không chắc chắn, nhưng nó _should_ :) –

+0

nó không nhưng không xử lý số âm – mplungjan

+1

Một lưu ý nhỏ. Hàm pow xấp xỉ câu trả lời. Vì vậy, đối với các giá trị lớn, xấp xỉ này có thể trả về các số rất sai. [[tham khảo] (http://stackoverflow.com/questions/9956471/wrong-result-by-java-math-pow)]. Điều này cũng đúng cho việc thực hiện JS. [ref] (http://www.ecma-international.org/ecma-262/6.0/#sec-math.pow) –

16

n thư mục gốc của x giống như x với công suất 1/n. Bạn chỉ có thể sử dụng Math.pow:

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

Sử dụng Math.pow()

Lưu ý rằng nó không xử lý tiêu cực độc đáo - đây là một cuộc thảo luận và một số mã mà không

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){} 
} 
2

Các n - th gốc của x là một số r sao cho r với sức mạnh của 1/nx.

Trong số thực, có một số subcases:

  • Có hai giải pháp (cùng giá trị với dấu hiệu ngược lại) khi x là tích cực và r là số chẵn.
  • Có một giải pháp tích cực khi x là số dương và r là số lẻ.
  • Có một giải pháp tiêu cực khi x là số âm và r là số lẻ.
  • Không có giải pháp khi x là số âm và thậm chí r.

Kể từ Math.pow không giống như một cơ sở tiêu cực với một số mũ phi nguyên, bạn có thể sử dụng

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); 
} 

Ví dụ:

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) 
+0

"nthRoot (-4, 2); // NaN (không có giải pháp) " cũng ... ít nhất là không có số thực – Moritz

2

Bạn có thể sử dụng

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

Đối với trường hợp đặc biệt của hình vuông và khối gốc, tốt nhất là để sử dụng các hàm gốc Math.sqrtMath.cbrt tương ứng.

Tính đến ES7, các exponentiation operator ** thể được sử dụng để tính toán gốc n thứ như /n thứ quyền lực của một cơ sở không âm:

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

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

này doesn 't làm việc với các căn cứ tiêu cực, mặc dù.

let root3 = (-32) ** 5;   // NaN 
Các vấn đề liên quan