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)

alex-mad 25.01.2006 20:35

Цитата:

Originally posted by jimon@Jan 25 2006, 06:10 PM
ну всеже она может хоть чучуть сказать какой корень :)

гы... нафиг такое надо? ф топку!

Kain 25.01.2006 23:10

Может я ещё не опоздал ?
alcoSHoLiK
Цитата:

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

перевести число в Bin и одна проверка
при одной 1 (может слова не те )
True
правые 0 откинуть, левые : степень, для 2 .

ещё можно такой способ, не только для двойки
(а вернее для не степени двойки оснований ) :
Цитата:

1)извлекаем кв.корень
2)проверяем на целосность (вроде натуральное называется)
True
3)делим число на основание
4)проверяем на целосность
Return true
False
Меняем 1) и 3) местами

подумаю ещё над приоритетом 1)2)3) и 3)2)1)
про узнавании степени не додумал ,пока.

PS ещё про корни :
где-то в древности корень примерно извлекали так
Код:

sqr(a)=sqr(b^2+c)~b+(c/2b)

где
B^2 > С
чем больше
тем точнее

Описал I в.н.э. древнегреческий ученый Героном Александрийский

alex-mad 26.01.2006 01:28

to Kain
в формулу корня особо не вникал, но она не пригодится, т.к. в правой части всё равно есть корень... время не выиграем... так што можно считать как обычно ( что не на много быстрее)
алгоритмы - это конечно хорошо, но тут вроде как "Любопытные формулы"
и к тому же alcoSHoLiK уже написал формулу "проверка числа на степень 2":
Код:

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


Kain 26.01.2006 22:46

Формула не для пользования была приведена, а для справки
так считали 4000 лет назад....
учебник Алгебры 8 класса

1)у alcoSHoLiK 'а стоит знак вопроса
2)ето не для блица (тупо посмотрел справку,нету там :lol:

а так как я не профи, как понял так и ответил
а вообще когда есть двусмысленность пишите как impersonalis:
ответ (читать ... ... .. )

N.O.T. 07.02.2007 11:29

Re: Любопытные формулы
 
Нужно было догнать любое число до первого большего с основанием 2 в N-степени, пример: если число 31, то резалт должен быть 32, если 257, то 512 и т.д.
Сначала написал, чтоб посмотреть будет ли ваще програ раобтать простым циклом:
while(true)
{
static int iIter = 1;
if( iLabelWidth > iIter )
iIter = iIter << 1;
else
{
iLabelWidth = iIter;
break;
}
}
потом начал придумывать как моно сделать запись короче, придумал:
// fIn - вход. число
// получаем степень
float stepen = log10((float)fIn)/ log10(2.0f);
int res = pow(2, ((floor(stepen)+1)));
Результат при сравнении на быстродействие:
на 10 млн. итераций выполняется за 9284 мск, против первого(обычным циклом) за 50 мск.
Так что оставил первый. Может кто-то лучше напишет, вставлю себе.

impersonalis 18.10.2007 15:55

Re: Любопытные формулы
 
Код:

((char*)&w)[sizeof(w)-1]&=~(1<<7);
Где w - float или double. Зануляет знаковый бит числа - аналог fabs. Не претендую на скорость выполнения - просто извращённая формула, порождённая моим мозгом.

HolyDel 26.12.2007 13:11

Re: Любопытные формулы
 
Цитата:

((char*)&w)[sizeof(w)-1]&=~(1<<7);
интересно, компилятор ~(1<<7) рассчитает как константу? или в рантайме будет это считать?

jimon-у спасибо за быстрыыыыый корень.
2Imeprsionalis - inline не получится вставить. там код на asm-e.

alcoSHoLiK 26.12.2007 19:14

Re: Любопытные формулы
 
Константные выражения компилятор считать умеет. Если не доверяешь ему, смотри сгенерированные асм-листинги.

impersonalis 04.10.2008 23:42

Ответ: Любопытные формулы
 
<<jimon>> (23:32:19 4/10/2008)
http://www.graphics.stanford.edu/~seander/bithacks.html канопляное поле - единство битовой вселенной !

~Lexx~ 17.11.2009 08:54

Ответ: Любопытные формулы
 
Формула для возведения числа в любую степень и извлечения любого корня:

exp(b*ln(a)),

где a - число, которое возводим в степень, b - степень в которую возводим, exp - экспонента, ln - натуральный логарифм.

cheaters-hater 09.02.2010 16:42

Ответ: Любопытные формулы
 
формула возвращает 0 если (параметр<0) или параметр, если (параметр=>0)
result= ( parameter+Abs(parameter) )/2
понадобилось при прохождении массива по элементам, во избежание минусовых индексов.
не самый быстрый и правильный вариант решения задачи, но может кому пригодится.:)

ABTOMAT 09.02.2010 19:33

Ответ: Любопытные формулы
 
result = parameter*(parameter>0) , не?

IGR 09.02.2010 22:56

Ответ: Любопытные формулы
 
если учитовать строго условие то по задумке
result = parameter*(parameter>=0) :)

impersonalis 10.02.2010 05:02

Ответ: Любопытные формулы
 
Цитата:

Сообщение от ABTOMAT (Сообщение 136696)
result = parameter*(parameter>0) , не?

Автор же написал:
Цитата:

не самый быстрый и правильный вариант решения задачи
Здесь не мало примеров формул нерациональных, но любопытных.
Думаю - стоит перместить тред в Математику (там она будет более к месту, не смущая брейнфачными решениями).

Alex.D. 10.02.2010 07:22

Ответ: Re: Любопытные формулы
 
Цитата:

Сообщение от N.O.T. (Сообщение 31299)
Нужно было догнать любое число до первого большего с основанием 2 в N-степени, пример: если число 31, то резалт должен быть 32, если 257, то 512 и т.д.

Может кто-то лучше напишет, вставлю себе.

Код:

x -= 1;
x |= (x >> 1);
x |= (x >> 2);
x |= (x >> 4);
x |= (x >> 8);
x |= (x >> 16);
x += 1;

^__^


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

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