|
Где ошибка? |
|
|
|
Aug 20 2009, 08:16
|
Гуру
     
Группа: Свой
Сообщений: 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; Спасибо
--------------------
Уходя, оставьте свет...
|
|
|
|
|
 |
Ответов
|
Aug 20 2009, 08:36
|

фанат дивана
     
Группа: Свой
Сообщений: 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)
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 20 2009, 10:50
|

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

|
Цитата(Dog Pawlowa @ Aug 20 2009, 16:23)  Второе слагаемое при проверке всегда ноль и на результат влиять не должно. Тогда может быть не хватает одного слова "long" в следующей строке: Код (unsigned long)delivery.request_perc)/ ?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 20 2009, 12:22
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(AHTOXA @ Aug 20 2009, 13:50)  Тогда может быть не хватает одного слова "long" в следующей строке: Код (unsigned long)delivery.request_perc)/ ?  Допустим. Но в примере, который работает Код 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! Только уже поздно, нужно как-то выкручиваться.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Aug 20 2009, 12:52
|
Гуру
     
Группа: Свой
Сообщений: 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 не быстрее будет? Ага, была такая мысль. Возьму на ночь осциллограф  , буду исследовать вопрос. Цитата(AHTOXA @ Aug 20 2009, 15:44)  Оверклокинг? Ассемблер?  В первую очередь алгоритм. Считать "мгновенную" концентрацию. Ассемблер не потяну уже. Хотя реально нужно не 4 байта добавить, а только один. Почему на С нет long char = 5 байтов ?
--------------------
Уходя, оставьте свет...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|