Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Вниз

Приведение к типу Single   Найти похожие ветки 

 
bobah ©   (2007-06-18 16:00) [0]

Здравствуйте!
Привожу к типу Single последовательность байт,
т.е к виду seeeeeeeemmmmmmmm...m,
где s-бит знака; e - бит экспоненты; m - бит мантисы

Пример:


function GetFloatFromByteDevice(const e,f1,f2,f3: Byte): Single;
// e - двоичный порядок
// f1 - старший байт мантиссы; f3 - младший байт
var buf : Array[0..3] of Byte;
begin
// TODO: Возможно, такая конструкция не совсеми процами работать будет
buf[0] := f3;
buf[1] := f2;
buf[2] := (f1 and 127) or ((e and 1) shl 7);
buf[3] := ((e shr 1) and 127) or (f1 and 128);
Result := Single(buf);
end;


Возможно ли что конструкция seeeeeeeemmmmmmmm...m (для Single) разная для разных OC или процессоров?


 
MBo ©   (2007-06-18 16:27) [1]

Процессоры X86 семейства поддерживают стандарт IEEE754,в котором описан, в частности, формат Single. Для кардинально других процессоров вряд ли удастся на Дельфи программу написать...

А что за задача вообще?


 
Однокамушкин   (2007-06-18 16:28) [2]

Для процессоров точно разная, у мотороловских, например, идут в другом порядке байты, а вот у интела и АМД всё всегда одинаково, и от ОС точно не зависит...


 
Однокамушкин   (2007-06-18 16:29) [3]


> MBo ©   (18.06.07 16:27) [1]
> Процессоры X86 семейства поддерживают стандарт IEEE754,в
> котором описан, в частности, формат Single.

Порядок хранения байт этим стандартом не регламентируется, поэтому у разных процессоров он разный... но по сути - согласен, в семействе X86 никаких отклонений быть не может...


 
bobah ©   (2007-06-18 16:45) [4]


>> MBo ©   (18.06.07 16:27) [1]

>> А что за задача вообще?


Задача в том что я опрашиваю приборы с компа по RS-232. Float-значения там храняться в особо извращенном виде, а именно 4 байта:
 eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm
     1б.-e         2б-f1          3б-f2           4б-f3
И вот надо мне их перевести в Single понятный для компьютера. Написал функцию изложенную выше.

А потом задумался, будет ли она всегда работать на всех популярных процессорах?

Или надо 2 в степени возводить, пересчитывать по формулам типа как ниже (приведен в протоколе обмена прибора):

А = (-1)^0 ⋅ (2^0 + 2^-1 + 2^-4 ) ⋅ 2^(129 - 127) = 6.25

 e        f0            f1           f2
129 01001000 00000000 00000000

Вот и думаю как лучше?


 
bobah ©   (2007-06-18 17:06) [5]


>> Однокамушкин   (18.06.07 16:29) [3]

>> Порядок хранения байт этим стандартом не регламентируется, поэтому у >> разных процессоров он разный... но по сути - согласен, в семействе X86
>> никаких отклонений быть не может...


То есть на всех известных сейчас PC функция (1 топик) будет отрабатывать
корректно?


 
Однокамушкин   (2007-06-18 19:28) [6]


> bobah ©   (18.06.07 17:06) [5]
> То есть на всех известных сейчас PC функция (1 топик) будет
> отрабатывать
> корректно?

Да


 
Kolan ©   (2007-06-18 20:22) [7]

> bobah ©   (18.06.07 16:00)

Про дерективу absolute знаете? Мож так проще будет?


 
Anatoly Podgoretsky ©   (2007-06-18 20:39) [8]


> Про дерективу absolute знаете? Мож так проще будет?

Ты хоть понял о чем тут идет речь?


 
bobah ©   (2007-06-19 10:57) [9]

Большое всем спасибо.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2007.08.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.042 c
2-1186091641
Slonik
2007-08-03 01:54
2007.08.26
Эмулятор нажатия Enter а


2-1186262373
Antonito
2007-08-05 01:19
2007.08.26
Преобразовать текст в Unucode


15-1185284193
tesseract
2007-07-24 17:36
2007.08.26
Я таки вернулся


2-1185954821
WFS
2007-08-01 11:53
2007.08.26
Можно ли как-нибудь выделить одну ячейку в DBGride?


15-1185940922
IMHO
2007-08-01 08:02
2007.08.26
Бухгалтера vs. программисты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский