» Программное обеспечение » SCADA/HMI DataRate » Работа с переменными float(оно же real, оно же Single)

Страниц (1): [1]
 

1. vilserg - 01 Апреля, 2014 - 11:45:32 - перейти к сообщению
Контроллер Siemens S7-200 через свой родной OPC-сервер PC Access выдаёт 4 байта. Эти 4 байта представляют собой число в формате ieee754. Скриптом в DataRate я собрал 4 байта в одну переменную типа int64, у которого младшие 32 бита представляют собой float-число в формате ieee754, а старшие 32 бита - нули.

само число: BF7F DFC2. Это ieee754 представление числа -0.999508. Как мне получить на экране именно -0.999508, а не 3212828610, которое является простым переводом BF7F DFC2 в десятичную систему??
2. vilserg - 03 Апреля, 2014 - 20:08:31 - перейти к сообщению
 vilserg пишет:
Контроллер Siemens S7-200 через свой родной OPC-сервер PC Access выдаёт 4 байта. Эти 4 байта представляют собой число в формате ieee754. Скриптом в DataRate я собрал 4 байта в одну переменную типа int64, у которого младшие 32 бита представляют собой float-число в формате ieee754, а старшие 32 бита - нули.

само число: BF7F DFC2. Это ieee754 представление числа -0.999508. Как мне получить на экране именно -0.999508, а не 3212828610, которое является простым переводом BF7F DFC2 в десятичную систему??


Ну, если никто не хочет, отвечаю себе сам:

byte[] bytes = { 0xC2, 0xDF, 0x7F, 0xBF };
float value = BitConverter.ToSingle(bytes, 0);
3. Support - 07 Апреля, 2014 - 09:15:28 - перейти к сообщению
Здравствуйте!

int _i = unchecked((int)0xBF7FDFC2);

float _singleValue = BitConverter.ToSingle(_bytes, 0);
byte[] _bytes = BitConverter.GetBytes(_i);


Тип System.Single соответствует стандарту IEC 60559:1989 (IEEE 754), описывающему правила двоичной арифметики с плавающей запятой.

Поэтому. чтобы преобразовать число 0xBF7FDFC2 не в целочисленное представление, каковым у Вас оно является, а в вещественное, надо сделать преобразование:

1) если переменная _i типа System.Int32 и надо представить ее в System.Single.

byte[] _bytes = BitConverter.GetBytes(_i); // 4 байта

2) если переменная _i типа System.Int64 и надо представить ее в System.Double.

long _i = 0xBF7FDFC2;

double _doubleValue = (double)BitConverter.ToSingle(_bytes, 0);

Powered by ExBB FM 1.0 Final