|
Floating point AVR-GCC, Как выполнять операции? |
|
|
|
Dec 4 2007, 10:35
|
Частый гость
 
Группа: Участник
Сообщений: 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 Это правильные результаты в представлении с плавающей точкой.
Так что получается все операции с плавающей точкой выполнятся безо вляких там спец внешних библиотек что ли, так просто??? Или я чего-то не понимаю?
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Dec 4 2007, 10:44
|
Местный
  
Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112

|
Код printf (stream, "0.6298=%f \n", x); может это имелось ввиду ?
|
|
|
|
|
Dec 4 2007, 10:51
|
Частый гость
 
Группа: Участник
Сообщений: 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 напечатал и посмотрел что они представлены с плавающей точкой и результаты верны.
|
|
|
|
|
Dec 4 2007, 11:15
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 5 2007, 08:36
|
Частый гость
 
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 5 2007, 09:03
|
Частый гость
 
Группа: Участник
Сообщений: 75
Регистрация: 15-03-07
Пользователь №: 26 193

|
Цитата(forever failure @ Dec 5 2007, 11:50)  чьей сборки avr-gcc, какая версия ? может avr-libc не собрана или не установлена ? не установлена. Тут все сложно - своя(в смысле местного производства  ) многоплатформенная ось..., libm.a из avr-libc я подликовал а если другие библиотеки брать то тут их так просто не подцепишь, очень многое править надо. Баг с преобразованием типов похоже оттуда-то оттуда и вылез. Обходные пути нашел.
Сообщение отредактировал Kris2007 - Dec 5 2007, 09:14
|
|
|
|
|
Dec 5 2007, 13:49
|
Частый гость
 
Группа: Участник
Сообщений: 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.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|