Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.24;
Скачать: CL | DM;

Вниз

Возведение числа в степень   Найти похожие ветки 

 
Dan   (2003-02-14 08:41) [0]

Братва, подскажите есть ли в Дельфях функция с помощью которой
можно возвести число в вещественную(real) степень, если
такой функции нет, то как это можно организовать?


 
TButton ©   (2003-02-14 08:44) [1]

в стандартном дистрибутиве такой функции нет. по крайней мере мне она не известна


 
Danilka ©   (2003-02-14 08:45) [2]

power


 
Danilka ©   (2003-02-14 08:47) [3]

TButton © (14.02.03 08:44)
Ваш возраст несколько настораживает...


 
Ricky-Ticky-Tavy ©   (2003-02-14 08:53) [4]

Есть - exp(n*ln(a)), где a-число, n-степень.


 
Danilka ©   (2003-02-14 09:09) [5]

Ricky-Ticky-Tavy © (14.02.03 08:53)
в коде напиши power, нажми Ctrl и кликни левой мышкой на нем...
так что лучше все-таки его использовать, а не exp(n*ln(a))


 
Palladin ©   (2003-02-14 09:18) [6]

юнит Math если лень мышкой тыкнуть :)


 
Anatoly Podgoretsky ©   (2003-02-14 09:35) [7]

TButton © (14.02.03 08:44)
Зато она есть в Pro и Enterprize


 
Chubais ©   (2003-02-14 09:46) [8]


> Dan (14.02.03 08:41)
> Братва,

гыыы


 
Sheriff   (2003-02-14 10:19) [9]

exp(n*ln(a)) выполняется быстрее, чем Power примерно в 2,5 раза.
?
:)


 
DVM ©   (2003-02-14 10:24) [10]


> exp(n*ln(a)) выполняется быстрее, чем Power примерно в 2,5
> раза.

Потому что делает дополнительные проверки исходных данных.


 
Anatoly Podgoretsky ©   (2003-02-14 10:33) [11]

Выписка из функции Power
Result := Exp(Exponent * Ln(Base))
А проверки на допустимость все равно надо делать, кроме того в функции проведена кой какая оптимизация в зависимости от операндов.


 
Danilka ©   (2003-02-14 10:35) [12]

Sheriff (14.02.03 10:19)

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) <= MaxInt) then
Result := IntPower(Base, Integer(Trunc(Exponent)))
else
Result := Exp(Exponent * Ln(Base))
end;


но эти проверки никак не могут столько занимать времени...


 
Anatoly Podgoretsky ©   (2003-02-14 10:42) [13]

Наоборот эти проверки ускоряют в этих случаях


 
Sheriff   (2003-02-14 10:48) [14]

exp(0.0*ln(5.5)) быстрее Power(5.5,0.0) ~ в 7,5 раз


 
Sheriff   (2003-02-14 10:59) [15]

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


 
Anatoly Podgoretsky ©   (2003-02-14 11:09) [16]

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

485(ln) и 84(power)

procedure TForm1.Button1Click(Sender: TObject);
var
Num: Extended;
I : Integer;
T : Integer;
begin
T := GetTickCount;
for I := 1 to 1000000 do Num := Exp(0.0 * ln(5.5));
Label1.Caption := IntToStr(GetTickCount-T);
T := GetTickCount;
for I := 1 to 1000000 do Num := Power(5.5,0.0);
Label2.Caption := IntToStr(GetTickCount-T)
end;


 
Anatoly Podgoretsky ©   (2003-02-14 11:10) [17]

Извинения приняты


 
pasha676   (2003-02-14 11:31) [18]

Но это частный случай. В проге имхо надо писать и то и другое в зависимости от ожидаемой области определения.



Страницы: 1 вся ветка

Текущий архив: 2003.02.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
3-75777
ArtemB
2003-02-06 08:55
2003.02.24
2 вопроса


4-76236
[S]_Dorado
2003-01-05 20:36
2003.02.24
Win API


1-75886
lety
2003-02-13 19:46
2003.02.24
лог ошибок


3-75758
mate
2003-02-05 15:21
2003.02.24
Hint for DBGrid


3-75795
sly fox
2003-02-06 11:30
2003.02.24
Как вставить ресунок в базу данных?