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

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

Vadimich 25.05.2011 14:34

Ответ: Уменьшения числа
 
вобщем, вчера я запнулся именно на этом.. не получилось внедрить t# вот и сейчас выходит не то.. получается результат, который был бы таким и без времени 1 = 1 / (1+2*.5) = .5

Черный крыс 25.05.2011 14:51

Ответ: Уменьшения числа
 
[quote=Dream;189393]умножение на дробное число никогда не приведёт к резельтату 0 (если конечно одно из чисел уже не является нулем) самый простой -
[quote]

Можно легко замагнитить число к нулю.

Vadimich 25.05.2011 14:53

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

Черный крыс 25.05.2011 15:03

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

Сообщение от Vadimich (Сообщение 189410)
а как это?

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

a = Min((Abs(a) * s) - 0.1, 0.0) * Sgn(a)

Если а меньше 0.1 то а приравнится к нулю.

Насчет функции Sgn(number) она какая то сверхсложная ?

Код:

Function Sgn:Int(num:Float)
    If a > 0.0 Then Return True
    If a < 0.0 Then Return -True
    Return False
End Function

Функция Min
Код:

Function Min:Float(v0:Float, v1:Float)
    If v0 < v1 Then Return v0
    Return v1
End Function


Dream 25.05.2011 15:27

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

Сообщение от Vadimich (Сообщение 189403)
вобщем, вчера я запнулся именно на этом.. не получилось внедрить t# вот и сейчас выходит не то.. получается результат, который был бы таким и без времени 1 = 1 / (1+2*.5) = .5

не глупи.если d#= 0тогда никакого уменьшения нету. если d#=1тоггда уменьшение в два раза. вроде же всё просто

Vadimich 25.05.2011 15:48

Ответ: Уменьшения числа
 
d - это делитель.. было бы странно, если бы деление на 1 уменьшало в два раза?

Dream 25.05.2011 16:49

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

Сообщение от Vadimich (Сообщение 189420)
d - это делитель.. было бы странно, если бы деление на 1 уменьшало в два раза?

уфффф.. ну хорошо, если тебе проще напишу так i=i/(1+d/2*t)

И вообще что это за делитель? зачем он применяется?

Vadimich 25.05.2011 17:27

Ответ: Уменьшения числа
 
если i - это импульс, то делитель (d) это то, что его гасит...
т.е. мне нужно иметь контроль для настройки скорости гашения полученного импульса и + к тому - чтобы был контроль времени этого процесса.. т.е. если время = .5, то гашение будет идти так же, но в два раза медленнее

Dream 25.05.2011 18:47

Ответ: Уменьшения числа
 
используй число от 0 до 1 и сразу вопросы отпадут
i=i*(d*t)

impersonalis 25.05.2011 20:11

Ответ: Уменьшения числа
 
извините, но первый пост - лютый БРЕД.
Автор может быть и подразумевает весьма конкретную задачу, но написал какую-то размазню.
Ответ: самый быстрый способ свети число к нулю - обнулить.
x=rnd(0,10)
x=0
Поражает наличие в треде телепатов (они вернулись из отпуска!), которые сумели восполнить пробелы, или, что более вероятно, решают свои задачи.

*импе телепатирует*
АВТОР, тебе надо читать вот это: http://ru.wikipedia.org/wiki/%D2%E5%...EB%E5%ED%E8%FF (в частности - http://ru.wikipedia.org/wiki/Следяща...ема_управления )

Mr_F_ 25.05.2011 20:21

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

АВТОР, тебе надо читать вот это: http://ru.wikipedia.org/wiki/%D2%E5%...EB%E5%ED%E8%FF (в частности - http://ru.wikipedia.org/wiki/Следяща...ема_управления )
нафига ему это читать?

impersonalis 25.05.2011 21:05

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

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

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

Сообщение от Vadimich (Сообщение 189379)
к примеру я бы сделал что-то вроде этого:

a# = Rnd (-10,10); задаем случайное значение
s# = .1; шаг уменьшения

d#=0.5; скорость уменьшения (по времени)(если 1 то обычно, 2 - ускорено, 0.5 - медленно)

PHP код:

a#=Int(Sgn(a#))*(Abs(a#)-(s#*d#)) 

хотя наличие двух меньшинств не практично?
Может просто иметь скорость...

Vadimich 26.05.2011 08:39

Ответ: Уменьшения числа
 
2 impersonalis: я бы не стал разводить такой базар, если мне надо было бы просто прировнять её к нулю. Наверное я тебя своей тупостью раздражаю :) мне не надо гасить ошибку на выходе... это просто частица, которая получила определенную скорость по вектору, которую надо быстро(в зависимости от переменной) погасить. и все это привязано ко времени... чтобы если оно вдруг замедлилось, скорость уменьшалась в соответствующем темпе... я решил эту проблему ещё вчера своим ламерским способом, представленным в начале, но надеюсь научиться чему-то более... изящному, что-ли, общаясь тут с более сообразительными ребятами

impersonalis 26.05.2011 21:03

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

мне не надо гасить ошибку на выходе... это просто частица, которая получила определенную скорость по вектору, которую надо быстро(в зависимости от переменной) погасить.
Я лишь сформулировал модель в терминах указанной выше дисциплины. Ваш код (функция, процедура, тело цикла, etc) передставляет собой некую следящую систему: он отслеживает значение переменной Х. По дефолту она равна нулю. Когда появляется "импульс", переменная становится отлична от нуля. Появляется "ошибка" слежения. Система должна некоторым образом компенсировать её.
Например: сервомеханизм реагирует на давление в котле. Как только оно начинает превышать установленный порог (например, 0 Па) - система компенсирует образовавшуюся разность (актуальное и требуемое значение), например, путём стравливания излишков газа. Вот вы и спрашиваете - каким законом должна быть описана эта реакция: открыть заслонку сразу на максимум, открывать на величину, пропорциональную давлению, проч?


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

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