-
- а если примерно так koyodza(419 знак., 09.02.2010 17:48)
- посмотрите книгу, там наверняка есть то, что Вам нужно - koyodza(09.02.2010 17:57, ссылка)
- ок, спасибо! - Argon(09.02.2010 18:02)
- посмотрите книгу, там наверняка есть то, что Вам нужно - koyodza(09.02.2010 17:57, ссылка)
- А нельзя хранить в памяти не 2^N, а само N? И заменить деление сдвигом. Особенно актуально на чипах без аппаратного деления. - vmp(09.02.2010 16:16)
- можно, но незачем, IAR-овский оптимизатор это сам делает. - Argon(09.02.2010 16:17)
- И откуда же он знает, что делитель не произвольное число, а именно 2^N? Или N - константа? - vmp(09.02.2010 17:39)
- ага - Argon(09.02.2010 17:54)
- Ну так этот пункт тоже надо было вносить в ТЗ. Алгоритмы могут получиться совсем другие. - vmp(09.02.2010 18:47)
- ага - Argon(09.02.2010 17:54)
- И откуда же он знает, что делитель не произвольное число, а именно 2^N? Или N - константа? - vmp(09.02.2010 17:39)
- можно, но незачем, IAR-овский оптимизатор это сам делает. - Argon(09.02.2010 16:17)
- Пошустрей никак, а код покороче сделать можно: Ксения(66 знак., 09.02.2010 15:28)
- ого! а ваш вариант в моем случае выполняется медленнее моего! Argon(81 знак., 09.02.2010 16:26)
- Тогда создайте константу и для (-semi_divider), чтобы не заставлять компилятор инвертировать знак в реальном времени. И снова прогоните тест. Я-то думала, что вы сами догадаетесь это сделать... - Ксения(09.02.2010 18:29)
- Еще вариант: определите константы через #define, чтобы компилятор честно подставлял константы в виде чисел, а не обращался к памяти, где хранятся константы. Тут в зависимости конкретного от процессора и компилятора, может ускориться, а может и Ксения(35 знак., 09.02.2010 18:37)
- IAR при макс. оптимизации однозначно константы воспринимает как константы, не берет из памяти (если только они как extern нигде больше не фигурируют). Argon(257 знак., 09.02.2010 18:53)
- Отписываюсь: все по-прежнему! Да в принципе, фиг с ним, меня устраивают эти чуть менее 100нс на операцию. Данке всем! - Argon(09.02.2010 19:11)
- а вот теперь самое время оценить, а нужно ли это округление в принципе :) - jaga-jaga(09.02.2010 20:37)
- Ветвление и там, и сям, одно. А какой у вас МК? - Ксения(09.02.2010 19:10)
- LPC2214 - Argon(09.02.2010 19:12)
- А вы еще вот так попробуйте: Ксения(92 знак., 09.02.2010 19:14)
- Приблизилось к моему вплотную, проигрыш в ~30 нс, т.е. 1-2 такта МК :) Заразился вашим азартом. Щас посмотрим что он там в обоих случаях компилит. - Argon(09.02.2010 19:21)
- А вы еще вот так попробуйте: Ксения(92 знак., 09.02.2010 19:14)
- LPC2214 - Argon(09.02.2010 19:12)
- Отписываюсь: все по-прежнему! Да в принципе, фиг с ним, меня устраивают эти чуть менее 100нс на операцию. Данке всем! - Argon(09.02.2010 19:11)
- IAR при макс. оптимизации однозначно константы воспринимает как константы, не берет из памяти (если только они как extern нигде больше не фигурируют). Argon(257 знак., 09.02.2010 18:53)
- Еще вариант: определите константы через #define, чтобы компилятор честно подставлял константы в виде чисел, а не обращался к памяти, где хранятся константы. Тут в зависимости конкретного от процессора и компилятора, может ускориться, а может и Ксения(35 знак., 09.02.2010 18:37)
- Тогда создайте константу и для (-semi_divider), чтобы не заставлять компилятор инвертировать знак в реальном времени. И снова прогоните тест. Я-то думала, что вы сами догадаетесь это сделать... - Ксения(09.02.2010 18:29)
- похоже что так! - Argon(09.02.2010 16:01)
- это малопонятней, а вот компилиться оно должно в тоже самое. если трюк, то платформозависимый. надо оттолкнуться от компилятора и платформы. - jaga-jaga(09.02.2010 15:38)
- ого! а ваш вариант в моем случае выполняется медленнее моего! Argon(81 знак., 09.02.2010 16:26)
- чой та запутали, но на вопрос "округления после целочисленного деления на 2" думаю что result = ( divider >> 1 ) + !!( divider % 2 ) - megajohn(09.02.2010 14:00)
- Сорри, не на 2, а на 2^N. Ну и хотелось бы избежать остатков от деления. Критерий - не краткость записи, а скорость работы. - Argon(09.02.2010 14:24 - 14:41)
- и натурально делится, а не сдвигается? это типа либа fixed point? - jaga-jaga(09.02.2010 16:14)
- тогда уж result = ( divider / 2 ) + ( divider & 1 ) - koyodza(09.02.2010 14:04)
- Общее правило с округлением, вроде такое РЕЗУЛЬТАТ = (ДЕЛИМОЕ ± ДЕЛИТЕЛЬ/2)/ДЕЛИТЕЛЬ. "-" если ДЕЛИТЕЛЬ < 0. - Chum_A(09.02.2010 14:08)
- Вот-вот! Как бы избежать проверки на знак? - Argon(09.02.2010 14:51)
- Общее правило с округлением, вроде такое РЕЗУЛЬТАТ = (ДЕЛИМОЕ ± ДЕЛИТЕЛЬ/2)/ДЕЛИТЕЛЬ. "-" если ДЕЛИТЕЛЬ < 0. - Chum_A(09.02.2010 14:08)
- Сорри, не на 2, а на 2^N. Ну и хотелось бы избежать остатков от деления. Критерий - не краткость записи, а скорость работы. - Argon(09.02.2010 14:24 - 14:41)
- а если примерно так koyodza(419 знак., 09.02.2010 17:48)