Возможный дубликат:
Какое первое целое число не может быть точно представлено числом с плавающей запятой IEEE 754?
Во-первых, это вопрос домашнего задания, просто чтобы сразу все прояснить. Конечно, я не ищу решение, которое кормят ложкой, просто, может быть, небольшой указатель в правильном направлении.
Итак, моя задача — найти наименьшее положительное целое число, которое нельзя представить в виде числа с плавающей запятой IEEE-754 (32 бита). Я знаю, что проверка на равенство для чего-то вроде «5 == 5.00000000001» не удастся, поэтому я подумал, что просто переберу все числа и проверю это следующим образом:
int main(int argc, char **argv)
{
unsigned int i; /* Loop counter. No need to inizialize here. */
/* Header output */
printf("IEEE floating point rounding failure detection\n\n");
/* Main program processing */
/* Loop over every integer number */
for (i = 0;; ++i)
{
float result = (float)i;
/* TODO: Break condition for integer wrapping */
/* Test integer representation against the IEEE-754 representation */
if (result != i)
break; /* Break the loop here */
}
/* Result output */
printf("The smallest integer that can not be precisely represented as IEEE-754"
" is:\n\t%d", i);
return 0;
}
Это не удалось. Затем я попытался вычесть целое число «i» из «результата» с плавающей запятой, то есть «i», надеясь получить что-то вроде «0,000000002», которое я мог бы попытаться обнаружить, но это тоже не удалось.
Может ли кто-нибудь указать мне свойство с плавающей запятой, на которое я могу положиться, чтобы получить желаемое условие разрыва?
-------------------- Обновление ниже ---------------
Спасибо за помощь в этом! Здесь я узнал несколько вещей:
Моя первоначальная мысль была действительно правильной и определила результат на машине, на которой она должна была работать (Solaris 10, 32-разрядная), но не работала в моих системах Linux (64-разрядная и 32-разрядная).
Изменения, которые добавил Ханс Пассант, заставили программу работать и с моими системами, здесь, кажется, есть некоторые отличия платформы, которых я не ожидал,
Спасибо всем!