XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
J
expert
offline
Опыт: 48,447
Активность:
NaRaYaN непонял... что уменьшить?

кстате.. чтобы подсчитать почти любой каорень мой цыкл выполняется небольше 50 раз...
Старый 29.06.2007, 21:28
YellowStar
poon
offline
Опыт: 15,144
Активность:
число методом подбора найденое. Находим от каждого числа в строке корень. Может выйдет что:)
Старый 29.06.2007, 21:31
J
expert
offline
Опыт: 48,447
Активность:
всеравно непонял вообщем делай.. сделаеш повышеш свой ранг алгоритмиста и получиш 250 опыта






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





.

Отредактировано Jon, 30.06.2007 в 23:01.
Старый 29.06.2007, 22:05
Prosha89
Невозможно-слово глупцов
offline
Опыт: 1,409
Активность:
Код:
function ROOT takes real X , integer N  returns real
local real y1 =0
local real y2 =0
        loop
         exitwhen  y1 >= X
    if ( not ( y1 != X ) ) then
        set bj_forLoopAIndex = 1
        set bj_forLoopAIndexEnd = N
        loop
            exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
            set y1 = ( y1 * y2 )
            set bj_forLoopAIndex = bj_forLoopAIndex + 1
        endloop
        set y1 = ( y1 + 0.01 )
        set y2 = y1
    else
          return y1
    endif
        endloop
       
endfunction


PS к орфографии не придераться мне важна оценка идеи и конструктивная критика

Отредактировано Jon, 30.06.2007 в 23:10.
Старый 29.06.2007, 22:47
J
expert
offline
Опыт: 48,447
Активность:
алгоритм неправельный... незнаю почему ты решил сделать так... там как минумум нужно двойной цыкл (хм... выглядит так.. будто ты хотел добавить еще один цыкл но забыл:):)

Отредактировано Jon, 29.06.2007 в 23:51.
Старый 29.06.2007, 22:58
Prosha89
Невозможно-слово глупцов
offline
Опыт: 1,409
Активность:
да действительно забыл второй цикл. Ну да не в этом дело. Ничо больше чо-то не придумалось ,поэтому буду ждать ответ (очень интересно)
Следующим вопросом сделай вычисление определенного интеграла :D:
Старый 30.06.2007, 01:10
J
expert
offline
Опыт: 48,447
Активность:
Prosha89 это очень легко (насчет интегралов) и есть в каждом учебнеке по высшей математики... я сколько их не читал постояно попалалисб формулы интегралов для кодинга
Старый 30.06.2007, 01:13
Prosha89
Невозможно-слово глупцов
offline
Опыт: 1,409
Активность:
поэтому я и поставил смайлик (Думаешь я чтоль их не читал?) Но еслиб не читал сам мож до такого не дадумался бы, как и с этим вопросом
PS тока не по математике а по информатике
Старый 30.06.2007, 01:15
J
expert
offline
Опыт: 48,447
Активность:
Prosha89 по математике тоже...
Старый 30.06.2007, 01:23
Prosha89
Невозможно-слово глупцов
offline
Опыт: 1,409
Активность:
ха, скажи что еслиб те дали одну формулу из учебника по математике ты б сходу смог ее "перевести" в код? Если да то извени.

Отредактировано Prosha89, 30.06.2007 в 01:37.
Старый 30.06.2007, 01:30
J
expert
offline
Опыт: 48,447
Активность:
у меня там этому уделено страницы 2 учебника... там маленькая форумула содержащая знак суммы
а знак суммы делается только через цыкл.. вообщем ладно.. отклонились от темы...
Старый 30.06.2007, 01:36
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
забыл проинициализировать некоторые риалки, например set X = (X + 0.01) не будет работать, так как не проинициализирован X (local real X => local real X = 0.00), да и exitwhen хз воспримет ли беззначные переменные (поидее, не должен)
Старый 30.06.2007, 15:47
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Вот мой код:
» Made by swdn

Код:
function power takes real X, integer N returns real
    local integer i = 1
    local real    z = X
    loop
        exitwhen i >= N
        set z = z * X
        set i = i + 1
    endloop
    return z
endfunction

function calc_acc takes real X returns real
    local real acc = 1
    local real x   = X
    loop
        exitwhen x / 10 <= 1
        set x = x / 10
        set acc = acc + 1
    endloop
    return acc / 10
endfunction

function root takes real X, integer N returns real
    local real acc1 = calc_acc(X)
    local real acc2 = acc1 / 10
    set udg_Middle = (X + 1) / N
    if power(N, N) == X then
        set udg_Middle = N
    else
    loop
        exitwhen (power(udg_Middle - acc1, N) < X) and (power(udg_Middle + acc1, N) > X)
        if power(udg_Middle, N) > X then
            set udg_Middle = (udg_Middle + 1) / 2
        elseif power(udg_Middle, N) < X then
            set udg_Middle = 3 * (udg_Middle + 1) / 2
        endif
    endloop
    if acc1 * 10 > 3 then
        loop
            exitwhen (power(udg_Middle - acc2, N) < X) and (power(udg_Middle + acc2, N) > X)
            if power(udg_Middle, N) > X + acc1 then
                set udg_Middle = udg_Middle - acc2
            elseif power(udg_Middle, N) < X - acc1 then
                set udg_Middle = udg_Middle + acc2
            endif
        endloop
    endif
    endif
    return udg_Middle
endfunction

udg_Middle - реальная глобалка.

Кстати, тоже 50 строк)
» Made by swdn

Код:
function sqrt takes real X returns real
    local real z = 1
    local integer i = 0
    loop
        exitwhen i >= 6
        set z = (z + X / z) / 2
        set i = i + 1
    endloop
    return z
endfunction

А это для вычисления квадратного корня

Отредактировано Jon, 30.06.2007 в 23:11.
Старый 30.06.2007, 16:31
J
expert
offline
Опыт: 48,447
Активность:
Ничтожество небудет работать
ShadoW DaemoN ща протестю... сек
[+] 2 пункта от makkad: 1.1 Публичное использование ненормативной лексики.

Отредактировано Jon, 30.06.2007 в 18:03.
Старый 30.06.2007, 17:32
WordEdit

offline
Опыт: 11,597
Активность:
ShadoW DaemoN
Вроде всё работает...А чо за метод юзал, или сам код придумал?
Старый 30.06.2007, 17:35
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Jon, ну он примерно считает. Я насчет вычисления точности сильно не заморачивался.
WordEdit, метод, хмм, смешанный. Первый цикл - это бинарный поиск варианта (кстати Jon уже описал этот метод в посте №22.). Для больших размерностей нужно использовать. Второй цикл - это простой перебор (для бОльшей точности).
Старый 30.06.2007, 17:45
J
expert
offline
Опыт: 48,447
Активность:
ShadoW DaemoN
Замечание:
нужно следить за функцией power(), т.к. если ты хочеш сделать алгоритм аптимальный, то надо уменьшать количество ее выполнения, и хотябы заносить в локальки, чем использовать повторно...
По коду:
протестил, работает не совсеми числами... почти со всеми степенями шестерки неработает.. да и sqrt(585*585*585,3) проврерял.. тоже неработает...
твоя переменая колеблется между нужным числом, но не улавливает его, и после некоторого времени вар всеже крашит поток и не выводит результат...
а так у тебя пока самый близкийй к ответу результат...
P.S.
1) код должен работать со всеми положительными числами, даже с дробными.
2) у меня код намного проще...

Jon добавил:
награда опыта увеличина:)

Отредактировано Jon, 30.06.2007 в 19:42.
Старый 30.06.2007, 19:45
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Jon, подредактировал вариант, протестил 5 раз.
» root

Код:
function power takes real X, integer N returns real
    local integer i = 2
    local real    z = X * X
    loop
        exitwhen i >= N
        set z = z * X
        set i = i + 1
    endloop
    return z
endfunction

function calc_acc takes real X returns real
    local real acc = 1
    local real x   = X
    loop
        exitwhen x / 10 <= 1
        set x = x / 10
        set acc = acc + 1
    endloop
    return acc / 10
endfunction

function root takes real X, integer N returns real
    local real acc1 = calc_acc(X)
    local real acc2 = acc1 / 10
    local real mid  = (X + 1) / power(N, N)
    local real mid2 = (X - mid / 2)
    if power(N, N) == X then
        set mid = N
    else
    loop
        exitwhen (power(mid - acc1, N) < X) and (power(mid + acc1, N) > X)
        set mid2 = mid2 / 2
        if power(mid + acc1, N) > X then
            if mid2 > 0 then
            set mid  = (mid + mid2) / 2
            else
            set mid  = (mid + (N / 2)) / 2
            endif
        else
            set mid = mid * N
        endif
    endloop
    if acc1 > 0.3 then
        loop
            exitwhen (power(mid - acc2, N) < X) and (power(mid + acc2, N) > X)
            set mid = mid - acc2
            if power(mid, N) < X - acc1 then
                set mid = mid + acc2 * 2
            endif
        endloop
    endif
    endif
    return mid
endfunction


Числа были такие (число, степень):
875.875, 2
585*585*585, 3
125*125, 25
6, 3
12, 12
Алгоритм немного оптимизирован (теперь делает максимум 200 итераций - по моим тестам)
Ага, все гениальное просто)

Отредактировано Jon, 30.06.2007 в 23:11.
Старый 30.06.2007, 20:36
J
expert
offline
Опыт: 48,447
Активность:
в моем коде интераций 40-50, ща пока занят.. проверю кодик через минут 20-30...


Jon добавил:
проблема с которой ты можеш столкнутся:
если вывести на экран число power(999,3), выведится
997002944, в не 997002999
(вместо 999 может быть любое число... большое... 789, 598 и т.п.)
Я хз почему так происходит, у меня было тоже самое, но оно происходит, я нашел как обойти эту проблему... обойди и ты...
но он и сам по себе страно происходит, кое где он это число видит нормально.. а гдето нет... вообщем я хз


ShadoW DaemoN кстате.. проверил твой код, перовое что я проверил - (999*999*999,3) уже не работает
причина тажа... крутится вокруг, а найти не может...

Отредактировано Jon, 22.07.2007 в 02:54.
Старый 30.06.2007, 23:12
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Jon, странно, у меня
Код:
call echo(R2S(root(999*999*999, 3)))

работает и выдает 998.979 =|
Насчет неправильных чисел - фз, попробовал все варианты, которые знаю. Анализом определил, что от 997002944 можно вычесть/сложить число не ниже 128 (число меньше 128 не вычитается/не складывается), и ведет себя число необычно.
Старый 30.06.2007, 23:49
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



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