2010-02-28 134 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會溢出。