我如何防止或处理-0值?

时间:2010-02-01 06:14:57

标签: visual-c++

我的程序似乎产生了一些-0值来代替应该为0的值。如何阻止我的程序输出这些值?

是否像检查值是否等于-0并将其重新分配为零一样简单?还是有更优雅的解决方案?

3 个答案:

答案 0 :(得分:1)

http://en.wikipedia.org/wiki/Signed_zero说: 根据IEEE 754标准,负零和正零应与通常(数值)比较运算符相等。

我会调查是否可以将变量转换为32位int(对于float)或64位int(对于double)并查看它们是否等于0x8000 ......

答案 1 :(得分:1)

由于标签显示为visual-c ++,因此您似乎在英特尔或兼容芯片上运行Windows,因此无法使用-0的整数值。也许你有一个负值但非常接近0的浮点值,例如-0.000000000000009,也许你只用几位精度打印它,例如-0.00000。在这种情况下,您可以执行以下操作:

if (x > -0.0000001 && x <= 0) x = 0;

当然,你想用更多的风格来做这件事,但这会给你一个想法。

您的问题的主要文字并未说明Visual C ++或Windows或英特尔。如果您在一台补码机器上运行,则可以使用整数值-0。通常-0比较等于+0,因此以下代码将整数零标准化:

if (y == 0) y = 0;  // This looks redundant but it turns a -0 into a +0

答案 2 :(得分:0)

听起来像是在使用浮动数字。 -0应该是一个非常小的负数,如-0.0000001,它被你的打印功能截断了。您可以通过一个好的调试器来检查它,或者将raw float / double打印为十六进制字节。

您可以进行一些比较并将其设置为零。 (例如,if(n&lt; 0&amp; n&gt; -0.0001)n = 0;)

(编辑)也许你正在做这样的事情:

#include <stdio.h>
#include <float.h>
#include <iostream>

int main()
{
    double d = -DBL_MIN;
    std::cout << std::fixed << d << std::endl;
    return 0;
}

// output: -0.000000

也许你可以尝试在float / double中打印出真正的值。也就是说,

cout << *(__int64)&d; // if d is double
cout << *(__int)&f;   // if f is float

印刷有助于了解发生的事情。