Пост, чтобы не забыть
Столкнулся с проблемой, что QUIK использует формат XLTable для передачи данных по DDE.
Данные идут в виде строк или чисел с плавающей запятой - вот с последними основная проблема.
Дело в том, что из пакета данных можно достать массив типа byte (c++), в котором 8 байт отведены под ЧПЗ двойной точности.
Эти 8 байт есть IEEE-754 представление ЧПЗ двойной точности (подробно , а калькулятор).
Основная проблема, как преобразовать массив байт в число типа double.
Пришлось делать все по битам ( красивые картинки) - принимаю комменты по коду, т.к. особо я его не оптимизировал - работает и ладно, пошел дальше.
//Проверка : 8 байт из посылки DDE: 0x9a99999999a09a40
//Есть десятичное 1704.15, моя функция дает 1704.1500000000001
//Массив байт
byte* data = new byte[8];
data[0] = 0x9a;
data[1] = 0x99;
data[2] = 0x99;
data[3] = 0x99;
data[4] = 0x99;
data[5] = 0xa0;
data[6] = 0x9a;
data[7] = 0x40;
//Буфер для перестановки байт
//Переставляем байты в обратном порядке
byte buf;
buf = data[0];
data[0] = data[7];
data[7] = buf;
buf = data[1];
data[1] = data[6];
data[6] = buf;
buf = data[2];
data[2] = data[5];
data[5] = buf;
buf = data[3];
data[3] = data[4];
data[4] = buf;
//Далее представляем 8 байт как сплошные 64 бита для простоты. 63 бит слева, 0 бит справа.
//63 бит - знак числа
//если 0 - число положительное, 1 - отрицательное
int sign = (data[0] & 0x80) >> 7;
//биты с 62 по 52 - показатель степени, из расшифрованного числа нужно отнять 1023
int exponent = (int)(((data[0] & 0x7f) << 4) + ((data[1] & 0xf0) >> 4)) - 1023;
//2, возведенная в нужную степень
double stepen2 = (int)pow(2.0,exponent);
//Заранее считаю множитель дробной части, чтобы сократить погрешность
double footer = stepen2 / 4503599627370496;
//биты с 51 по 0 - мантисса
//Формула расчета:
//(-1)^sign * 2^(exponent - 1023) * (1 + mantisse/2^52)
//далее я последнюю скобку умножил на 2^(exponent - 1023),
//чтобы не пришлось делить на 2^52, а меньше.
double mantisse = stepen2 + (
//51 -48
((double)(data[1] & 0x0f) * (double)281474976710656) +
((double)data[2] * (double)1099511627776) +
((double)data[3] * (double)4294967296) +
((double)data[4] * (double)16777216) +
((double)data[5] * (double)65536) +
((double)data[6] * (double)256) +
((double)data[7] )) * footer;
//Итоговое значение со знаком
double value = (sign == 0 ? 1 : -1) * mantisse;
Вам это будет интересно!
Последние новости
Конструкции стен из кирпича
Стены, выложенные из кирпича, по сравнению с деревянными характеризуются значительно большей прочностью и устойчивостью. Помимо этого, в число их достоинств входят долговечность и способность сохранять первоначальные качества при длительном воздействии неблагоприятных внешних физико климатических факторов. Для сооружения жилых построек современная стро...Читать далее »
Ограждающие конструкции - современные решения
Для того чтобы правильно подобрать способ теплоизоляции жилой постройки и вид утеплителя, важно знать основные характеристики конструкционных элементов, составляющих здание, и материалов, используемых для их выполнения. Чтобы получить жилище, которое будет отвечать всем требованиям комфорта и безопасности, при проектировании особое внимание следует уделять ...Читать далее »
Пробковые утеплители
Одним из высокоэффективных современных утепляющих материалов считаются плиты, изготовленные из измельченной коры пробкового дуба. Среди их главных достоинств следует назвать небольшой вес, твердость, прочность и устойчивость к гниению и образованию плесени при воздействии влаги. Пробковые теплоизолирующие материалы не повреждаются грызунами и не разрушаются...Читать далее »
Выполнение теплоизоляции пола и перекрытий
Помимо повышения теплотехнических качеств стен, окон и кровли, для создания благоприятных микроклиматических условий в доме необходимо утеплять пол и потолочные перекрытия. Пол можно считать особой конструкцией в жилой постройке, поскольку человек пребывает почти в постоянном контакте с ним. Именно поэтому важно выбрать такую конструкцию и вид теплоизоляции, ...Читать далее »
Приложение
Утепление окна стекловолокном – обязательное условие, при котором значительно снизятся теплопотери. Теплоизоляция кирпичного дома плитами пенополистирола – надежный способ сделать жилище теплым и комфортным. Как сделать это правильно, показано на рис. 50. ...Читать далее »
Пенополистирольные утеплители
В последнее время на строительном рынке особенно высоким спросом пользуется теплоизолирующий материал URSA XPS. Его выпускают в форме жестких плит, размер которых составляет 1,25 × 0,6 м. Сырьем для производства данного материала является экструдированный пенополистирол, обладающий структурой с закрытыми ячейками. URSA XPS – это утеплитель, главными свойствами которого являются устойчивость к воздействию влаги и высока...Читать далее »
Теплоизоляция - важная составляющая архитектуры здания
О доме, отличающемся от других построек изысканной и оригинальной архитектурой, мечтает каждый. Сегодня реализовать это желание несложно: достаточно всего лишь подготовить смелый проект и необходимые строительные материалы. Современные загородные мини городки удивляют своими необычными строениями с характерными для них сложной конфигурацией, резкой разницей высоты составляющих частей, французскими окнами и т. ...Читать далее »
