Предыдущая рекомендация кода:
int ceil(float val)
{
int temp = val * 10;
if(val%10)
return (temp+1);
else
return temp;
}
не компилируется: получает сообщение об ошибке «C2296:«% »: недопустимо, левый операнд имеет тип« float »« в строке 4 »if (val% 10)msgstr "потому что вы не можете использовать оператор мод (%) на float или double.См .: Почему мы не можем использовать оператор% для операндов с плавающей запятой и двойного типа? Он также не работает для десятичных значений, точность которых не превышает 1 / 10.
Принимая во внимание, чтопредыдущая рекомендация кода:
int ma_ceil(float num)
{ int a = num;
if ((float)a != num)
return num+1;
return num;
}
работает хорошо, если вы не выходите за пределы значения с плавающей запятой.число = 555555555;или num = -5.000000001 не будут работать, если вы не используете double.
Кроме того, поскольку числа с плавающей запятой и числа с двойными числами хранятся в формате IEEE, сохраненные двоичные представления могут быть неточными.Например:
float num = 5;в некоторых случаях может быть не присвоено значение 5.0000000, а 5.9999998 или 5.00000001.Чтобы исправить предыдущую версию кода, я бы рекомендовал изменить возвращаемое значение, чтобы использовать целочисленную математику, а не полагаться на точность значения с плавающей запятой, следующим образом:
int ma_ceil(float num)
{ int a = num;
if ((float)a != num)
return a+1;
return a;
}