Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тип Float его описание. Как его реализовать??? 
:(
    Опции темы
ivan219
  Дата 5.10.2007, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Описание:
user posted image

Как всё это дело реализовать в коде???

Вот что уменя получилось:
Код

var
  S1, P: Byte;
  M: Word;
  DatSingle: Single;
  Stream: TMemoryStream;
.
.
       Stream.Position := 6;
       Stream.Read(P, 1);
       Stream.Position := 7;
       Stream.Read(M, 2);
       if P > 63 then
        begin
         S1 := 1;
         P := P - 128;
        end
       else S1 := 0; 
       DatSingle := M * Power(2, P);
       if S1 = 1 then DatSingle := - DatSingle;


Это сообщение отредактировал(а) ivan219 - 5.10.2007, 10:13
PM MAIL ICQ   Вверх
W4FhLF
Дата 5.10.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121





--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
ivan219
Дата 5.10.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Маленько не то там нет реализации в коде да и 32 бита.

Это сообщение отредактировал(а) ivan219 - 5.10.2007, 14:38
PM MAIL ICQ   Вверх
W4FhLF
Дата 5.10.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Ссылки внизу страницы там смотрел? Да вроде есть, на JS конечно всё, но закомментировано.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
ivan219
  Дата 5.10.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Чегото нет там исходников да и JS я не знаю.
PM MAIL ICQ   Вверх
W4FhLF
Дата 5.10.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



ivan219, посмотри исходник страницы. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
ivan219
  Дата 11.10.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Цитата(W4FhLF @  5.10.2007,  15:42 Найти цитируемый пост)
ivan219, посмотри исходник страницы. 

Посмотрев пришол к выводу что ничего не понял там 1000 строк кода smile 
PM MAIL ICQ   Вверх
Alexeis
Дата 11.10.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Код

type
  FloatRec = record
    s : byte;
    p : byte;
    m : Cardinal;
  end;

function UnPackFloat(f : Single) : FloatRec;
var
  i : Integer;
Begin
  Move(f, i, 4);
  Result.s := (i and $80000000) shr 31;
  Result.p := (i and $7F800000) shr 23;
  Result.m := (i and $7FFFFF);
End;

procedure TForm1.FormCreate(Sender: TObject);
var
  c : Single;
  r : FloatRec;
begin
  c := -2.3589;
  r := UnPackFloat(c);


Это сообщение отредактировал(а) Alexeis - 11.10.2007, 15:53


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
  Дата 11.10.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Alexeis, помойму не то, мне надо из 24бит (3 байта т.е. 255, 255, 255) данных сделать нормальный вид переменной типа такого 2.322234 и на оборот из 2.33445 -> (255, 255, 255).

Вобщем нужено 2.345 <-> [255, 255, 255] описание типа на верху в картинке.
PM MAIL ICQ   Вверх
Alexeis
Дата 11.10.2007, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



ivan219, для 24х бит я ничего не могу проверить, так как в делфях нет такого типа. Это для Single (32 бит Float). Предлагаю тебе самому переделать для 24х битного. smile


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
Дата 11.10.2007, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Alexeis, понемаешь есть описание этого типа 1 топик есть данные 3 байта я незнаю как всё это применит и превести в нормальный вид.
PM MAIL ICQ   Вверх
Alix
Дата 11.10.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



Цитата
Вобщем нужено 2.345 <-> [255, 255, 255]

В корне не верно, т.к. должно получится отрицательное число.

Вот, набросал функцию переводящую TFloat в Single и всякий stuff для проверок:
Код

type
  TFloat = packed record
    sp : byte;
    m2 : byte;
    m1 : byte;
  end;

function byteToBits(b : byte) : string;
var
  i : byte;
begin
  result := '';
  for i := 1 to 8 do begin
    if (b and 1) = 0 then
      result := '0' + result
    else
      result := '1' + result;
    b := b shr 1;
    if i = 4 then
      result := ' ' + result;
  end;
end;

function numberToBits(n : pointer; len : integer) : string;
var
  c : pbyte;
  i : integer;
begin
  c := n;
  result := '';

  for i := 1 to len do begin
    result := result + ' | ' + byteToBits(c^);
    inc(c);
  end;
end;

function floatToSingle(float : TFloat) : Single;
type
  PSingle = ^TSingle;
  TSingle = packed record
    m3 : byte;  
    m2 : byte;
    m1 : byte; // не совсем чисто мантисса, есть еще бит от поряка - см. описание ниже
    sp : byte;
  end;

var
  s : PSingle;
  p : shortint;

begin
  s := @result;

  p := (float.sp and $7f) - 64;
  s^.m3 := float.m1 and $01;
  s^.m2 := ((float.m2 and 1) shl 7) or ((float.m1 and $fe) shr 1);
  s^.m1 := float.m2 shr 1;
  s^.m1 := s^.m1 or ((p and 1) shl 7);
  s^.sp := byte(p) shr 1; // byte() to prevent arifmetic shr
  s^.sp := s^.sp or (float.sp and $80);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  f : TFloat;
  s : single;
  p : shortint;

begin
  // значение мантиссы и порядка подсмотел из single
  p := -60;
  f.sp := $00 or (p + 64);
  f.m2 := $b1;
  f.m1 := $ae;
  showmessage('Original bits: ' + numberToBits(@f, sizeof(f)));
  s := floatToSingle(f);
  showmessage('Converted bits: ' + numberToBits(@s, sizeof(s)));
  showmessage('Converted in decimal: ' + FloatToStr(s));

  s := 1e21;
  showmessage('Standard single bits: ' + numberToBits(@s, sizeof(s)));
  showmessage('Standard in decimal: ' + floattostr(s));
end;


Обрати внимание, что я предполагаю, что у TFloat в памяти вначале идет знак/порядок, а потом 2 байта мантиссы в прямом порядке. Вообще, по-идее числа в памяти хранятся несколько иначе, но 3 байта это слишком не стандартно, поэтому я не стал делать по-другому.

Формат TFloat как у тебя на рисунке. Формат Single такой:
user posted image
Или если в порядке расположения в памяти:
     мл. байт                          ст. байт
      7     0  15   8  23 22 16 31 30  24 - номера разрядов памяти
      м.....м  м....м  х м....м  s х....х
     -16  -23  -8 -15  0 -1  -7    7    1 - показатели  степеней  разрядов  мантиссы и характеристики


Возможно, что я где-то и ошибся, однако пример отрабатывает верно smile (хотя из-за меньшей точности 3-х байтового представления погрешность все же набегает)

Это сообщение отредактировал(а) Alix - 11.10.2007, 23:42


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.