Проблемы вычислений с плавающей и целочисленной типами данных в C - PullRequest
0 голосов
/ 01 марта 2010

Следующий код не дает ожидаемого ответа при умножении числа с плавающей запятой * 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);
}

По какой-то причине мой дисплей показывает мне, что period_needed -518! Почему не 20000 * 12 = 240000?

Ответы [ 2 ]

2 голосов
/ 01 марта 2010

Компилируете ли вы для встроенной платформы?

Может быть, ваш int по умолчанию имеет ширину всего 2 байта, в этом случае 12 * 20000 переполнится.

1 голос
/ 01 марта 2010

Это не совсем 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, если вам нужна большая точность./MPIR.

...