为什么当零是除数时,它被假定为正数

本文关键字:为什么 | 更新日期: 2023-09-27 18:28:56

请检查以下代码。

double zero1 = 0;
double zero2 = -zero1;
bool test = zero1 == zero2;    // true                       (1)
double number1 = 3 / zero1;    // positive infinity          (2)
double number2 = 3 / zero2;    // negative infinity          (3)

我们如何解释这种矛盾?就我所能想到的

1) 当它是除数时,它被假定为一些正的小数字(如double.Epsilon)。但这与statement (3)相矛盾,因为zero2也等于零(也应假定为正数)。

2) 它总是被假定为一些正的小数字。这与语句(1)相矛盾(如果zero1为正,则zero2应为负)

3) 或者分裂是不安全的。有时3/0也可能给我负无穷大。

正确的方法和解释是什么?

为什么当零是除数时,它被假定为正数

Double类型具有不同的正零和负零值。

当你比较一个正零点和一个负零点时,它们是相等的。不管符号是什么,零都等于零。

零就是零,这不是一个很小的值。正零和负零具有相同的精确值,尽管它们具有不同的符号。如果你比较一个很小的正值和一个非常小的负值,它们是不相等的。

当你用零除数时,你会得到正或负无穷大,这取决于操作数的符号。AFAIK,这是唯一一个零的符号给出不同结果的运算。例如,在负零点上使用Math.Sign会返回正零点。

如果你真的在乎,你可以这样做,

bool IsPositive(double value)
{
    const ulong SignBit = 0x8000000000000000;
    return ((ulong)BitConverter.DoubleToInt64Bits(value) & SignBit) != SignBit;
}