这是我的代码,使用打印语句时,它似乎是一个无限循环:
我可以解决的一些潜在问题是整数除法,也许弄清楚算法是否终止,并且如果它始终具有正确的输出,也许我不理解C语言的某些特质导致此问题? / p>
根据我的理解,由于总和趋向于负无穷大,一旦达到epsilon精度的近似值,它将导致break语句被触发,结束算法。
#include <stdio.h>
int main()
{
double pi, sum, epsilon;
long long i=1;
long long max = 2147483647;
printf("Pleas enter the desired accuracy epsilon : ");
scanf("%f", &epsilon);
while (i<max){
if (i%2 == 0){
sum = -4.0/(2.0*i-1);
}else if (i%2 ==1){
sum = (4.0/(2.0*i-1));
}
if (sum < epsilon){
break;
}
pi += sum;
}
printf("The value of pi approximated to epsion : %f is %f\n", epsilon, pi);
return 0;
}
答案 0 :(得分:1)
您不会在SELECT
City,
SUM(Sales) as Total
FROM Employees
Where City <> 'London'
GROUP BY City
循环中增加i
的值。结果,它的值始终保持为1。
在完成处理后,在while
循环的结束i
之前,将}
递增。
初始化while
的值,这样在您第一次尝试读取它们的值时就不会遇到未定义的行为。
此外,在启用适当选项的情况下(对于GCC,pi, sum, epsilon
),编译器会警告您,您正在尝试将-Wall
读入float
。
double
因此,您必须使用正确的转换说明符:warning: format '%f' expects argument of type 'float *', but argument 2 has type 'double *' [-Wformat=]
scanf("%f", &epsilon);
~^ ~~~~~~~~
语句中的%lf
而不是%f
。
如果您对数字scanf
不太确定,只想取一个大值,也可以使用2147483647
(来自ULLONG_MAX
)来初始化limits.h
而不是对值进行硬编码。
答案 1 :(得分:1)
您需要在i
循环中增加while
的值。
您的循环条件while(i < max)
始终得到满足(无限循环)。因此,i
或max
的值应在循环内更改,以结束循环。
答案 2 :(得分:1)
您的代码具有未定义的行为:
width: 50;
height: 50;
background-color: rgb(50, 50, 50);
border: 6px solid rgba(50, 50, 50, 0.2);
border-radius: 100;
align-items: center;
justify-content: center;
scanf("%f", &epsilon);
scanf
取%f
,而不是float *
。 double *
的正确格式为double *
。
您的循环条件%lf
等效于while (i<max)
,因为while (1)
和i
都不会在循环内更改其值。
这也意味着max
始终是sum
:
4
sum = (4.0/(2.0*i-1));
// 4 / (2 * 1 - 1) = 4 / (2 - 1) = 4 / 1 = 4
也具有未定义的行为:pi += sum;
未初始化。