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

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

Закрытая тема
 
J
expert
offline
Опыт: 48,747
Активность:
хз.. еще раз значит проверю...
а сможеш достичь точность в 0,001?:)
Старый 30.06.2007, 23:56
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Jon, для данного случая - элементарно. Просто добавь два нуля в строку:
>> local real acc2 = acc1 / 10
чтобы получилось
>> local real acc2 = acc1 / 1000
У меня вышло 998.999. Ювелирная работа))).
Для общего случая придется корректировать вычисление точности (accuracy)
Старый 01.07.2007, 00:03
J
expert
offline
Опыт: 48,747
Активность:
а в отририцательной степени у тебя работает?:)

Jon добавил:
добавь орицательную степень.. это должно быть легко...
и получиш опыт, и я выкладываю свое решение...
Старый 01.07.2007, 00:14
J
expert
offline
Опыт: 48,747
Активность:
ShadoW DaemoN а если увеличить точность то насчколько увеличятся интерации?
Старый 01.07.2007, 00:16
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Jon, на 24.
Чтобы отрицательные N работали, надо добавить
Код:
if N < 0 then
  return 1 / mid
endif

перед
Код:
return mid


Цитата:
это должно быть легко...

ты так говоришь, как будто сам не знаешь, легко это или нет)
Старый 01.07.2007, 00:37
J
expert
offline
Опыт: 48,747
Активность:
ShadoW DaemoN а твоя функция power() в этом процессе тоже будет тогда использовать отрицательную степень

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


Jon

Цитата:
Код:
function RealTertiaryOp takes boolean flag, real valueA, real valueB returns real
    if flag then
        return valueA
    else
        return valueB
    endif
endfunction

function PowInt takes real x, integer power returns real
    local real x1 = x  
    local boolean bool= power < 0  
    if power == 0 then
        return 1
    elseif bool then
        set power = -power
    endif
    loop
        exitwhen power == 1
        set x1 = x1 * x
        set power = power - 1
    endloop
    return RealTertiaryOp(bool,1/x1,x1)
endfunction

function root takes real x, integer power returns real
    local real i = 1
    local real d = 1.5
    local real y = 0
    local boolean bool = true
    local boolean bool2= power < 0
    if x < 0 or power == 0 then
        return 1/0 //так... делать было нечего:)
    endif
    if bool2 then
        set power = -power
    endif
    loop                       
        loop 
            exitwhen PowInt(i,power) > x == bool 
            set i = i+i*d
        endloop   
        exitwhen RAbsBJ(y-i) < 0.001       
        set y = i
        set d = -d/2
        set bool = not bool
    endloop
    return RealTertiaryOp(bool2,1/i,i)
endfunction
PowInt(X, N) - находит любое число в N-ой степени (N принадлежит цельым числам)
sqrt(X, A) - находит любой корень A-той степени (A принадлежит цельым числам)
Кстате... если ты хочеш найти дробную степень (N/A) из числа X, то сначало найди корень A-той степени из числа X, а потом возведи его в степень N.

ShadoW DaemoN

Цитата:
Код:
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
Прикрепленные файлы
Тип файла: w3x Корень.w3x (18.8 Кбайт, 27 просмотров )

Отредактировано Jon, 01.07.2007 в 01:11.
Старый 01.07.2007, 00:53
Закрытая тема

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

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

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

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



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