我已经将实验性的C#“float”版本Clipper库翻译成了javascript。在最新的沙盒版本中,有一个IsAlmostEqual函数似乎很难翻译。由于数值稳定性问题,双等号无法使用==运算符进行比较,因此需要这个函数来处理这些问题。
有什么想法可以将
Numerical stability and robustness: 数值稳定性和健壮性:
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
http://www.mpi-inf.mpg.de/~kettner/pub/nonrobust_cgta_06.pdf
http://cpc.cs.qub.ac.uk/MRSN/higham.pdf
http://www.2ality.com/2012/04/number-encoding.html
-9223372036854775808 - aInt
和-9223372036854775808 - bInt
可以使用BigInteger库轻松计算,但BitConverter.DoubleToInt64Bits
则更难。有什么想法可以将
IsAlmostEqual
函数翻译成javascript吗?或者具体如何在javascript中实现BitConverter.DoubleToInt64Bits
?private static bool IsAlmostEqual(double A, double B)
{
//http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
Int64 aInt = BitConverter.DoubleToInt64Bits(A);
if (aInt < 0) aInt = unchecked(-9223372036854775808 - aInt);
Int64 bInt = BitConverter.DoubleToInt64Bits(B);
if (bInt < 0) bInt = unchecked(-9223372036854775808 - bInt);
return (Math.Abs(aInt - bInt) <= 10000000000);
}
Numerical stability and robustness: 数值稳定性和健壮性:
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
http://www.mpi-inf.mpg.de/~kettner/pub/nonrobust_cgta_06.pdf
http://cpc.cs.qub.ac.uk/MRSN/higham.pdf
http://www.2ality.com/2012/04/number-encoding.html
Math.abs(0 - Number.EPSILON / 10) < Number.EPSILON
是非常正确的... 我不确定你怎么会得到false
。 - Ry-