неожиданные значения от деления - PullRequest
1 голос
/ 29 апреля 2011

Я получаю неожиданное значение из следующего кода:

- (void) test
{
int target = 0;  
int received = 0;

float result = (float)received/target;

NSLog(@"%.0f",result);
}

в консоли печатается "nan". Целевые и полученные значения могут измениться. но когда оба равны 0, проблема создается. Я хочу отобразить значение результата на этикетке, но вместо значения с плавающей точкой печатается nan.

что не так в коде?

Спасибо ...

Ответы [ 5 ]

6 голосов
/ 29 апреля 2011

IEEE 754 определяет, что результатом 0.0 / 0.0 является (беззвучный) NaN.

Положительное число с плавающей точкой, деленное на ноль, дает положительную бесконечность. Отрицательный дивиденд возвращает отрицательную бесконечность.

3 голосов
/ 29 апреля 2011

Вы делите на ноль, что, как правило, является недопустимой арифметической операцией, в этом случае приведет к исключению в FPU (из-за IEEE 754, который обрабатывает арифметику с плавающей запятой в микропроцессорах), и результатом будет NaN, что означает «Не число '.

Переменная 'target' должна иметь значение, которое отделено от нуля, иначе деление никогда не будет выполнено правильно. Раньше деление на ноль было верным способом вызвать сбой процесса.

Чтобы поймать Nan, вы можете включить math.h и использовать функцию isnan (), чтобы принять решение продолжить обработку ошибок или регулярный поток.

2 голосов
/ 29 апреля 2011

Вы можете поймать значение с помощью метода

isnan()

Требуется дубль и возвращает бул. Вы можете изменить свой код так, чтобы он работал:

- (void) test
{
    int target = 0;  
    int received = 0;

    float result = (float)received/target;

    if (isnan(result))
    {
        result = 0;
    }
    NSLog(@"%.0f",result);
}
0 голосов
/ 30 апреля 2011

Еще одна заметка, которая еще не упомянута в других ответах.

Линия ...

float result = (float)received/target;

... сначала приводит к получению (float), а затем делит на целочисленное значение. Я не знаю об остальных вас, но я не знаю, что компилятор делает с этим. Я должен был бы искать это.

С другой стороны, я знаю, что делает компилятор, когда вы делите int на int или float на float, ... не просматривая его.

Итак. Ради будущих читателей вашего кода я призываю вас переформулировать вашу строку кода как int-by-int или float-by-float. Если вы имеете в виду float-by-float, то будущая читательская строка будет легче понять:

float result = (float) received / (float) target;
0 голосов
/ 29 апреля 2011

Если вы делите на ноль, результат считается неопределенным для языка программирования, в математике он называется бесконечностью. См. , * , , и , * 1006. * .. А nan означает NotANumber ..

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