1

我刚刚对从 1 到 50 的数字进行了循环,并打印出 WebGL 对 exp(float) 的计算。我正在使用高精度,这些来自 WebGL2。

   precision highp float;
    varying vec2 TexCoords;
    uniform highp sampler2D A;

    void main() {
      float result = exp(texture2D(A, TexCoords).r);
      gl_FragColor.r = result;
    }

我在 javascript 中运行了同样的东西并比较了结果。聪明的东西非常小,但很快就会增加非常大的数字。

所以我还比较了 javascript 和 python (numpy) 的结果,它们非常具有可比性。

以下是 Math.abs(diff) 中的纬度数:

Diffs', '8.25484005595456e-8, 3.700182968913168e-7, 0.0000037810978241736848, 0.0000055018942362039525, 0.000003128868712565236, ... 12720537652, 21883728284, 30738633104, 20683268800, 324543434496, 2989835245824, 6539001840640, 12329169293312, 110431739568128, 262788127178752, 615023709454336, 1369528883085312, 3028196912005120

这些是 javascript 和 pyton 之间的最后几个差异:

3.0517578125e-05 6.103515625e-05 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 32.0 0.0 0.0 ... 0.0 0.0 0.0 262144.0

这些是 WebGL 程序的前几个数字:

'来自 WebGL 的结果', '2.7182817459106445,7.3890557289123535,20.085533142089844,

并来自javascript:

'来自 javascript 的结果', '2.718281828459045,7.38905609893065,20.085536923187668,

4

1 回答 1

4

不是WebGL用户,所以我可能是错的,但您的差异表明WebGL6-7只有第一个数字是正确的。这听起来很适合浮点精度(仅尾数)32bit23bits

javascript结果在对应的前 16 位数字中是正确的,因此64bit double您很可能比较32bit64bit计算结果,因此其精度较低也就不足为奇了。

这里比较:

WebGL     : 2.7182817459106445 ,7.3890557289123535 ,20.085533142089844  ,
javascript: 2.718281828459045  ,7.38905609893065   ,20.085536923187668  ,
PI float  : 2.71828174591064453,7.38905572891235352,20.08553504943847656,
PI double : 2.71828182845904509,7.38905609893064952,20.08553692318766437,
x87 double: 2.7182818284590451 ,7.3890560989306504 ,20.0855369231876679 ,

前两行是你的号码。这些线是用x87 on和计算的常数PI的结果相乘来计算的。最后一行使用x87 FPU内部实现。e32bit64bite^x80bit -> 64bit

正如您所看到的, WebGL32bit浮动非常密切相关,从而支持了我的结论。

于 2018-08-05T06:41:13.210 回答