在 Visual Studio 2019 中使用 numeric_limits 的 C++ long double min/max 值错误

1 c++ long-double numeric-limits

使用 Visual Studio Community 2019 v16.4.2 和它在 64 位 Win10 上附带的最新内容。

在测试各种数据类型限制时遇到了一个奇怪的错误,numeric_limits 无法区分 double 和 long double 最小/最大值。使用带有默认 GNU Mac 工具链的 NetBeans 显示更合理的结果。

    // Type limits: float
    std::cout 
        << "MIN float        " << numeric_limits<float>::min() << "\n"
        << "MAX float        " << numeric_limits<float>::max() << "\n"
        << "MIN double       " << numeric_limits<double>::min() << "\n"
        << "MAX double       " << numeric_limits<double>::max() << "\n"
        << "MIN long double  " << numeric_limits<long double>::min() << "\n"
        << "MAX long double  " << numeric_limits<long double>::max() << "\n";
Run Code Online (Sandbox Code Playgroud)

控制台输出

MIN float        1.17549e-38
MAX float        3.40282e+38
MIN double       2.22507e-308
MAX double       1.79769e+308
MIN long double  2.22507e-308    // NetBeans on Mac 3.3621e-4932
MAX long double  1.79769e+308    // NetBeans on Mac 1.18973e+4932
Run Code Online (Sandbox Code Playgroud)

flo*_*tan 8

C++ 标准只要求long double至少具有 的精度double,因此您的程序输出没有任何问题。

引用标准(第 3.9.1 节,点亮 8):

共有三种浮点类型:float、double 和 long double。double 类型提供的精度至少与 float 一样,long double类型提供的精度至少与 double 一样。 float 类型的值集是double 类型的值集的子集;double 类型的值集是 long double 类型的值集的子集。浮点类型的值表示是实现定义的。整型和浮点型统称为算术类型。标准模板 std::numeric_limits (18.3) 的特化应指定实现的每个算术类型的最大值和最小值。