Re: [問題] 面試遇到的問題
看板C_and_CPP作者LPH66 (-6.2598534e+18f)時間10年前發表 (2015/07/31 16:46), 10年前編輯推噓12(12推 0噓 9→)留言21則, 10人參與討論串4/4 (看更多)
※ 引述《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
所以兩者相等, 兩個不等的比較都不成立
---
題外話, 這兩個數精確地轉回十進位是
float -> 0.699999988079071044921875
double -> 0.6999999999999999555910790149937383830547332763671875
---
既然這是面試題
我覺得你只要能答出前一種狀況會一個成立一個不成立
後一種狀況則會都不成立, 應該基本觀念就有了
(前一種狀況改不同的數結果會不同, 例如若改 0.6 則是 a > 0.6 成立
改 0.5 則是 a > 0.5 跟 a < 0.5 都不成立)
--
LPH [acronym]
= Let Program Heal us
-- New Uncyclopedian Dictionary, Minmei Publishing Co.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.39.85
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1438361169.A.590.html
推
08/01 01:04, , 1F
08/01 01:04, 1F
推
08/01 01:07, , 2F
08/01 01:07, 2F
→
08/01 01:08, , 3F
08/01 01:08, 3F
推
08/01 01:09, , 4F
08/01 01:09, 4F
→
08/01 01:09, , 5F
08/01 01:09, 5F
推
08/01 01:12, , 6F
08/01 01:12, 6F
→
08/01 01:14, , 7F
08/01 01:14, 7F
IEEE754 在這個回答裡只是當做二進位科學記號來看而已
浮點數這種東西就算實作不同, 骨子裡都還是科學記號 (這點原 PO 可以記下來)
因此一些科學記號的概念換個底就能通用, 例如有效數字、計算誤差等等
前一種狀況就算浮點數不是 IEEE754, 只要都是科學記號表示就一定會有一大一小
另外 chrisdar 提到的 literal fp 的型態算是隱藏考題
不知道這個的話後一種狀況跟前一種就沒有差別了
所以我才會說合格的回答是「前一種兩者恰有一成立,後一種兩者皆不成立」
※ 編輯: LPH66 (123.195.39.85), 08/01/2015 01:42:09
推
08/01 08:20, , 8F
08/01 08:20, 8F
推
08/01 10:18, , 9F
08/01 10:18, 9F
推
08/01 14:51, , 10F
08/01 14:51, 10F
→
08/01 14:51, , 11F
08/01 14:51, 11F
推
08/01 15:16, , 12F
08/01 15:16, 12F
推
08/01 15:25, , 13F
08/01 15:25, 13F
→
08/01 15:54, , 14F
08/01 15:54, 14F
→
08/01 15:55, , 15F
08/01 15:55, 15F
→
08/01 15:55, , 16F
08/01 15:55, 16F
→
08/01 15:56, , 17F
08/01 15:56, 17F
→
08/01 16:01, , 18F
08/01 16:01, 18F
推
08/01 17:56, , 19F
08/01 17:56, 19F
推
08/01 21:30, , 20F
08/01 21:30, 20F
推
08/02 22:38, , 21F
08/02 22:38, 21F
討論串 (同標題文章)