1

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

在测试各种数据类型限制时遇到了一个奇怪的错误,numeric_limits 无法区分 double 和 long double min/max 值。使用带有默认 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";

控制台输出

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
4

2 回答 2

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) 的特化应指定实现的每种算术类型的最大值和最小值。

于 2020-01-06T12:25:20.053 回答
1

long double并且double使用 Visual Studio 等效。

两者doublelong double包含 64 位:1 位符号,11 位指数,52 位尾数。其范围为 +/-1.7E308,精度至少为 15 位。

这符合 c++ 标准。它只需要long double至少具有double. 请参阅此处以获取官方参考。

于 2020-01-06T12:25:05.850 回答