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.