如何解决C sqrt在小于1但大于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,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之间,因此x 2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。