gpt4 book ai didi

c - 当应该进行 100000 次迭代时,迭代卡在第 16512 次迭代

转载 作者:行者123 更新时间:2023-12-04 04:39:15 27 4
gpt4 key购买 nike

我很惊讶为什么我的代码在第 16512 次迭代时卡住了,即使它似乎没有语法问题。这是代码:

#include <stdio.h>
/*C version of Newton-Raphson method*/
float sqrt(float num);

main()
{
int i;
for (i = 1; i <= 100000; i++) {
printf("%d: %.3f\n", i, sqrt(i));
}
}

float sqrt(float num)

{
float guess, e, upperbound;
guess = 1;
e = 0.001;
do
{
upperbound = num / guess;
guess = (upperbound + guess) / 2;
} while (!(guess * guess >= num - e &&
guess * guess <= num + e));
return guess;
}

该代码应该使用 Newtonian-Raphson 方法找到从 1 到 100000 的所有数字的平方根,但在第 16152 次迭代后什么也没发生。如果该信息有帮助,我正在使用 VS2012 的开发人员命令提示符来编译我的脚本。启蒙将很高兴得到赞赏。

最佳答案

老实说,当我发表评论时,与其说是真正的知识,不如说是一种预感。该算法是有效的,所以一定有什么东西使 while 循环不会终止,而且由于您正确使用了 epsilon,我们达到了浮点数的限制。

@PaulR 的评论使它更有意义。 16512 的 sqrt 是 128.499027233672... Float 的精度相当有限,因此在该数字的 0.001 以内没有得到任何结果。如果您想到更大的数字,则更有意义,例如sqrt(123455555.54321)(即 11111.11111)。浮点精度甚至不一定能让您到达 11111,更不用说 11111.111。

更改为双重“修复”此问题,但只是将 jar 踢了下来。稍后,我们会遇到相同的精度问题,该算法应该适用于任何大小的数字。

@mrbratch 提出了强大的解决方案 - 将您的容忍度定义为数字的百分比。如果您设置 e = num * 0.00001 ,您的循环将始终完成。显然,您可以使用 epsilon 并将其调整到您满意的程度。请注意,对于大数字,这可以为您提供一个整数,该整数甚至不是最接近正确答案的 int。

我不能说 python,但我可以确认 javascript uses double precision .

关于c - 当应该进行 100000 次迭代时,迭代卡在第 16512 次迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19184273/

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