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

 
 
> Как sprintf() работает с float числами?
Александар
сообщение Apr 28 2008, 09:18
Сообщение #1





Группа: Новичок
Сообщений: 8
Регистрация: 28-08-07
Пользователь №: 30 106



Q правильно преобразуется, а E не понятно как.
в прикрепленном файле содержимое массива Str после выполнения функции.

#include <avr/io.h>
#include <stdio.h>

unsigned char Q=5;
char Str[16];
double E=2.15;
int main(void) //
{

sprintf(Str, "Q=%d E=%2.2f %s",Q, E, "FFF");
__asm__ volatile("nop");

}
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
bzx
сообщение Apr 28 2008, 09:53
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



Можно попытаться поиграться в настройках компилятора с опциями sprintf


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
GDI
сообщение Apr 28 2008, 09:55
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



В ИАРе надо было бы включить поддержку float в функциях printf, sprintf - по-умолчанию она выключена


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 28 2008, 10:04
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



RTFM:
Цитата
Since the full implementation of all the mentioned features becomes fairly large, three different flavours of vfprintf() can be selected using linker options. The default vfprintf() implements all the mentioned functionality except floating point conversions. A minimized version of vfprintf() is available that only implements the very basic integer and string conversion facilities, but only the # additional option can be specified using conversion flags (these flags are parsed correctly from the format specification, but then simply ignored). This version can be requested using the following compiler options:


-Wl,-u,vfprintf -lprintf_min

If the full functionality including the floating point conversions is required, the following options should be used:


-Wl,-u,vfprintf -lprintf_flt -lm


Анатолий

Сообщение отредактировал aesok - Apr 28 2008, 10:06
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 28 2008, 10:18
Сообщение #5


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



по-моему, с ключом %f надо выводить флоты, а не даблы
По результату похоже, что неправильно распаковывается число Е.
попробуйте обозвать его float
или выводить (float)E


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 28 2008, 10:23
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(MrYuran @ Apr 28 2008, 14:18) *
по-моему, с ключом %f надо выводить флоты, а не даблы
...


В avr-gcc типы float и double идентичны, по крайней мере сейчас.

Анатолий.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 28 2008, 10:38
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(aesok @ Apr 28 2008, 13:23) *
В avr-gcc типы float и double идентичны, по крайней мере сейчас.
Анатолий.

Ну не знаю... по крайней мере однажды у меня тоже такая галиматья выводилась, и связано это было именно с несоответствием типов выводимых переменных с ключами вывода


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Александар
сообщение Apr 28 2008, 10:41
Сообщение #8





Группа: Новичок
Сообщений: 8
Регистрация: 28-08-07
Пользователь №: 30 106



Добавил строку -Wl,-u,vfprintf -lprintf_flt -lm в параметры проекта в linker option, все получилось, правда код возрос. СПАСИБО!!!
Проект на AVR Studio + GCC.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 29 2008, 16:57
Сообщение #9


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Тут уже всё решилось, но я хочу кое-что пояснить.

Цитата(MrYuran @ Apr 28 2008, 13:18) *
по-моему, с ключом %f надо выводить флоты, а не даблы
С форматом %f и остальными "плавающими" форматами, насколько я помню, всегда *printf-ом выводилось double, модификатор l (%lf и т.д.) при віводе игнорируется.
А вот *scanf-ом вводилось float по %f и double %lf.
Сейчас ещё *printf-ом по %Lf выводится long double (обратите внимание на то, что тут L большая)

Насколько я помню, для *printf при выводе float преобразовывать его вручную не нужно, так же, как не нужно вручную преобразовывать char/short к int, это делается автоматически согласно default argument promotions.
По крайней мере я никогда не преобразовывал для вывода signed/unsigned char/short к int smile.gif

Ну а у AVR, как уже было сказано, float и double совпадают, поэтому это место точно не могло быть причиной.



Цитата(MrYuran @ Apr 28 2008, 13:38) *
Ну не знаю... по крайней мере однажды у меня тоже такая галиматья выводилась, и связано это было именно с несоответствием типов выводимых переменных с ключами вывода
Ну не знаю... Если вместо int подсунуть long или float - да, будет галиматья. По цепочке от char до int и float вместо double должно всё быть нормально.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


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


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