【问题标题】:Why does double.Parse ignore the sign of zero?为什么 double.Parse 忽略零的符号?
【发布时间】:2011-06-25 16:11:39
【问题描述】:

例如,在:

bool eq = (1 / double.Parse("-0.0")) == (1 / -0.0);

eq 将是 false

double.Parse 必须经历一些麻烦才能显式忽略零符号,即使不这样做几乎不会导致问题。 因为我需要原始表示,所以我必须编写自己的解析函数,它可以处理负零的特殊情况,并将double.Parse 用于其他所有内容。

这不是一个大问题,但我真的很想知道他们为什么决定忽略零的符号,因为在我看来,不这样做并不是一件坏事。

【问题讨论】:

  • 为什么需要零符号?毕竟 IEEE 754 声明 +0 == -0
  • 您的代码示例如何不抛出 DivideByZeroException?
  • @Donal:因为我需要以字节为单位的原始表示,而且它是不同的。 @FishBasketGordo:因为在 IEEE 754 浮点中除以零是合法且定义明确的。
  • @Fish:使用浮点类型时不会引发该异常。 MSDN上是这么说的。 msdn.microsoft.com/en-us/library/…
  • 这是因为 CLR 包含 COMNumber::NumberBufferToDouble() 中的代码,如果指数和尾数都为零,则无论符号如何,该代码都将结果显式设置为 0。你无法改变它。

标签: c#


【解决方案1】:

我不知道 为什么 本身,但有一个潜在的解决方案:如果您在开头看到一个 - 字符,请解析字符串的其余部分,然后将其取反。

【讨论】:

  • 当然可以,尝试将(1 / -0.0) 更改为(1 / 0.0) - 结果将是true 您在考虑NaN 吗?
  • @harold:很奇怪,不,我认为它也不适用于无穷大。 (这样做没有意义。)但是,你是对的,谢谢。
  • +∞ 在任何现代数学解释中都不等于 -∞...
【解决方案2】:

有区别:

  1. double.Parse("-0.0") = 0, 1/0 -> INF

  2. 1/-0.0 -> -INF

但语句 2 中的减号运算符并不表示“-0.0”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2021-04-16
    相关资源
    最近更新 更多