javascript - JavaScript 中的快速 nextafter 函数

标签 javascript floating-point

我正在尝试遍历 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/

相关文章:

java - JVM/CLR 上相同字节的不同浮点值

javascript - 创建新类型,还是检查类型?

javascript - 关于通过 DOM 解析 XML

javascript - 这个语句中的+有什么作用: a = +array[i]

c++ - 可以从 double 分配给 double 的 static_cast<float> 进行优化吗?

java - java.lang.Double.toString() 和 java.lang.Double.parseDouble 往返安全吗?

java - Java 中的高效 strtod?

javascript - Backbone.js 路由器中的键值对参数处理

javascript - 如何使用 JavaScript 类中的属性和方法来交换数据?

c++ - 比较从字符串转换的浮点值与文字