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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разъяснение (пояснение) схемы ЗАПРОС-ОТВЕТ, при работе с внешним устройством 
V
    Опции темы
Pakshin A. S.
Дата 30.8.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 21
Всего: 61



 smile 

Теперь мучаюсь с MakeLong... Как я понял, эта фугкция делает из чисел C2 и 0D число С20D... Так? А как четыре числа слить в одно? smile
PM   Вверх
Romikgy
Дата 30.8.2006, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

function sl4_1(x1: byte;x2: byte;x3: byte;x4: byte): dword;
begin
Result:=0;
Result:=Result+x1;
Result:=Result shl 8;
Result:=Result+x2;
Result:=Result shl 8;
Result:=Result+x3;
Result:=Result shl 8;
Result:=Result+x4;

end;



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Pakshin A. S.
Дата 30.8.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 21
Всего: 61



Спасибо за неоценимую помощь и науку!!!  smile

Добавлено @ 13:53 
 smile 
Число 4443DCCD подал в функцию... Ответ должен быть 783,45.. А получается 55... Что-то не то... smile
Это пример из таблички второй, где описывается пример ответа...

Добавлено @ 13:56 
А вот тупая переписка процедуры дала верный результат... 
Код

 SIGN := ord(($44 and 80 <> 0)); EX := ($4443 and $7F80)/$80 ;
 EX := exp((EX-127)*ln(2)); bt := ($43DCCD or $800000)/$800000;
 Val := exp(sign*ln(1)) * EX * bt;

PM   Вверх
Romikgy
Дата 30.8.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



значит не этот алгоритм надо юзать
Цитата(Pakshin A. S. @  30.8.2006,  10:10 Найти цитируемый пост)

Старший бит Single-числа содержит знак числа, следующие ща ним восемь бит - порядок числа со смещением 127, следующие 23 разряда - мантисса числа со скрытой единицей в 24-ом разряде. Значение числа при этом:
Val = (-1)^SIGN x 2^(EXP-127) x (1.bitsmant)
При передаче Single-числа сначала передаются третий и четвертый байты (младшие wrod-слово), затем первый и второй байты.
Пример: ДЕсятичное число -35.46, в Single-формате равное (C20DD70Ah), передается в следующем порядке: D7h, 0Ah, C2h, 0Dh. Для восстановление числа можно использовать процедуру:
SIGN = (C2 and 80 <> 0) = 1;
EXP = (C20D and 7F80)/80 = 84 (hex) = 132 (dec);
2^(EXP-127) = 32 (dec);
1.bitsmant = (0D D7 OA or 800000)/800000 = 1.1081250;
Val = (-1) * 32 * 1.1081250 = -35.46000

а что то другое

Добавлено @ 14:09 
Цитата(Romikgy @  30.8.2006,  13:03 Найти цитируемый пост)
2^(EXP-127) = 32 (dec);

это я не заметил smile
щаз


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Pakshin A. S.
Дата 30.8.2006, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 21
Всего: 61



Код

function GetValue(p1, p2, p3, p4: byte): real;
var
 EX, BIT: real;
 buf1, buf2: dword;
begin
 buf1:=$4086{p1 shl 8 + p2};
 buf2:=$866666{p2 shl 8 + p3 shl 8 + p4};
 EX := (buf1 and $7F80)/$80 ;
 EX := exp((EX-127)*ln(2));
 BIT := (buf2 or $800000)/$800000;
 Result:= EX * BIT;
 if (p1 and 80) <> 0
  then
   Result:=-Result
end;

Тут не верно складываются числа... И знак не определяется...  smile 
PM   Вверх
Romikgy
Дата 30.8.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



во терь нормально smile
Код

function Hex_to_single(x: dword): double;
var EX,y: longint;
bit,z: double;
begin
EX :=x and $7f800000;
EX:=EX shr 16;
EX:=EX div $80;
y:=   $800000;
z:=y+0.0;
y:= x and $ffffff;
bit := y /z;
bit:=bit+1.0;
z:=EX-127;
z:=z*ln(2);
z:=Exp(z);
if (x and $80000000)>0 then
Result:=(-1.0)*(z)*bit
else
Result:=(z)*bit;
end;


Добавлено @ 14:19 
Цитата(Pakshin A. S. @  30.8.2006,  13:12 Найти цитируемый пост)
Тут не верно складываются числа... И знак не определяется... 

это почему?
ды знака там нет значит +


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Romikgy
Дата 30.8.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Код

function Hex_to_single(x: dword): double;
var EX,y: longint;
bit,z: double;
begin
EX :=x and $7f800000;
EX:=EX shr 16;
EX:=EX div $80;
y:=   $800000;
z:=y+0.0;
y:= x and $7fffff;

bit := y /z;
bit:=bit+1.0;
z:=EX-127;
z:=z*ln(2);
z:=Exp(z);
if (x and $80000000)>0 then
Result:=(-1.0)*(z)*bit
else
Result:=(z)*bit;
end;

все 3 параметра обрабатывает нормально smile

Добавлено @ 14:35 
Код

function Hex_to_single(x: dword): double;
var EX,y: longint;
bit,z: double;
begin
EX :=x and $7f800000;
EX:=EX shr 16;
EX:=EX div $80;
y:=   $800000;
z:=y+0.0;
y:= x and $7fffff;
bit := y /z;
bit:=bit+1.0;
EX:=EX-127;
EX:=1 shl EX;
if (x and $80000000)>0 then
Result:=(-1.0)*(EX)*bit
else
Result:=(EX)*bit;
end;

меньше работы с дробным число smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Pakshin A. S.
Дата 30.8.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 21
Всего: 61



Угу... smile

Я тут еще и своё доработал:
Код

function GetValue(p1, p2, p3, p4: byte): real;
var
 EX, BIT: real;
 buf1, buf2: dword;
begin
 buf1:=(0 + p1) shl 8 + p2;
 buf2:=((0 + p2) shl 8 + p3) shl 8 + p4;
 EX := (buf1 and $7F80)/$80 ;
 EX := exp((EX-127)*ln(2));
 BIT := (buf2 or $800000)/$800000;
 Result:= EX * BIT;
 if (p1 and $80) <> 0
  then
   Result:=-Result
end;

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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