浮点比较特定

Floating Point comparison specific

我有一个关于浮点比较的具体问题。我知道由于精度问题不建议使用 == 比较,但在这种特定情况下,我想知道在所有情况下/编译器中,此声明是否适用?

float a = 1.02f;
float b = 1.02f;

if(a == b)
{
   print(true);
}
else
{
   print(false);
}

换句话说,如果我精确地分配浮点数,不加、减、降或提升,这是否总是成立?

是的,编译器应该始终如一地将相同的浮点常量转换为相同的值 - 如果不是,则这是编译器中的一个错误 [这当然不是不可能的]。但是,只要您对该值执行任何其他操作(例如从包含 cin 的文件中读取它)或进行简单的数学运算(加 1.0,然后减去 1.0),就不能保证该值与任何值相同更长。

正如所指出的,值 "Not A Number" 或 "NaN" 保证永远不会等于任何东西,除 != 之外的所有比较都将是 false,无论它与什么相比 - 这是浮点规范的一部分。但是所有其他常量,只要您只是使用常量分配给变量,它就应该在整个代码中保持不变。

当然,您不能依赖两个不同的编译器从相同的源代码中得出完全相同的值[很多时候它们会这样做,但有时它们只是对最后一位进行一些不同的舍入,或类似导致差异的东西]