我有一个函数,可以根据范围内的值计算 3d 空间中的点[0, 1]
. 我面临的问题是,二进制浮点数不能精确表示 1。
函数中计算的数学表达式能够计算出以下值:t=1.0
,但该值永远不会被函数接受,因为它在计算之前检查是否符合范围。
curves_error curves_bezier(curves_PointList* list, curves_Point* dest, curves_float t) {
/* ... */
if (t < 0 || t > 1)
return curves_invalid_args;
/* ... */
return curves_no_error;
}
我怎样才能用这个函数计算 3d 点t=1.0
?我听说过一些关于ELLIPSIS
前段时间我认为与这样的问题有关,但我不确定。
Thanks
EDIT: 好吧,我很抱歉。由于我面临的问题,我认为浮点数不能精确地表示 1。问题可能是因为我正在进行这样的迭代:
for (t=0; t <= 1.0; t += 0.1) {
curves_error error = curves_bezier(points, point, t);
if (error != curves_no_error)
printf("Error with t = %f.\n", t);
else
printf("t = %f is ok.\n", t);
}
for (t=0; t <= 1.0; t += 0.1) {
你的问题是二进制浮点数不能精确表示0.1
.
最接近的32位单精度IEEE754浮点数是0.100000001490116119384765625,最接近的64位双精度浮点数是0.1000000000000000055511151231257827021181583404541015625。如果严格按照 32 位精度进行运算,则相加的结果0.1f
0 的十倍是
1.00000011920928955078125
如果中间计算的执行精度高于float
有,它可能会导致1.0
甚至稍小的数字。
要解决您的问题,在这种情况下您可以使用
for(k = 0; k <= 10; ++k) {
t = k*0.1;
because 10 * 0.1f
正是1.0
.
另一种选择是在您的curves_bezier
功能,
if (t > 1 && t < 1 + epsilon) {
t = 1;
}
对于一个适当小的 epsilon,也许float epsilon = 1e-6;
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)