我可能遗漏了一些明显的东西,但我正在试验 gpu.js 并得到一些奇怪的结果。我只是想确保我没有做一些明显愚蠢的事情(这很可能)。

不确定这是否与我正在做的事情有关,或者在使用 WebGL 通过 gpu.js 完成时执行计算的方式有问题。

我创建了一个新的 GPU 和新内核:

const gpu = new GPU();
const test = gpu.createKernel(function () {
    return 255 +
        (255 * 256) +
        (255 * 256 * 256) +
        (255 * 256 * 256 * 256);
}).setOutput([1]);

const res = test();

这给了我 4294967296 的结果(包含在 float32array 中)。

如果我从控制台运行相同的计算,我会得到 4294967295 的结果。

最佳答案

IEEE 754 单精度(32 位)浮点值由 24 个有效位和 8 个指数位组成。

4294967295 是 0xffffffff(整数),它不能完全准确地存储在 32 位浮点数中,因为它只有 24 位有效位。
4294967296 是 0x100000000(整数),可以存储在 32 位浮点数中,因为它是 0x4f800000(浮点数)。

相比之下,IEEE 754 double (64 位)浮点值由 53 个有效位和 11 个指数位组成。
因此,一个 64 位浮点值,可以准确地存储值 4294967295 (0x41effffffffe00000)。

关于javascript - gpus.js (webgl?) float32 问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46038047/

10-16 23:12