话不多说,直接上代码
![图片[1],浅谈运算过程中数值损失,网络安全爱好者中心-神域博客网](https://cos.godyu.com/2023/10/image-33.png)
#include<stdio.h>int main(){int n;double sum = 0;scanf("%d", &n);for (int i = 0; i < n; i++){sum += 1 / (2 * i - 1);}printf("%.2lf", sum);return 0;}#include<stdio.h> int main() { int n; double sum = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { sum += 1 / (2 * i - 1); } printf("%.2lf", sum); return 0; }#include<stdio.h> int main() { int n; double sum = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { sum += 1 / (2 * i - 1); } printf("%.2lf", sum); return 0; }
在这段代码中,无论你n的输入为多少,输出永远是1.00,这是为什么呢
众所周知,int类型的数在进行除法时会有数值损失
如10/3=3;而不是等于3.333…而double类型的数就可以保留小数部分,不会造成数值损失
sum += 1 / (2 * i - 1);sum += 1 / (2 * i - 1);sum += 1 / (2 * i - 1);
在这段代码中,1是int类型,(2 * i – 1)也是一个int类型,所以在进行除法运算时,小数部分永远会丢失,输出的结果永远是1.00
解决方法很简单,就是把1改成1.0
sum += 1.0 / (2 * i - 1);sum += 1.0 / (2 * i - 1);sum += 1.0 / (2 * i - 1);
1.0是一个浮点数,浮点/整数=浮点,不会造成数值损失啦
以此篇文章致敬我回答了n次的问题
THE END
暂无评论内容