7°C
завтра: 20°C
Погода в Перми
7°C
днем15°C
вечером17°C
завтра20°C
Подробно
 94,09
−0.2320
Курс USD ЦБ РФна 19 апреля
94,0922
−0.2320
 100,53
+0.2529
Курс EUR ЦБ РФна 19 апреля
100,5316
+0.2529
  • Люди! Хееееееееееелп.

    Тут мне брат попросил помочь сделать одну просто смешную прогу на Паскале еще досовском. Я никогда не был с этим связан. Первый раз сел, сделал все, только ЭТО не смог.

    Как называется степенная функция???
    Не охота второй FOR применять. Не поверят, что сам сделал.

  • давно это было, но возвести число в степень кажися было POW(x,y)... али нет?

  • Я вообще с этим не имел дела.

    Нет что-то я там во встроенном Хелповнике не нахожу такого...

  • Эхх, кажись нету там ее (а может я просто не помню), но сделать это через натуральный логарифм можно. Посмотри справочник по математике.

  • pow функции в Паскале нет... Но как уже предложили, используют обходной путь - логарифм, учитывая положительность аргуметов..
    Если лень искать в справочнике по математике, то :
    exp(x*ln(y)) - возвращает y в степени x..

    P.S. Забавно, минуть 5 назад узнал что на нгсе появился форум по программированию :)) Может хоть тут толковые люди будут.. А то в Нске не знаю ни одного нормального форума по сабжу :((

  • Вот только вычисляться это будет долго... Если этих вычислений много и делаются они в цикле, то лучше руками написать функцию, которая будет делать последовательное умножение - намного быстрее получится.

  • Пасибо.

    Re:P.S.
    Люди то есть. Я! Только я ничего (почти) не знаю, но хочу научиться...

  • Тута паскаля у меня немае, но, как мне помнится смутно, была функция power
    D3 точно уже такую имеет,

    И по коду видно, что используется обыкновенное циклическое умножение, переписанное в асме.

    { Invariant: Y >= 0 & Result*X**Y = X**I. Init Y = I and Result = 1. }
    {function IntPower(X: Extended; I: Integer): Extended;
    var
    Y: Integer;
    begin
    Y := Abs(I);
    Result := 1.0;
    while Y > 0 do begin
    while not Odd(Y) do
    begin
    Y := Y shr 1;
    X := X * X
    end;
    Dec(Y);
    Result := Result * X
    end;
    if I < 0 then Result := 1.0 / Result
    end;
    }
    function IntPower(Base: Extended; Exponent: Integer): Extended;
    asm
    mov ecx, eax
    cdq
    fld1 { Result := 1 }
    xor eax, edx
    sub eax, edx { eax := Abs(Exponent) }
    jz @@3
    fld Base
    jmp @@2
    @@1: fmul ST, ST { X := Base * Base }
    @@2: shr eax,1
    jnc @@1
    fmul ST(1),ST { Result := Result * X }
    jnz @@1
    fstp st { pop X from FPU stack }
    cmp ecx, 0
    jge @@3
    fld1
    fdivrp { Result := 1 / Result }
    @@3:
    fwait
    end;


    ---
    Full http://full.nm.ru
    -------
    Объявление в зоопарке: "Страусов не пугать. Пол бетонный."

  • Ассемблер оно, конечно, хорошо, а если степень дробная ???

  • Ну так опять в исходники лезем, и читаем, как это сделано :))

    function Power(Base, Exponent: Extended): Extended;
    begin
    if Exponent = 0.0 then
    Result := 1.0 { n**0 = 1 }
    else if (Base = 0.0) and (Exponent > 0.0) then
    Result := 0.0 { 0**n = 0, n > 0 }
    else if (Frac(Exponent) = 0.0) and (Abs(Exponent)

  • А если степень целая, но офигенно большая? То перемножение займет много времени. Надо или оптимизировать перемножение, или сразу к экспонированию логарифма переходить.

    Если не ошибаюсь в Turbo Professional это должно быть, хотя это уже не интересно:(

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

    ---
    Full http://full.nm.ru
    -------
    Однажды в студеную зимнюю пору смотрю - поднимается медленно.

Записей на странице:

Перейти в форум

Модератор: