[問題] 指數加了轉型後取ceil()結果不同

看板C_and_CPP (C/C++)作者 (ㄚ隆)時間11年前 (2015/03/18 21:37), 11年前編輯推噓6(6011)
留言17則, 5人參與, 最新討論串1/1
問題(Question): 不懂為什麼把2強制轉型結果會不同,以及使用不同std結果不同 預期的正確結果(Expected Output): 2 2 錯誤結果(Wrong Output): 使用xcode 6.2 2 3 使用$ c++ -o test_ceil test_ceil.cpp 2 2 使用$ c++ -std=c++11 -o test_ceil test_ceil.cpp 2 3 gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) 程式碼(Code):(請善用置底文網頁, 記得排版) #include <iostream> #include <cmath> using namespace std; int main(int argc, char *argv[]) { float r1 = sqrt(pow(3,2)-pow(2,2)); cout << ceil(sqrt(pow(r1,(float)2)-pow(1,2))) << endl;// <---2 cout << ceil(sqrt(pow(r1,2)-pow(1,2))) << endl;// <---3 } 補充說明(Supplement): 如果把sqrt(pow(r1,(float)2)和sqrt(pow(r1,2)單獨用float存出來再放回最後 兩式的話三種編譯環境出來結果都會是2,2 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.167.85.113 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1426685867.A.E00.html

03/18 21:59, , 1F
這只是浮點運算的精度而已吧,他不能保證開根號再平方還是
03/18 21:59, 1F

03/18 22:00, , 2F
原本的值. 可能會差一點點,可能略大也可能略小
03/18 22:00, 2F

03/18 22:02, , 3F
你不要取ceil, 直接印出浮點的值不就知道了?
03/18 22:02, 3F

03/18 22:09, , 4F
感謝樓上,不過我不懂的是為什麼把2強制轉型結果會變呢?
03/18 22:09, 4F

03/18 22:30, , 5F
我是想知道只有我 compiler 不過嗎?我以為會出現
03/18 22:30, 5F

03/18 22:31, , 6F
模擬兩可的覆載...
03/18 22:31, 6F
請問什麼是模擬兩可的覆載呢? ※ 編輯: yea107 (118.167.85.113), 03/18/2015 22:41:28

03/18 22:58, , 7F
pow 函式在 c++ 11 有 ( 3+1 ) 個原型 , 引數可以吃
03/18 22:58, 7F

03/18 22:58, , 8F
float,double,long double, 那 pow(2,2) 會呼叫的是哪個?
03/18 22:58, 8F

03/18 22:59, , 9F
上述問題所出現的bug在IDE常顯示 "模擬兩可的覆載" 之類
03/18 22:59, 9F

03/18 23:00, , 10F
anyway, 我只是想問是不是我手邊編譯器的問題而已 .
03/18 23:00, 10F

03/18 23:07, , 11F
印象中 C++11 會轉整數為 double (特殊規則)
03/18 23:07, 11F

03/19 02:15, , 12F
挖了一下標準, 樓上這規定是在 26.8p11
03/19 02:15, 12F

03/19 02:16, , 13F
詳細如下: 若有 long double 參數則選 long double;
03/19 02:16, 13F

03/19 02:17, , 14F
否則若有 double 參數或整參數則選 double;否則選 float
03/19 02:17, 14F

03/19 02:17, , 15F
這規則適用所有 <cmath> 的函數
03/19 02:17, 15F
喔喔,所以在pow(r1,(float)2)會選到pow(float,float), 而pow(r1,2)會選到pow(double,double) !! 非常感謝!! 我還以為第二種狀況他會把2轉成float然後叫pow(float,float)... ※ 編輯: yea107 (118.167.85.113), 03/19/2015 03:15:56

03/19 03:21, , 16F
嗯, 不過 C++11 開始才有這規定
03/19 03:21, 16F

03/19 21:59, , 17F
原來如此 vc 大概就乾瞪眼了 謝謝。
03/19 21:59, 17F
文章代碼(AID): #1L2N-hu0 (C_and_CPP)
文章代碼(AID): #1L2N-hu0 (C_and_CPP)