Страница 1 из 1

Преобразование double(64) в float(32)

СообщениеДобавлено: 28 мар 2014, 09:57
VanMo
Пример макроса, конвертирующего double (четыре 16-битных слова) в float (32-bit float). В примере используется жёстко заданное входное значение (заполнение массива src в начале макроса)
Код: Выделить всё
macro_command main()

short src[4]

//используйте GetData вместо хардкода
src[3]=0x3fd4
src[2]=0x1893
src[1]=0x74bc
src[0]=0x6a7f

short dst[2]

int sign
sign = src[3] & 0x8000

int expn
expn = (src[3]>>4) & 0x7FF

if ( ( (expn & 0x700) <> 0) and ( (expn & 0x700) <> 0x700 ) ) then
   //ПОТЕРЯ ЭКСПОНЕНТЫ!
end if


if (expn & 0x400) <> 0 then
   expn = (expn & 0x7F) | 0x80
else
   expn = expn & 0x7F
end if

int mantis
mantis = ((src[3]&15)<<19) | (src[2]<<3) | (src[1]>>13)

dst[1] = sign | (expn<<7) | (mantis>>16)
dst[0] = mantis

//сохраняем результат в LW0/LW1
SetData(dst[0], "Local HMI", LW, 0, 2)

end macro_command

Преобразование float(32) в double(64)

СообщениеДобавлено: 28 мар 2014, 09:58
VanMo
Обратное преобразование
Код: Выделить всё
   unsigned short srcf32[2]
   unsigned short destf64[4]
   
   //чтение float32 из LW40/LW41
   GetData(srcf32[0], "Local HMI", LW, 40, 2)
   
   unsigned short signf32
   unsigned int mantisf32
   unsigned short expf32
   signf32 = srcf32[1] & 0x8000
   expf32 = (srcf32[1] >> 7) & 0xFF
   expf32 = (expf32-127+1023) & 0x7FF
   mantisf32 = srcf32[0] | ((srcf32[1] & 0x7F)<<16)
     
   destf64[3] = signf32 | (expf32 << 4) | (mantisf32 >> 19)
   destf64[2] = mantisf32 >> 3
   destf64[1] = mantisf32 << 13
   destf64[0] = 0
   
   //запись float64 в LW50/LW51/LW52/LW53   
   SetData(destf64[0], "Local HMI", LW, 50, 4)