我正在使用asin来计算角度。该代码是如下:如何从有符号零清除负号
double FindAngle(const double theValue)
{
return asin(theValue);
}
FindAngle返回-0.0(符号零),当参数theValue = -0.0。现在,我如何摆脱返回值的减号。
我正在使用asin来计算角度。该代码是如下:如何从有符号零清除负号
double FindAngle(const double theValue)
{
return asin(theValue);
}
FindAngle返回-0.0(符号零),当参数theValue = -0.0。现在,我如何摆脱返回值的减号。
包括<cmath>
和使用abs
功能上的返回值,如果你希望所有的结果是积极的,或检查您的返回值为-0.0,并采取它的abs
值,只是这种情况。
如果将abs()应用于输入值,您将得到错误的结果... – 2010-01-18 09:31:34
是的,谢谢。我意识到我的错误。已经更新了答案。 – 2010-01-18 09:32:13
如果你只是想转换-0 0并保留其他不变,只是做一个比较。
double FindAngle(double value) {
double res = asin(value);
if (res == 0.0) res = 0.0;
return res;
}
double FindAngle(const double theValue)
{
return abs(asin(value));
}
你可以做到以下几点:
double FindAngle(const double theValue)
{
return (asin(theValue) + 0.0);
}
我有同样的问题,并且为我工作。
您可以使用以下方法。
value = Float.compare(value, -0.0f) == 0 ? 0.0f : value ;
您确定签名为零是您的问题吗? (在这种情况下,所建议的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
的)。
说实话,我没有看到这样做的理由。无论如何,Asin会返回角度-pi ... pi。 – MaR 2010-01-18 10:30:01