【问题标题】:How to test if double value is not negative如何测试双值是否为负
【发布时间】:2016-11-10 00:37:35
【问题描述】:

我没有在谷歌上搜索这个,所以我想问如何正确和确定地测试双精度值大于或等于 0。

我不知何故知道双有问题的零值(± 0.0 等),我需要检查我的双变量是否大于或等于 0。否则,如果它不是负数,可能会更好。

问题是,我可以这样测试吗:
if(myDoubleValue >= 0.0)(我认为这可能有问题)
或者这样会更好:
if(!(myDoubleValue < 0.0))

对不起,可能是愚蠢的问题。

【问题讨论】:

  • 为什么你认为第一个选项有问题?
  • @yman 好吧,只是一种感觉。我认为这两个选项不会给出完全相同的结果,但我可能是错的,这就是我问的原因。

标签: c++ c++11 double


【解决方案1】:

±0 值仅表示该值是从负值还是正值接近 0(当然,这并不是对所有情况的保证)。但是,它仍然 0。

因此,x >= 0 将包括 +0 和 -0 零。您可以在一个简单的程序中自行测试。 :)

IEEE754 standard 中明确表示

比较应忽略零符号(因此 +0 = -0)。

大多数处理器和实现都使用 IEEE754,因此对于所有实际目的,-0 >= 0 是正确的。

对于任何数字 x,x >= 0!(x < 0) 是相同的。 +0 和 -0 也是如此。


正如 aschepler 在 comment 中指出的那样,当 x 为 NaN(非数字)时,x >= 0!(x < 0) 的两个测试不同。 NaN 总是不同于任何实数,因此当 x 为 NaN 时,!(x < 0) 将为真。 如果您的计算中可能出现 NaN,您可能需要单独处理。

【讨论】:

  • 我编辑了问题,我忘了在文本中说,我需要大于或等于 0。
  • 如果x 不是数字,!(x < 0)x >= 0 是不同的。
  • 感谢 MartinNyolt 和 @aschepler,这是帮助。而文字 0.0 并没有以某种方式改变这一点?
  • 非常感谢,所以符号在这里并不重要,我担心 -0 因为我只想要不负(正和零)并且 -0 不是负,它仍然只有 0 所以没关系。
【解决方案2】:

是的,您可以同时测试两者
如果(myDoubleValue >= 0.0)

if(!(myDoubleValue

【讨论】:

  • 我知道我可以测试两者,但它会为每个可能的双精度值给出完全相同的结果吗?尤其是 0 左右。
  • 是的,对于每个可能的双精度值,即使在 c 和 c++ 编程语言中大约为零,它也会给出完全相同的结果。
【解决方案3】:

我相信this article 可能会回答您的问题。零有自己不可互换的表示。值是正数还是负数由符号位表示。

引用文章:

如果每个位都为零(符号位无关),则该数字被视为零。

因此正/负零必须对比较操作没有影响 - 它仍然是零。

【讨论】:

  • 谢谢,我会尝试阅读,但我现在没有心情阅读任何长篇文章。
  • 请在问题中包含您发布的链接的相关信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2022-08-07
  • 2011-02-27
  • 2011-09-17
  • 1970-01-01
相关资源
最近更新 更多