Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Delphi Single to Dword

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Eluvatar



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день, друзья!
 
Подскажите как преобразовать средствами Delphi тип Single в Dword ?
 
заранее благодарен!

Всего записей: 114 | Зарегистр. 14-09-2005 | Отправлено: 11:51 13-08-2014
idiMAN

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eluvatar
Не совсем понятно, что Вам нужно. Single - это вещественный тип, а dword - целый.
Если нужно просто преобразование типов с округлением вещественного числа типа single до целого с типом dword, то можно использовать, например, Trunc или Round. Только перед округлением, желательно проверить "поместится" ли результат в переменную типа dword, которая может принимать значение от 0 до 4294967295, в отличие от переменной типа single, которая может принимать значения от 1,18 x 10^-38 до 3,4 x 10^38.

Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 12:39 13-08-2014
Eluvatar



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Single -это вещественный
dword - два слова, два ворда описывают single , а одним word-om не опишешь, да.
 
Вот я нашел обратную процедуру , из dword в single:
 
 

Код:
 
function NumToFloat(dwNum: DWORD): String;
const
  EXP_BIAS = 127;
var
  sFloat: String;
  dwFloat: Cardinal;
  snglFloat: Single; // 4 байта
  bySign, byExp: Byte;
  dwFractPart: Cardinal;
  snglFractPart: Single;
begin
  dwFloat:= dwNum;
  bySign:= (dwFloat shr 31) and $1;
  byExp:= Byte((dwFloat shr 23) and $FF);
  if byExp = $FF then
  begin
    // ShowMessage('Infinity or Nan');
    Result:= 'Infinity or Nan';
  end
  else
  if byExp = $00 then
  begin
    // ShowMessage('0 (Zero) or Denormal');
    Result:= '0 (Zero) or Denormal';
  end
  else
  begin
    dwFractPart:= Cardinal( (  Cardinal(dwFloat shl 9) shr 9  ) );
 
    // 10 бит точность - тысячные доли - итоговая точность сотые доли
    snglFractPart:= 1.0 +
      ((dwFractPart shr 22) and $1) * 0.5 +
      ((dwFractPart shr 21) and $1) * 0.25 +
      ((dwFractPart shr 20) and $1) * 0.125 +
      ((dwFractPart shr 19) and $1) * 0.0625 +
      ((dwFractPart shr 18) and $1) * 0.03125 +
      ((dwFractPart shr 17) and $1) * 0.015625 +
      ((dwFractPart shr 16) and $1) * 0.0078125 +
      ((dwFractPart shr 15) and $1) * 0.00390625 +
      ((dwFractPart shr 14) and $1) * 0.001953125 +
      ((dwFractPart shr 13) and $1) * 0.0009765625 +
      // Максимальная точность
      ((dwFractPart shr 12) and $1) * 0.00048828125 +
      ((dwFractPart shr 11) and $1) * 0.000244140625 +
      ((dwFractPart shr 10) and $1) * 0.0001220703125 +
      ((dwFractPart shr 9) and  $1) * 0.00006103515625 +
      ((dwFractPart shr 8) and  $1) * 0.000030517578125 +
      ((dwFractPart shr 7) and  $1) * 0.0000152587890625 +
      ((dwFractPart shr 6) and  $1) * 0.00000762939453125 +
      ((dwFractPart shr 5) and  $1) * 0.000003814697265625 +
      ((dwFractPart shr 4) and  $1) * 0.0000019073486328125 +
      ((dwFractPart shr 3) and  $1) * 0.00000095367431640625 +
      ((dwFractPart shr 2) and  $1) * 0.000000476837158203125 +
      ((dwFractPart shr 1) and  $1) * 0.0000002384185791015625 +
      ( dwFractPart        and  $1) * 0.00000011920928955078125;
 
    snglFloat:= Power(-1, bySign) * Power(2.0, (byExp - EXP_BIAS)) * snglFractPart;
    sFloat:= FloatToStr(snglFloat);
    // ShowMessage(sFloat);
  end;
  Result:= sFloat;
end;
 


Всего записей: 114 | Зарегистр. 14-09-2005 | Отправлено: 12:55 13-08-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eluvatar
из DWORD в single не нужно ничего преобразовывать
приведеный код это неудачное преобразование в string

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 15:40 13-08-2014
Eluvatar



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
из DWORD в single не нужно ничего преобразовывать  
приведеный код это неудачное преобразование в string  

 
если убрать преобразование в стринг мы получим  сингл.
 
Подскажите , а как тогда быть?
 
у меня есть функция, которая принимет word,  а у меня значение в single
 

Код:
 
function TIdModBusClient.WriteRegister(const RegNo, Value: Word): Boolean;
var
  Data: array[0..0] of Word;
  bNewConnection: Boolean;
begin
  bNewConnection := False;
  Data[0] := Value;
  if FAutoConnect and not Connected then
  begin
  {$IFDEF DMB_INDY10}
    Connect;
  {$ELSE}
    Connect(FConnectTimeOut);
  {$ENDIF}
    bNewConnection := True;
  end;
 
  try
    Result := SendCommand(mbfWriteOneReg, RegNo, 0, Data);
  finally
    if bNewConnection then
      DisConnect;
  end;
end;
 

 

Всего записей: 114 | Зарегистр. 14-09-2005 | Отправлено: 15:57 13-08-2014 | Исправлено: Eluvatar, 15:59 13-08-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
function Trunc ( const Number : Extended ) : Integer;
 
Frac  Дробная часть числа с плавающей запятой
Round  Округление чисел с плавающей запятой до целого числа

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 17:35 13-08-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
перевод в DWORD без использования указателей
typedef
mr = record  
case integer of
0: (SValue: single);
1: (DValue: dword);
end;
 
mr.Svalue = SingleVar;
DWordvar := mr.DValue;

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 23:39 13-08-2014
idiMAN

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Eluvatar
Если нужно просто сохранить 4 байта, занимаемых переменной типа Single в 4-х байтах переменной типа Dword, то проще сделать так:

Код:
 
var
    SingleVar    : Single;
    DwordVar    : dword absolute SingleVar;
 

Т.е. когда вы присваиваете значение переменной SingleVar, вы автоматом получаете результат, но в уже хранящийся в переменной DwordVar

Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 09:03 14-08-2014
YuriyRR



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще сишный метод
 
var
    SingleVar    : Single;
    DwordVar    : Dword;
begin
SingleVar := Значение;
DwordVar  :=  pDWORD(@SingleVar )^;

Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 14:08 14-08-2014
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Delphi Single to Dword


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru