почему не работает *100 / 100

vde69
Offline
Зарегистрирован: 10.01.2016

есть код который вроде работает

    if (getDelayTime(time_heat_start, t) >= (dt/100*p)) 
       {

а вот такой код выдает туфту

    p = p * 100;
    if (getDelayTime(time_heat_start, t) >= (dt/100*p/100)) 
       {

читал, что в арифмитических операциях тип берется из самого большого, и соответственно возможны проблеммы с переполнением.

использовоть тут float не хочется, сейчас везде int

 

как правильно поступать?

Йожэг
Offline
Зарегистрирован: 16.01.2016
А что, если сначала умножать, а потом - делить
dt*p/100
и тип данных побольше (unsigned long int), чтоб переполнения не было.
Йожэг
Offline
Зарегистрирован: 16.01.2016
if (getDelayTime(time_heat_start, t) >= (1L*dt*p/100))

Типа так.

vde69
Offline
Зарегистрирован: 10.01.2016

сделал так, вроде работает правильно

 

//*************************************************************************************************
// процедура включает и выключает нагрев в зависимости от необходимой мощности
//   p       - относительной мощность сотые доли % (допустимые значения от 0 до 10 000)
//   dt      - общее время одного цикла вкл/выкл (в мсек, допустимые значения от 0 до 32 767), это время делется пропорционально параметра "p" 
//             100% мощность этого времени не должно приводить к перебегу температуры выше разумной погрешности, 
//             по этому общее время одного цикла должно расчитыватся заранее.
//   t       - текущее время
//*************************************************************************************************

void on_off_heat(int p, int dt, unsigned long t) {
  unsigned long t1 = 1;

  if (mode_heat == true) {t1 = t1*dt/100*p/100; }
  else if (mode_heat == false) { t1 = t1*dt/100*(100-p/100); }

  if (mode_heat == true) {
    // идет нагрев, нужно проверить может стоит остановится
    if (getDelayTime(time_heat_start, t) >= t1) {
      mode_heat = false;
      time_heat_stop = t;    
    }
  }
  else if (mode_heat == false) {
    // идет охлаждение, нужно проверить может стоит запустится
    if (getDelayTime(time_heat_stop, t) >= t1) {
      mode_heat = true;
      time_heat_start = t;    
    }
  }
}