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

 
 
> 64-x битный double
Skaf
сообщение Jan 11 2012, 08:33
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



Всем привет.

Пользуюсь AVRGCC

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

Есть ли 64 битный тип с плавающей точкой? Если нет, то как поступить в данной ситуации?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 20)
Непомнящий Евген...
сообщение Jan 11 2012, 09:49
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



а long double тоже 32 бита?
Go to the top of the page
 
+Quote Post
OlegNS
сообщение Jan 11 2012, 09:50
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 97
Регистрация: 25-09-06
Пользователь №: 20 664



Два раза по double )
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jan 11 2012, 09:53
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(Skaf @ Jan 11 2012, 11:33) *
64 битные цифры с плавающей точкой-
как поступить в данной ситуации?

Трактовать данные как массив из четырёх short (или unsigned short). Разобраться где там знак, порядок и мантисса. Выделять их отдельно, и всё ручками преобразовывать к нужному виду.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 11 2012, 10:26
Сообщение #5


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Вроде ГЦЦ с опцией -mfloat64
Но я лично не пробовал
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 11 2012, 10:54
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(_Pasha @ Jan 11 2012, 14:26) *
Вроде ГЦЦ с опцией -mfloat64

Для AVR эта опция не работает...
Выход, imho, один: принять восемь байт (в структуру или в переменную, длинною 64 бита - long long), а дальше - преобразовать самодельной функцией к 32-битному float/double
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 11 2012, 11:33
Сообщение #7


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

Если так, то это засада: мантиссу обрезать можно, а экспоненту как 11 бит в 8 преобразовать?
Надо все-таки у Клена <float.h> посмотреть.

Сообщение отредактировал _Pasha - Jan 11 2012, 11:35
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jan 11 2012, 11:37
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



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

+- бесконечность например. Тут надо уже на задачу смотреть - возможно заложено 64 бита, а числа ходят маленькие...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 11 2012, 11:42
Сообщение #9


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

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

Сообщение отредактировал _Pasha - Jan 11 2012, 11:42
Go to the top of the page
 
+Quote Post
Skaf
сообщение Jan 12 2012, 06:23
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



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


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

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

Я тут в инете нашел какую-то библиотечку для работы с 64 битным флоатом на АВР. Умеет с ними арифметические действия делать и преобразовывать в 32 бита. Пока не упсел пощупать, но если она нормально заработает- выложу ссылочку.

Сообщение отредактировал Skaf - Jan 12 2012, 06:21
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 12 2012, 06:47
Сообщение #11


неотягощённый злом
******

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



Цитата(Skaf @ Jan 11 2012, 11:33) *
заключается в том, что бинарный протокол
Может всё-таки проще будет переключиться на NMEA протокол?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Skaf
сообщение Jan 12 2012, 10:20
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



Цитата
Может всё-таки проще будет переключиться на NMEA протокол?


Действительно может. Попробую и так и так.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 12 2012, 14:38
Сообщение #13


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Хм, если double на AVR 32 битный, то float сколько - неужели 16 битный?
Сорри за офтоп sm.gif
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 12 2012, 15:45
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(sonycman @ Jan 12 2012, 18:38) *
Хм, если double на AVR 32 битный, то float сколько - неужели 16 битный?

В GCC для AVR: float = double
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jan 13 2012, 06:13
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



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

Можно ссылку?
Go to the top of the page
 
+Quote Post
Skaf
сообщение Jan 13 2012, 06:22
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



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


http://www.mikrocontroller.net/topic/85256#new
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jan 13 2012, 08:51
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(Skaf @ Jan 13 2012, 09:22) *

Спасибо! Очень интересно посмотреть. И под другие процессоры можно приспособить. Скорость указанная там интересна - 1000 умножений в секунду или 400 делений в секунду на ATMega32 (16 MHz).
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 13 2012, 10:52
Сообщение #18


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(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

Сообщение отредактировал _Pasha - Jan 13 2012, 10:56
Go to the top of the page
 
+Quote Post
Skaf
сообщение Jan 13 2012, 11:26
Сообщение #19


Местный
***

Группа: Участник
Сообщений: 228
Регистрация: 4-06-09
Пользователь №: 49 940



Похоже правда тяжелющщщая.. с либой прога весит 20332 байт флеша, а без - 1222 байт.
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jan 13 2012, 15:58
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(_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

и так далее.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 13 2012, 20:27
Сообщение #21


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



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

Вероятно, алгоритмы в либе оставляют желать лучшего.
Go to the top of the page
 
+Quote Post

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

 


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


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