|
|
View previous topic :: View next topic |
Author |
Message |
MCUprogrammer
Joined: 08 Sep 2020 Posts: 221
|
Round the number |
Posted: Fri Jan 15, 2021 3:10 am |
|
|
CCS C 5.099
MCU 33EP512GM710
#use delay(clock=120MHz,crystal=16MHz)
Hello there
I encountered an interesting situation. I read values with the keypad. Then I put the value I read into the unsigned int16 value variable. Then I do the following on my float cal_value variable.
cal_value = value /10.0;
my value value is 6;
6 / 10.0 = 0.6. Doesn't come out. It turns out 0.59. I want to round it to the screen with% g. But rounding does not happen. What do you think I can do wrong. I used the ceil () function. it makes my value 1 instead of 0.6.
Also the debugger of the ccs c compiler does not work properly. It keeps giving an error. I don't understand how this work.
Also, isn't it possible to divide an unsigned int type variable into a Float type variable?
When I do value / 10 the code doesn't work. Code: |
the code I used to print the screen;
current_output = digit_1;
calculated_value = current_output/10.0;
glcd_rect(170,84,240,105,ON,OFF);
sprintf(buffer,"current value:");
glcd_text57(62,92,buffer,1,ON);
sprintf(buffer,"%g",calculated_value);
glcd_text57(182,87,buffer,2,ON); |
_________________ Best Regards...
MCUprogrammer
_______________________________
Work Hard |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Fri Jan 15, 2021 5:00 am |
|
|
Welcome to the limitations of float.
There are some numbers that the standard FP format, can never represent
accurately. So (for example) 0.45. Just as with decimal notation, where
1/3, needs an infinitely long sequence of digits, in binary, 0.45, requires
an infinite sequence to represent accurately. So using the standard
single precision format, 0.45's nearest possible value is 3EE66666 (in IEEE),
which represents 0.4499999. Now you can't 'round' this to get 0.45, since
if you add one to the representation (3EE66667), this gives 0.45000002.
So you can't actually 'have' a value of 0.45....
Now you can round in the output, by adding 0.0049, and then printing just
two digits. So:
Code: |
val=0.45;
printf("VAL = %5.2F\n\r", val+0.0049);
|
Wiil display 0.45.
For three digits:
Code: |
val=0.45;
printf("VAL = %6.3F\n\r", val+0.00049);
|
In each case, you add just less than 0.5 of the digit beyond where you
want to display, and limit to that digit.
ceil gives the integer above the starting value. Hence your '1'.
I posted a 'round' function, to round to a number of decimals a while
ago:
https://ccsinfo.com/forum/viewtopic.php?p=50803
However this is 'maths heavy' to do. |
|
|
MCUprogrammer
Joined: 08 Sep 2020 Posts: 221
|
|
Posted: Fri Jan 15, 2021 5:17 am |
|
|
Thank you so much. Problem solved. _________________ Best Regards...
MCUprogrammer
_______________________________
Work Hard |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|