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

 
 
> Floating point AVR-GCC, Как выполнять операции?
Kris2007
сообщение Dec 4 2007, 10:35
Сообщение #1


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

Группа: Участник
Сообщений: 75
Регистрация: 15-03-07
Пользователь №: 26 193



Пишу:
float x, pi;
x=0.6298;
pi = 3.14159265358;
printf (stream, "0.6298=%lx \n", x);
printf (stream, "pi/6=%lx \n", pi/6);
printf (stream, "pi=%lx \n", pi);
printf (stream, "2*pi=%lx \n",2 * pi);
Получаю на терминале:
0.6298=3f213a93
pi/6=3f060a92
pi=40490fdb
2*pi=40c90fdb
Это правильные результаты в представлении с плавающей точкой.

Так что получается все операции с плавающей точкой выполнятся безо вляких там спец внешних библиотек что ли, так просто??? Или я чего-то не понимаю?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
forever failure
сообщение Dec 4 2007, 10:44
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Код

printf (stream, "0.6298=%f \n", x);

может это имелось ввиду ?
Go to the top of the page
 
+Quote Post
Kris2007
сообщение Dec 4 2007, 10:51
Сообщение #3


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

Группа: Участник
Сообщений: 75
Регистрация: 15-03-07
Пользователь №: 26 193



Цитата(forever failure @ Dec 4 2007, 13:44) *
Код

printf (stream, "0.6298=%f \n", x);

может это имелось ввиду ?


Нет. Тут свой printf сделали - так он печатать для авр-ов не умеет , точнее умеет наверно но я еще не разобрался где и как DBL_DIG и FLT_DIG для avr-ов определить.

Я числа как unsigned long напечатал и посмотрел что они представлены с плавающей точкой и результаты верны.
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 4 2007, 11:01
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
Так что получается все операции с плавающей точкой выполнятся безо вляких там спец внешних библиотек

Да, а разве могло быть иначе?
когда потребуется sin/cos и т.п. - math.h
Go to the top of the page
 
+Quote Post
forever failure
сообщение Dec 4 2007, 11:07
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



Попробуйте в ключи компоновки добавить -Wl,-u,vfprintf -lprintf_flt
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 4 2007, 11:15
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Kris2007 @ Dec 4 2007, 12:35) *
Так что получается все операции с плавающей точкой выполнятся безо вляких там спец внешних библиотек что ли, так просто??? Или я чего-то не понимаю?
Вот что мне на аналогичный вопрос отвечал aesok:
Цитата
Цитата
И если будете использовать float подключите 'libm.lib' библиотеку, добавте ключик -lm.
Насчет libm.. короткий ответ - на всякий случай подключайте ее всегда.

Дело в том что есть 2 варианта функций выполняющих действия (+, -, .. сравнения, преобразования в/из int) над float. В libgcc написанные на С и в libm написанные ассемблере. Для того чтобы использовались ассемблерные варианты этих функций нужно подключить libm в командной строке линкера после libgcc.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Kris2007
сообщение Dec 5 2007, 08:36
Сообщение #7


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

Группа: Участник
Сообщений: 75
Регистрация: 15-03-07
Пользователь №: 26 193



Цитата(forever failure @ Dec 4 2007, 14:07) *
Попробуйте в ключи компоновки добавить -Wl,-u,vfprintf -lprintf_flt

Не так не получается. Нет у меня никакой библиотеки printf_flt, свой тут printf (к сожалению похоже и не доделанный).

А как преобразование выполнить unsigned long в double или float с плавающей точкой.
Так не выходит:
unsigned long lp;
double p;
p=(double)lp;

lp не преобразуется как плавающей точке и я это вижу при печати переменной.

В результате выражения типа M_PI/p вычисляется неверно.

Сообщение отредактировал Kris2007 - Dec 5 2007, 08:37
Go to the top of the page
 
+Quote Post
forever failure
сообщение Dec 5 2007, 08:50
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



чьей сборки avr-gcc, какая версия ? может avr-libc не собрана или не установлена ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 5 2007, 09:01
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Kris2007 @ Dec 5 2007, 10:36) *
Так не выходит:
unsigned long lp;
double p;
p=(double)lp;
Значит это бага. должно работать даже p = lp и M_PI/lp. Согласно правилам приведения типов если в выражении один из операндов float, то второй целый автоматически преобразовывается к float. Обратное преобразование выполняется функцией ceil(). Надо смотреть листинг и выяснять - это ошибка компилятора или библиотечной функции преобразования unsigned long в double. А дальше писать баг-репорт и искать временные пути обхода. "Я так думаю!" (с) Фрунзик Мкчтрян.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Kris2007
сообщение Dec 5 2007, 09:03
Сообщение #10


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

Группа: Участник
Сообщений: 75
Регистрация: 15-03-07
Пользователь №: 26 193



Цитата(forever failure @ Dec 5 2007, 11:50) *
чьей сборки avr-gcc, какая версия ? может avr-libc не собрана или не установлена ?

не установлена.
Тут все сложно - своя(в смысле местного производстваsmile.gif ) многоплатформенная ось..., libm.a из avr-libc я подликовал а если другие библиотеки брать то тут их так просто не подцепишь, очень многое править надо.
Баг с преобразованием типов похоже оттуда-то оттуда и вылез. Обходные пути нашел.

Сообщение отредактировал Kris2007 - Dec 5 2007, 09:14
Go to the top of the page
 
+Quote Post
Kris2007
сообщение Dec 5 2007, 13:49
Сообщение #11


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

Группа: Участник
Сообщений: 75
Регистрация: 15-03-07
Пользователь №: 26 193



Цитата(Сергей Борщ @ Dec 5 2007, 12:01) *
Обратное преобразование выполняется функцией ceil(). Надо смотреть листинг и выяснять - это ошибка компилятора или библиотечной функции преобразования unsigned long в double.


The ceil() function returns the smallest integral value greater than or equal to x, ex-
pressed as a floating-point number.
Число округляется, остается записано как floting point.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 5 2007, 16:41
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Kris2007 @ Dec 5 2007, 15:49) *
Число округляется, остается записано как floting point.
Да, лопухнулся. Обратное преобразование тоже выполняется автоматически


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


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


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