为什么当零是除数时,它被假定为正数
本文关键字:为什么 | 更新日期: 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;
}