我正在制作一个像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中这在技术上是不可能的?
答案 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*b
或c=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
);