【问题标题】:How can I solve c++ std::rintf issue in gcc如何解决 gcc 中的 c++ std::rintf 问题
【发布时间】:2020-10-07 17:44:00
【问题描述】:

不明白,为什么std::rintf会返回如下结果(g++ 7.3.0):

cout << rintf(14.5f) << endl;            
cout << rintf(15.5f) << endl;             
cout << rintf(16.5f) << endl;

结果:

14
16
16

源数字可以精确地存储在浮点数中,所以这不应该是计算问题。

我检查了源代码,它使用了__builtin_rintf

当然,我可以编写自己的函数,但是这个问题让我很困扰。

【问题讨论】:

  • 运行std::fgetround()时返回什么?
  • 如果您想要 14、15、16 作为结果,请使用 round 而不是 rint

标签: c++ gcc stl cmath


【解决方案1】:

这是“银行家的四舍五入”,也称为“四舍五入”。问题是 x.5 的值正好在 x 和 x+1 之间。有很多可能的方法来处理这样的舍入值。舍入到偶数舍入到偶数,所以 14.5 变成 14,15.5 变成 16,16.5 变成 16。我听说经过大量计算,这会减少累积舍入误差。

其他可能性包括向 0 舍入:14.5 变为 14,-14.5 变为 -14;向负无穷舍入(向下舍入):14.5 变为 14,-14.5 变为 -15;从 0 舍入:14.5 变为 15,-14.5 变为 -15;向正无穷取整(向上取整):14.5 变为 15,-14.5 变为 -14。

通常有一种方法可以选择舍入模式,但标准 C++ 不支持舍入。

【讨论】:

    猜你喜欢
    • 2021-07-23
    • 2010-10-28
    • 2019-11-09
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多