|
|
  |
Преобразование double во float |
|
|
|
Aug 21 2013, 18:57
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 22-03-10
Из: Саратов
Пользователь №: 56 123

|
Как-то так можно: Код float DoubleToFloat(const unsigned char *doublePtr) { unsigned long long v = *(unsigned long long*)doublePtr; unsigned mantissa = (unsigned)((v & 0x003fffffffffffffull) >> (52 - 23)); unsigned exponent = (unsigned)((v & 0x7ff0000000000000ull) >> 52); if(exponent > 1023 + 127) mantissa = 0x7fffffff;
if(exponent < 1023 - 127) return 0.0;
exponent -= 1023 - 127; exponent <<= 23;
mantissa |= exponent; if(v & 0x8000000000000000ull) mantissa |= 0x80000000ul; union IntToFloat { unsigned i; float f; }iToF; iToF.i = mantissa; return iToF.f; } Только поаккуратней с этим кодом - я его быстро набрасал, толком не тестировал.
|
|
|
|
|
Aug 22 2013, 11:21
|

Гуру
     
Группа: Модератор 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; };
|
|
|
|
|
Aug 23 2013, 07:17
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Xenia @ Aug 22 2013, 17:10)  Если у компилятора нет формата double, то скорее всего, формата long long у него тоже нет. Не факт. В avr-gcc появился таки long-long, а double так и нет. 2ТС: чем скорее вы переползёте с CV на avr-gcc или IAR тем раньше сможете по-настоящему расправить свои крылья. CV - это студенческая игрушка, пригодная лишь для ознакомления с миром ембеда и не более того.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|