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