Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 64-x битный double
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Skaf
Всем привет.

Пользуюсь AVRGCC

Подключаю глонасс-приемник к ATXMega64A1. Проблема заключается в том, что бинарный протокол обмена данными с глонасс-примником содержит 64 битные цифры с плавающей точкой- double. На авр double 32 бита.

Есть ли 64 битный тип с плавающей точкой? Если нет, то как поступить в данной ситуации?
Непомнящий Евгений
а long double тоже 32 бита?
OlegNS
Два раза по double )
maksimp
Цитата(Skaf @ Jan 11 2012, 11:33) *
64 битные цифры с плавающей точкой-
как поступить в данной ситуации?

Трактовать данные как массив из четырёх short (или unsigned short). Разобраться где там знак, порядок и мантисса. Выделять их отдельно, и всё ручками преобразовывать к нужному виду.
_Pasha
Вроде ГЦЦ с опцией -mfloat64
Но я лично не пробовал
Палыч
Цитата(_Pasha @ Jan 11 2012, 14:26) *
Вроде ГЦЦ с опцией -mfloat64

Для AVR эта опция не работает...
Выход, imho, один: принять восемь байт (в структуру или в переменную, длинною 64 бита - long long), а дальше - преобразовать самодельной функцией к 32-битному float/double
_Pasha
Цитата(Палыч @ Jan 11 2012, 14:54) *
Для AVR эта опция не работает...
Выход, imho, один: принять восемь байт (в структуру или в переменную, длинною 64 бита - long long), а дальше - преобразовать самодельной функцией к 32-битному float/double

Если так, то это засада: мантиссу обрезать можно, а экспоненту как 11 бит в 8 преобразовать?
Надо все-таки у Клена <float.h> посмотреть.
Непомнящий Евгений
Цитата(_Pasha @ Jan 11 2012, 14:33) *
Если так, то это засада: мантиссу обрезать можно, а экспоненту как 11 бит в 8 преобразовать?
Надо все-таки у Клена <float.h> посмотреть.

+- бесконечность например. Тут надо уже на задачу смотреть - возможно заложено 64 бита, а числа ходят маленькие...
_Pasha
Цитата(Непомнящий Евгений @ Jan 11 2012, 15:37) *
+- бесконечность например. Тут надо уже на задачу смотреть - возможно заложено 64 бита, а числа ходят маленькие...

Вопрос к ТС, ибо если там какие-то коэффициенты аппроксимации присутствуют, например, то из песни слов не выбросишь.
Skaf
Цитата
Вопрос к ТС, ибо если там какие-то коэффициенты аппроксимации присутствуют, например, то из песни слов не выбросишь.


Да нет, видимо что-то выбросить можно. Они в этом типе там все гонят. И широту и долготу и высоту и скорость движения и даже время. Меня собственно именно эти поля и интересуют.

Цель- получить удобоваримые цифры для отображения на экране через OSD (наложить на аналоговый видеосигнал).

Я тут в инете нашел какую-то библиотечку для работы с 64 битным флоатом на АВР. Умеет с ними арифметические действия делать и преобразовывать в 32 бита. Пока не упсел пощупать, но если она нормально заработает- выложу ссылочку.
demiurg_spb
Цитата(Skaf @ Jan 11 2012, 11:33) *
заключается в том, что бинарный протокол
Может всё-таки проще будет переключиться на NMEA протокол?
Skaf
Цитата
Может всё-таки проще будет переключиться на NMEA протокол?


Действительно может. Попробую и так и так.
sonycman
Хм, если double на AVR 32 битный, то float сколько - неужели 16 битный?
Сорри за офтоп sm.gif
Палыч
Цитата(sonycman @ Jan 12 2012, 18:38) *
Хм, если double на AVR 32 битный, то float сколько - неужели 16 битный?

В GCC для AVR: float = double
maksimp
Цитата(Skaf @ Jan 12 2012, 09:23) *
Я тут в инете нашел какую-то библиотечку для работы с 64 битным флоатом на АВР. Умеет с ними арифметические действия делать и преобразовывать в 32 бита.

Можно ссылку?
Skaf
Цитата
Можно ссылку?


http://www.mikrocontroller.net/topic/85256#new
maksimp
Цитата(Skaf @ Jan 13 2012, 09:22) *

Спасибо! Очень интересно посмотреть. И под другие процессоры можно приспособить. Скорость указанная там интересна - 1000 умножений в секунду или 400 делений в секунду на ATMega32 (16 MHz).
_Pasha
Цитата(maksimp @ Jan 13 2012, 12:51) *
Скорость указанная там интересна - 1000 умножений в секунду или 400 делений в секунду на ATMega32 (16 MHz).


Цитата
float64_t f_div(float64_t fa, float64_t fb )
/***********************************************************/
{
float64_t x;

x=f_inverse(fb);
x=f_mult(fa,x);
return(x);
}

А в инверсии - CORDIC ...хм... Интересно вникнуть, кто будет быстрее - прямое деление на асме или тяжелые вычисления на Си. Вообще, на первый взгляд, либа тяжелющщщщая.
ЗЫ если быть точнее, то это не CORDIC, только я не знаю, как оно называется sm.gif
Skaf
Похоже правда тяжелющщщая.. с либой прога весит 20332 байт флеша, а без - 1222 байт.
maksimp
Цитата(_Pasha @ Jan 13 2012, 14:52) *
либа тяжелющщщщая.

Посмотрел в дизассемблере. Очень много уходит на копировние 64 битных чисел. По 8 команд, байт за байтом. Вероятно можно заметно уменьшить размер если передавать числа по адресу.
Вместо
Код
float64_t f_div(float64_t fa, float64_t fb )

сделать
Код
void f_div(float64_t *fa, float64_t *fb, float64_t *fr) // *fr = *fa / *fb

и так далее.
_Pasha
Цитата(maksimp @ Jan 13 2012, 18:58) *
Посмотрел в дизассемблере. Очень много уходит на копировние 64 битных чисел. По 8 команд, байт за байтом. Вероятно можно заметно уменьшить размер если передавать числа по адресу.

Вероятно, алгоритмы в либе оставляют желать лучшего.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.