|
Как рациональнее всего преобразовать float в int? |
|
|
|
Dec 21 2010, 16:34
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Надеюсь вы поняли, что проблема была в ваших Код unsigned char x; unsigned char y; Я уже писал на форуме и вам советую - забудьте про float и double. Не нужны они в 99,99% случаев.
|
|
|
|
|
Dec 22 2010, 04:15
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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 т.е. очень быстро.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Dec 22 2010, 04:18
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Dec 27 2010, 07:37
|
Участник

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

|
вообще то на сколько я замечал то сдвиг для умножения/деления работает быстрее чем это множить или делить, но есть недостаток, множить или делить только кратное 2.
|
|
|
|
|
Dec 31 2010, 16:09
|

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

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