Re: [问题] 面试遇到的问题

楼主: 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
所以两者相等, 两个不等的比较都不成立
作者: chrisdar   2015-08-01 01:04:00
Q3 真的只是想考 有没看过 IEEE754 而已吧~更正, Q3 考的是 1.IEEE754 2.字面常量
作者: Feis (永远睡不着 @@)   2015-08-01 01:08:00
IEEE 754 不是 C 或 C++ 的必备条件. 还是要看编译器
作者: stupid0319 (征女友)   2015-08-01 01:09:00
是在考组语fld,fcomip 怎么运作的吗?
作者: Feis (永远睡不着 @@)   2015-08-01 01:09:00
要我说的话应该就是对浮点数的危机感而已
作者: chrisdar   2015-08-01 01:12:00
有些编译器会提醒二元比较算子 的 左右方资料宽度不同遇到不会提示的 debug起来真的就完全没有头绪
作者: name2name2 (yang~hi)   2015-08-01 08:20:00
作者: cuteSquirrel (松鼠)   2015-08-01 10:18:00
优质好文
作者: EdisonX (卡卡兽)   2015-08-01 14:51:00
我想问一般在取有效位数是看后一位是 0/1 做 +1 吗?像 0.0011 | 1 看4位,最后是 0.0011 / 0.0100 ?
作者: OSDBNetwork (路人甲)   2015-08-01 15:16:00
高手中的高手
作者: LiloHuang (十年一刻)   2015-08-01 15:25:00
0.7f
作者: Feis (永远睡不着 @@)   2015-08-01 15:54:00
EdisonX: "一般" 的话,默认是往偏差值少的地方移动如果往大往小都一样, 则往双数走. 这例子应该是 0.0100实际上的话应该还是看实作品. 无条件进位或舍去也都是可能如果要研究的话还有正负数可以玩呢~有兴趣的话可以复习一下 " 四舍六入五成双"
作者: EdisonX (卡卡兽)   2015-08-01 21:30:00
谢谢feis
作者: kidbower   2015-08-02 22:38:00
wow

Links booklink

Contact Us: admin [ a t ] ucptt.com