【问题标题】:Why "is_modulo" is false for double and float?为什么“is_modulo”对于双精度和浮点数是错误的?
【发布时间】:2015-08-26 15:12:42
【问题描述】:

我写了一些代码来检查一个类型是否有模表示:

#include <iostream>
#include <limits>

using namespace std;

int main( )
{
    cout << "Whether float objects have a modulo representation: "
         << numeric_limits<float>::is_modulo << endl;
    cout << "Whether double objects have a modulo representation: "
         << numeric_limits<double>::is_modulo << endl;
}

输出:

Whether float objects have a modulo representation: 0
Whether double objects have a modulo representation: 0

但我们可以使用fmod()(来自&lt;math.h&gt;)求floatdouble 的模数。那么,如果可以找到浮点数或双精度数的模,为什么is_modulo 为假?

【问题讨论】:

    标签: c++


    【解决方案1】:

    From cppreference

    std::numeric_limits&lt;T&gt;::is_modulo 的值是 true 对于使用模算术处理溢出的所有算术类型 T,也就是说,如果这种类型的加法、减法、乘法或除法的结果将超出范围 [min(), max()],则此类操作返回的值与预期值相差 max()-min()+1 的倍数。

    浮点数is undefined behavior 溢出,因此floatdoublestd::numeric_limits::is_modulofalse

    【讨论】:

      【解决方案2】:

      这与fmod 无关。对浮点值的任意操作是无关紧要的。

      是否有“模表示”就像unsigned ints 自动环绕一样。

      floats 和 doubles 都没有这样做,因此 is_modulofalse

      【讨论】:

        【解决方案3】:

        here所述:

        std::numeric_limits&lt;T&gt;::is_modulo 的值为 true 用模运算处理溢出的算术类型 T,即 是,如果 结果 加法、减法、乘法或 这种类型的划分将超出范围[min(), max()], 此类操作返回的值与预期值不同 max()-min()+1 的倍数。

        所以它没有说“求模”,而是说a + b 的行为方式。浮点运算不会像整数运算那样溢出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-24
          • 2018-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-21
          相关资源
          最近更新 更多