C++ __FLT_MAX______________________________________?

C++ __FLT_MAX______________________________________?,c++,gcc,numeric-limits,gcc9,C++,Gcc,Numeric Limits,Gcc9,在GCC 9.1中,当使用浮点类型调用std::numeric_limits的函数时,大多数情况下返回0 这发生在我正在工作的项目中,MSVC、GCC 8.3或Clang 8.0没有问题::epsilon()有时有一个正确的值,但从其他文件调用时,它的计算结果也可能为0 //行末尾的注释值是调试器给定的值 //使变量constexpr不会改变它们的值 auto intMax=std::numeric_limits::max();//{int}2147483647 自动浮动最大值=标准::数值限制

在GCC 9.1中,当使用浮点类型调用std::numeric_limits的函数时,大多数情况下返回0

这发生在我正在工作的项目中,MSVC、GCC 8.3或Clang 8.0没有问题<代码>::epsilon()有时有一个正确的值,但从其他文件调用时,它的计算结果也可能为0

//行末尾的注释值是调试器给定的值
//使变量constexpr不会改变它们的值
auto intMax=std::numeric_limits::max();//{int}2147483647
自动浮动最大值=标准::数值限制::最大值();//{float}0
自动浮动PSILON=std::数值限制::epsilon();//{float}0
自动浮动最小值=标准::数值限制::最小值();//{float}0
自动浮动最低=标准::数值限制::最低();//{float}-0
auto doubleMax=std::numeric_limits::max();//{double}0
自动双epsilon=std::numeric_limits::epsilon();//{double}2.2204460492503131e-16
auto doubleMin=std::numeric_limits::min();//{double}0
auto doubleLowest=标准::数值限制::最低();//{double}-0
std::cout因此错误来自(至少间接地)预编译头,我们将其与cotire一起用于CMake

这些标题中包含的每个文件(手动单独包含在“有问题”的文件中)都没有重现该问题

虽然有点奇怪,但除了科泰尔,目前我看不到任何可行的解释。根据以下线索,显然已经有报告称其存在限制问题:

临时解决方案是使用GCC 9.1+禁用预编译头。如果有人遇到过同样的问题,如果你知道原因和原因,请随时添加评论或回答


感谢乔瓦尼、卡米尔和n.m在评论中引导我走向正确的方向

您是否使用破坏浮点数学的编译器标志编译项目?没有特别的,只是
-O3-DNDEBUG-Wall-Wextra-Werror-Wno未知pragmas
我怀疑这与8.3有所不同,除非9.1更改了一些默认行为。我可以尝试使用一些启用的方法,但与
-ffloat store-ffast math
没有任何区别。您可以查看
gcc-dM-E-
\uu DBL\u MAX\uuu
的输出,该命令定义良好(
\define\uu DBL\u MAX\uuu((double)1.7976931348623157081452742731704357e+308L)
)。签入项目(使用CMake)会更困难,因为当我通过-E时,它不会输出任何东西,除了许多
c++:warning:file.cpp.o:linker输入文件未使用,因为链接未完成
Max int        = 2147483647

Max float      = 3.40282e+38
Epsilon float  = 1.19209e-07
Min float      = 1.17549e-38
Lowest float   = -3.40282e+38

Max double     = 1.79769e+308
Epsilon double = 2.22045e-16
Min double     = 2.22507e-308
Lowest double  = -1.79769e+308
Max int        = 2147483647

Max float      = 0
Epsilon float  = 0
Min float      = 0
Lowest float   = -0

Max double     = 0
Epsilon double = 2.22045e-16
Min double     = 0
Lowest double  = -0