请检查以下代码。
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
也可能给我负无穷大。
什么是正确的方法,解释?
答案 0 :(得分:2)
Double
类型具有正零和负零的不同值。
当您将正零与负零比较时,它们是相等的。无论符号如何,零都等于零。
零正好为零,它不是一个非常小的值。正零和负零具有相同的确切值,尽管它们具有不同的符号。如果将非常小的正值与非常小的负值进行比较,则它们不相等。
当你将零分割为零时,根据操作数的符号得到正或负无穷大。 AFAIK,这是唯一一个零符号给出不同结果的操作。例如,在负零上使用Math.Sign
会返回正零。
答案 1 :(得分:0)
如果你真的在乎,你可以这样做,
bool IsPositive(double value)
{
const ulong SignBit = 0x8000000000000000;
return ((ulong)BitConverter.DoubleToInt64Bits(value) & SignBit) != SignBit;
}