C#BitConverter.DoubleToInt64位的Javascript端口
这个问题与有关,但因为我试图优化函数以提高速度,所以我提出了一个新问题 我正在将新代码从Angus Johnson翻译成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
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;
}