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

float в mikroC
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6585
Страница 1 от 1

Автор:  maiden [ Сря Фев 25, 2009 4:08 pm ]
Заглавие:  float в mikroC

Здравейте,
пиша една програмка на C da изчислява една задачка по оптимизация.
задавам
flaot променлива=израз;
след като отпечатам променливата излиза че се пази само цялата част но не и дробната.
Поддържа ли float mikroC?

Автор:  bateAz [ Сря Фев 25, 2009 4:52 pm ]
Заглавие: 

A как я "отпечатваш"? Ако може пусни сорса, дето го "отпечатва". :)

Автор:  Zdrav [ Сря Фев 25, 2009 5:21 pm ]
Заглавие: 

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

Автор:  maiden [ Сря Фев 25, 2009 5:48 pm ]
Заглавие: 

float a=3.1;
float b=4.1;
float result;
int df;

void main() {
Usart_Init(9600);
result=2*a*a+2*a*b+6*b*b+2*a-3*b+3; //очаквам резултат 142,4
df=(result*10)/10;
Usart_Write(df);

df=((int)result*10)%10;
Usart_Write(df);
//Получавам 142,0
}
Слаб програмист съм .помогнете:)



....
Направих го така
float a=3.1;
float b=4.1;
float result;
int df;

void main() {
Usart_Init(9600);
result=2*a*a+2*a*b+6*b*b+2*a-3*b+3; очаквам142,4
df=result*10;
df%=10;
Usart_Write(result);

Usart_Write(df);
//получавам 142,3
}
пак не става

Автор:  [ Сря Фев 25, 2009 6:14 pm ]
Заглавие: 

Аз ги разделям по бабешкия начин числата:
Код:
int16 fractional, integer;
float flt;
   integer = (int16)flt;               // Get integer part
   fractional = (int16)((flt-(float)integer)*100);      // Get 2 digits from fractional part



Usart_write() пребразува ли ти числото от двоично до двоично-десетично представяне ? Ако не го преобразува
нам да ти разпечата числото с цифри от 0 до 9, ами с цифри от 0 до F

Автор:  maiden [ Сря Фев 25, 2009 6:41 pm ]
Заглавие: 

¶,
и така не става :(
това предполагам е на CCS ,което си написал... това int16 предполагам е int..
няма в микроС int16

double fractional, integer;
void main() {
Usart_Init(9600);
result=2*a*a+2*a*b+6*b*b+2*a-3*b+3;
integer = (double)result;
Usart_Write(integer);
fractional = (double)((result-(float)integer)*100);
Usart_Write(fractional);
иначе на терминала си показва десетични числа

Автор:  [ Сря Фев 25, 2009 7:15 pm ]
Заглавие: 

maiden написа:
¶,
и така не става :(
това предполагам е на CCS ,което си написал... това int16 предполагам е int..
няма в микроС int16


int16 ( а и другите, които използвам ) идва от
Код:
typedef char int8;
typedef unsigned char uint8;
typedef int int16;
typedef unsigned int uint16;
typedef short long int24;
typedef unsigned short long uint24;
typedef signed long int32;
typedef unsigned long uint32;


Кода трябва да ти е:
Код:
int/*или каквото там разбира за 16-битов int компилатора*/ fractional, integer;
, а не

Код:
double fractional, integer;


Засега остави тия сметки дето правиш, ами разпечатай едно просто число с плаваща запетая, примерно:
Код:
float flt = 22.0/7.0;


Цитат:
иначе на терминала си показва десетични числа


Това последното ми се вижда много странно за тази функция, защото аз я разбирам като вземи и изпрати един байт по RS232, но
как ще е кодиран байта ( двоичен байт или двоично-десетичен(BCD) ) тя как знае за това ??

Прикачени файлове:
PrintFloat.jpg
PrintFloat.jpg [ 15.98 KiB | Прегледано 1304 пъти ]

Автор:  maiden [ Сря Фев 25, 2009 7:31 pm ]
Заглавие: 

Usart_write изпраща двоичен байт. Има функция отделно за конвертиране в binary to BCD.Така мисля де..:)
Твоята препоръка стана с 22.0/7.0 и получих на терминала точно 3.14.

Сложих пак израза и получавам 142.39 :)

Автор:  Zdrav [ Чет Фев 26, 2009 8:27 am ]
Заглавие: 

maiden написа:
df=((int)result*10)%10;

Така не се прави. В този ред когато кастваш result към int вече си загубил дробната част.
Трябва да е:
Код:
df=((int)(result*10 + 0.5))%10;

Ако ти е все едно как се закръглява резултата и искаш да опростиш и ускориш кода може да пропуснеш добавянето на 0.5.
При следващите варианти които си опитал също имаш грешки, но няма да се спирам на тях.
Какво прави Usart_Write() е отделен въпрос.

Автор:  valioman [ Чет Фев 26, 2009 9:58 am ]
Заглавие: 

а що не пробваш по бабешкия начин ... не знам МикроЦ то дали има printf() ама дори и да няма пробвай да конвертираш в string и тогава да го хвърлиш по uart-a

Автор:  ps66 [ Чет Фев 26, 2009 10:16 am ]
Заглавие: 

доколкото разбирам на младежа проблема е че вместо 142.4 (точния резултат) - той получава 142.39 и това го притеснява !

освен очевидните грешки при int/float преобразуванията, .. може да е резултат от закръгленията (междинни стойности ...) на туй microC (или както му викат) ...или по-точно на библиотеките му за плаващи сметки!

пробвай да закръгляш до разряда който те интересува - така ще е и по-коректно по принцип !

пример:
резултата ти е 142.399999 - което си е баш 142.4 ... но не съвсем :)

Автор:  maiden [ Чет Фев 26, 2009 6:00 pm ]
Заглавие: 

Zdrav,
мерси така стана както си ми написал

df=((int)(result*100 + 0.5))%100;

съответно като се умножава .10,.100 и съответно накрая %10,%100
се регулират значещите цифри. Благодаря и на другите.Много полезен форум за тези които се занимават
с тези неща.Много има да чета още за "С" че досега бях само с асемблер.

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