forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Уменьшения числа (http://forum.boolean.name/showthread.php?t=14783)

Vadimich 25.05.2011 10:06

Уменьшения числа
 
Привет всем! Хочу узнать, какой самый быстрый и наиболее оптимизированный способ свести случайное значение на 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

насколько это оптимальный вариант, когда производительность критична?
еще был самый простой вариант - делить... это вообще одна строчка.. но мне как-то советовали избегать вычеслений
с длинными числами с плавающей точкой. Помогите, пожалуйста :)

Dzirt 25.05.2011 11:04

Ответ: Уменьшения числа
 
Измеряй сколько времени требуется для твоего способа и для других(в том числе и з плавающей точкой), результаты потом сравниш.
Это хорошая практика оптимизации для всех вычеслений.

LLI.T.A.L.K.E.R. 25.05.2011 11:06

Ответ: Уменьшения числа
 
Цитата:

If a>0 Then

If a>s Then
По крайней мере If a>s Then мне кажется лишним.

Если что, ещё советовали:
Цитата:

Не делить /10, а умножать на *0.1
но в итоге выходит что-то, вроде : 0+E1223

Добавлено:
тогда наоборот If a>0 Then лишне :4to:

Vadimich 25.05.2011 11:10

Ответ: Уменьшения числа
 
думаю, что без If a>s число станет меньшим чем ноль (например, если S будет не ровным) и уже начнет обрабатываться условием If a<0... т.е. будет постоянно смещаться то више нуля, то ниже

LLI.T.A.L.K.E.R. 25.05.2011 11:47

Ответ: Уменьшения числа
 
Посмотрел новый блитз-хелп (а какой он сейчас версии?)
что-то новенькое 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)

Цитата:

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

Черный крыс 25.05.2011 11:53

Ответ: Уменьшения числа
 
А вот так ?

Код:

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

Ответ: Уменьшения числа
 
Или так :

Код:

Local a:Float = Rand(-100.0, 100.0)
Local s:Float = 0.9
 
a:*s

С каждым шагом, переменная а будет уменьшатся на 10% ( подходит когда нужно движение с плавным замедлением )

Dream 25.05.2011 12:44

Ответ: Уменьшения числа
 
умножение на дробное число никогда не приведёт к резельтату 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) - всегда вроде было

LLI.T.A.L.K.E.R. 25.05.2011 13:05

Ответ: Уменьшения числа
 
Цитата:

Sgn (number) - всегда вроде было
ой, да
проверил свой 1.88
есть! просто не по алфавиту сортированы - не читаемо.

Mr_F_ 25.05.2011 13:38

Ответ: Уменьшения числа
 
юзай lerp
http://en.wikipedia.org/wiki/Lerp_(computing)

a+c*(b-a)

где c = процент (0 до 1) перехода из a в b

----
Цитата:

с длинными числами с плавающей точкой.
в блице длина всех дробных числе должна быть одинакова (в байтах, т.е. они же все флоаты).
твоя куча if сожрёт больше времени чем пара операций с дробными числами
а вообще это экономия на спчиках

Dream 25.05.2011 13:45

Ответ: Уменьшения числа
 
ТРЕБУЮ БЕНЧМАРК! 4 if против линейной интерполяции

Vadimich 25.05.2011 13:56

Ответ: Уменьшения числа
 
мне это нужно было для гашения полученного импульса..
допустим, если полученный импульс i# = 1, делитель d# = 2 то это будет
i = i/d... но у меня ещё есть одна переменная - TimeScale#, которая обычно равна 1 (отвечает за замедление времени)
как внедрить её в i = i/d, чтобы если она меньше единицы (например, t# = .5) гашение импульса через деление происходило медленнее?

Dream 25.05.2011 14:06

Ответ: Уменьшения числа
 
умнложить делитель на время
только нужно немного переделать если ты хочешь чтобы по такому принципу работал - i=i/(1+d#*t#)

Vadimich 25.05.2011 14:25

Ответ: Уменьшения числа
 
разве тогда, исходя из предложенного примера это не будет вот так?
i = i/(d*t)
1 = 1/(2*.5) = 1
извините, я в математике не очень.. поэтому могу ошибаться

Vadimich 25.05.2011 14:26

Ответ: Уменьшения числа
 
сорри.. опоздал со своим примером )


Часовой пояс GMT +4, время: 16:09.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot