3

Clipper ライブラリの実験的な C# "float" バージョンを JavaScript に翻訳しました。最新のサンドボックス バージョンには、翻訳が難しいと思われる関数IsAlmostEqualがあります。数値の安定性の問題により、== 演算子を使用して二重等価を比較することはできないため、この関数はこれらの問題を処理するために必要です。

-9223372036854775808 - aInt-9223372036854775808 - bIntBigInteger ライブラリなどを使用して計算するのは簡単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

4

1 に答える 1