小数表达式的n项之和应该是浮点数时是整数
Posted
技术标签:
【中文标题】小数表达式的n项之和应该是浮点数时是整数【英文标题】:The sum of n terms of fractional expression is an integer when it should be a float 【发布时间】:2020-03-19 14:58:54 【问题描述】:在下面的代码中为什么我没有得到一个有效的结果,除非我输入term = 1.0/n
而不是当term = 1/n
。我已经将术语声明为浮动,这还不够吗?
#include <stdio.h>
int main()
float sum = 0, term;
int n, i;
printf("enter the value of n:\n");
scanf("%d", &n);
term = 1.0 / n;
for(i = 1; i <= n; i++)
sum = term + sum;
printf("Sum = %.3f\n", sum);
return 0;
【问题讨论】:
因为1
是int
,n
也是如此,所以你最终会得到整数除法。使用1.0
会导致浮点除法。
你想达到什么目的?总结1/n
,n
次只会给你1。你想要1 + 1/2 + 1/3 .. + 1/n
吗?
我怀疑你想求和 1/i(或者更确切地说是 C 中的 1.0/i
)。
表达式term = 1/n
的右轴是一个整数。在评估 RHS 时,LHS 的类型无关紧要。
【参考方案1】:
在下面的代码中为什么我没有得到一个有效的结果,除非我输入
term = 1.0/n
,而不是当term = 1/n
。我已将term
声明为float
。这还不够吗?
很遗憾没有。
ISO/IEC 9899:2017 §6.5.5 6 州:
整数相除时,
/
运算符的结果是去掉任何小数部分的代数商。105) 如果商a/b
是可表示的,则表达式(a/b)*b + a%b
应等于a
[...]105) 这通常被称为“向零截断”。
翻译:这两个整数相除的结果是一个整数。
即使将其分配给float
或double
变量也不够,它会在分配之前被截断,解决方案是将小数表达式中的操作数之一转为浮点数或双精度数,例如你做到了。
【讨论】:
以上是关于小数表达式的n项之和应该是浮点数时是整数的主要内容,如果未能解决你的问题,请参考以下文章