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

atk*_*ins 0 c# ieee-754

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

x * y == y
Run Code Online (Sandbox Code Playgroud)

其中x != 1and y != 0(and nory等于+inf, -inf, or nan)。

Jan*_*ann 7

是的; 当您接近极小的因子和/或非正规数时,可能会发生这种情况。

例子:

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

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