2010-02-28 6 views
-1

Le code suivant ne donne pas la réponse que je pense quand je multiplierai un * flotteur 12.Float par rapport à des problèmes de calcul de type de données Integer en 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); 
} 

Pour une raison quelconque mon écran me montre que periods_needed est -518! Pourquoi n'est-ce pas 20000 * 12 = 240000?

+3

Sans définition pour les types 'period_needed', ou' calibration', nous n'avons aucune idée. Mon pari est que 'periods_needed' est une sorte de short, mais vous n'avez pas fourni tout le code. –

+0

Quels sont les types de périodes nécessaires, temp, target_overflows, leftover? Code s'il vous plaît. – vladr

+0

À quoi est due la déclaration de periods_needed? Est-ce un nombre entier? Est-ce un flotteur? –

Répondre

1

Ce n'est pas strictement ANSI C, mais essayez ceci: (?)

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

Il ne ressemble pas à tous les types vous déclarez variables, ce qui les choses vont vraiment bouleversé à moins qu'ils déclarés ailleurs. Vous voudrez peut-être changer les types selon que vous avez vraiment besoin de flottants, c'est-à-dire qu'un int long pourrait faire pour certains d'entre eux, ou un double si vous avez besoin de plus de précision.

Si vous avez besoin de précision arbitraire, recherchez MPFR/MPIR.

+0

probablement 'fprintf'? – vladr

+0

Définitivement fprintf, on dirait que lcd_putc pourrait être un handle pour un affichage lcd? –

+0

Ils sont tous déclarés flottants ailleurs. Désolé de ne pas inclure tout mon code. En fait, rien n'est coulé du tout. Utiliser 12,0 plutôt que 12 n'a pas changé la réponse. – Adam

2

Compilez-vous pour une plate-forme intégrée?

Peut-être votre int par défaut est juste 2 octets de large, auquel cas 12 * 20000 déborderait.

Questions connexes