我有这段代码:
float f;
float time;
time=samplesPerPeriod/44;
f=(1/time)*1000;
当samplesPerPeriod为35时,我在此日志中获得无限:
NSLog(@"frequency:%f Hz",f);
我不能分成一个小于1的数字? 是否与目标c类中的c函数有关?
谢谢。
答案 0 :(得分:2)
您需要为行
使用浮点数time=samplesPerPeriod/44;
所以改为
time=(float)samplesPerPeriod/44.0;
如果samplesPerPeriod
是int
,那么除法将是整数除法。这意味着你真的在做什么
35/40
,int
为0
,然后转换为值float
的{{1}}。因此,您需要在分割之前将0.0
转换为浮点数,为了安全和清晰,在分母中也使用samplesPerPeriod
值float
。
答案 1 :(得分:1)
我假设samplesPerPeriod
是整数类型。如果是这样,那么samplesPerPeriod/44
将在整数数学中执行,因此结果为0.然后你做1 / 0.0,这是无穷大。
要解决此问题,请执行以下任何操作:
time = (float)samplesPerPeriod / 44;
time = samplesPerPeriod / 44.0;
time = (float)samplesPerPeriod / 44.0;
答案 2 :(得分:1)
哪种类型的变种samplesPerPeriod
是?我想int
。您的代码应该是这样的,以便正常工作:
time = (float)samplesPerPeriod / 44.0;
答案 3 :(得分:1)
35/44导致0.0因为
- in case of = operator right side is evaluated first and assigned to left.
- 35/44 is 0. (as both are int)
so finally 1/0.0 results in infinite.
使用35f / 44f
,然后它将被视为浮动
答案 4 :(得分:0)
假设samplesPerPeriod
是整数类型
float time;
time = samplesPerPeriod / 44;
然后/运算符的两个操作数都是整数类型,并执行整数除法。
使用float
个操作数执行浮点除法。
使用:
time = samplesPerPeriod / 44.0f;
或
time = (float) samplesPerPeriod / 44;
此外,您的time
对象属于float
类型。使用44.0f(一个float
字面值)而不是44.0(一个double
字面值),可以保证使用float
而不是double
个操作数执行除法。例如,如果您的CPU只能执行FPU单精度,这可能很关键。 double
字面值的使用将强制软件仿真用于double
类型的操作数的划分。请注意,在这种情况下,gcc可以选择警告:
-Wdouble-promotion