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

作者: yea107 (ㄚ隆)   2015-03-18 21:37:45
問題(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;// <
作者: bxxl (bool)   2015-03-18 21:59:00
這只是浮點運算的精度而已吧,他不能保證開根號再平方還是原本的值. 可能會差一點點,可能略大也可能略小你不要取ceil, 直接印出浮點的值不就知道了?
作者: yea107 (ㄚ隆)   2015-03-18 22:09:00
感謝樓上,不過我不懂的是為什麼把2強制轉型結果會變呢?
作者: EdisonX (卡卡獸)   2015-03-18 22:30:00
我是想知道只有我 compiler 不過嗎?我以為會出現模擬兩可的覆載...pow 函式在 c++ 11 有 ( 3+1 ) 個原型 , 引數可以吃float,double,long double, 那 pow(2,2) 會呼叫的是哪個?上述問題所出現的bug在IDE常顯示 "模擬兩可的覆載" 之類anyway, 我只是想問是不是我手邊編譯器的問題而已 .
作者: Feis (永遠睡不著 @@)   2015-03-18 23:07:00
印象中 C++11 會轉整數為 double (特殊規則)
作者: LPH66 (-6.2598534e+18f)   2015-03-19 02:15:00
挖了一下標準, 樓上這規定是在 26.8p11詳細如下: 若有 long double 參數則選 long double;否則若有 double 參數或整參數則選 double;否則選 float這規則適用所有 <cmath> 的函數嗯, 不過 C++11 開始才有這規定
作者: EdisonX (卡卡獸)   2015-03-19 21:59:00
原來如此 vc 大概就乾瞪眼了 謝謝。

Links booklink

Contact Us: admin [ a t ] ucptt.com