Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的平方根算法_C_Algorithm_Square Root - Fatal编程技术网

C语言中的平方根算法

C语言中的平方根算法,c,algorithm,square-root,C,Algorithm,Square Root,出于实践原因,我用C编写了以下算法: #include <stdio.h> #include <stdlib.h> int main(){ double x=0; printf("Enter the number: "); scanf("%lf", &x); int i = 0; double v = 0; double n=0; int grenze = 12; double z = 10; /* for(i=1; i<(x/2+1); i+

出于实践原因,我用C编写了以下算法:

#include <stdio.h>
#include <stdlib.h>


int main(){

double x=0;

printf("Enter the number: ");

scanf("%lf", &x);

int i = 0;

double v = 0;
double n=0;
int grenze = 12;
double z = 10;
/*
for(i=1; i<(x/2+1); i++){
    v=i;
    if((v*v) <= x){
        n = i;
    }
}

v=n;
*/
for(i=1; i<grenze+1; i++){
    z = z * 0.1;

    while(v*v<x){
        v = v + z;
        if(v*v<x){
            n = v;
        }
    }
    v=n;
}
printf("%.10f\n", n);



}
#包括
#包括
int main(){
双x=0;
printf(“输入数字:”);
扫描频率(“%lf”、&x);
int i=0;
双v=0;
双n=0;
int-grenze=12;
双z=10;
/*

对于(i=1;i对于足够大的数
v
和足够小的数
z
v=v+z
;是一个无操作-
v
不会改变。这会使循环运行很长时间

该算法不是一个好的选择-您应该查看该方法。我不相信您的算法对像
1E-70
(并且您已经证明它对像
1E+70
)这样的数字不起作用)这样的极端数能很好地工作。请注意,在大多数支持IEEE浮点的机器上,double的范围高达1E±300或更大

你能解释一下为什么对于某个极限
v=v+z
是不可操作的吗


浮点数的小数位数是有限的——通常大约16位表示双精度。如果你加上
1E+16
1E-16
,那么结果就是
1E+16
;没有足够的有效数字来存储额外的信息。你以
5E+10
作为起点;你生成分数
z=1.0
然后
0.1
0.01
,…
0.00001
等等(朋友之间的数量级是多少?)。当你到处添加最小的值时,你不会改变任何东西


主题的规范文档是或来自。

如果您在while循环中编写
printf
语句来显示
v
,您将看到在某个点它停止更改(这很糟糕,因为您使用它退出循环!)

我将
printf(“DEBUG:entered for loop,v=%lf\n”,v);
放在while循环中,看到了以下内容:

DEBUG: entered for loop, v=173205.080757
DEBUG: entered for loop, v=173205.080757
DEBUG: entered for loop, v=173205.080757
DEBUG: entered for loop, v=173205.080757
DEBUG: entered for loop, v=173205.080757
DEBUG: entered for loop, v=173205.080757
DEBUG: entered for loop, v=173205.080757
DEBUG: entered for loop, v=173205.080757

您添加的z非常小,当v为173205时,它实际上不会改变值。您可以通过将
v
的类型更改为
long double
来扩展范围;但是,由于我们只需要使用一定数量的位,因此仍然存在一个上限,向其添加足够小的数字不会改变re可呈现的值。

您是否使用了调试器来帮助您?它的设计正是为了帮助深入研究此类问题。这与使用调试器有什么关系?调试器(即gdb)可以在终端中运行。对于足够大的数字,
v=v+z;
是不可操作的-
v
不会改变。这会使循环运行很长时间。该算法不是一个好的选择。我不相信它对
1E-70
这样的数字有效(而且你已经证明它对
1E+70
这样的数字无效)。请注意,在大多数支持IEEE浮点数学的计算机上,双精度的范围可达
1E±300
或更大。浮点数字的小数位数有限,通常为
double
约16位。如果添加
1E+16
1E-16
,则结果为
1E+16
;没有通过有效数字来存储额外的信息。你有
5E+10
作为起点;你生成分数
z=1.0
,然后
0.1
0.01
,…
0.00001
等等(朋友之间的数量级是多少?)。当你到处添加最小的值时,你不会改变任何东西。关于这个主题的规范文档是或来自。应该有一个可以重复的问答。我还没有确定它。我会将我的评论转换为答案。更改为
长双精度
是一个临时的创可贴更改从5E10到5E50的源代码和
long double
将毫无帮助。它也不会解决源代码很小的问题。非常真实的Jonathan,我很快编辑了它以反映这一现实。