当我乘以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?
答案 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。