【问题标题】:Why am I getting unexpected output when using floor with pow?为什么我在使用带有 pow 的 floor 时会得到意外的输出?
【发布时间】: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 - 或简单地从类似的东西折叠),其中编译器在第一种情况下没有进行相同的优化(原因我不太明白,但编译器有时会以神秘的方式工作)

标签: c++ pow floor


【解决方案1】:

实际上,int 的最大值是 2,147,483,647,因此应该没有溢出或截断(这是一个 int)。而我的输出正是:

1000000000 1000000000 1000000000

【讨论】:

猜你喜欢
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多