我写了一个程序,将所有素数打印到给定的一个数 #包括 浮动绝对值(浮动a) { 如果(a=e) { g2=(g1+x1/g1)/2.0; g1=x1/g2; } sr=(int)g1; 返回(sr); } int main() { int-num; //num=0; printf(“输入一个介于1和1000之间的数值”); scanf(“%d”和&num); //printf(“你好”); int标志; flag=0; int i; i=2; int m,j; m=j=0; while(i3) { m=sqert(i); 对于代码中的(j=2;j
,您试图将我写了一个程序,将所有素数打印到给定的一个数 #包括 浮动绝对值(浮动a) { 如果(a=e) { g2=(g1+x1/g1)/2.0; g1=x1/g2; } sr=(int)g1; 返回(sr); } int main() { int-num; //num=0; printf(“输入一个介于1和1000之间的数值”); scanf(“%d”和&num); //printf(“你好”); int标志; flag=0; int i; i=2; int m,j; m=j=0; while(i3) { m=sqert(i); 对于代码中的(j=2;j,c,primes,C,Primes,,您试图将float与double进行比较 #include<stdio.h> float abso(float a) { if(a<0.0) return(-1*a); else return a; } int sqert(int x) { float x1 = (float)x; float g1, g2; g1 = x1/2.0; g2 = x1/g1; double e=0.00
float
与double
进行比较
#include<stdio.h>
float abso(float a)
{
if(a<0.0)
return(-1*a);
else
return a;
}
int sqert(int x)
{
float x1 = (float)x;
float g1, g2;
g1 = x1/2.0;
g2 = x1/g1;
double e=0.000000001;
int sr;
while(abso(g1-g2)>=e)
{
g2 = (g1+x1/g1)/2.0;
g1 = x1/g2;
}
sr = (int)g1;
return(sr);
}
int main()
{
int num;
//num = 0;
printf("Enter a num between 1 and 1000 ");
scanf("%d",&num);
//printf("hello");
int flag;
flag = 0;
int i;
i = 2;
int m, j;
m = j = 0;
while(i<=num)
{
flag = 1;
if(i==2)
{
printf("%d ",i);
i++;
}
else if(i==3)
{
printf("%d ",i);
i= i+2;
}
else if(i>3)
{
m = sqert(i);
for(j=2;j<=m;j++)
{
if((i%j) == 0)
{
flag = 0;
break;
}
}
if(flag == 0)
{
i = i + 2;
continue;
}
if(j==m+1)
printf("%d ",i);
i = i + 2;
}
}
printf("\n");
return(0);
}
这是不正确的,因为float
和double
之间的精度不同
double
的精度是float
的2倍
float
是32位IEEE 754单精度浮点数(1位表示符号,8位表示指数,23*表示值),
i、 e.浮点数有7位小数精度
double
是一个64位IEEE 754双精度浮点数(符号为1位,指数为11位,值为52*位),
i、 e.双精度有15位小数 将
e
声明为float
并确保为其分配的值符合float
的精度比如:
while(abso(g1-g2)>=e)
然后您的代码将按预期工作
@EricPostphil在评论中说,sqert
函数可能并不总是返回正确的近似值。这是正确的。
因此,最好使用
math.h
中的sqrt
来代替sqert
,因为g1
和g2
是浮点数,由于舍入误差,绝对差值可能永远不会小于e
。一个float
只有6或7位精度,所以请尝试e=0.00001
。您可能还希望在调试器中读取并运行该程序,或者添加printf语句以显示重要变量的值,并将其与预期值进行比较。找出差异的来源,然后进行修复。如果使用math lib提供的平方根函数,会发生什么情况?尝试这样做可以将搜索范围缩小到sqert外的代码或to内的代码。@TheWinterSoldier要想获得更有效的素数方法,请参见“当心!当我将浮点数转换为整数时,我总是使用舍入(I=(int)(f+.5);
)而不是截断(I=(int)f;
).我曾经因为没有这样做而被咬过…或者,在整个代码中使用double
。在现代社会,(除非处理资源非常有限的嵌入式系统/其他系统)无论如何,使用float
没有多大意义……当程序在使用浮点时出现问题,这个答案会将问题误诊。将float
值与double
值进行比较不会导致任何问题。float
值将毫无错误地转换为double
,并且mparison将正确进行。此外,建议的修复方法是可疑的。它仍然会让sqert
返回近似值。是否已对其进行评估以确保近似值足够好?例如,如果函数返回6.99…9 forsqert(49)
,程序可能会报告49为素数,即使它不是。对于答案中建议的e值,我检查了程序是否将所有素数打印到1000(这是要求)。printf(“输入一个介于1和1000之间的数值”)
并且它确实打印了所有这些内容。@user846834:我对此表示怀疑。当我现在按照答案中的建议将e
设置为0.00001
时,输出包括961,即31•31。当我将其设置为上一个答案中建议的0.000001
时,程序将挂起。当我将e
设置为该值时,但更改所有float
到double
,程序包括49个,即7•7。你用来结束循环的方法从根本上是有缺陷的。@EricPostphil:我同意你的看法。OP使用的sqert
函数不是我会使用的。sqrt()
来自math.h
的函数工作得很好。
float e = 0.00001;