Вопрос по преобразованию типов - PullRequest
0 голосов
/ 10 августа 2011

Вот мой код:

float result;
result = 1.0 + 1/2;
NSLog(@"Result = %f", result);

Почему значение результата 1,000000 вместо 1,5?

Спасибо

Ответы [ 3 ]

3 голосов
/ 10 августа 2011

Вот так катится компилятор Си. Objective-C - это сверхтонкий слой поверх C, поэтому хорошо знать, как работает ваш C.

Все выражения оцениваются в соответствии с приоритетом оператора, а типы никогда не повышаются и не понижаются до последней минуты. Именно так C может обеспечить максимально точные результаты.

Итак, шаги оценки для этого:

float result = 1.0 + 1/2;

Это действительно:

  1. (float)result = (double)1.0 + (int)((int)1 / (int)2);
  2. (float)result = (double)1.0 + (int)0;
  3. (float)result = (double)1.0 + (double)0.0;
  4. (float)result = (double)1.0;
  5. (float)result = (float)1.0;

То, что вы хотите, это выражение:

float result = 1.0f + 1.0f/2.0f;

Тогда вы получите эту оценку:

  1. (float)result = (float)1.0 + (float)((float)1.0 / (float)2);
  2. (float)result = (float)1.0 + (float)0.5;
  3. (float)result = (float)1.5;

Гораздо меньше работы для процессора, и вы получите то, что ожидаете. Повышение скорости заметно только в том случае, если вы используете реальные переменные, а не константы. В действительности ваше исходное утверждение и мои пересмотренные утверждения будут оптимизированы компилятором как:

  • (float)result = (float)1;
  • (float)result = (float)1.5;?
3 голосов
/ 10 августа 2011

Поскольку 1/2 равно 0, потому что это делается с помощью целочисленной математики.

Попробуйте

result = 1.0 + 1.0/2
0 голосов
/ 10 августа 2011

Заменить

result = 1.0 + 1/2;

с

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