哈喽大家好,学过c语言的小伙伴们一定遇到过这么一道分式求和题,
计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值
二话不说直接上代码,这段代码的实现逻辑是通过控制sign符号的正负变化来实现分式求和,大家发现这段代码的问题了吗??
#define _CRT_SECURE_NO_WARNINGS 1
//计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值
#include<stdio.h>
int main()
{
int i, sign=1.0;
double sum=0;
for (i = 1; i <= 100; i++)
{
sum += sign / i;
sign = -sign;
}
printf("sum = %lf\n", sum);
return 0;
}
来看运行结果:
看起来好像没什么问题,为了求分式和,还用了双精度浮点型,但是结果为什么结果与预期有出入呢?
经过我的排查,问题出现在这句代码上
sum += sign / i;
改为:
sum += sign * 1.0 / i;
后,运行结果
这是什么原因呢?为什么在数学上一个小小的1.0,乘与不乘不影响数值的变化,而在计算机上,却能产生不同的结果呢?
原来在c语言中,进行除运算,常常出现精度丢失的情况,小伙伴们在编程过程中有遇到过精度丢失的情况吗?我们可以在评论区互相讨论,共同学习。