Guys,
I am having a problem with float division using PK51. I was wondering if anyone could explain this or has seen it before.
I have a float, and want to divide it by 36000. If I do this directly, I get strange results, even -ve numbers although all the variables are +ve.
accrued_seconds =(total_accrued_seconds/36000);
Both variables are floats, however, if I do the following
accrued_seconds = (unsigned long)(total_accrued_seconds/10); accrued_hours = (float)(accrued_seconds/3600);
I get the correct result. For some reason that I don't understand using too big a divisor in the first code causes an error but not a two step as in the second. I have also tried the two step without the cast to an unsigned long and I get the errored result.
I tired the same thing on GCC on a PC and of course it works fine.
Any clues anyone?
Cheers,
Dirk
Indeed. A decimal integer constant's type is the first from the list of 'int', 'long int', 'long long int' (C99) in which its value can be represented.
Exactly. In C90 (aka ANSI C), the list would be 'int', 'long int', 'unsigned long int'. Apparently, Keil's C51 compiler doesn't follow the C90 standard in this case. I cannot think of a good explanation why.
Maybe it depends on whether Integer Promotion is enabled or not...