2013-05-02 80 views
3

我正在計算自由空間損失和擊中障礙。ios問題與日誌計算

這樣做計算:

fslLoss = 36.6 + (20 * log(fromAntenna/5280)) + (20 * log(serviceFreq)) 

凡fslLoss是float和fromAntenna和servicefreq是整數:

NSLog(@"the freespace Loss is %0.01f", fslLoss); 

結果是 「自由空間損耗是-inf」

的問題似乎出現在20log(來自天線/ 5280)部分,因爲沒有它我會得到正常的結果。

順便說一句...嘗試log10具有相同的結果。

感謝您的幫助,

padapa

+0

這將是非常輕微更有效的做:'fslLoss = 36.6 + 20 *(日誌(fromAntenna/5280.0)+日誌(serviceFreq)); '。這消除了一個乘法。 – rmaddy 2013-05-02 02:14:22

回答

4

你說fromAntenna是一個整數,所以fromAntenna/5280將與整數算法來計算。這意味着它會被四捨五入(技術上來說),可能不是你想要的。

與修復:

log((double) fromAntenna/5280.0) 
+0

'serviceFreq'沒有相同的問題,因爲它在調用函數時會自動提升;沒有爲'int'定義的'log'函數。 – Dave 2013-05-02 01:44:30

+0

'log(fromAntenna/5280.0)'已經可以做到這一點,因爲在這種情況下,編譯器會自動將'fromAntenna'提升爲double。沒有明確的演員需要。 – JustSid 2013-05-02 01:47:47

+0

是真實的,但我個人更傾向於將所有事情都明確表達出來。值得注意的另一件事是,如果'float'精度應該被用來代替'double',它應該是'5280.0f'。 – Dave 2013-05-02 01:49:29

4

log(0)是-inf。對數內的整數除法可以是零。使用fromAntenna/5280.0進行浮點除法。

2

編譯器正確使用fromAntenna & serviceFreq作爲整數,並且當fslLoss是一個浮點數時不會給出好的結果。使用一些浮動蒙上,你就會有更好的運氣:

fslLoss = 36.6 + (20 * log((float)fromAntenna/5280)) + (20 * log((float)serviceFreq)); 
+0

Mike,感謝您的幫助。雖然你是對的,我只需要1或2位數字精確的這個應用程序。 – padapa 2013-05-02 02:08:09