在给定方向上以给定精度圆形打印双精度

时间:2013-09-12 13:36:47

标签: c++ rounding

注意:我知道有一些类似的问题,但我找不到我在这里问的答案。

我想打印一个双精度到一个std :: ostream四舍五入到+ oo或-oo,带有n个小数位。

乘以10 ^ n,floor'ing或ceil'ing,然后将结果乘以10 ^ -n不是一个选项,因为结果可能无法表示。

到目前为止我的内容如下:

#include <iostream>
#include <cfenv>

int main()
{
    double one_third = 1.0/3.0;
    std::cout.precision(4);
    fesetround(FE_DOWNWARD);
    std::cout << one_third << std::endl;
    fesetround(FE_UPWARD);
    std::cout << one_third << std::endl;
}

gcc-4.7.2的输出如下:

0.3333
0.3333

我在期待:

0.3333
0.3334

这个代码有什么问题?

谢谢!

1 个答案:

答案 0 :(得分:3)

编辑:这必须是GCC 4.7.2错误。该代码在GCC 4.8.1中工作正常,但在4.7.2中失败。

此代码(example on ideone.com)适用于GCC 4.8.1:

#include <iostream>
#include <cfenv>

int main()
{
    double one_third = 1.0/3.0;
    std::cout.precision(4);

    std::fesetround(FE_DOWNWARD);
    std::cout << one_third << std::endl;

    std::fesetround(FE_UPWARD);
    std::cout << one_third << std::endl;

    return (0);
}

节目输出:

0.3333
0.3334