Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Delphi Single to Dword

Автор: Eluvatar
Дата сообщения: 13.08.2014 10:51
Добрый день, друзья!

Подскажите как преобразовать средствами Delphi тип Single в Dword ?

заранее благодарен!
Автор: idiMAN
Дата сообщения: 13.08.2014 11:39
Eluvatar
Не совсем понятно, что Вам нужно. Single - это вещественный тип, а dword - целый.
Если нужно просто преобразование типов с округлением вещественного числа типа single до целого с типом dword, то можно использовать, например, Trunc или Round. Только перед округлением, желательно проверить "поместится" ли результат в переменную типа dword, которая может принимать значение от 0 до 4294967295, в отличие от переменной типа single, которая может принимать значения от 1,18 x 10^-38 до 3,4 x 10^38.
Автор: Eluvatar
Дата сообщения: 13.08.2014 11:55
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;
Автор: YuriyRR
Дата сообщения: 13.08.2014 14:40
Eluvatar
из DWORD в single не нужно ничего преобразовывать
приведеный код это неудачное преобразование в string
Автор: Eluvatar
Дата сообщения: 13.08.2014 14:57

Цитата:
из 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;
Автор: YuriyRR
Дата сообщения: 13.08.2014 16:35
function Trunc ( const Number : Extended ) : Integer;

Frac Дробная часть числа с плавающей запятой
Round Округление чисел с плавающей запятой до целого числа
Автор: YuriyRR
Дата сообщения: 13.08.2014 22:39
перевод в DWORD без использования указателей
typedef
mr = record
case integer of
0: (SValue: single);
1: (DValue: dword);
end;

mr.Svalue = SingleVar;
DWordvar := mr.DValue;
Автор: idiMAN
Дата сообщения: 14.08.2014 08:03
Eluvatar
Если нужно просто сохранить 4 байта, занимаемых переменной типа Single в 4-х байтах переменной типа Dword, то проще сделать так:

Код:
var
SingleVar : Single;
DwordVar : dword absolute SingleVar;
Автор: YuriyRR
Дата сообщения: 14.08.2014 13:08
Еще сишный метод

var
SingleVar : Single;
DwordVar : Dword;
begin
SingleVar := Значение;
DwordVar := pDWORD(@SingleVar )^;

Страницы: 1

Предыдущая тема: Экспорт БД из MS Access (.accdb) в MS Sql Server (.mdf)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.