Двоичный код числа с плавающей точкой.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
TEH3OP
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 12.12.2003 (Пт) 20:19
Откуда: Москва

Двоичный код числа с плавающей точкой.

Сообщение TEH3OP » 11.05.2004 (Вт) 2:15

Ребята расскажите мне пожалуйста какой формат хранения числа в переменной типа Single и Double.
Про мантиссу и парядок я знаю, мне надо знать сколько бит на мантиссу и сколько и какие позиции битов парядка.
Так же туплю -- парядок это число сдвигов или степень десятки?

Тут взялся за написание курсача по типам данных VB и, как идиот, не могу про числа с плавающей точкой ничего написать. Попытался разобраться сам, раскладывая на биты -- туплю. Книжки подходящей нет под рукой... по форуму ничего не нашёл, в МСДН'е и прочей тренхамундии тож ноль.

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

Заранее благодарен.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.05.2004 (Вт) 10:07

MSDN писал(а):Single (single-precision floating-point) variables are stored as IEEE 32-bit (4-byte) floating-point numbers, ranging in value from -3.402823E38 to -1.401298E-45 for negative values and from 1.401298E-45 to 3.402823E38 for positive values. Thetype-declaration character for Single is the exclamation point (!).

Конкретные детали смотри в IEEE Format - floating-point numbers. Ключевое это: на степени идет 8 бит, на число 23 бита, один бит на знак.
Lasciate ogni speranza, voi ch'entrate.

TEH3OP
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 12.12.2003 (Пт) 20:19
Откуда: Москва

Сообщение TEH3OP » 11.05.2004 (Вт) 10:42

alibek писал(а):Ключевое это: на степени идет 8 бит, на число 23 бита, один бит на знак.

Ща это как раз читаю -- СПАСИБО!

PS: но всётаки парядок (степень) это число сдвигов (степень двойки) или число десятичных нулей/знаков после запятой (степень десятки)?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.05.2004 (Вт) 10:46

Полагаю, степени двойки.
Во всяком случае
Floating-point numbers use the IEEE (Institute of Electrical and Electronics Engineers) format. Single-precision values with float type have 4 bytes, consisting of a sign bit, an 8-bit excess-127 binary exponent, and a 23-bit mantissa. The mantissa represents a number between 1.0 and 2.0. Since the high-order bit of the mantissa is always 1, it is not stored in the number. This representation gives a range of approximately 3.4E–38 to 3.4E+38 for type float.

я понял именно так
Lasciate ogni speranza, voi ch'entrate.

TEH3OP
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 12.12.2003 (Пт) 20:19
Откуда: Москва

Не могу раскодировать.... ;-/

Сообщение TEH3OP » 11.05.2004 (Вт) 12:15

alibek писал(а):Полагаю, степени двойки.
Во всяком случае
Floating-point numbers use the IEEE (Institute of Electrical and Electronics Engineers) format. Single-precision values with float type have 4 bytes, consisting of a sign bit, an 8-bit excess-127 binary exponent, and a 23-bit mantissa. The mantissa represents a number between 1.0 and 2.0. Since the high-order bit of the mantissa is always 1, it is not stored in the number. This representation gives a range of approximately 3.4E–38 to 3.4E+38 for type float.

я понял именно так


ОК ещё раз спасибо!
Тогда одна проблемма (практического плана):

Код: Выделить всё
   
Dim lng As Long, sgl As Single
   
    VBA.Randomize
    sgl = VBA.Rnd * &H7FFFFFFF
    CopyMemory lng, sgl, 4&


Из этого всего получается:
sgl = 1.355801E+09
lng = 1319215043
вот лично я, немогу из битов lng сделать (раскодировать) значение sgl.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.05.2004 (Вт) 14:17

А ты думал всё просто? :)

The Single type
A 4-byte (32-bit) Single number is divided into three fields:

1 8 23
s e f

The value v of the number is given by

if 0 < e < 255, then v = (–1)^s * 2^(e–127) * (1.f )
if e = 0 and f <> 0, then v = (–1)^s * 2^(–126) * (0.f )
if e = 0 and f = 0, then v = (–1)^s * 0
if e = 255 and f = 0, then v = (–1)^s * Inf
if e = 255 and f <> 0, then v is a NaN


The Double type
An 8-byte (64-bit) Double number is divided into three fields:

1 11 52
s e f

The value v of the number is given by
if 0 < e < 2047, then v = (–1)^s * 2^(e–1023) * (1.f )
if e = 0 and f <> 0, then v = (–1)^s * 2^(–1022) * (0.f )
if e = 0 and f = 0, then v = (–1)^s * 0
if e = 2047 and f = 0, then v = (–1)^s * Inf
if e = 2047 and f <> 0, then v is a NaN
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

TEH3OP
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 143
Зарегистрирован: 12.12.2003 (Пт) 20:19
Откуда: Москва

Всё сходится! УРЯ!!!

Сообщение TEH3OP » 12.05.2004 (Ср) 0:21

А я и не думал что всё просто -- потому и спрашивал!!! ;-)

Число: 1.075241E+09
Биты: 01001110100000000010110111000011
s = 0
e = 10011101
f = 00000000010110111000011

s <--> "+"
e = 157
1.f = 1.00000000010110111000011 = 1.0013965368270874

}==> v = + 2^(157-127)*1.0013965368270874 =
= + 2^30*1.0013965368270874 =
= 1075241344 = 1.075241E+09

Ж8-)

PS: Спасибо, родина вас незабудет!!! ;-)))


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Bing-бот и гости: 58

    TopList