Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Проблем с float i HI-TECH ?!?
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=5212
Страница 1 от 1

Автор:  GTN [ Съб Дек 15, 2007 3:55 pm ]
Заглавие:  Проблем с 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 ме мъчи.
Ще се радвам на идеи за разрешаването на двата проблема :)

Автор:  woody [ Съб Дек 15, 2007 5:13 pm ]
Заглавие: 

Без да знам какъв е този компилатор и за какво е, винаги можеш да разпечаташ какво има в тези променливи преди и след аритметичната операция.

Код:
#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 ако не можеш да си ги конвертираш.

Автор:  ps66 [ Съб Дек 15, 2007 5:22 pm ]
Заглавие:  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];

:)

Автор:  GTN [ Съб Дек 15, 2007 5:29 pm ]
Заглавие: 

@woody
Компилатора е за PIC микроконтролери, или поне тази версия която аз използвам. Сега ще пробвам това което предлагаш. Ако мога де :oops:

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

Автор:  woody [ Съб Дек 15, 2007 5:55 pm ]
Заглавие: 

Трябва да можеш, защо да не? :-)

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

Автор:  lucifer [ Съб Дек 15, 2007 6:07 pm ]
Заглавие: 

Не знам какъв компилатор ползваш и с какви библиотеки разполагаш, но аз за същото нещо в 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;
}

:)

Автор:  TheWizard [ Съб Дек 15, 2007 6:09 pm ]
Заглавие: 

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 | Прегледано 1082 пъти ]
pcl40c-f.rar [3.32 KiB]
125 пъти

Автор:  GTN [ Съб Дек 15, 2007 6:54 pm ]
Заглавие: 

woody написа:

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


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

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

Автор:  GTN [ Съб Дек 15, 2007 7:57 pm ]
Заглавие: 

Уфффффф , 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.


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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/