搜索
编程论坛
→
开发语言
→
C++论坛
→
『 C++教室 』
→ 为什么我老是能遇到这种超级简单又奇葩的问题 求大神搭救!!
标题:
为什么我老是能遇到这种超级简单又奇葩的问题 求大神搭救!!
只看楼主
okokpypy
等 级:
新手上路
帖 子:17
专家分:0
注 册:2017-6-1
结帖率:
50%
楼主
已结贴
√
问题点数:5 回复次数:6
为什么我老是能遇到这种超级简单又奇葩的问题 求大神搭救!!
#include <iostream>
using namespace std;
int main() {
float a, f = 4.4;
while (f > 0) {
cin >> a;
f -= a;
cout << f << endl;
}
return 0;
}
请依次输入1.1、2.2、1.1结果竟然不是0
!? (编译器vc 6.0)
求原因~
搜索更多相关主题的帖子:
输入
return
超级
依次
cout
2020-07-13 11:04
rjsp
等 级:
版主
威 望:
507
帖 子:8890
专家分:53117
注 册:2011-1-18
第
2
楼
得分:0
这个,计算机前几节课就应该告诉你
浮点数
不是
实数
吧!
即使没有,那数学课上也讲过
进制
和
科学表达式
,固定位的某个进制的数 转化为另一种进制时,可能是无限循环小数。
浮点数
是一种二进制形式的科学表达式。
一种
可能(非一定)
的情况:
float f = 4.4;
此时 f 的值为 4.400000095367431640625
输入 1.1
a 的值为 1.10000002384185791015625
f -= a; 后 f 的值为 3.30000019073486328125
输入 2.2
a 的值为 2.2000000476837158203125
f -= a; 后 f 的值为 1.1000001430511474609375
输入 1.1
a 的值为 1.10000002384185791015625
f -= a; 后 f 的值为 0.00000011920928955078125
2020-07-13 12:00
okokpypy
等 级:
新手上路
帖 子:17
专家分:0
注 册:2017-6-1
第
3
楼
得分:0
回复 2楼 rjsp
所以浮点数的运算能否得到正确的值 完全看运气?!
这种运算的不稳定性 会否影响到程序的稳定性?
2020-07-13 13:49
倾听心跳
等 级:
论坛游侠
帖 子:39
专家分:153
注 册:2016-6-22
第
4
楼
得分:2
一般对这种运算都采用double,对最后计算的结果会去精确小数位,防止精度溢出的问题
2020-07-13 14:38
rjsp
等 级:
版主
威 望:
507
帖 子:8890
专家分:53117
注 册:2011-1-18
第
5
楼
得分:3
以下是引用
okokpypy
在2020-7-13 13:49:54的发言:
所以浮点数的运算能否得到正确的值 完全看运气?!
这种运算的不稳定性 会否影响到程序的稳定性?
这取决于你认为什么是“正确的值”。在计算机看来,4.4f - 1.1f - 2.2f - 1.1 的结果无论是 小于0、等于0,还是 大于0,都是正确的。
打个比方,你的身高1米8,但我们都知道任何一个物体长度值接近100%的可能是无理数,那我说你身高180cm错了吗?要求精度达到1cm时,正确;要求精度达到1mm时,错误。
你要追求纯数学上的严格相等,你就不应该使用浮点数。比如你可以用 44 - 11 - 22 - 11,其中每个数的量纲你可以在逻辑上认定它们是 0.1。
2020-07-13 14:39
lin5161678
等 级:
贵宾
威 望:
45
帖 子:1136
专家分:3729
注 册:2011-12-3
第
6
楼
得分:0
浮点数相等有固定格式
fabs(x-y) < 自定义精度
表示 x 等于 y
有兴趣了解为什么要用固定格式 请搜索IEEE 754
没兴趣了解就简单背下来
https://zh.
2020-07-13 16:38
青山七海
等 级:
新手上路
帖 子:6
专家分:7
注 册:2020-7-22
第
7
楼
得分:0
回复 3楼 okokpypy
哈哈哈,因为计算机和我们用的进制不同啊,内部是二进制,我们是十进制。
具体的不好说,你自己百度一下,反正就是二进制、十进制无法相互精确表示浮点数。
打个比方把:你说中文,老外说英文。然后你用中文和老外讲话,老外A用英文讲给老外B,然后老外B他再用中文讲回给你,整个句子肯定不会一模一样。
所以,你不可能得到精确结果的。
如果你用过数学软件,会发现它们得到的解都很奇怪。比如你用纸笔算出来结果是1,但是计算机告诉你是0.9999999998.这就是浮点数误差的原因了。
2020-07-23 23:06
7
1/1页
1
参与讨论请移步原网站贴子:
https://bbs.bccn.net/thread-502505-1-1.html
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by
Discuz
, Processed in 0.064856 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved