2012-06-24 4 views
0

У меня есть небольшой математический вопрос.Преобразование десятичного в шестнадцатеричный/двоичный

Есть ли способ преобразования десятичного числа (например, 3.14) в шестнадцатеричный или двоичный? Если это возможно, может ли кто-нибудь разместить здесь некоторые ссылки на учебники или exaplanations? (Я не хочу этого для какого-то языка, мне он нужен вообще в математике.) Пожалуйста, помогите.

EDIT:

входных в коде:

0.1 

Выход в ASM код:

415740h 

Другой вход:

0.058 

Другой выход от компилятора:

00415748h 

Но как это было сделано? Как его можно преобразовать?

+0

http://www.wikihow.com/Convert-from-Decimal-to-Binary –

+0

_I не хочу, чтобы он был на каком-то языке, мне он нужен в основном в математике. Checkout: http://math.stackexchange.com/ – Anne

+0

Mr D - Я имел в виду числа с запятой (например, 5,21651526) – user35443

ответ

2

Я не признаю ваши выходные выборки в кодировках чисел с плавающей точкой или других общих представлений .1 и .058. Я подозреваю, что эти числа - это адреса, где ассемблер или компилятор сохранил кодировку с плавающей запятой.

Другими словами, вы написали текст, включающий в себя литерал с плавающей запятой, а ассемблер или компилятор преобразовали этот литерал в кодировку с плавающей запятой, сохранили его на каком-то адресе и затем поместили адрес в инструкцию, которая загружает кодировку с плавающей запятой из памяти.

Эта гипотеза согласуется с тем, что эти два номера отличаются на восемь. Поскольку с плавающей запятой с двойной точностью обычно восемь байтов, второй адрес (0x415748) составлял восемь байтов за первый адрес (0x415740).

Способ для кодирования числа с плавающей точкой примерно так:

Пусть й число, подлежащие кодированию.

Установите s (бит знака) на 0, если x положителен и 1, если x отрицательный. Установите x в абсолютное значение x.

Set е (экспонент) 0. Повторите какие из перечисленных ниже обстоятельств:

  • Если х 2 или больше, добавьте 1 е и разбивают й на 2. Повторять до тех пор, пока х меньше 2.
  • Если х меньше 1, добавить -1 е и умножить х на 2. Повторять до тех пор, пока х, по крайней мере 1.

Когда вы закончите с вышеизложенным, х, по крайней мере 1 и меньше 2. Кроме того, исходное число равно (-1) s · 2 e · x. То есть мы представили число со знаковым битом (s) и показателем двух (e), а значимое (x), которое находится в [1, 2) (включает 1, исключает 2).

Комплект f = (x-1) · 2 . Раунд f до ближайшего целого (если это связь между двумя целыми числами, округленная до четного целого). Если f теперь 2 , установите f в 0 и добавьте 1 в e. (Этот шаг находит 52 бита x, которые сразу после «десятичной точки», когда x представляется в виде двоичной цифры, округление после цифры 52 и, и она корректирует экспоненту, если округление в этом положении округляет x вверх до 2, который находится за пределами интервала, где мы этого хотим.)

Добавить 1023 to e. Это не имеет большого значения в отношении x; это просто часть кодирования с плавающей запятой. При декодировании 1023 вычитается.

Теперь преобразуйте s, e и f в двоичные цифры, используя ровно одну цифру для s, 11 цифр для e и 52 цифры для f. Если необходимо, включая начальные нули, так что e представлено ровно 11 двоичными цифрами, а f представлено ровно 52 двоичными цифрами. Объедините эти цифры, и у вас есть 64 бит. Это обычная кодировка IEEE 754 для числа с плавающей запятой с двойной точностью.

Есть некоторые особые случаи: Если исходное число равно нулю, используйте ноль для s, e и f. (s также может быть 1, чтобы представлять специальный «отрицательный ноль» .Если, перед добавлением 1023, e меньше -1022, тогда необходимо внести некоторые корректировки, чтобы получить «денормальный» результат или ноль, что я не далее, на данный момент.Если перед добавлением 1023 e больше 1023, тогда величина числа слишком велика, чтобы быть представлена ​​в плавающей точке. Вместо этого она может быть закодирована как бесконечность, установив e (после добавления 1023) до 2047 и f к нулю.

+0

«Установите x в абсолютное значение x» - что вы имели в виду? – user35443

+0

Независимо от значения x, возьмите его абсолютное значение и измените x на это значение. Итак, если x равно -3, установите его равным 3. Если x равно 3, установите его в 3 (это не изменяется). Цель этого шага состоит в том, чтобы просто удалить знак, чтобы следующие шаги касались только положительных чисел. Например, один из следующих этапов показывает показатель экспоненты и регулирует х в [1, 2]. Если бы этот шаг должен был быть написан для того, чтобы отрегулировать положительный x в [1, 2), а отрицательный x был в (-2,1), это было бы более сложно. Итак, на этом раннем этапе мы помним знак (в s) и удалив его из x. –

0

Десятичное число с плавающей точкой: http://sandbox.mc.edu/~bennet/cs110/flt/dtof.html

+0

[Здесь находится двоичный ключ] (http://sandbox.mc.edu/~bennet/cs110/convexamp/binhex.html) Вам просто нужно преобразовать каждые 4 двоичных цифры в 1HEX – matskiv

+0

Но опять же, я имел в виду цифры с запятой (например, 5,21651526) ... – user35443

+0

Это для чисел с запятой - номера с плавающей запятой. Они хранятся в 32 битах (или 64b для двойных). Первый бит - знак (0 = +/1 = -), затем 8 бит показателя (-127 - +127), а остальное - нормализованное число (без «1»). – matskiv

Смежные вопросы