为什么在除数时将零假设为正数?

时间:2014-11-03 11:27:31

标签: c# math

请检查以下代码。

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也可能给我负无穷大。

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

2 个答案:

答案 0 :(得分:2)

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

当您将正零与负零比较时,它们是相等的。无论符号如何,零都等于零。

零正好为零,它不是一个非常小的值。正零和负零具有相同的确切值,尽管它们具有不同的符号。如果将非常小的正值与非常小的负值进行比较,则它们不相等。

当你将零分割为零时,根据操作数的符号得到正或负无穷大。 AFAIK,这是唯一一个零符号给出不同结果的操作。例如,在负零上使用Math.Sign会返回正零。

答案 1 :(得分:0)

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

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