forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Любопытные формулы (http://forum.boolean.name/showthread.php?t=275)

impersonalis 01.11.2005 20:29

Напрмер.
Реализация чередования значений a и b, хранящийхся в перменной x
x=( a + b ) - x
Перед первой обработкой в x должно хранится одно из значений (a или b )
Код:

a=6
b=9
x=b
For i=1 To 10
        x=(a+b)-x
        Print x
Next
WaitKey()


impersonalis 01.11.2005 20:36

Реализация прохода переменной x всех значений из [0;b-1]
x = ( x + 1 ) Mod b
Код:

b=5
x=0
For i=1 To 10
        x=(x+1)Mod *b
        Print x
Next
WaitKey()


impersonalis 01.11.2005 20:46

Выбор максимума из a,b в одну ф-лу
x = ( Abs( a-b ) + ( a+b ) ) *.5
Код:

a=4
b=10
x=(Abs(a-b)+(a+b))*.5
Print x
WaitKey()


jimon 01.11.2005 23:58

хм

ето ты сам придумал ? или где взял ?

НУБ 02.11.2005 01:44

>Выбор максимума из a,b в одну ф-лу
>x = ( Abs( a-b ) + ( a+b ) ) *.5

If a>b
x=a
else
x=b
endif

- это будет гораздо быстрее, чем куча умножений/сложений(раз в 5-6 примерно), вот тест(если не верите):

Код:

a=5
b=8

time1=MilliSecs()
For i=1 To 10000000
x = ( Abs( a-b ) + ( a+b ) ) *.5
Next
time1=MilliSecs()-time1

time2=MilliSecs()
For i=1 To 10000000
If a>b
x=a
Else
x=b
EndIf
Next
time2=MilliSecs()-time2


Print time1
Print time2
WaitKey()


jimon 02.11.2005 16:34

прикол у меня первый способ быстрее :)
у pentiumов alu рулит полюбе - вот за что их люблю , и неглючат никогда

impersonalis 02.11.2005 20:55

Не отрицаю - все выше изложенные формулы работают медленее, конструкций условного перехода, однако, в борьбе за скорость приходится отказваться от удобочитаемости ( избавляться от функциий, юзать goto и т.п.) - так что выбор за вами. Я лишь посчитал эти формулы интересными.
Практически все где-то видел : в институте, интернете, чужом коде.

impersonalis 02.11.2005 20:58

Ф-лу минимума можно получить или эвристически или объединив ф-лы для max и чередования 2ух значений.
x = ( ( a+b ) - Abs( a-b ) ) *.5
Код:

a=10
b=1
x = ( ( a+b ) - Abs( a-b ) ) *.5
Print x
WaitKey()


alcoSHoLiK 23.01.2006 23:01

Как определить, является ли число степенью двойки?
Код:

bool PowOfTwo (int num)
{
  return !(num & (num-1));
}


jimon 24.01.2006 14:33

БЫСТРЫЙЙЙЙ !!! :)) квадратный корень с минимальной точностью

Код:

float fast_sqrt(float f)
{
  float result;
  _asm
  {
    mov eax, f
    sub eax, 0x3f800000
    sar eax, 1
    add eax, 0x3f800000
    mov result, eax
  }

  return result;
}

:))

impersonalis 24.01.2006 15:39

2jimon :
продолжая борьбу за скорость: добавь ещё inline для функции

alcoSHoLiK 24.01.2006 22:11

Да, хорошая функция, но огорчает, что выдает неточный результат с простыми корнями. Например, fast_sqrt(625)==25.76, а fast_sqrt(144)==12.5.

jimon 24.01.2006 23:05

ето не я делал... щитается дефак-то самая быстрая функция примерного извлечение квадратного корня

alex-mad 25.01.2006 00:05

Цитата:

Originally posted by jimon@Jan 24 2006, 10:05 PM
ето не я делал... щитается дефак-то самая быстрая функция примерного извлечение квадратного корня

а говорил с минимальной точностью...

jimon 25.01.2006 19:10

ну всеже она может хоть чучуть сказать какой корень :)


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

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