【发布时间】:2015-02-13 06:54:30
【问题描述】:
所以,我在我的代码块上运行了这段代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int a;
a=pow(10,9);
cout<<a<<endl;
a=ceil(pow(10,9));
cout<<a<<endl;
a=floor(pow(10,9));
cout<<a<<endl;
return 0;
}
我得到的输出为:
999999999
100000000
100000000
由于截断效应,第一个输出不是 10^9,这意味着 pow(10,9) 类似于 999999999.99999..,但是这东西的地板怎么是1000000000??
【问题讨论】:
-
在我的机器上它打印了
1000000000三次。另见ideone.com/qLIp33 -
欢迎使用浮点,其中 nothing 看起来像 :-)
-
您使用的是什么机器、编译器和操作系统?您也可以尝试将这三个值打印为十六进制字节吗?
-
pow(10,9)在两个调用中可能会被不同地对待...例如,在 x86 上,当从 80 位寄存器转换为中间 64 位double值时,它可能会向上取整这是floor的输入,而 to-int转换只是截断。 -
回答您的问题的唯一方法是检查编译器的汇编器输出。
trunc(pow(10,9))很可能会变成一个精确的整数计算(乘以 10 * 10,然后它本身给出 10^4,再给出 10^8,然后再乘以 10 - 或简单地从类似的东西折叠),其中编译器在第一种情况下没有进行相同的优化(原因我不太明白,但编译器有时会以神秘的方式工作)