|
2D-программирование Вопросы, касающиеся двумерного программирования |
25.05.2011, 10:06
|
#1
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Уменьшения числа
Привет всем! Хочу узнать, какой самый быстрый и наиболее оптимизированный способ свести случайное значение на 0...
оно может быть как положительным, так и отрицательным
к примеру я бы сделал что-то вроде этого:
a# = Rnd (-10,10); задаем случайное значение
s# = .1; шаг уменьшения
;в цикл
If a>0 Then
If a>s Then
a = a - s
Else
a = 0
EndIf
Else If a<0
If a<(-s) Then
a = a + s
Else
a = 0
EndIf
EndIf
насколько это оптимальный вариант, когда производительность критична?
еще был самый простой вариант - делить... это вообще одна строчка.. но мне как-то советовали избегать вычеслений
с длинными числами с плавающей точкой. Помогите, пожалуйста
|
(Offline)
|
|
25.05.2011, 11:04
|
#2
|
Элита
Регистрация: 16.01.2008
Сообщений: 1,800
Написано 958 полезных сообщений (для 3,833 пользователей)
|
Ответ: Уменьшения числа
Измеряй сколько времени требуется для твоего способа и для других(в том числе и з плавающей точкой), результаты потом сравниш.
Это хорошая практика оптимизации для всех вычеслений.
|
(Offline)
|
|
25.05.2011, 11:06
|
#3
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Уменьшения числа
По крайней мере If a>s Then мне кажется лишним.
Если что, ещё советовали:
Не делить /10, а умножать на *0.1
|
но в итоге выходит что-то, вроде : 0+E1223
Добавлено:
тогда наоборот If a>0 Then лишне
|
(Offline)
|
|
25.05.2011, 11:10
|
#4
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Уменьшения числа
думаю, что без If a>s число станет меньшим чем ноль (например, если S будет не ровным) и уже начнет обрабатываться условием If a<0... т.е. будет постоянно смещаться то више нуля, то ниже
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.05.2011, 11:47
|
#5
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Уменьшения числа
Посмотрел новый блитз-хелп (а какой он сейчас версии?)
что-то новенькое Sgn (number)
a#=Int(Sgn(a#))*(Abs(a#)-s#))
|
Int() может быть не нужен.. просто Note: non-integer values return the sign to 7 signigicant figures. (e.g. -1.000000)
Измеряй сколько времени требуется для твоего способа и для других(в том числе и з плавающей точкой), результаты потом сравниш.
|
|
(Offline)
|
|
25.05.2011, 11:53
|
#6
|
|
Ответ: Уменьшения числа
А вот так ?
Local a:Int = Rand(-100, 100)
Local s:Int = -1
a = (Abs(a) + s) * Sgn(a)
Это код на БМаксе.
Abs(x) - возвращает модуль числа.
Sgn(x) - возвращает знак числа.
Я оперирую с челыми числами, так как для процессора это гораздо быстрее...
Уже опередили! )))
|
|
|
Сообщение было полезно следующим пользователям:
|
|
25.05.2011, 12:01
|
#7
|
|
Ответ: Уменьшения числа
Или так :
Local a:Float = Rand(-100.0, 100.0)
Local s:Float = 0.9
a:*s
С каждым шагом, переменная а будет уменьшатся на 10% ( подходит когда нужно движение с плавным замедлением )
|
|
|
25.05.2011, 12:44
|
#8
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Уменьшения числа
умножение на дробное число никогда не приведёт к резельтату 0 (если конечно одно из чисел уже не является нулем) самый простой -
function Test(start#,step#)
doExite=(star = 0) (или как там сравнить, забыл уже)
while (doExit)
if(start#>0)
start=start-step;
if(start<=0)
doExite=1
endif
else
start=start+step
if(start>=0)
doExite=1;
endif
endif
do
endfunction
Sgn (number) - всегда вроде было
|
(Offline)
|
|
25.05.2011, 13:05
|
#9
|
Мастер
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений (для 504 пользователей)
|
Ответ: Уменьшения числа
Sgn (number) - всегда вроде было
|
ой, да
проверил свой 1.88
есть! просто не по алфавиту сортированы - не читаемо.
|
(Offline)
|
|
25.05.2011, 13:38
|
#10
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Уменьшения числа
юзай lerp
http://en.wikipedia.org/wiki/Lerp_(computing)
a+c*(b-a)
где c = процент (0 до 1) перехода из a в b
----
с длинными числами с плавающей точкой.
|
в блице длина всех дробных числе должна быть одинакова (в байтах, т.е. они же все флоаты).
твоя куча if сожрёт больше времени чем пара операций с дробными числами
а вообще это экономия на спчиках
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
25.05.2011, 13:45
|
#11
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Уменьшения числа
ТРЕБУЮ БЕНЧМАРК! 4 if против линейной интерполяции
|
(Offline)
|
|
25.05.2011, 13:56
|
#12
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Уменьшения числа
мне это нужно было для гашения полученного импульса..
допустим, если полученный импульс i# = 1, делитель d# = 2 то это будет
i = i/d... но у меня ещё есть одна переменная - TimeScale#, которая обычно равна 1 (отвечает за замедление времени)
как внедрить её в i = i/d, чтобы если она меньше единицы (например, t# = .5) гашение импульса через деление происходило медленнее?
|
(Offline)
|
|
25.05.2011, 14:06
|
#13
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Уменьшения числа
умнложить делитель на время
только нужно немного переделать если ты хочешь чтобы по такому принципу работал - i=i/(1+d#*t#)
|
(Offline)
|
|
25.05.2011, 14:25
|
#14
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Уменьшения числа
разве тогда, исходя из предложенного примера это не будет вот так?
i = i/(d*t)
1 = 1/(2*.5) = 1
извините, я в математике не очень.. поэтому могу ошибаться
|
(Offline)
|
|
25.05.2011, 14:26
|
#15
|
Нуждающийся
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений (для 3 пользователей)
|
Ответ: Уменьшения числа
сорри.. опоздал со своим примером )
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:42.
|