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

 
 
 
Reply to this topicStart new topic
> Где ошибка?
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
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
rezident
сообщение Aug 20 2009, 11:45
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(AHTOXA @ Aug 20 2009, 16:50) *
Тогда может быть не хватает одного слова "long" в следующей строке:
И суффикса U или скорее даже ULL у константы 10000.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 20 2009, 12:22
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #7


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

Группа: Свой
Сообщений: 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
AHTOXA
сообщение Aug 20 2009, 12:44
Сообщение #8


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

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



Цитата(Dog Pawlowa @ Aug 20 2009, 18:22) *
Допустим. Но в примере, который работает
Код
ccc= aaa*delivery.request_perc;
,
то есть тип delivery.request_perc остается вообще unsigned int.


Ненене, не остаётсяsmile.gif Тут aaa - long long, поэтому перед умножением delivery.request_perc приводится тоже к long long.
(Я после паскаля тоже долго привыкал к сишным правилам приведения типовsmile.gif )

Цитата
Но, как оказывается, все это фигня. Ну нашел я, как правильно записать. Использовать не могу - не хватает времени на работу с long long в риалтайме.


Табличку? И уж совсем дурацкое предложение - а в float не быстрее будет?

Цитата
Чеховское "В Москву, в Москву!" теперь звучит так -> скорее на ARM!
Только уже поздно, нужно как-то выкручиваться.


Оверклокинг? Ассемблер? smile.gif


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


Гуру
******

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



Цитата(MrYuran @ Aug 20 2009, 15:32) *
а LL зачем? неужто такая точность нужна? (8 байт)
Если какая-то часть выражения не меняется, её можно сосчитать заранее в отдельную переменную, и подставлять в критическом месте готовое значение

Дозатор растворов. Для точности дозирования нужно считать микролитры и концентрата и воды. А по объему нужно нужно использовать за раз 10 литров концентрата, при 0.5% это 2000 литров. C long недобор диапазона в 200 раз.


Цитата(AHTOXA @ Aug 20 2009, 15:44) *
Табличку? И уж совсем дурацкое предложение - а в float не быстрее будет?

Ага, была такая мысль. Возьму на ночь осциллограф smile.gif , буду исследовать вопрос.

Цитата(AHTOXA @ Aug 20 2009, 15:44) *
Оверклокинг? Ассемблер? smile.gif

В первую очередь алгоритм. Считать "мгновенную" концентрацию.
Ассемблер не потяну уже. Хотя реально нужно не 4 байта добавить, а только один.
Почему на С нет long char = 5 байтов ? smile.gif


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


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Dog Pawlowa @ Aug 20 2009, 15:52) *
Ага, была такая мысль. Возьму на ночь осциллограф smile.gif , буду исследовать вопрос.
А чем вам поможет 4-байтный float с его точностью в 7 десятичных знаков (24 бита мантиссы), если вам не хватет 4 байтов long?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 20 2009, 19:25
Сообщение #11


Гуру
******

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



Цитата(Сергей Борщ @ Aug 20 2009, 21:50) *
А чем вам поможет 4-байтный float ...

Да, пожалуй...
Фактически мой алгоритм построен подобно известной задаче - "насколько нужно удлинить нить, опоясывающую земной шар, чтобы под ней прошла кошка". Из-за неточности расчетов помпа будет работать с рывками и паузами.


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


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Dog Pawlowa @ Aug 21 2009, 01:25) *
Фактически мой алгоритм построен подобно известной задаче - "насколько нужно удлинить нить, опоясывающую земной шар, чтобы под ней прошла кошка". Из-за неточности расчетов помпа будет работать с рывками и паузами.
Разделите управление на постоянную и дифференциальную компоненты воздействия. И обсчитывайте их отдельно. При этом постоянная величина и величина изменения могут различаться на порядки.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 21 2009, 12:27
Сообщение #13


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Dog Pawlowa @ Aug 20 2009, 22:25) *
Фактически мой алгоритм построен подобно известной задаче

Если из операций только +-*/, то не страшно новый целый тип ввести.
Go to the top of the page
 
+Quote Post

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

 


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


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