除以小于1的浮点数时是无穷大?

时间:2012-01-06 17:51:33

标签: objective-c c

我有这段代码:

 float f;
    float time;
    time=samplesPerPeriod/44;
    f=(1/time)*1000;

当samplesPerPeriod为35时,我在此日志中获得无限:

NSLog(@"frequency:%f Hz",f);

我不能分成一个小于1的数字? 是否与目标c类中的c函数有关?

谢谢。

5 个答案:

答案 0 :(得分:2)

您需要为行

使用浮点数
time=samplesPerPeriod/44;

所以改为

time=(float)samplesPerPeriod/44.0;

如果samplesPerPeriodint,那么除法将是整数除法。这意味着你真的在做什么

35/40

int0然后转换为值float的{​​{1}}。因此,您需要在分割之前将0.0转换为浮点数,为了安全和清晰,在分母中也使用samplesPerPeriodfloat

答案 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