C# 当零是除数时,为什么要假定它为正数?

C# 当零是除数时,为什么要假定它为正数?,c#,math,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) 我们如何

请检查以下代码

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
)。但这与
语句(3)
相矛盾,因为
zero2
也等于零(也应假定为正小数)

2) 它总是假定为某个正的小数值。这与陈述(1)相矛盾(如果
zero1
为正,则
zero2
应为负)

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


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

双精度类型具有不同的正零和负零值

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

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


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

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

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

它保留了符号(x/y)=(符号(x)或异或符号(y))的规则。我认为,矛盾是,即使这是真的
-0==+0
这不是真的:
3/-0==3/+0
使用
Math.sign
也许?@JonSkeet
Math.sign(-0)
返回0。谢谢你,古芙。我怎么知道零是正的还是负的?用它除以一个数字,然后检查结果是否为正?或者其他任何明确的方式?@serdar,这有关系吗?只需检查
IsInfinity
@塞尔达:有一些方法可以检查它:这是对我认为的评论的回答。非常感谢。