楼主:
LPH66 (-6.2598534e+18f)
2015-08-01 00:46:07※ 引述《caxz ( )》之铭言:
: 问题三
: int main()
: {
: float a = 0.7;
: if(a > 0.7) cout<< "C" <<endl;
: else cout<< "C++" <<endl;
: //以上这段印出C++
: if(a < 0.7)
: cout<< "C" <<endl;
: else
: cout<< "C++" <<endl;
: //以上这段印出C
: }
: 这看似简单但我却想不通....有什么到原因是这样的output ??
____
0.7 无法以二进制有限小数表示, 将其转为二进制是为 0.10110
因此实际上电脑看到的不是 0.7, 而是依照其精确度留存的二进制近似值
取 float 切 24 位有效位数会得到 0.101100110011001100110011 | 0...
因此这个 a 变量实际上存的值是二进制的 0.101100110011001100110011
而单写 0.7 其形态为 double, 切 53 位有效位数得
0.10110011001100110011001100110011001100110011001100110 | 0...
因此 a 跟 0.7 比较即是比较下列两数的大小:
a 0.101100110011001100110011
0.7 0.10110011001100110011001100110011001100110011001100110
由此 a < 0.7 会成立
: 后来又被问到 如果 a 的行型态被改为 double 呢?
: 我刚刚是try了一下 结果都是C++
: 为何会有这种改变呢?
这时这两个数都是 double 的那个 0.7
所以两者相等, 两个不等的比较都不成立
Q3 真的只是想考 有没看过 IEEE754 而已吧~更正, Q3 考的是 1.IEEE754 2.字面常量
作者:
Feis (永远睡不着 @@)
2015-08-01 01:08:00IEEE 754 不是 C 或 C++ 的必备条件. 还是要看编译器
作者:
Feis (永远睡不着 @@)
2015-08-01 01:09:00要我说的话应该就是对浮点数的危机感而已
有些编译器会提醒二元比较算子 的 左右方资料宽度不同遇到不会提示的 debug起来真的就完全没有头绪
作者:
EdisonX (卡卡兽)
2015-08-01 14:51:00我想问一般在取有效位数是看后一位是 0/1 做 +1 吗?像 0.0011 | 1 看4位,最后是 0.0011 / 0.0100 ?
作者: LiloHuang (十年一刻) 2015-08-01 15:25:00
0.7f
作者:
Feis (永远睡不着 @@)
2015-08-01 15:54:00EdisonX: "一般" 的话,默认是往偏差值少的地方移动如果往大往小都一样, 则往双数走. 这例子应该是 0.0100实际上的话应该还是看实作品. 无条件进位或舍去也都是可能如果要研究的话还有正负数可以玩呢~有兴趣的话可以复习一下 " 四舍六入五成双"
作者:
EdisonX (卡卡兽)
2015-08-01 21:30:00谢谢feis
作者: kidbower 2015-08-02 22:38:00
wow