[英]How to get rid of minus sign from signed zero
我用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;
}
包括<cmath>
並在返回值上使用abs
函數,如果你想要所有結果都是正數,或者檢查你的返回值是否等於-0.0並獲取它的abs
值,就這種情況而言。
您可以使用以下方法。
value = Float.compare(value, -0.0f) == 0 ? 0.0f : value ;
double FindAngle(const double theValue)
{
return abs(asin(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
”)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.