Числа с точкой (Hexadecimal)

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

Числа с точкой

Сообщение BratSinot »

Доброго времени суток!

Как в C переменной типа float/double присвоить hex число с точкой? Вариант типа: float a=0x0.0x1, не работает. Выдает:

Код: Выделить всё

error: hexadecimal floating constants require an exponent
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Числа с точкой

Сообщение Rootlexx »

Код: Выделить всё

float a = 0x.1P0;
- 1/16.
Почитайте: http://h30097.www3.hp.com/dtk/Compaq_C_Com...rm/DOCU0002.HTM , раздел 1.8.2.3.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Числа с точкой

Сообщение eddy »

0x0.0x1

А вы где-нибудь такого рода записи видели?
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Числа с точкой

Сообщение drBatty »

BratSinot писал(а):
30.09.2010 00:39
Как в C переменной типа float/double присвоить hex число с точкой? Вариант типа: float a=0x0.0x1, не работает.

а как понять .0x1 ? это 0x1 или 0x80000000 ?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Числа с точкой

Сообщение BratSinot »

Rootlexx писал(а):
30.09.2010 00:51

Код: Выделить всё

float a = 0x.1P0;
- 1/16.
Почитайте: http://h30097.www3.hp.com/dtk/Compaq_C_Com...rm/DOCU0002.HTM , раздел 1.8.2.3.

Спасибо.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Числа с точкой

Сообщение NickLion »

drBatty писал(а):
30.09.2010 02:26
а как понять .0x1 ? это 0x1 или 0x80000000 ?

А как мы понимаем 0.1? Десятичная система не уникальная ведь. 0.27 - это 2*10-1+7*10-2. Абсолютно так же и в 16-ричной системе - 0x.27 - это 2*16-1+7*16-2. А 0x.1 - это просто 1/16.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Числа с точкой

Сообщение drBatty »

NickLion писал(а):
30.09.2010 09:02
А как мы понимаем 0.1?

0x1.1
я так и понимаю.
но тут 0x1.0x1
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Числа с точкой

Сообщение NickLion »

drBatty, а, извините, не так понял Вашу фразу :(
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Числа с точкой

Сообщение BratSinot »

Rootlexx писал(а):
30.09.2010 00:51

Код: Выделить всё

float a = 0x.1P0;
- 1/16.
Почитайте: http://h30097.www3.hp.com/dtk/Compaq_C_Com...rm/DOCU0002.HTM , раздел 1.8.2.3.

Оно конечно работает, но честно вам скажу, я не "въезжаю" в принцип по которому оно действует.

Ладно, пока перевожу путем %a.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Числа с точкой

Сообщение drBatty »

drBatty писал(а):
30.09.2010 18:51
А как мы понимаем 0.1?

0x1.1
я так и понимаю.

я прекрасно понимаю, что 1.1, это 11/10
по аналогии, я понимаю, что 0x1.1, это 0x11/0x10
BratSinot писал(а):
30.09.2010 00:39
Как в C переменной типа float/double присвоить hex число с точкой? Вариант типа: float a=0x0.0x1, не работает.

запись 0x0.0x1 я вообще не понимаю.
BratSinot писал(а):
30.09.2010 23:22
Оно конечно работает, но честно вам скажу, я не "въезжаю" в принцип по которому оно действует.

0x1P-1 0.500000 double

на самом деле, тут двоичная система счисления. Для краткости двоичные числа записывают шестнадцатеричными.
потому -1 означает 2^(-1), т.е. 1/2, т.е. 0.5

0x.1P3 0.500000

Это сложнее. Сначала переведём в двоичную систему мантиссу 0.1, получится 0000.0001
Теперь умножим на 2^3, т.е. сдвинем влево на 3 бита
0000.1000
Можно заметить, что если умножить ещё на 2, получим ровно
0001.0000
т.е. единицу, теперь делим обратно, но уже в десятичной
1/2 == 0.5

ЗЫЖ на самом деле это просто, но тут 80% символов убрали. Сократили короче ;)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Числа с точкой

Сообщение Rootlexx »

Пример числа в десятичной системе счисления:

Код: Выделить всё

13,25 = 1 * 10^1 + 3 * 10 ^ 0 + 2 * 10^(-1) + 5 * 10^(-2)

Как видите, число раскладывается по цифрам, его составляющим, умноженным на основание (в десятичной системе - десять) в степени, равной индексу (номеру) цифры по порядку относительно точки отсчёта (нуля) - младшего разряда целой части. Нумерация идёт в сторону старших разрядов.
То же число в двоичной системе:

Код: Выделить всё

1101,01 = 1 * 2^3 +  1 * 2^2 + 0 * 2^1 + 1 * 2^0 + 0 * 2^(-1) + 1 * 2^(-2)

Вам должна быть известна экспоненциальная запись чисел:

Код: Выделить всё

13,25 = 1,325 * 10^1 = 1,325E+1
10504,2160 = 1,0504216 * 10^4 = 1,0504216E+4

Теперь рассмотрим пример:

Код: Выделить всё

float eq_12 = 0x1.8P3;

"0x" отбрасываем, ибо это просто указатель того, что далее следует шестнадцатеричное число. Остаток:
- та же экспоненциальная запись, только мантисса записана в шестнадцатеричной системе счисления, а в качестве основания показательной функции используется двойка.
То есть:

Код: Выделить всё

0x1.8P3 = 0x1.8 * 2^3 = (1 * 16^0 + 8 * 16^(-1)) * 2^3 = 12
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Числа с точкой

Сообщение BratSinot »

Так, а мантиса здесь где?
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4471
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Числа с точкой

Сообщение Rootlexx »

BratSinot писал(а):
01.10.2010 00:15
Так, а мантиса здесь где?

0x1.8.
Читайте: http://ru.wikipedia.org/wiki/Экспоненциальная_запись .
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Числа с точкой

Сообщение BratSinot »

Rootlexx писал(а):
01.10.2010 00:21
BratSinot писал(а):
01.10.2010 00:15
Так, а мантиса здесь где?

0x1.8.
Читайте: http://ru.wikipedia.org/wiki/Экспоненциальная_запись .

А, теперь понял что и как записывается.
Спасибо сказали: