如何摆脱签名零的减号
我用asin来计算角度。 代码如下:
double FindAngle(const double theValue) { return asin(theValue); }
当参数theValue = -0.0时,FindAngle返回-0.0(有符号零)。 现在,我如何摆脱返回值的减号。
您可以执行以下操作:
double FindAngle(const double theValue) { return (asin(theValue) + 0.0); }
我有同样的问题,这对我有用。
如果您只想将-0转换为0并保持其他不变,请进行比较。
double FindAngle(double value) { double res = asin(value); if (res == 0.0) res = 0.0; return res; }
包括
并在返回值上使用abs
函数,如果你想要所有结果都是正数,或者检查你的返回值是否等于-0.0并获取它的abs
值,就这种情况而言。
abs函数(c ++参考)
double FindAngle(const double theValue) { return abs(asin(value)); }
您可以使用以下方法。
value = Float.compare(value, -0.0f) == 0 ? 0.0f : value ;
你确定签名零是你的问题吗? (在这种情况下,如上面FacundoJ所提出的那样,向它添加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
”(但对于x = -0.50001E-4
,当然是“ -0000.0001
”)。