2010-02-28 48 views
-1

下面的代码,当我乘的浮动* 12浮点与整数数据类型的计算问题,用C

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); 
} 

出于某种原因,我的屏幕显示我periods_needed是-518不会产生我期望的答案!为什么不是20000 * 12 = 240000?

+3

没有定义'periods_needed'或者'calibration'的类型,我们没有任何线索。我敢打赌,'periods_needed'是某种简短的,但你没有提供所有的代码。 – 2010-02-28 22:34:44

+0

period_needed,temp,target_overflows,剩余的类型是什么?代码请。 – vladr 2010-02-28 22:35:23

+0

什么是句号需要声明?它是一个整数吗?这是一个浮动吗? – 2010-02-28 22:35:42

回答

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可能适用于其中一些类型,或者如果您需要更高的精度,则可以使用double类型。

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

+0

可能'fprintf'? – vladr 2010-02-28 22:37:49

+0

肯定fprintf,看起来像lcd_putc可能是一个液晶显示器的句柄? – 2010-02-28 22:40:48

+0

他们都被宣布为其他地方的花车。对不起,没有包括我所有的代码。事实上,根本没有任何东西被铸造出来。使用12.0而不是12不会改变答案。 – Adam 2010-02-28 22:46:17

2

您正在编译嵌入式平台吗?

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