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

Вниз

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

 
wern   (2003-06-19 08:23) [0]

Профессионалы! Как возвести число в степень?
не в квадрат, а например в 10.436784


 
Palladin ©   (2003-06-19 08:27) [1]

а для этого нужно быть профи?
c:=exp(10.436784*log(число))


 
_Raven   (2003-06-19 08:27) [2]

x^y = Exp(Ln(x)*y)

Алгебра, да и только


 
wern   (2003-06-19 08:32) [3]

Спасибо :)
... да, а вот это подходит Power ?


 
Palladin ©   (2003-06-19 08:34) [4]

ну а в справке почитать лень? или не судьба?


 
wern   (2003-06-19 08:51) [5]

>Palladin © (19.06.03 08:34)
В справке много не написано..., а у меня в разных случаях получаются разные значения :(
А какой из них правильнее? Погрешность идет на десятки :(((


 
Palladin ©   (2003-06-19 08:54) [6]

вот бы я удивился если бы у тебя в разных случаях одинаковые были бы значения...


 
wern   (2003-06-19 09:00) [7]

Чего то я не пойму.
Вы меня наверное не так поняли...
Sqr(5)=25
Exp(2*log(5))=25
Ну как? Удивились? :)))

Речь то ОБ ЭТОМ...


 
Palladin ©   (2003-06-19 09:03) [8]

http://www.delphikingdom.com/helloworld/reals.htm


 
pasha676   (2003-06-19 09:18) [9]


> Sqr(5)=25
> Exp(2*log(5))=25


Почему логарифм десятичный? Надо натуральный. Паладин описался, но слепо то копировать тоже нельзя.


 
Axis_of_Evil ©   (2003-06-19 09:22) [10]

> Sqr(5)=25
> Exp(2*log(5))=25

Смеюсь ...
все еще смеюсь ...
млин, не остановиться ...

// пусть еще кто-нибудь скажет,
// что математика программисту не нужна
// // Я думал все здесь школу закончили ...


 
Palladin ©   (2003-06-19 09:26) [11]

описка :) каюсь :) но думать то надо иногда :)


 
xxxXXxxx   (2003-06-19 09:27) [12]

...нет слов! из-за школьной формулы развели целые дебаты!
может, пообсуждаем, как вычислить синус?


 
Anatoly Podgoretsky ©   (2003-06-19 09:31) [13]

А давай


 
Axis_of_Evil ©   (2003-06-19 09:56) [14]

>может, пообсуждаем, как вычислить синус?
Действительно давай!
Неееет, не написать a := Sin(2*Pi);
Я вот, например, не знаю как в Delphi Sin вычисляется ...
вряд ли через ряд Тейлора ... действительно как?
// интерполяцией :>


 
pasha_golub ©   (2003-06-19 10:47) [15]

Ваще-то, ИМХО, синус вычисляет мат. сопроцессор.


 
Jeer ©   (2003-06-19 10:51) [16]

Да ведь и сопроцессор вычисляет Sin по некоторому алгоритму - читай микропрограмме.
Например, параллельное вычисление Sin и Cos - по алгоритму Волдера.


 
HolyGlory   (2003-06-19 11:34) [17]

Эх вы, Мастера... А еще претендуете на звание знающих архитектуру :(
Конечно, можно считать и так: x^alpha=exp(alpha*ln(x)). Только проблема одна есть: в ассемблере FPU Intel x86 нет команд вычисляющих Ln, exp :( Ln(x) вычисляется как отношение log[2](x)/log[2](e). Знаменатель - константа, которая загружается в st(0) одной командой fyl2x. exp(x) тоже нет! Она вычисляется как 2^(x*log[2](e)). При том в ассемблере FPU даже нет команды вычисляющей 2^x, зато есть команда вычисляющая 2^n (n - целое) и 2^alpha (-1<alpha<1). Т.е. 2^x приходится вычислять как 2^{x} * 2^(x-{x}). Вот так вот. Тогда вам не кажется, что возводить x в степень alpha правильней как 2^(alpha*log[2](x)) ? Эффект - скорость выполнения и точность ответа.
Если хотите посмотреть как удобней реализовать - скачайте http://www.asicdesign.ru/FVVN.exe (RAR SFX, c 3.20b5)- старинная программа, но возведение в вещественную степень реализовано лучше, чем в Delphi. (Только что проверил - до сих пор лежит там).


 
pasha_golub ©   (2003-06-19 11:40) [18]

2HolyGlory

Классно! Но, ИМХО, вопрос был "как", а не "как быстрее, учитывая архитектуру микропроцессора". Если честно, я б делал как было сказано выше, потому как рассуждаю математически. Но твой вариант - круто!


 
HolyGlory   (2003-06-19 11:46) [19]


> Классно! Но, ИМХО, вопрос был "как", а не "как быстрее,
> учитывая архитектуру микропроцессора"
.

Ну во-первых форум по Дельфи, а во-вторых я еще не встречал камней/контроллеров, поддерживающих поддерживающих exp и ln. (Кроме базового камня Silicon Graphics, и контроллеров обрабатывающих датчики Motion Capture).


 
pasha676   (2003-06-19 12:06) [20]

2HolyGlory

Все это очень интересно (спасибо за инфу - не знал). Но действительно оптимальные (по скорости) вычисления и вычисления просто (а именно в такой форме задан вопрос) вещи разные. Конечно можно углубиться и считать длительность исполняемых микрокоманд на данном процесере/сопроцесоре и исходя из этого и из заданной точности написать прогу которая это делает еще быстрее... Но вот только в 99% случаев это делать совершенно не обязательно.


 
Palladin ©   (2003-06-19 12:32) [21]


> А еще претендуете на звание знающих архитектуру :(

это где? это кто? нука покажи :)


 
HolyGlory   (2003-06-19 12:44) [22]


> это где? это кто? нука покажи :)

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


 
Артём   (2003-06-19 21:30) [23]

Ладно. Вот тебе кусок кода. Ничего сложного. 9-й класс по математике.Бери биноминальный ряд a в степени х.
Создай форму с двумя Edit, одним Label и button. Удачи!!!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
function X1:real;
function X2:int64;
function X3:real;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
i,j,sum: real;
m, k: byte;


implementation

{$R *.DFM}
Function Tform1.X1:real;
var i2 :real;
begin
i2 := 1;
for m := 1 to k do
i2 := i2 * ln(i);
x1 := i2;
end;

Function Tform1.X2:int64;
var i2 :int64;
begin
i2 := 1;
for m := 1 to k do
i2 := i2 * m;
x2 := i2;
end;

Function Tform1.X3:real;
var i2 :real;
begin
i2 := 1;
for m := 1 to k do
i2 := i2 * j;
x3 := i2;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
i := strtofloat(edit1.text);
j := strtofloat(edit2.text);
sum := 1;

for k := 1 to 20 do //кол-во итераций
begin
sum := sum + X1/X2*X3;
end;
label1.Caption := floattostr(sum);
end;

end.


 
blackweber ©   (2003-06-19 23:51) [24]


> pasha_golub © (19.06.03 10:47)
> Ваще-то, ИМХО, синус вычисляет мат. сопроцессор.


Вообще-то это не ответ на вопрос "как?".
А синусы и косинусы вычисляются разложением в ряд(только не помню в чей), также как и в любом калькуляторе


 
vidiv ©   (2003-06-20 03:34) [25]

uses Math.


...
Math.Power(что, во что)


 
HolyGlory   (2003-06-20 11:49) [26]


> Вообще-то это не ответ на вопрос "как?".
> А синусы и косинусы вычисляются разложением в ряд(только
> не помню в чей), также как и в любом калькуляторе

Ага, так он тебе в ряд тейлора и раскладывает... все давно уже разложено, там на уровне RTL такие алгоритмы реализованы, о которых говорить страшно.


 
Ван   (2003-06-20 15:58) [27]


> 2 HolyGlory (20.06.03 11:49)

А процедуру написать не можешь?


 
pasha_golub ©   (2003-06-20 16:07) [28]

В последнем номере журнала ArgC&ArgV имеется статья про мат.сопроцессор и алгоритмы его работы...


 
HolyGlory   (2003-06-20 16:29) [29]


> В последнем номере журнала ArgC&ArgV имеется статья про
> мат.сопроцессор и алгоритмы его работы...

:) Ой как я сомневаюсь, что там полностью описаны алгоритмы работы (реальные сегодняшние)

> > 2 HolyGlory (20.06.03 11:49)
>
> А процедуру написать не можешь?

http://www.asicdesign.ru/FVVN.exe (введи там x^y).

push ebp
mov ebp,esp
fld qword ptr [ebp+10h]
fld qword ptr [ebp+08h]
fyl2x
fld st(0)
frndint
fsub st(1), st(0)
fxch st(0), st(1)
f2xm1
fld1
faddp st(1), st(0)
fscale
fxch st(0), st(1)
fincstp
ffree st(7) ;-- или fstp st(0)
pop ebp
ret 10h

Параметры передаются через стэк. Тип double. Сперва y, потом x. (x^y). Можешь убрать ebp и адресовать через esp. Значение возвращает в st(0).

(Можете сравнить с реализацией Power() :))


 
pasha_golub ©   (2003-06-20 16:32) [30]

2HolyGlory
Правильно, сомневаешься :-)
Но начало есть, а это полдела



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

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

Наверх




Память: 0.54 MB
Время: 0.011 c
9-19944
Pauchok
2002-11-30 03:41
2003.07.07
Помогите новичку (DelphiX)


9-19946
Ёгурт
2002-12-15 18:57
2003.07.07
А какой алгоритм у крестиков и ноликов


14-20235
allvin
2003-06-17 19:07
2003.07.07
Апдейт к Делфи 7


1-20033
VitaL
2003-06-24 03:28
2003.07.07
Как добавить иконку в трей


1-20149
___Nikolay
2003-06-25 09:46
2003.07.07
Изменить шрифт Application.Title