C中的浮点数与整数数据类型计算问题

时间:2010-02-28 22:31:13

标签: c types primitive-types

当我乘以float * 12时,以下代码不会产生我期望的答案。

void setup_timer_parameters(float micro_seconds)
{
   //constants
   calibration = 0;

   //calculables
   periods_needed = micro_seconds * 12 + calibration;

   target_overflows = periods_needed / 65536;
   overflows_counter = target_overflows;

   temp = periods_needed - (target_overflows * 65536);
   leftover = (long)temp;
   //int overflows_needed = micro_seconds % timer_period;
   printf(lcd_putc, "\fPN%05f TMP%05f\nTO%05f LO%05f", periods_needed, temp, target_overflows, leftover);
}

void main(){
   setup_timer_parameters(20000F);
}

出于某种原因,我的显示屏显示periodic_needed为-518!为什么不是20000 * 12 = 240000?

2 个答案:

答案 0 :(得分:2)

您是否正在为嵌入式平台进行编译?

也许你的默认int只有2字节宽,在这种情况下12 * 20000会溢出。

答案 1 :(得分:1)

这不是严格的ANSI C,但试试这个:

void setup_timer_parameters(float micro_seconds)
{
   //constants
   float calibration = 0;

   //calculables
   float periods_needed = micro_seconds * 12.0 + calibration;

   float target_overflows = periods_needed / 65536;
   float overflows_counter = target_overflows;

   float temp = periods_needed - (target_overflows * 65536);
   float leftover = (long)temp;
   //int overflows_needed = micro_seconds % timer_period;


   fprintf(lcd_putc, "\fPN%05f TMP%05f\nTO%05f LO%05f", periods_needed, temp, target_overflows, leftover);
}

int main(int argc, char** argv)
{
   setup_timer_parameters(20000F);
   return 0;
}

看起来你没有声明任何变量类型,除非它们在其他地方声明(?),否则它们会真的让人烦恼。您可能希望根据您是否真的需要浮点数来更改类型,即long int可能会对其中某些内容执行,或者如果您需要更高精度则可以更改。

如果您需要任意精度,请查找MPFR / MPIR。