如何摆脱签名零的减号

时间:2010-01-18 09:25:59

标签: c++ c floating-point

我正在使用asin来计算角度。代码如下:

double FindAngle(const double theValue)
{
     return asin(theValue);
}

当参数theValue = -0.0时,FindAngle返回-0.0(有符号零)。现在,我如何摆脱返回值的减号。

6 个答案:

答案 0 :(得分:8)

您可以执行以下操作:

double FindAngle(const double theValue)
{
     return (asin(theValue) + 0.0);
}

我遇到了同样的问题,对我有用。

答案 1 :(得分:6)

如果您只想将-0转换为0并保持其他不变,请进行比较。

double FindAngle(double value) {
    double res = asin(value);
    if (res == 0.0) res = 0.0;
    return res;
}

答案 2 :(得分:3)

包含<cmath>并在返回值上使用abs函数,如果您希望所有结果都是正数,或者检查您的返回值是否等于-0.0并取abs它的价值,就这种情况而言。

abs function (c++ reference)

答案 3 :(得分:0)

double FindAngle(const double theValue)
{
    return abs(asin(value));
}

答案 4 :(得分:0)

您可以使用以下方法。

 value = Float.compare(value, -0.0f) == 0 ? 0.0f : value ;

答案 5 :(得分:0)

你确定签名零是你的问题吗? (在这种情况下,按照FacundoJ above的建议添加0.0 - 实际上会解决它。如果你的算术符合IEEE 754,那就是。)

另一方面,如果你的问题是printf("%f", x)产生-0.000000(或类似的类似格式说明符),那么仅添加0.0是不够的:你将获得相同的输出任何小而负的价值。

在这种情况下需要一些实际的编程(至少我知道没有更好的解决方案)。我前几天用了这样的东西:

int snrfmt(char *s, const char *format, double x)
{
    int n, m;
    char z[32];

    n = sprintf(s, format, x);
    m = sprintf(z, format, -DBL_MIN);
    if (n == m && strcmp(s, z) == 0)
        n = sprintf(s, format, 0.0);
    return n;
}

作为sprintf()的替代品:

double x = -1.23E-45;
char nr[80];

(void)snrfmt(buf, "%#+010.4f", x);
puts(nr);

这会产生&#34; +0000.0000&#34;根据需要(当然&#34; -0000.0001&#34;对于x = -0.50001E-4)。