2010-01-18 117 views
4

我正在使用asin来计算角度。该代码是如下:如何从有符号零清除负号

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

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

+0

说实话,我没有看到这样做的理由。无论如何,Asin会返回角度-pi ... pi。 – MaR 2010-01-18 10:30:01

回答

3

包括<cmath>和使用abs功能上的返回值,如果你希望所有的结果是积极的,或检查您的返回值为-0.0,并采取它的abs值,只是这种情况。

abs function (c++ reference)

+0

如果将abs()应用于输入值,您将得到错误的结果... – 2010-01-18 09:31:34

+0

是的,谢谢。我意识到我的错误。已经更新了答案。 – 2010-01-18 09:32:13

6

如果你只是想转换-0 0并保留其他不变,只是做一个比较。

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

我不认为使用“==”比较两个双打总是会起作用 – ratnaveer 2010-01-18 09:37:02

+1

浮点值的比较应该以某种精度完成,即晶圆厂(a-b)ε。使用'=='显然是错误的。 – MadH 2010-01-18 09:42:26

+14

它适用于这种情况。我相信提问者只想将'-0.0'转换为'0.0',而不是'[-epsilon,0]'中的浮点范围。只有一个'-0.0',唯一的值== 0.0是'-0.0'和'0.0',因此可以使用==。 – kennytm 2010-01-18 09:45:39

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

你可以做到以下几点:

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

我有同样的问题,并且为我工作。

0

您可以使用以下方法。

value = Float.compare(value, -0.0f) == 0 ? 0.0f : value ; 
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); 

这将产生 “+0000.0000” 根据需要(当然 “-0000.0001” 为x = -0.50001E-4的)。