我正在编写此代码以继续计算序列1+(2/2!)+(3/3!)+ .....直到序列的两个后续成员之间的差异为10 ^ -4但是减法总是给我0.00而不是停止循环
#include<stdio.h>
#include<stdlib.h>
int main()
{
int c = 0;
double sum = 0;
double fact = 1;
double seq;
double temp = 0;
bool check = false;
while (check != true)
{
c++;
fact = fact * c;
seq = c/fact;
if(temp-seq == 1E-04)
check = true;
// printf("%f\n",temp-seq);
temp = seq;
}
printf("stopped at %d operations \n",c);
system("pause");
return 0;
}
答案 0 :(得分:2)
指向“每个计算机科学家的内容......”的链接告诉您:不要将浮点数与完全相等进行比较。如初。
始终使用“距离所需答案的距离不足一些”。换句话说,改变:
if(temp-seq == 1E-04)
到
if(temp-seq <= 1E-04)
由于完全按<{1}} 值的可能性非常小。
答案 1 :(得分:1)
检查浮点数是否相等通常不起作用。要使两个双精度相等,所有64位必须相等。即使在最轻微的不准确的情况下,相等检查也会失败。尝试打印带有20位小数的temp - seq
来查看。
旁注:if (check != true)
是INSANE。这是不可读和危险的
您只需使用if (!check)
。
答案 2 :(得分:0)
首先,阅读其他回复,他们有很好的信息。 其次,你没有正确的计算,下面是一个工作实例。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int main()
{
int count = 0;
double sequence = 0;
double previous = sequence;
double factorial = 1;
bool done = false;
while (!done)
{
++count;
factorial = factorial * count;
sequence += count / factorial;
if (sequence - previous < 1e-4)
done = true;
printf("%f\n",sequence - previous);
previous = sequence;
}
printf("stopped at %d operations \n", count);
system("pause");
return 0;
}