Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
08/10/07 22:45
Read: times


 
#143080 - Try this, can be better
Responding to: ???'s previous message
This can be so much complicated part of code for compiler:

tmp = 65536 - (10 * AxisAngle + 460) * 221184 / 120000; //that is, by removing the two zeros
TH = tmp / 256;
TL = tmp - TH * 256;

I have some experience with getting better result and eliminating anomally with divide formula to smaller part and also expliciting conversion like this:

// temporarily variables
float tmp_float = 0;
unsigned int tmp = 0;

// your following formula:
// tmp = 65536 - (10 * AxisAngle + 460) * 221184 / 120000
// can be rewrite by this:
tmp_float = (float)AxisAngle * (float)10;
tmp_float += (float)460;
// this is equal for tmp_float = tmp_float + (float)460;
tmp_float *= (float)3456;
// this is equal for tmp_float = tmp_float * (float)3456;
tmp_float /= (float)1875;
// this is equal for tmp_float = tmp_float / (float)1875;
// 3456/1875 is equal to 221184/120000 but smaller numbers
tmp_float = (float)65536 - tmp_float;
// finally you can use here some of round functions to get...
// ...better result or simplify conversion like this:
tmp = (unsigned int)tmp_float;

// after this it is better using bit rotation rutines instead...
// ...of dividing and substracting
TH = (unsigned char)(tmp >> 8);
TL = (unsigned char)tmp;
// or TL = (unsigned char)(tmp & 0xFF);

...

This can be helpfull in other cases not just in this one. Keep this on your mind and I think you will have less problem with compiler anomally :) Good luck.

Michal

List of 31 messages in thread
TopicAuthorDate
Problem with using Timer 1 of AT89S52 in C            01/01/70 00:00      
   methodology and the raw reason            01/01/70 00:00      
      Range of Variables            01/01/70 00:00      
         What type is AxisAngle?            01/01/70 00:00      
            AxisAngle is char            01/01/70 00:00      
            Integer < 65536?            01/01/70 00:00      
               Working within the range of long integers            01/01/70 00:00      
                  so I should....?            01/01/70 00:00      
                     A float constant            01/01/70 00:00      
                        what's the different            01/01/70 00:00      
                           const float...            01/01/70 00:00      
                              which means the compiler            01/01/70 00:00      
                     floats            01/01/70 00:00      
         drop float            01/01/70 00:00      
            Since I have just started to learn C...            01/01/70 00:00      
               A real programming language            01/01/70 00:00      
            Fractional Equivalence            01/01/70 00:00      
         Why?            01/01/70 00:00      
            there is a reason for this...            01/01/70 00:00      
               don't think as a PC programmer....            01/01/70 00:00      
                  Application vs. Hardware Platform            01/01/70 00:00      
                     the prudent programmer...            01/01/70 00:00      
                  PDP?            01/01/70 00:00      
                     it's not similar to the REAL assembly, of course,            01/01/70 00:00      
            Division is not always first            01/01/70 00:00      
               You are right.            01/01/70 00:00      
                  Explicitness            01/01/70 00:00      
                     is this when the C-code...            01/01/70 00:00      
                     agree with the agreement            01/01/70 00:00      
   Try this, can be better            01/01/70 00:00      
      Superfluous casts            01/01/70 00:00      

Back to Subject List