We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi,
My problem is that I have integer constants coded as compile-time constant floating equations to avoid having to use the floating point library... let me explain...
Take some code that does not use floating point operations - say:
void main(void) { unsigned int i = 1000; for (; i; i--) ; }
Under Projects / Options / C/C++ / Misc Controls: add the directive:
--fpu=none
since we don't need FPU support.
Like this, the program will compile.
Now, ask the compiler to do some compile-time floating-point calculation that results in an integer - insert at head of file:
unsigned int j = (unsigned int)(1.0*3.0);
The RealView compiler refuses to compile the line, even though we don't need FP support at run-time.
Is there a way round this?
I'll leave the addition of the 0.5 term as an exercise.
Shame - you fell short of having to encode 0.5 as a fraction with a denominator of 15... I know, and I know you know, how to fix this, but the resulting code would still require a word or two of explanation (denominator of "15*2"?) - hence the word "shame" [as in pity]...
No much shame, since the "workaround" is trivial - as long as the compiler have the numeric range.
but the resulting code would still require a word or two of explanation
Well, if the answer was completely obvious, it wouldn't have been much of an exercise to be left to the reader, now would it? ;-)
#define DAC_const (15.0/255) #define VPP_5V (BYTE)((5.0/DAC_const)+0.5) #define VPP_12V (BYTE)((12.0/DAC_const)+0.5) #define VPP_OFF (BYTE)((0.0/DAC_const)+0.5
Because of this limitation, the code has to be written:
#define VPP_5V (BYTE)(85U) #define VPP_12V (BYTE)(204U) #define VPP_OFF (BYTE)(0U)
which is not as good.
If you changed the definitions to the following they would be the same as the floating point versions
#define VPP_5V (BYTE)(86U) //(BYTE)((5.0/DAC_const)+0.5) evaluates to 86 not 85 #define VPP_12V (BYTE) (205U) #define VPP_OFF (BYTE) (1U) #define ONE_OVER_DAC_CONSTANT (17U) // Because 1 / DAC_const is an exact integer (17) , you could do 5 * 17 and just add 1 because you are rounding up.
Sorry I believe I got my "rounding" (or truncating) wrong. But these numbers do come out to be EXACT integers. There should be no need to use floating point.