C sqrt 在低于 1 但高于 0 的浮点数上无法正常工作
C sqrt not working properly on floating point numbers below 1 but above 0
我正在尝试创建一个具有随机维度但大小为 1 的向量。这就是我想出的(删除了 rand() 函数并将其替换为两个部分共有的数字代码。):
float x = sqrt((4566%100)/100.f);
float y = sqrt(1.f-x);
printf("%f, %f\n", x, y);
printf("%f\n", (x*x)+(y*y));
输出是这样的:
0.812404, 0.433124
0.847596
但是当我删除毕达哥拉斯定理的逆函数时(代码看起来有点像这样):
float x = (4566%100)/100.f;
float y = 1.f-x;
printf("%f, %f\n", x, y);
printf("%f\n", x+y);
输出如下所示:
0.660000, 0.340000
1.000000
假设我没疯,第一段代码最后一行的输出应该是1,上面打印的向量应该是完全不同的东西。我只能假设出错的地方在 sqrt
函数中。如果是,有人可以帮我修复它吗?如果不是,有人可以帮我找出我的错误吗?
如果根据勾股定理sqrt(x * x + y * y) = 1
,则y
不等于sqrt(1.f-x)
。应该是 sqrt(1.f-x*x)
:
sqrt(x * x + y * y) = 1
- (两边都平方)=>
x * x + y * y = 1
- (两边减去
x * x
)=>y * y = 1 - x * x
- (计算两边的平方根)=>
y = sqrt(1 - x * x)
鉴于 x
的计算,y
的计算不正确:
float y = sqrt(1.f-x);
您需要减去x
的平方:
float y = sqrt(1.f-x*x);
由于 x
在 0 和 1 之间,x2 < x,这将产生更大的(正确的模 FP 误差)值 y
.
我正在尝试创建一个具有随机维度但大小为 1 的向量。这就是我想出的(删除了 rand() 函数并将其替换为两个部分共有的数字代码。):
float x = sqrt((4566%100)/100.f);
float y = sqrt(1.f-x);
printf("%f, %f\n", x, y);
printf("%f\n", (x*x)+(y*y));
输出是这样的:
0.812404, 0.433124
0.847596
但是当我删除毕达哥拉斯定理的逆函数时(代码看起来有点像这样):
float x = (4566%100)/100.f;
float y = 1.f-x;
printf("%f, %f\n", x, y);
printf("%f\n", x+y);
输出如下所示:
0.660000, 0.340000
1.000000
假设我没疯,第一段代码最后一行的输出应该是1,上面打印的向量应该是完全不同的东西。我只能假设出错的地方在 sqrt
函数中。如果是,有人可以帮我修复它吗?如果不是,有人可以帮我找出我的错误吗?
如果根据勾股定理sqrt(x * x + y * y) = 1
,则y
不等于sqrt(1.f-x)
。应该是 sqrt(1.f-x*x)
:
sqrt(x * x + y * y) = 1
- (两边都平方)=>
x * x + y * y = 1
- (两边减去
x * x
)=>y * y = 1 - x * x
- (计算两边的平方根)=>
y = sqrt(1 - x * x)
鉴于 x
的计算,y
的计算不正确:
float y = sqrt(1.f-x);
您需要减去x
的平方:
float y = sqrt(1.f-x*x);
由于 x
在 0 和 1 之间,x2 < x,这将产生更大的(正确的模 FP 误差)值 y
.