[an error occurred while processing this directive]
Начиная с 3.0
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено TAP 30 января 2004 г. 11:18
В ответ на: А неуж-то AD на double разродились? По IEEE? отправлено SМ 30 января 2004 г. 10:51

у них появилось ETSI (незнаю что ет такое) библиотеки и наверное ieee
сьест не сьест :)
float powf (float x, float y) {
int sign, *p, xind; float v;

if (x == 0.0)
return 0.0;
sign = 0; /* positive sign */
p = (int *) &x; /* point to x */
if (x < 0.0) {
sign = (int) y; /* last bit for sign */
if ( sign != y) {
errno=EDOM;
return 0.0;
}
p[0] &= 0x7fff; /* x is positive now */
}
xind = p[0] >> 7;
xind -= 0x7f; /* convert ieee exponent */
p[0] &= 0x007f;
p[0] |= 0x3f80; /* x is in [1.0, 2.0) */

v = x - 1.0; /* v in [0.0, 1.0) */
v = _log2_1 (v); /* v in [0.0, 1.0) */
v += (double) xind; /* v = log2 (x); */
v *= y; /* v = y * log2 (x) */

y = floor (v); /* y is integer */
xind = (int) y; /* save exponent */
if ( xind < -126 )
return 0.0;
else
if (xind > 127 )
if ( sign&0x1 )
return FLT_MIN;
else
return FLT_MAX;
xind += 0x7f;
xind <<= 7; /* ready for ieee exponent */
v = v - y; /* v is in [0.0, 1.0) */
v = _exp2 (v); /* v is in [1.0, 2.0) */

p = (int *) &v;
p[0] &= 0x007f;
p[0] |= xind; /* v *= 2^exponent */
if (sign & 0x01)
p[0] |= 0x8000; /* negate v if sign is true */
return v;
}

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru