реклама на сайте
подробности

 
 
> Где ошибка?
Dog Pawlowa
сообщение Aug 20 2009, 08:16
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



IAR MSP
вот это работает неправильно(где-то внутри происходит переполнение при delivery.water_volume_ul>(approx) 10 000 000):

Код
delivery.request_conc_volume_ul=    
    (unsigned long)    ((unsigned long long)         
        (delivery.water_volume_ul+delivery.semi_water_volume_ul) *    
            (unsigned long)delivery.request_perc)/  
                (10000-delivery.request_perc);


вот это работает правильно:
Код
   unsigned long long aaa;
   unsigned long long ccc;
   delivery.divider=10000-delivery.request_perc;

  aaa=delivery.water_volume_ul+delivery.semi_water_volume_ul;
  ccc= aaa*delivery.request_perc;
  delivery.request_conc_volume_ul=(unsigned long)(ccc/delivery.divider);


Сейчас нет возможности в ассемблере смотреть, если можно, ткните в K&R, где именно я ошибся?
Приведение delivery.request_perc к unsigned long непонятно зачем, но это вроде не криминал.

Типы:
typedef struct
{ unsigned int request_perc;
unsigned int divider;
unsigned long request_conc_volume_ul; //ul
unsigned long conc_volume_ul;
unsigned long semi_water_volume_ul;
unsigned long water_volume_ul;
} delivery_type;
Спасибо


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Aug 20 2009, 08:36
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Dog Pawlowa @ Aug 20 2009, 14:16) *
Код
(unsigned long long)(delivery.water_volume_ul+delivery.semi_water_volume_ul)

- сначала суммируется, потом приводится к unsigned long long. Надо:

Код
((unsigned long long)delivery.water_volume_ul+delivery.semi_water_volume_ul)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 20 2009, 10:23
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(AHTOXA @ Aug 20 2009, 11:36) *
- сначала суммируется, потом приводится к unsigned long long. Надо:

Второе слагаемое при проверке всегда ноль и на результат влиять не должно.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 20 2009, 10:50
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Dog Pawlowa @ Aug 20 2009, 16:23) *
Второе слагаемое при проверке всегда ноль и на результат влиять не должно.


Тогда может быть не хватает одного слова "long" в следующей строке:
Код
(unsigned long)delivery.request_perc)/


? smile.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 20 2009, 12:22
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(AHTOXA @ Aug 20 2009, 13:50) *
Тогда может быть не хватает одного слова "long" в следующей строке:
Код
(unsigned long)delivery.request_perc)/


? smile.gif

Допустим. Но в примере, который работает
Код
ccc= aaa*delivery.request_perc;
,
то есть тип delivery.request_perc остается вообще unsigned int.
Получается, что привели к unsigned long - стало хуже, чем если оставить unsigned int ?

Цитата(rezident @ Aug 20 2009, 14:45) *
И суффикса U или скорее даже ULL у константы 10000.

10000 - это 100% в сотых долях. Соответственно, при проверке из этого значения вычитается 500 - 5% в сотых долях.
Проценты в процессе работы не изменяются. То есть приводить до вычитания не имеет смысла. Приводить после - тоже, это делитель.


Но, как оказывается, все это фигня. Ну нашел я, как правильно записать. Использовать не могу - не хватает времени на работу с long long в риалтайме.
Чеховское "В Москву, в Москву!" теперь звучит так -> скорее на ARM!
Только уже поздно, нужно как-то выкручиваться.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 20 2009, 12:32
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(Dog Pawlowa @ Aug 20 2009, 16:22) *
Только уже поздно, нужно как-то выкручиваться.

а LL зачем? неужто такая точность нужна? (8 байт)
Если какая-то часть выражения не меняется, её можно сосчитать заранее в отдельную переменную, и подставлять в критическом месте готовое значение


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 10:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01468 секунд с 7
ELECTRONIX ©2004-2016