C#BitConverter.DoubleToInt64位的Javascript端口

C#BitConverter.DoubleToInt64位的Javascript端口,c#,javascript,double,int64,C#,Javascript,Double,Int64,这个问题与有关,但因为我试图优化函数以提高速度,所以我提出了一个新问题 我正在将新代码从Angus Johnson翻译成Javascript,并且有一个函数IsAlmostEqual,它使用技术来比较double的相等性 原始C#函数如下: public static bool IsAlmostEqual(double A, double B) { //http://www.cygnus-software.com/papers/comparingfloats/comparingfloat

这个问题与有关,但因为我试图优化函数以提高速度,所以我提出了一个新问题

我正在将新代码从Angus Johnson翻译成Javascript,并且有一个函数
IsAlmostEqual
,它使用技术来比较double的相等性

原始C#函数如下:

public static bool IsAlmostEqual(double A, double B) { //http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm const int maxUlps = 10000; Int64 aInt = BitConverter.DoubleToInt64Bits(A); if (aInt < 0) aInt = Int64.MinValue - aInt; Int64 bInt = BitConverter.DoubleToInt64Bits(B); if (bInt < 0) bInt = Int64.MinValue - bInt; Int64 sub = unchecked(aInt - bInt); if (sub > aInt != bInt < 0) return false; return (sub <= 0 && sub > -maxUlps) || (sub > 0 && sub < maxUlps); } 有没有办法使
doubleToInt64位
更快?

A是一个更适合从缓冲区读取不同类型的类,而不是在缓冲区上创建不同类型的数组。这里是您的
doubleToInt64位
方法,它被重写为使用
DataView

function DoubleToInt64Bits(A, xInt)
{
    var dataView = new DataView(buf);
    dataView.setFloat64(0, A);
    xInt.lo = dataView.getUint32(4) | 0;
    xInt.hi = dataView.getInt32(0) | 0;
}

这将我的运行时间从~1500ms缩短到~850ms。

非常感谢!在原始代码中,
doubleToInt64位
需要800-1000毫秒。使用您的版本需要0-6毫秒。 function DoubleToInt64Bits(A, xInt) { (new Float64Array(buf))[0] = A; xInt.lo = (new Uint32Array(buf))[0] | 0; xInt.hi = (new Int32Array(buf))[1] | 0; }
function DoubleToInt64Bits(A, xInt)
{
    var dataView = new DataView(buf);
    dataView.setFloat64(0, A);
    xInt.lo = dataView.getUint32(4) | 0;
    xInt.hi = dataView.getInt32(0) | 0;
}