Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите, как программно вычислить квадратный корень. [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо