我正在使用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