![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите, как программно вычислить квадратный корень. [D6, WinXP]
Тень © (2002-10-02 17:43:00)Народ! Помогите, как программно вычислить квадратный корень?.
Le Taon (2002-10-04 00:50:00) [1]Ну так вот тебе отличнейшая функция квадратного корня,
работает для любых Х >= 0.
Работает очень быстро, всего в 100 раз медленнее Sqrt.
function SqRoot2(X: Double): Double;
// 0.1 < X < 1.9
var
Xm1, Xm1n: Double;
n: Integer;
p, K, M: Double;
begin
p := 0.5;
Result := 1;
Xm1 := X - 1;
Xm1n := Xm1;
K := 1;
M := 1;
for n := 1 to 128 do
begin
K := K*(p - n + 1);
M := M*n;
Result := Result + xm1n*K/M;
Xm1n := Xm1n*Xm1;
end;
end;
function SqRoot(X: Double): Double;
const
Sqrt2 = 1.4142135623730950488016887242097;
var
i, N: Integer;
begin
N := 0;
Result := 0;
if X = 0 then Exit;
if X < 0 then raise Exception.Create("Твою мать...");
if X > Sqrt2 then
begin
repeat
X := X/2;
N := N + 1;
until X <= Sqrt2;
Result := SqRoot2(X);
for i := 0 to N-1 do Result := Result*Sqrt2;
end else
begin
repeat
X := X*2;
N := N + 1;
until X >= Sqrt2;
Result := SqRoot2(X);
for i := 0 to N-1 do Result := Result/Sqrt2;
end;
end;
Jeer (2002-10-03 23:32:00) [2]>Le Taon (03.10.02 23:19)
Видишь ли..
Если ты не сделал оценку - значит промазал.
Если же шутка - слишком много предложений.
:))
Le Taon (2002-10-03 23:19:00) [3]Jeer © (03.10.02 22:47)
Не воспринимай так серьёзно.
Jeer (2002-10-03 22:47:00) [4]Известна, но ближе к верхней границе дает погрешность порядка сотых долей процента.
Le Taon (2002-10-03 22:13:00) [5]Есть много способов.
Например, так:
function SqRoot(X: Double): Double;
// 0 < X < 2
var
Xm1, Xm1n: Double;
n: Integer;
p, K, M: Double;
begin
p := 0.5;
Result := 1;
Xm1 := X - 1;
Xm1n := Xm1;
K := 1;
M := 1;
for n := 1 to 128 do
begin
K := K*(p - n + 1);
M := M*n;
Result := Result + xm1n*K/M;
Xm1n := Xm1n*Xm1;
end;
end;
:)))))
Jeer (2002-10-03 20:41:00) [6]Да, но не все так просто..
Вот такая простенькая функция считает в 1.5 раза быстрее стандартной Дельфийской Power, правда в 4 раза медленнее Sqrt.
Для Sqrt есть и более эффективные алгоритмы.
Так, что не все так просто.:))
function QPower(Base, Exponent: Extended): Extended; assembler;
asm
fld Exponent
fld Base
fabs
fyl2x
fld st
frndint
fsub st(1),st
fxch st(1)
ftst
fstsw ax
sahf
jb @L0
f2xm1
jmp @L1
@L0:
fchs
f2xm1
fld1
fadd st,st(1)
fdivp st(1),st
fchs
@L1:
fld1
faddp st(1),st
fscale
fstp st(1)
end;
Best Before 2024 (2002-10-03 18:43:00) [7]2 alena.svt © (03.10.02 18:36)
Пожалуйста, не обижайтесь. Не хотел Вас задеть никаким образом
Ответ был не Вам, а г-ну Тени.
Вы спросили (удивленно), куда же подробнее, я и сказал.
P.S.
Но Ваш последний постинг ставит все точки над i :)
Снимаю шляпу :)
alena.svt (2002-10-03 18:36:00) [8]Корень из числа: Функция Sqrt
Функция возращает квадратный корень от указаного значения
function Sqrt (x: extended): Extended:
Аргументы: x - действительное число, больше 0
Пример :
Sqrt(25); {функция вернет 5}
Из пособия для D5 Борис Карпов(с)
alena.svt (2002-10-03 18:26:00) [9]Миша я понимаю может мышь заело, но так я тут причем?
Конечно, подробней - букв-то больше :) Если это объяснения мне почему то на этом мысль заканчивается
Song (2002-10-03 18:23:00) [10]Лена, относись поспокойней к таким, надо народу хоть что-то сказать, когда нечего :-)
Best Before 2024 (2002-10-03 18:22:00) [11]alena.svt © (03.10.02 18:20)
>>А меня то ты че цепанул или ты че подробней объяснил :}
Конечно, подробней - букв-то больше :)
P.S. цепанул :)))
alena.svt (2002-10-03 18:20:00) [12]2Best Before 2024 (03.10.02 18:17)
А меня то ты че цепанул или ты че подробней объяснил :}
Best Before 2024 (2002-10-03 18:17:00) [13]Тень (03.10.02 18:09)
>>А по подробней...
alena.svt © (03.10.02 18:15
>>А куда уже?
SQuareRooT
alena.svt (2002-10-03 18:15:00) [14]2Тень (03.10.02 18:09)
А по подробней...
А куда уже?
Игорь Шевченко (2002-10-03 18:11:00) [15]А поподробнее в Help"е :-)
Тень (2002-10-03 18:09:00) [16]А по подробней...
MBo (2002-10-02 17:44:00) [17]SQRT