错误C++在Visual Studio 2019中使用numeric_limits的长双精度最小值/最大值

Wrong C++ long double min/max values using numeric_limits in Visual Studio 2019

本文关键字:limits 双精度 最大值 最小值 numeric Visual C++ Studio 2019 错误      更新时间:2023-10-16

使用Visual Studio Community 2019 v16.4.2及其在64位Win10上提供的最新功能。

在测试各种数据类型限制时遇到了一个奇怪的错误,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

c++标准只要求long double至少具有double的精度,所以程序的输出没有错。

引用标准(§3.9.1,第 8 点(:

有三种浮点类型:浮点型、双精度型和长型双精度型。双精度型至少提供与浮点数一样多的精度,而长型双精度型提供的精度至少与双精度一样多。浮点型的值集是双精度类型的值集的子集;双精度类型的值集是长双精度类型的值集的子集。浮点类型的值表示形式是实现定义的。整型和浮点型统称为算术类型。标准模板 std::numeric_limits (18.3( 的专用化应指定实现的每个算术类型的最大值和最小值。

long doubledouble在Visual Studio中是等效的。

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

这与 c++ 标准一致。它只需要long double至少具有double的精度。有关官方参考,请参见此处。