бесконечен при делении на число с плавающей точкой, которое меньше 1? - PullRequest
0 голосов
/ 06 января 2012

у меня есть этот код:

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

когда samplesPerPeriod равен 35, я получаю бесконечность в этом журнале:

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

не могу ли я разделить на число, которое меньше 1?это связано с тем, что это функция переменного тока в классе цели c?

спасибо.

Ответы [ 5 ]

2 голосов
/ 06 января 2012

Вам необходимо использовать числа с плавающей запятой для строки

time=samplesPerPeriod/44;

Так что вместо этого сделайте

time=(float)samplesPerPeriod/44.0;

Если samplesPerPeriod является int, то деление будет целочисленным делением.Это означает, что вы действительно делаете

35/40

, который как int равен 0, то есть , затем , преобразованный в float со значением 0.0.Таким образом, вам нужно привести samplesPerPeriod к числу с плавающей точкой перед делением, и для безопасности и ясности используйте значение float 44.0 в знаменателе.

1 голос
/ 06 января 2012

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, тогда оно будет рассматриваться как число с плавающей запятой

1 голос
/ 06 января 2012

Какой тип var samplesPerPeriod?Я думаю int.Ваш код должен быть примерно таким, чтобы он работал правильно:

time = (float)samplesPerPeriod / 44.0;
1 голос
/ 06 января 2012

Я предполагаю, samplesPerPeriod является целочисленным типом. Если это так, то samplesPerPeriod/44 выполняется в целочисленной математике, поэтому результат равен 0. Затем вы выполняете 1 / 0.0, что является бесконечностью.

Чтобы исправить это, выполните одно из следующих действий:

time = (float)samplesPerPeriod / 44;
time = samplesPerPeriod / 44.0;
time = (float)samplesPerPeriod / 44.0;
0 голосов
/ 06 января 2012

Предполагается, что 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. Это может иметь решающее значение, например, если ваш процессор может выполнять FPU одинарной точности. Использование литерала double приведет к программной эмуляции для разделения операндов типа double. Обратите внимание, что gcc имеет возможность предупреждать в таких случаях:

-Wdouble-promotion

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...