簡體   English   中英

如何擺脫簽名零的減號

[英]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值,就這種情況而言。

abs函數(c ++參考)

您可以使用以下方法。

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM