tes*_*ino 0 c# floating-point directx-11 compute-shader
我想使用两个浮点数进行双重划分(看起来Direct Compute不支持双重划分).
那可能吗?
这是我到目前为止所尝试的(c#代码,以后应该是HLSL):
int count = 7;
double value = 0.0073812398871474;
float f1 = (float)value;
float f2 = (float)((value - f1));
float r1 = f1 / count;
float r2 = f2 / count;
double result = (double)r1 + (double)r2;
Run Code Online (Sandbox Code Playgroud)
0,00105446285765182(结果)
0,00105446284102106(正确的结果)
它与f1中的舍入有关.如果值是:
double value = 0.0073812344471474;
Run Code Online (Sandbox Code Playgroud)
然后结果是正确的.
使用浮点除法计算计数的倒数,然后使用Newton-Raphson倒数公式将精度提高到全双精度.
int count = 7;
double value = 0.0073812398871474;
double r = (double) (1.0f / count); // approximate reciprocal
r = r * (2.0 - count*r); // much better approximation
r = r * (2.0 - count*r); // should be full double precision by now.
double result = value * r;
Run Code Online (Sandbox Code Playgroud)