是否有可能在JavaScript中定义负数的平方根?

时间:2017-06-18 08:52:29

标签: javascript math complex-numbers

我正在制作一个像JavaScript中的内置数学一样的东西,但它有其他功能,如阶乘,伽玛函数,求和等。我打算做虚数,比如负1的平方根。
当我看到-1^0.5(将数字提升到半数时的平方根)等于NaN。很多东西都等于NaN,比如1-“a”或1÷0等。这是我代码的一部分:

/*What I'm Thinking*/
foo {
    ...
    pow: function(x, y){ // maybe?
        ...
    }
    I: "i", // Probably not the efficient way
    I2: -1 // ...
    // and more crazy ideas
}

我甚至考虑过做一个功能。我的最后一个想法是另一个战俘功能,当基数是负数时,它不会放弃并且可能返回“我”或其他东西;但是再一次,字符串可能不是最有效的方法,因为加法,减法,乘法,除法等是困难的部分。
是否还有其他更好的方法来制作虚数,或者至少有任何有用的方法,或者在JavaScript中这在技术上是不可能的?

2 个答案:

答案 0 :(得分:1)

您必须考虑两种模式,这两种模式都有优点和缺点,具有取决于实际情况的平衡。

实数模式下,pow函数,如果有的话(即基础是非负的),则具有遵循通常的幂律的唯一结果,例如{ {1}},a^(b+c)=a^b*a^c(a*b)^c=a^c*b^c

复数模式下,a^(b*c) = (a^b)^c函数几乎总是 a 结果。然而,定义关系/方程式也将几乎总是具有多个解决方案,这些解决方案同样可以是该函数的值。对于理性指数,人们可能会想到集值结果,即多项式方程的根。对于非理性甚至是复杂的指数,结果只是连续性而没有内在意义。

允许两种模式的通常方法是使用复杂的数据类型,以便仅在此数据类型的参数上使用pow的复杂版本。由于javascript中不存在运算符重载,因此您无法使用pow语法正确的复杂数据类型,您必须使用c=a*bc=a.mul(b)等语法。

答案 1 :(得分:0)

在数学运算中使用时,您可以传递一个将自身解析为值的对象:

var I={
 toString:_=>"I",
 valueOf:_=>NaN,
 pow:_=>I
}

usecases:

console.log(I*2);//NaN
console.log(I+" is a string now");
console.log(I.pow(5));

在Math.pow中实现:

var temp=Math.pow
Math.pow=function(a,b){
  return temp(a,b) || I;
}

Number.prototype.pow=function(a){ return Math.pow(this,a);};

console.log(
 Math.pow(5,2),
 Math.pow(-1,0.5),//I
 Math.pow(5,2).pow(2),
 Math.pow(-1,0.5).pow(5)//I
);