C用于循环控制,使用不给出结果的差异

时间:2014-04-14 08:36:10

标签: c loops

我正在编写此代码以继续计算序列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;
}

3 个答案:

答案 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;
}