реклама на сайте
подробности

 
 
> Преобразование double во float
MKdemiurg
сообщение Aug 21 2013, 15:06
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939



Собс-но сабж.
Есть число выдаваемое прибором формата DOUBLE.
При этом в компиляторе нет этого формата , а есть float и long int;
Как пересчисчитать с потерей точности и размерности?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MKdemiurg
сообщение Aug 22 2013, 10:09
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 624
Регистрация: 15-06-10
Из: Россия
Пользователь №: 57 939



Спасибо за подсказки.
Сделал просто пересчётом по формулt из IEEE 754

unsigned long int r1, r2;
float r3;
r1=((((unsigned int)dob[0]&0x7F)<<4)|doub[1]>>4);
r2=(unsigned long int)doub[1]<<28|((unsigned long int)doub[2]<<20)|((unsigned long int)doub[3]<<12)|((unsigned long int)doub[4]<<4)|(doub[5]>>4);
r3=pow(-1,doup[0]>>7)*pow(2,(r1-1023))*(1+r2/4294967296.0);

PS Компилятр CVAVR - long long там тоже не реализован. Но до этого момента и не нужно было.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Aug 22 2013, 11:21
Сообщение #3


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(MKdemiurg @ Aug 22 2013, 14:09) *
Компилятор CVAVR - long long там тоже не реализован. Но до этого момента и не нужно было.


Он и в этом моменте не нужен. Чтобы достать старшие байты double-числа, нет необходимости прибегать к типу long long. Более того, добычка этих байт через long long сопряжена с организацией огромных сдвигов (29 и 52 разрядов), что никак не назовешь эффективным программированием.

Было бы куда проще накладывать число double не на long long, а на unsigned char v[8] или unsigned short v[4], а затем сложить float из этих байт или слов. А еще симпатичнее вместо массива объявить структуру с битовыми полями под стать double-формату. Например:

Код
struct double_type {
   uint32_t mantissa_lo : 29;
   uint32_t mantissa_hi : 23;
   unsigned int exponent : 11;
   unsigned int sign : 1;
};

struct float_type {
   uint32_t mantissa : 23;
   unsigned int exponent : 8;
   unsigned int sign : 1;
};
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 03:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01549 секунд с 7
ELECTRONIX ©2004-2016