Текущий архив: 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.51 MB
Время: 0.006 c