※ 引述《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
所以兩者相等, 兩個不等的比較都不成立