C++ __FLT_MAX______________________________________?
在GCC 9.1中,当使用浮点类型调用std::numeric_limits的函数时,大多数情况下返回0 这发生在我正在工作的项目中,MSVC、GCC 8.3或Clang 8.0没有问题<代码>::epsilon()有时有一个正确的值,但从其他文件调用时,它的计算结果也可能为0C++ __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 自动浮动最大值=标准::数值限制
//行末尾的注释值是调试器给定的值
//使变量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