因此,在我的 C++ 代码中,我有以下代码行用于调试目的:
if(float1 != float2)
{
std::cout<<float1<<" "<<float2<<std::endl;
}
发生的事情是程序正在进入 if 语句......但是当我打印出两个浮点值时,它们是相同的。但如果它们相同,那么它应该完全绕过这个 if 语句。所以我真的很困惑为什么会这样。
因此,在我的 C++ 代码中,我有以下代码行用于调试目的:
if(float1 != float2)
{
std::cout<<float1<<" "<<float2<<std::endl;
}
发生的事情是程序正在进入 if 语句......但是当我打印出两个浮点值时,它们是相同的。但如果它们相同,那么它应该完全绕过这个 if 语句。所以我真的很困惑为什么会这样。
float
s 可能只是具有非常相似的值。默认情况下,I/O 库将截断浮点值的输出。precision
您可以通过调用以下成员函数来确保获得完整的精度std::cout
:
if(float1 != float2)
{
std::cout.precision(9);
std::cout<<float1<<" "<<float2<<std::endl;
}
现在你应该看到区别了。该值9
是 IEEE 754 32 位浮点数可表示的 base-10 位数(请参阅下面的 @EricPostpischil 评论)。
浮点值通常以二进制格式存储在计算机内存中。同时,您打印cout
的值以十进制格式表示。从二进制浮点表示到十进制表示的转换可能是有损的,具体取决于您的转换设置。这意味着您打印的内容不一定与实际存储在内存中的内容完全相同。这解释了为什么直接比较float1
和float2
可能会说它们不同,而十进制打印输出可能看起来相同。