用C程序求一个简单级数的和

用C程序求一个简单级数的和,c,C,我这里有一个程序,用来总结这个系列 1+1/2+1/3+1/4... 等 唯一的用户输入是输入您希望此总和运行的次数。 然而,我总是得到一个总数 #include <stdio.h> int main(void) { int b,x; /* b is number of times program runs and x is the count*/ float sum; printf("Enter the number of

我这里有一个程序,用来总结这个系列 1+1/2+1/3+1/4... 等

唯一的用户输入是输入您希望此总和运行的次数。 然而,我总是得到一个总数

#include <stdio.h>

int main(void)
    {
        int b,x; /* b is number of times program runs and x is the count*/
        float sum;
        printf("Enter the number of times you want series to run.\n");
        scanf("%d", &b);
        printf("x     sum\n");

        for(x=1,sum=0;x<b+1;x++)
        {
          printf("%d %9.3f\n",x, (sum +=(float)(1/x)));
        }
        return 0;

    }
#包括
内部主(空)
{
int b,x;/*b是程序运行的次数,x是计数*/
浮点数;
printf(“输入希望系列运行的次数。\n”);
scanf(“%d”和“b”);
printf(“x sum\n”);

对于(x=1,sum=0;x而言,括号放错了位置,因此对
1/x
进行整数除法,对x>1的任何值都得到0

我建议你改变:

      printf("%d %9.3f\n",x, (sum +=(float)(1/x)));
致:


问题是在执行
1/x
时进行整数除法,只要
x
大于1,就会得到0。即使以后将其转换为
float
,也会造成“损坏”。一个简单的修复方法是将除法更改为
1.0f/x

,因为您已将x声明为int,(1/x)当x为1时返回1,当x>1时返回0。因此,总和保持为1。因此得到相同的结果


因此,将
(1/x)
更改为
1.0f/x
,这样结果将以浮点形式返回这里您正在计算的
1/x
中的小数被截断。在原始值被截断后将其转换为浮点是没有意义的

因此,将此更改为:-

printf("%d %9.3f\n",x, (sum +=(float)(1/x)));

表达式
(1/x)
始终是整数除法。对于第一次运行,这将是
1/1
给你1。但是,下一轮它将是
1/2
,它是0。基本上对于
1/x
其中x>1,答案将是零


要解决这个问题,请将表达式写成
1.0/x
,这将导致
x
被提升为双精度,使您可以进行双精度除法。

两个问题:一个枯燥,一个有趣

1)
1/x
将是不精确的,因为1和x都是整数类型,因此计算将以整数算法进行。强制转换所做的只是将结果的整数类型转换为浮点。要解决此问题,请写入
1.0/x
。然后在除法之前将“x”提升为浮点

2) 对于
循环,您应该颠倒
的顺序:

 sum = 0.0;
 for(x = b; x >= 1; --x)
(我还从for循环中移动了初始化或
sum
,因为
sum=0
float
类型的表达式,但是
x=b
int
类型的表达式,所以不应该使用逗号运算符,因为它们具有不同的数据类型。)

原因很微妙:您应该只添加类似大小的浮点。按我的方式循环意味着先添加较小的值


如果
b
的值很高,效果会很明显;试试看。你原来的方法总是低估了总和。

试着打印出
(float)(1/x)
。看来你们中的大多数人都走得这么快……不管是哪种方式……我想你们是第一个正确回答的人……不知道为什么它不让我……是的……我现在明白了……哎呀,你们还是会(系统地)得到答案的由于浮点不精确而导致的结果被低估。请参见我的答案;-)是的,这是一个单独的问题,但你是对的,颠倒循环顺序将提供更好的数值稳定性。@Paul R;是的,你是对的;OP抱怨和总是一,而你的答案解决了这个问题。但是我花了一天的时间来解决mi带来的问题使用浮点运算,我无法控制自己。但我并没有在for循环中添加浮点,所以我真的需要更改吗?在这里添加它们:sum+=(float)(1/x)。
printf("%d %9.3f\n",x, (sum += 1.0f/x));
 sum = 0.0;
 for(x = b; x >= 1; --x)