| Автор |
Съобщение |
|
maiden
|
 float в mikroC
Здравейте,
пиша една програмка на C da изчислява една задачка по оптимизация.
задавам
flaot променлива=израз;
след като отпечатам променливата излиза че се пази само цялата част но не и дробната.
Поддържа ли float mikroC?
|
| Сря Фев 25, 2009 4:08 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
A как я "отпечатваш"? Ако може пусни сорса, дето го "отпечатва". 
|
| Сря Фев 25, 2009 4:52 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
Зависи и как си написал израза. Ако не си съобразил някои неща... често срещано явление е да загубиш дробната част.  А може и по-лошо.
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
| Сря Фев 25, 2009 5:21 pm |
|
 |
|
maiden
|
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
|
Аз ги разделям по бабешкия начин числата:
Usart_write() пребразува ли ти числото от двоично до двоично-десетично представяне ? Ако не го преобразува
нам да ти разпечата числото с цифри от 0 до 9, ами с цифри от 0 до F
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Сря Фев 25, 2009 6:14 pm |
|
 |
|
maiden
|
¶,
и така не става
това предполагам е на 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
|
int16 ( а и другите, които използвам ) идва от Кода трябва да ти е: , а не Засега остави тия сметки дето правиш, ами разпечатай едно просто число с плаваща запетая, примерно:
Това последното ми се вижда много странно за тази функция, защото аз я разбирам като вземи и изпрати един байт по RS232, но
как ще е кодиран байта ( двоичен байт или двоично-десетичен(BCD) ) тя как знае за това ??
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Сря Фев 25, 2009 7:15 pm |
|
 |
|
maiden
|
Usart_write изпраща двоичен байт. Има функция отделно за конвертиране в binary to BCD.Така мисля де..
Твоята препоръка стана с 22.0/7.0 и получих на терминала точно 3.14.
Сложих пак израза и получавам 142.39 
|
| Сря Фев 25, 2009 7:31 pm |
|
 |
|
Zdrav
Ранг: Форумен бог
Регистриран на: Сря Яну 26, 2005 2:01 pm Мнения: 1952 Местоположение: Варна
|
Така не се прави. В този ред когато кастваш result към int вече си загубил дробната част.
Трябва да е:
Ако ти е все едно как се закръглява резултата и искаш да опростиш и ускориш кода може да пропуснеш добавянето на 0.5.
При следващите варианти които си опитал също имаш грешки, но няма да се спирам на тях.
Какво прави Usart_Write() е отделен въпрос.
_________________ Най-опасният враг на истината и свободата е мнозинството.
|
| Чет Фев 26, 2009 8:27 am |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
а що не пробваш по бабешкия начин ... не знам МикроЦ то дали има printf() ама дори и да няма пробвай да конвертираш в string и тогава да го хвърлиш по uart-a
|
| Чет Фев 26, 2009 9:58 am |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
доколкото разбирам на младежа проблема е че вместо 142.4 (точния резултат) - той получава 142.39 и това го притеснява !
освен очевидните грешки при int/float преобразуванията, .. може да е резултат от закръгленията (междинни стойности ...) на туй microC (или както му викат) ...или по-точно на библиотеките му за плаващи сметки!
пробвай да закръгляш до разряда който те интересува - така ще е и по-коректно по принцип !
пример:
резултата ти е 142.399999 - което си е баш 142.4 ... но не съвсем 
|
| Чет Фев 26, 2009 10:16 am |
|
 |
|
maiden
|
Zdrav,
мерси така стана както си ми написал
df=((int)(result*100 + 0.5))%100;
съответно като се умножава .10,.100 и съответно накрая %10,%100
се регулират значещите цифри. Благодаря и на другите.Много полезен форум за тези които се занимават
с тези неща.Много има да чета още за "С" че досега бях само с асемблер.
|
| Чет Фев 26, 2009 6:00 pm |
|
|