当 x != 1 和 y != 0 时,x * y == y 可以吗?

Could x * y == y when x != 1 and y != 0?

如果 xy 是 IEEE 754 浮点数(单精度或双精度),我们可以

x * y == y

其中 x != 1y != 0y 也不等于 +inf-infnan)。

是;当您接近极端小因素时,可能会发生这种情况 and/or denormal numbers.

示例:

float x = 1.0000001f;
float y = 0.00000000000000000000000000000000000000001f;
Console.WriteLine("x: " + x);
Console.WriteLine("y: " + y);
Console.WriteLine(x * y == y);
Console.WriteLine("x*y: " + (x * y));

产量

x: 1.0000001
y: 1E-41
True
x*y: 1E-41

(dotnetfiddle with .NET Core 3.1)

所有数字都定义明确,但乘法不能以这种精度进行。

有趣的事实:运行与 .NET Framework 4.7.2 相同产生以下结果:

x: 1
y: 9.999666E-42
False
x*y: 9.999666E-42

(dotnetfiddle with .NET Framework 4.7.2)

因此,对于非常小的数字,实现的行为会有所不同。