[问题] 指数加了转型后取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