IEEE-754 と x86 について話している他の回答に追加するだけです。この問題は、見た目よりもさらに複雑です。IEEE-754 には 0.1 の表現が「1 つ」ではなく、2 つ存在します。最後の桁の切り上げまたは切り上げのいずれかが有効です。x86 は内部の浮動小数点計算に 64 ビットを使用しないため、この違いが実際に発生する可能性があります。実際には 80 ビットを使用しています。これは倍精度拡張精度と呼ばれます。
そのため、x86 コンパイラだけでも、同じ数値が 2 つの異なる方法で表現されることがあります。これは、バイナリ表現を 64 ビットで計算するものと、80 を使用するものがあるためです。
実際、同じコンパイラでも、同じマシンでも発生する可能性があります。
#include <iostream>
#include <cmath>
void foo(double x, double y)
{
if (std::cos(x) != std::cos(y)) {
std::cout << "Huh?!?\n"; //← you might end up here when x == y!!
}
}
int main()
{
foo(1.0, 1.0);
return 0;
}
なぜでcos(x) != cos(y)
あってもx == y
参照してください。詳細については。