Отговори на тема  [ 9 мнения ] 
Проблем с float i HI-TECH ?!? 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Яну 26, 2007 5:05 pm
Мнения: 310
Местоположение: из България
Мнение Проблем с float i HI-TECH ?!?
Здравейте,
Вече няколко дена се опитвам да подкарам една проста сметка. Имам си едно float число, и искам да прибавя към него друго float. Да ама нещо не успявам.

Ето програмата. Използвам МПЛАБ и HI-TECH. Оптимизациите са изключени.

#include <htc.h>
#include <stdio.h>

float fnum=2.33,fnum2;
char outString[8];

void main (void)
{
fnum2=fnum+2.01;

sprintf(outString,"%5.2f",fnum2);

}//krai main



Преди събирането на двете числа:
value decimal
fnum =5.885049e-039 4199711
fnum2=0 0


След това:
fnum =5.885049e-039 4199711
fnum2=5.927294e-039 4229858


Ако успея да разреша този проблем ще искам да преорбазувам fnum2 до ascii. Пробвах със sprintf(); но записва само едно f в първия елемент на масива. Ако пробвам със "%d" и int вместо float, няма проблеми. Обаче нещо този float ме мъчи.
Ще се радвам на идеи за разрешаването на двата проблема :)


Съб Дек 15, 2007 3:55 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
Без да знам какъв е този компилатор и за какво е, винаги можеш да разпечаташ какво има в тези променливи преди и след аритметичната операция.

Код:
#define DUMP(x) dump (&x, sizeof (x))

void dump (const void *s, int n)
{
    unsigned char *b = (unsigned char *)s;

    printf ("memory at 0x%08lX: ", (long)s);
    while (n--)
      printf ("%02X ", *b++);
    printf ("\n");
}

// ....

    DUMP (fnum);
    DUMP (fnum2);


След това анализираш стойностите преди и след събирането примерно. Част от проблемите които може да имаш са криви библиотеки, крива инициализация на инициализираните променливи (fnum), крив sprintf().

Същата програма компилирана за PC ще ти покаже горе-долу на какво приличат числата във little-endian float ако не можеш да си ги конвертираш.


Съб Дек 15, 2007 5:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: Проблем с float i HI-TECH ?!?
GTN написа:
Здравейте,
Вече няколко дена се опитвам да подкарам една проста сметка. Имам си едно float число, и искам да прибавя към него друго float. Да ама нещо не успявам.

Ето програмата. Използвам МПЛАБ и HI-TECH. Оптимизациите са изключени.

#include <htc.h>
#include <stdio.h>

float fnum=2.33,fnum2;
char outString[8];

void main (void)
{
fnum2=fnum+2.01;

sprintf(outString,"%5.2f",fnum2);

}//krai main



Преди събирането на двете числа:
value decimal
fnum =5.885049e-039 4199711
fnum2=0 0


След това:
fnum =5.885049e-039 4199711
fnum2=5.927294e-039 4229858


Ако успея да разреша този проблем ще искам да преорбазувам fnum2 до ascii. Пробвах със sprintf(); но записва само едно f в първия елемент на масива. Ако пробвам със "%d" и int вместо float, няма проблеми. Обаче нещо този float ме мъчи.
Ще се радвам на идеи за разрешаването на двата проблема :)


много стиснат ми се виждаш -> що не вземеш да се поотпуснеш малко ... например:

char outString[8+8];

:)

_________________
путинофили: "иди н***й"


Съб Дек 15, 2007 5:22 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Яну 26, 2007 5:05 pm
Мнения: 310
Местоположение: из България
Мнение 
@woody
Компилатора е за PIC микроконтролери, или поне тази версия която аз използвам. Сега ще пробвам това което предлагаш. Ако мога де :oops:

@ps66
Пробвах и с масив с размер 20,50, 100. Все същата работа :( едно "f".


Съб Дек 15, 2007 5:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
Трябва да можеш, защо да не? :-)

Ако имаш някакъв хардуерен дебъгер или дори симулатор можеш да видиш директно какво е съдържанието на тези променливи по време на изпълнение. Ако не - горния пример трябва да ти свърши работа.


Съб Дек 15, 2007 5:55 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Апр 04, 2006 5:13 pm
Мнения: 41
Мнение 
Не знам какъв компилатор ползваш и с какви библиотеки разполагаш, но аз за същото нещо в CodeVision ползвам функцията ftoa от stdlib.h
Ето как изглежда и самата функция:


static flash float _fround[7]={0.5,0.05,0.005,0.0005,0.00005,0.000005,0.0000005};

void ftoa(float n,unsigned char decimals,char *str)
{
float scale;
unsigned char i,d;
if (n<0.0) {n=-n; *str++='-';};
if (decimals>6) decimals=6;
n=n+_fround[decimals];
i=0;
scale=1.0;
while (n>=scale) {scale=scale*10.0; ++i;};
if (i==0) *str++='0';
else
while (i--)
{
scale=floor(0.5+scale/10.0);
d=(unsigned char) (n/scale);
*str++=d+'0';
n=n-scale*d;
};
if (decimals==0) {*str=0; return;};
*str++='.';
while (decimals--)
{
n=n*10.0;
d=(unsigned char) n;
*str++=d+'0';
n=n-d;
};
*str=0;
}

:)


Съб Дек 15, 2007 6:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
Project/Options/... PRINTF - float
ако ти ревне за LITE версията
Error [141] ; . can't open library file "...........\lib\pcl40c-f.lib": No such file or directory

Attachment: добави го в LIB папката


Прикачени файлове:
test1.jpg
test1.jpg [ 27.91 KiB | Прегледано 1078 пъти ]
pcl40c-f.rar [3.32 KiB]
124 пъти
Съб Дек 15, 2007 6:09 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Яну 26, 2007 5:05 pm
Мнения: 310
Местоположение: из България
Мнение 
woody написа:

Ако имаш някакъв хардуерен дебъгер или дори симулатор можеш да видиш директно какво е съдържанието на тези променливи по време на изпълнение. Ако не - горния пример трябва да ти свърши работа.


Имам хардуерен дебъгер, ще го проверя. Само че сега излезе малко друга работа.
Благодаря и на останалите който отговориха.
И техните варианти ще пробвам.
Дано да стане нещо :)

Приятна вечер на всички :roll:


Съб Дек 15, 2007 6:54 pm
Профил
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Яну 26, 2007 5:05 pm
Мнения: 310
Местоположение: из България
Мнение 
Уфффффф , 2 пъти изчетох ръководството на HI-TECH, ама трябвало и FAQ на сайта им да видя , да разбера защо така се получавало.

Цитат:
Why do my 'float' variables in MPLAB's Watch window have the wrong value?

MPLAB's Watch window interprets all floating-point variables
('float' or 'double') as 32 bit values unless you manually change
the properties for each one.

Since our PICC compiler uses 24 bits for 'float', and also for
'double' unless you explicitly specify otherwise, this means
all floating point values displayed will appear wrong.

To correct the display, right-click on the variable name in the
Watch window and select Properties, then change its size to 24 bits.

А това май е отговора на втория ми въпрос. Ама ще пробвам утре че сега излизам :)



Цитат:
Using %f in printf does not work

Q: I have a printf call like:

printf("number=%f\n");

but the output is 'number=(non-float printf)'. What am I doing wrong?

A: In HPD you must set "Options/Float formats in printf" or from the command
line use a -LF option to include the floating point library. The default
library does not include floating point support for printf, to reduce the
code size.


Благодаря още веднъж на всички :)
Все пак ще пробвам и вашите варианти :)


Съб Дек 15, 2007 7:57 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни