Вам это будет интересно!

  • Чтобы не забыть…

  • Для себя и потомков. Чтобы не забыть.



  • Столкнулся с проблемой, что 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 – это утеплитель, главными свойствами которого являются устойчивость к воздействию влаги и высока...
    Читать далее »

    Торфяные утеплители

    Для повышения теплоизоляционных характеристик ограждающих конструкционных элементов нередко используют торфоизоляционные плиты. Их производят на основе плохо разложившегося торфа, который отличается волокнистой структурой. В процессе обработки сырье формуют и выдерживают в условиях высокой температуры. Плотность торфоизоляционных плит составляет от 170 до 260 кг/м3, а коэффициент теплопроводности равен 0,06 Вт/(м°С)...
    Читать далее »

    Теория теплопередачи - основа строительства

    Современные физики говорят о 3 явлениях, выражающих теплопередачу, – теплопроводности, излучении и конвекции. Каждое из них обладает собственными характеристиками. Так, при определении свойств однородных твердых тел говорят о теплопроводности. Ее суть заключается в способности одного объекта передавать тепло другому при соприкосновении либо посредством промежуточного проводника (рис. 3). ...
    Читать далее »

    Древесно-стружечные теплоизолирующие материалы

    Одним из наиболее распространенных в настоящее время древесно стружечных утеплителей является фибролит. Его получают путем смешивания древесной стружки, портландцемента и воды. Древесная стружка, или древесная шерсть, при этом должна состоять из лент длиной не менее 50 см. В некоторых случаях портландцемент нередко заменяют магнезиальным вяжущим компонентом. Перед технологической обработкой древесную стружку, вы...
    Читать далее »

    Стеклянные утепляющие материалы

    Технология изготовления стекловаты во многом сходна с методом производства минеральной ваты. В качестве основного сырья выступают мел либо известняк, кварцевый песок и сульфат натрия либо сода. Кроме того, для получения этого утеплителя могут использоваться и остаточные продукты стекольной промышленности. Стеклянная вата состоит из тончайших волокон, которые получают путем вытягивания из предварительно расплавле...
    Читать далее »