gpt4 book ai didi

javascript - JavaScript 中的快速 nextafter 函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:44:35 24 4
gpt4 key购买 nike

我正在尝试遍历 JavaScript 中的所有 32 位 float ,以直观地比较一些多项式评估方法的准确性。为此,我实现了如下所示的代码。不幸的是,这段代码太慢了。

有什么方法可以提高性能吗?

在 C/C++ 中,等效代码在我的计算机上运行需要一分多钟,而我没有耐心查看这段代码需要多长时间。

function nextFloat(f) {
// Note that this moves away from 0.0
// It will fail at +/- infinity and result in an NaN
var bitRepr = floatToBits(f);
bitRepr++;
return bitsToFloat(bitRepr);
}

function prevFloat(f) {
// Note that this moves towards 0.0
// This will fail at 0.0 and result in an NaN
var bitRepr = floatToBits(f);
bitRepr--;
return bitsToFloat(bitRepr);
}

function floatToBits(f) {
var buf = new ArrayBuffer(4);
(new Float32Array(buf))[0] = f;
return (new Uint32Array(buf))[0];
}

function bitsToFloat(b) {
var buf = new ArrayBuffer(4);
(new Uint32Array(buf))[0] = b;
return (new Float32Array(buf))[0];
}

我可能会考虑使用的另一种方法是将数字乘以 (1 + epsilon),但我相信无论如何我都需要在位级别解决边缘情况。

最佳答案

如果您的代码是同步的,您不需要一直调用 new,这意味着您可以保留 Uint32ArrayFloat32Array,它们通过跨所有函数的相同缓冲区链接,例如

var obj = (function () {
var int = new Uint32Array(1),
float = new Float32Array(int.buffer);
return {
i2f: function (i) {
int[0] = i;
return float[0];
},
f2i: function (f) {
float[0] = f;
return int[0];
},
next: function () {
int[0] = int[0] + 1;
return float[0];
},
prev: function () {
int[0] = int[0] - 1;
return float[0];
}
};
}());

关于javascript - JavaScript 中的快速 nextafter 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31925435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com