|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:40 am
|
Страница 1 от 1
|
[ 9 мнения ] |
|
Проблем с float i HI-TECH ?!?
| Автор |
Съобщение |
|
GTN
Ранг: Популярен
Регистриран на: Пет Яну 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 |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
Без да знам какъв е този компилатор и за какво е, винаги можеш да разпечаташ какво има в тези променливи преди и след аритметичната операция.
След това анализираш стойностите преди и след събирането примерно. Част от проблемите които може да имаш са криви библиотеки, крива инициализация на инициализираните променливи (fnum), крив sprintf().
Същата програма компилирана за PC ще ти покаже горе-долу на какво приличат числата във little-endian float ако не можеш да си ги конвертираш.
|
| Съб Дек 15, 2007 5:13 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 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 |
|
 |
|
GTN
Ранг: Популярен
Регистриран на: Пет Яну 26, 2007 5:05 pm Мнения: 310 Местоположение: из България
|
@woody
Компилатора е за PIC микроконтролери, или поне тази версия която аз използвам. Сега ще пробвам това което предлагаш. Ако мога де
@ps66
Пробвах и с масив с размер 20,50, 100. Все същата работа  едно "f".
|
| Съб Дек 15, 2007 5:29 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
Трябва да можеш, защо да не?
Ако имаш някакъв хардуерен дебъгер или дори симулатор можеш да видиш директно какво е съдържанието на тези променливи по време на изпълнение. Ако не - горния пример трябва да ти свърши работа.
|
| Съб Дек 15, 2007 5:55 pm |
|
 |
|
lucifer
Ранг: Минаващ
Регистриран на: Вто Апр 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 |
|
 |
|
TheWizard
Ранг: Форумен бог
Регистриран на: Сря Апр 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 папката
|
| Съб Дек 15, 2007 6:09 pm |
|
 |
|
GTN
Ранг: Популярен
Регистриран на: Пет Яну 26, 2007 5:05 pm Мнения: 310 Местоположение: из България
|
Имам хардуерен дебъгер, ще го проверя. Само че сега излезе малко друга работа.
Благодаря и на останалите който отговориха.
И техните варианти ще пробвам.
Дано да стане нещо
Приятна вечер на всички 
|
| Съб Дек 15, 2007 6:54 pm |
|
 |
|
GTN
Ранг: Популярен
Регистриран на: Пет Яну 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. А това май е отговора на втория ми въпрос. Ама ще пробвам утре че сега излизам  |  |  |  |  |
Благодаря още веднъж на всички
Все пак ще пробвам и вашите варианти 
|
| Съб Дек 15, 2007 7:57 pm |
|
|
|
Страница 1 от 1
|
[ 9 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|