Почему последний двоичный бит 0.1f округляется до 1? - PullRequest
5 голосов
/ 15 сентября 2011

Я изучаю курс операционной системы в колледже, и недавно мы узнали, как числа с плавающей запятой представляются в памяти.

Наша домашняя работа о преобразовании плавающих чисел (float s) в их двоичные представления вручную.

например. 200,0234375 выдаст 01000011010010000000011000000000 после длительного процесса преобразования.

Один из вопросов о том, как 0,1f будет представлен в памяти. Итак, я выполнил весь процесс конвертации и закончил так:

00111101110011001100110011001100

С тем, что мы узнали до сих пор, это правильный ответ на вопрос (я спросил учителя).

Но по следующему вопросу нас просят проверить ответ с помощью программы, чтобы увидеть фактическое двоичное представление 0,1f. Реальное представление таково:

00111101110011001100110011001101

(обратите внимание на последний бит)

Затем нас просят угадать, почему это происходит.

Я заметил периодический 0011 при преобразовании числа, и поскольку следующий бит после конечного 0 будет 1, я бы предположил, что компьютер округлит это окончательное 0 до 1, что объясняет разницу.

Итак, я хочу знать, я прав? Компьютер округляет последний бит на основе того, что будет следующим битом при использовании 23 битов мантиссы?

Это домашнее задание, поэтому, если бы вы могли просто направить меня к ответу, если я ошибаюсь, я был бы признателен.

Кроме того, я не смог найти ответ на свой вопрос от Google, используя ключевые слова, которые я мог придумать. Простите, если это дубликат.

Ответы [ 4 ]

3 голосов
/ 15 сентября 2011

Компьютер округляет последний бит на основе того, что будет следующим битом при использовании 23 битов мантиссы?

Да, конечно.По умолчанию компилятор и арифметическая система с плавающей точкой пытаются дать вам правильно округленные результаты.

В качестве аналогии, если бы я попросил вас написать от 2/3 до трех десятичных знаков, вы бы ответили 0,666 или0,667?Это должно быть 0,667, потому что это ближе к истинному ответу.

1 голос
/ 15 сентября 2011

Существует несколько режимов округления.

Вы можете прочитать об этом в Википедии .

Это просто вопрос реализации.C ++ не имеет стандарта для этого.

1 голос
/ 15 сентября 2011

Это будет зависеть от вашей платформы, конкретного оборудования с плавающей запятой и конкретных настроек этого оборудования.

В частности, на платформах x86 конкретное поведение будет зависеть от содержимого FPU или SSEРегистры управляющих слов.

1 голос
/ 15 сентября 2011

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

...