2013-05-02 68 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