Можно ли печатать с плавающей точкой только целочисленную арифметику? - PullRequest
0 голосов
/ 03 мая 2018

Я сейчас читаю о числах с плавающей запятой и наткнулся на следующее упражнение:

Печать числа в десятичном формате. Предполагается, что число с плавающей точкой IEEE 754 single . Должны быть напечатаны все десятичные цифры, в том числе полученные из-за ошибок округления. Например, когда пользователь вводит 0,1, соответствующее значение с плавающей запятой отображается как 0,1000000015 и т. Д.

Возможно ли не использовать операции с плавающей точкой для печати числа с плавающей запятой в десятичном формате? Мне известен самый простой подход: многократно умножать число с плавающей точкой на 10, обрезать его и брать младшую значащую десятичную цифру в целой части. Но для этого требуется умножение и усечение с плавающей запятой.

РЕДАКТИРОВАТЬ: мой главный вопрос о печати дробной части. Это то, что я пытаюсь реализовать.

Шаг 0. Набор:

result = 0
addend = 5

Шаг 1. Найдите начало дробной части числа с плавающей запятой в его двоичном представлении (здесь при выполнении вычислений вручную делалась бы нормализация).

Шаг 2. Отметив начало дробной части, прочитайте биты один за другим слева направо. Вычислить:

if (bit_read = 1)
    result = result * 10 + addend
addend = addend * 5

Повторяйте шаг 2, пока не закончится дробная часть.

Шаг 3. Напечатайте result как целое число.

Будет ли такой алгоритм корректно работать со всем диапазоном нормалей и ненормалей?

1 Ответ

0 голосов
/ 03 мая 2018

Если у вас есть доступ к двоичному представлению вашего числа с плавающей запятой (на вашем «языке агностика»), вы можете читать каждый бит один за другим в строку - и затем анализировать эту строку, используя только целые числа (чтобы распечатать ее как число с плавающей запятой).

Таким образом, в приведенном выше случае ответ: Да

ОБНОВЛЕНИЕ (после редактирования вопроса)

Может быть НАСТОЯЩЕЕ описание представления с плавающей точкой, и его анализ будет полезен в вашем случае.

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