Clipper ライブラリの実験的な C# "float" バージョンを JavaScript に翻訳しました。最新のサンドボックス バージョンには、翻訳が難しいと思われる関数IsAlmostEqualがあります。数値の安定性の問題により、== 演算子を使用して二重等価を比較することはできないため、この関数はこれらの問題を処理するために必要です。
-9223372036854775808 - aInt
-9223372036854775808 - bInt
BigInteger ライブラリなどを使用して計算するのは簡単BitConverter.DoubleToInt64Bits
ですが、難しいです。
IsAlmostEqual
関数を JavaScriptに変換する方法はありますか? または具体的にどのようBitConverter.DoubleToInt64Bits
にjavascriptに実装するのですか?
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);
}
数値安定性とロバスト性:
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