【问题标题】:Wrong C++ long double min/max values using numeric_limits in Visual Studio 2019 [duplicate]在 Visual Studio 2019 中使用 numeric_limits 的 C++ long double min/max 值错误 [重复]
【发布时间】:2020-01-06 12:19:05
【问题描述】:

在 64 位 Win10 上使用 Visual Studio Community 2019 v16.4.2 和最新的东西。

在测试各种数据类型限制时遇到了一个奇怪的错误,numeric_limits 无法区分双精度和长双精度最小值/最大值。使用带有默认 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

【问题讨论】:

  • 您期望numeric_limits&lt;long double&gt;::max() 的价值是多少?为什么?
  • “应该是 3.3621e-4932” 根据谁?
  • 运行 GNU Mac 默认工具链的 NetBeans 使用 numeric_limits 为我提供了这些值。很抱歉含糊不清,以前没有使用过堆栈。

标签: c++ long-double numeric-limits


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    long doubledouble 在 Visual Studio 中是等效的。

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

    这符合 c++ 标准。它只需要long double 至少具有double 的精度。官方参考请见here

    【讨论】:

    • 请定义“相同”的含义。它们是不同的类型。
    • 是的,“等价”会更准确,但即使这样也有误解的余地(因为它表明词汇关键字序列 long doubledouble 是等价的,但它们不是)
    • long doubledouble 在 Windows 中是相同的”也不正确。 MinGW-w64 有一个long double,比普通的double 精度更高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多