Код | Числа с плавающей точкой являются основным способом представления арифметической информации и занимают в памяти четыре подряд расположенных байта (в порядке увеличения адреса): • байт 1 - увеличенный на десятичное 128 (т.е. на шестнадцатиричное 80) двоичный порядок; • байты 2,3,4 - 23-разрядная двоичная нормализованная мантисса со знаком в прямом коде, без скрытых разрядов. Знак числа содержится в старшем (седьмом) бите байта 2, равен “0” для положительных чисел и “1” для отрицательных. Байт 2 содержит наиболее значащие разряды, байт 4 – наименее значащие. Числа нормализованные, и для всех чисел, кроме строгого нуля, шестой бит байта 2 содержит двоичную единицу. Диапазон представления примерно от 10-40 до 1040 с учетом знака; реальный диапазон, обусловленный возможностями пакета арифметических операций и индикации на дисплее лицевой панели -- до 223-1, т.е. до 8388607; точность представления 7-8 десятичных разрядов (всего, а не после запятой!). В таком виде хранятся все мгновенные, средние и архивные параметры (кроме архивов общих интегралов), арифметические константы описаний труб и датчиков. В перспективе для нового протокола предусмотрена возможность перекодировки данных в стандартный формат коротких вещественных чисел FLOAT, принятый в ЭВМ типа IBM/PC, в стандарте IEEE-754. Если при описании канала признак перекодировки не задан, все параметры с плавающей точкой выдаются и принимаются по данному каналу во внутреннем представлении. Если задан признак перекодировки, то при выдаче параметра будет производиться преобразование в формат FLOAT (в порядке возрастания адреса): • Байт 1 – наименее значащие 8 разрядов мантиссы. • Байт 2 – следующие по значимости 8 разрядов мантиссы. • Байт 3 – разряды с 0-го по 6-й содержат наиболее значимые 7 разрядов мантиссы. Старший разряд байта содержит младший разряд порядка. • Байт 4 – разряды с 0-го по 6-й содержат старшие 7 разрядов порядка (увеличенного на десятичное 128). Старший разряд содержит знак числа, «0» для положительных и «1» для отрицательных чисел. Мантисса FLOAT записана в прямом коде, в нормализованном виде. Самый старший разряд мантиссы, всегда после нормализации равный «1», не хранится, т.е. подразумевается «скрытая единица».
|
пытаюсь реализовать данные алгоритм, но пока все четно. Код | float Dev2Ibm(const unsigned long& value) { unsigned char order = (value & 0xFF000000) >> 24; bool sign = value & 0x00800000; unsigned long mantissa = value & 0x007FFFFF;
unsigned long result = ((sign ? 1 : 0) << 31) | (order << 23);// + mantissa; return *(float *)&result; }
|
есть парочка примеров: 85 65 72 B0 (25,362) -> 60 E5 CA 41 (IEEE-754 = 25.362) 8A 51 40 00 (650) -> 00 80 22 44 (IEEE-754 = 650) Памажите! Заранее благодарен! ЗЫ голова не варит Это сообщение отредактировал(а) chaos - 23.9.2008, 14:05
|