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


Сря Фев 25, 2009 4:08 pm
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
A как я "отпечатваш"? Ако може пусни сорса, дето го "отпечатва". :)


Сря Фев 25, 2009 4:52 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
Зависи и как си написал израза. Ако не си съобразил някои неща... често срещано явление е да загубиш дробната част. :) А може и по-лошо.

_________________
Най-опасният враг на истината и свободата е мнозинството.


Сря Фев 25, 2009 5:21 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 5:48 pm
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Аз ги разделям по бабешкия начин числата:
Код:
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

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Сря Фев 25, 2009 6:14 pm
Профил WWW
Мнение 
¶,
и така не става :(
това предполагам е на 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 6:41 pm
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
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 | Прегледано 1280 пъти ]

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
Сря Фев 25, 2009 7:15 pm
Профил WWW
Мнение 
Usart_write изпраща двоичен байт. Има функция отделно за конвертиране в binary to BCD.Така мисля де..:)
Твоята препоръка стана с 22.0/7.0 и получих на терминала точно 3.14.

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


Сря Фев 25, 2009 7:31 pm
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
maiden написа:
df=((int)result*10)%10;

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

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

_________________
Най-опасният враг на истината и свободата е мнозинството.


Чет Фев 26, 2009 8:27 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 17, 2005 5:07 pm
Мнения: 813
Местоположение: Сливен
Мнение 
а що не пробваш по бабешкия начин ... не знам МикроЦ то дали има printf() ама дори и да няма пробвай да конвертираш в string и тогава да го хвърлиш по uart-a


Чет Фев 26, 2009 9:58 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
доколкото разбирам на младежа проблема е че вместо 142.4 (точния резултат) - той получава 142.39 и това го притеснява !

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

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

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


Чет Фев 26, 2009 10:16 am
Профил
Мнение 
Zdrav,
мерси така стана както си ми написал

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

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


Чет Фев 26, 2009 6:00 pm
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 12 мнения ] 

Кой е на линия

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


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

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