gpt4 book ai didi

c - C 算法中的平方根问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:55:49 25 4
gpt4 key购买 nike

我有一些代码可以在单位球体上找到一个点。回想一下,对于单位球体:

1 = sqrt( x^2 + y^2 + z^2 )

该算法在 0 和 1 之间随机选择两个点(x 和 y 坐标)。如果它们的大小小于 1,我们就有空间通过求解上述 z 方程来定义第三个坐标。

void pointOnSphere(double *point){
double x, y;

do {
x = 2*randf() - 1;
y = 2*randf() - 1;
} while (x*x + y*y > 1);

double mag = sqrt(fabs(1 - x*x - y*y));

point[0] = 2*(x*mag);
point[1] = 2*(y*mag);
point[2] = 1 - 2*(mag*mag);
}

从技术上讲,我继承了这段代码。以前的所有者使用 -Ofast 编译,它“无视严格的标准合规性”。 TL;DR 这意味着您的代码不需要遵循严格的 IEEE 标准。因此,当我尝试在不进行优化的情况下进行编译时,我遇到了错误。

 undefined reference to `sqrt'

什么是 IEEE 标准?好吧,由于计算机无法将 float 存储到无限精度,如果您不小心,在某些计算过程中会出现舍入错误。

谷歌搜索后,我遇到了 this question这让我走上了正确使用 IEEE 东西的正确轨道。我什至读过this article关于 float (我推荐)。不幸的是它没有回答我的问题。

我想在我的函数中使用 sqrt() 而不是像 Newton Iteration 这样的东西.我知道我的算法中的问题可能来自于我可能(即使不是真的)将负数传递给 sqrt() 函数这一事实。我只是不太确定如何解决这个问题。感谢所有的帮助!

哦,如果相关的话,我正在使用 Mersenne Twister数字生成器。

澄清一下,我将 libm 与 -lm 链接起来!我还确认它指向正确的库。

最佳答案

对于 sqrt 的 undefined reference ,您需要使用 libm 进行链接,通常使用 -lm 或类似选项。

还要注意

Provided their magnitude is less than one we have room to define a third coordinate by solving the above equation for z.

错了。 x 和 y 必须满足 x * x + y * y <= 1 才能有 z 的解。

关于c - C 算法中的平方根问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47063724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com