Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Floating point AVR-GCC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Kris2007
Пишу:
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
Это правильные результаты в представлении с плавающей точкой.

Так что получается все операции с плавающей точкой выполнятся безо вляких там спец внешних библиотек что ли, так просто??? Или я чего-то не понимаю?
forever failure
Код

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

может это имелось ввиду ?
Kris2007
Цитата(forever failure @ Dec 4 2007, 13:44) *
Код

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

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


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

Я числа как unsigned long напечатал и посмотрел что они представлены с плавающей точкой и результаты верны.
defunct
Цитата
Так что получается все операции с плавающей точкой выполнятся безо вляких там спец внешних библиотек

Да, а разве могло быть иначе?
когда потребуется sin/cos и т.п. - math.h
forever failure
Попробуйте в ключи компоновки добавить -Wl,-u,vfprintf -lprintf_flt
Сергей Борщ
Цитата(Kris2007 @ Dec 4 2007, 12:35) *
Так что получается все операции с плавающей точкой выполнятся безо вляких там спец внешних библиотек что ли, так просто??? Или я чего-то не понимаю?
Вот что мне на аналогичный вопрос отвечал aesok:
Цитата
Цитата
И если будете использовать float подключите 'libm.lib' библиотеку, добавте ключик -lm.
Насчет libm.. короткий ответ - на всякий случай подключайте ее всегда.

Дело в том что есть 2 варианта функций выполняющих действия (+, -, .. сравнения, преобразования в/из int) над float. В libgcc написанные на С и в libm написанные ассемблере. Для того чтобы использовались ассемблерные варианты этих функций нужно подключить libm в командной строке линкера после libgcc.
Kris2007
Цитата(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 вычисляется неверно.
forever failure
чьей сборки avr-gcc, какая версия ? может avr-libc не собрана или не установлена ?
Сергей Борщ
Цитата(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. А дальше писать баг-репорт и искать временные пути обхода. "Я так думаю!" (с) Фрунзик Мкчтрян.
Kris2007
Цитата(forever failure @ Dec 5 2007, 11:50) *
чьей сборки avr-gcc, какая версия ? может avr-libc не собрана или не установлена ?

не установлена.
Тут все сложно - своя(в смысле местного производстваsmile.gif ) многоплатформенная ось..., libm.a из avr-libc я подликовал а если другие библиотеки брать то тут их так просто не подцепишь, очень многое править надо.
Баг с преобразованием типов похоже оттуда-то оттуда и вылез. Обходные пути нашел.
Kris2007
Цитата(Сергей Борщ @ 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.
Сергей Борщ
Цитата(Kris2007 @ Dec 5 2007, 15:49) *
Число округляется, остается записано как floting point.
Да, лопухнулся. Обратное преобразование тоже выполняется автоматически
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.