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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Как рациональнее всего преобразовать float в int?
sergeeff
сообщение Dec 21 2010, 16:34
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Надеюсь вы поняли, что проблема была в ваших

Код
unsigned char x;
unsigned char y;


Я уже писал на форуме и вам советую - забудьте про float и double. Не нужны они в 99,99% случаев.
Go to the top of the page
 
+Quote Post
zheka
сообщение Dec 22 2010, 03:52
Сообщение #17


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Не совсем в этом причина.
800/256 - я так написал, чтобы было понятно тем, кому я задаю вопрос.
Я же рассуждая, что каждый раз высчитывть константу затратно в своем коде изначально просто умножал на 3.125, отсюда и возникла работа с float.

Кстати, в полученном коде все-таки каждый раз косвенно высчитывается 800/256 и 400/256. Нельзя ли еще сократить?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 22 2010, 04:03
Сообщение #18


Гуру
******

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



QUOTE (zheka @ Dec 22 2010, 08:52) *
Нельзя ли еще сократить?
Сократить что? Одно умножение и пересылку (сдвиг на 8 это пересылка байта 2 раза, ибо результат у вас двухбайтный)? Маловероятно. Разве что таблицей. У вас есть лишний килобайт флеша?


--------------------
На любой вопрос даю любой ответ
"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
ReAl
сообщение Dec 22 2010, 04:15
Сообщение #19


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(zheka @ Dec 21 2010, 21:28) *
Код
sX=(int)((((long int)x)*800L)>>8);
sY=(int)((((long int)y)*480L)>>8);
FillEllipse(800-sX, sY, 10, 10, clRed);

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

Кстати, a*3.125 это a*25/8 aka (a*25)>>3 (впрочем, я бы может округление добавил, (a*25+4)/8), что вполне считается для Вашего диапазона даже не в long т.е. очень быстро.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Dec 22 2010, 04:18
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



Цитата
Кстати, в полученном коде все-таки каждый раз косвенно высчитывается 800/256 и 400/256. Нельзя ли еще сократить?
можно. арифметику, дроби в каком классе проходят ? тренируйте мозги:

800/256 = (800 / 32) / (256 / 32) = 25 / 8 = 25 >> 3;
400/256 = (400 / 16) / (256 / 16) = 25 / 16 = 25 >> 4;

вместо long теперь достаточно unsigned int.

Сообщение отредактировал ukpyr - Dec 22 2010, 04:23
Go to the top of the page
 
+Quote Post
zheka
сообщение Dec 22 2010, 04:27
Сообщение #21


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



ukpyr
спасибо.

Сообщение отредактировал zheka - Dec 22 2010, 04:28
Go to the top of the page
 
+Quote Post
~phase
сообщение Dec 27 2010, 07:37
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 24-06-07
Из: ukraine
Пользователь №: 28 658



вообще то на сколько я замечал то сдвиг для умножения/деления работает быстрее чем это множить или делить, но есть недостаток, множить или делить только кратное 2.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Dec 27 2010, 07:48
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(~phase @ Dec 27 2010, 14:37) *
вообще то на сколько я замечал то сдвиг для умножения/деления работает быстрее чем это множить или делить, но есть недостаток, множить или делить только кратное 2.


Если делимое - переменная величина то сложно чтото придумать кроме как x/y. Но если делимое константа или Вы хотите умножить число на другое дробное число-константу, то всегда можно подобрать такое число что y=a/b где a будет степенью двойки, тогда останется только перемножить на b и результат сдвинуть на log2(cool.gif вправо (эквивалент деления результат на a). Подобные манипуляции существенно ускоряют математику за счёт избавления от деления на число не кратное 2.
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 29 2010, 20:57
Сообщение #24


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(ukpyr @ Dec 22 2010, 09:18) *
вместо long теперь достаточно unsigned int.

Зато сдвиг стал много тяжеловеснее.
Ускорять всяко лучше на асме, где можно сделать умножение U8xU16=U16, или U16xU16 = MSU16(U24) - (опустить расчет младшего байта).
Только думаю смысла нет все это делать, ибо CodeVision и афтар в C плавает - тормозить будет не это так что-то другое.
Go to the top of the page
 
+Quote Post
Serj78
сообщение Dec 31 2010, 16:09
Сообщение #25


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Я думаю Жеке не надо напоминать, что наш любимый CV преобразование типов не делает sm.gif
B появление в правой части выражения char первым, хоть в левой и long или int стоит , будет вызывать переполнение и неадекватный результат. sad.gif
обычно это делается так, хотя и выглядит криво
не a=b*c;
а так: а=b;
b*=с;

Интересно, что работает быстрее, чем "принудительное" приведение к int
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 00:54
Рейтинг@Mail.ru


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