如果x和y是 IEEE 754 浮点数(单精度或双精度),我们可以有
x * y == y
Run Code Online (Sandbox Code Playgroud)
其中x != 1and y != 0(and nory等于+inf, -inf, or nan)。
是的; 当您接近极小的因子和/或非正规数时,可能会发生这种情况。
例子:
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));
Run Code Online (Sandbox Code Playgroud)
产量
x: 1.0000001
y: 1E-41
True
x*y: 1E-41
Run Code Online (Sandbox Code Playgroud)
(dotnetfiddle 与 .NET Core 3.1)
所有数字都是明确定义的,但不能以这种精度进行乘法运算。
有趣的事实:使用 .NET Framework 4.7.2 运行相同的结果会产生以下结果:
x: 1
y: 9.999666E-42
False
x*y: 9.999666E-42
Run Code Online (Sandbox Code Playgroud)
(dotnetfiddle 与 .NET Framework 4.7.2)
因此,对于非常小的数字,实现的行为会有所不同。