2010-01-18 120 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的)。