当 x != 1 和 y != 0 时,x * y == y 可以吗?
Could x * y == y when x != 1 and y != 0?
如果 x
和 y
是 IEEE 754 浮点数(单精度或双精度),我们可以
x * y == y
其中 x != 1
和 y != 0
(y
也不等于 +inf
、-inf
或 nan
)。
是;当您接近极端小因素时,可能会发生这种情况 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)
因此,对于非常小的数字,实现的行为会有所不同。
如果 x
和 y
是 IEEE 754 浮点数(单精度或双精度),我们可以
x * y == y
其中 x != 1
和 y != 0
(y
也不等于 +inf
、-inf
或 nan
)。
是;当您接近极端小因素时,可能会发生这种情况 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)
因此,对于非常小的数字,实现的行为会有所不同。