Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.07.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
3-19973
M126
2003-06-12 17:00
2003.07.07
Как сделать вычисления в edit?


14-20247
Bland
2003-06-19 21:44
2003.07.07
Инстолятор на delphi


14-20246
Rradion
2003-06-19 15:05
2003.07.07
СРОЧНО ( к завтрому ) надо решить задачки по Матем. -> 10$ по WM.


1-20148
Endi
2003-06-24 22:42
2003.07.07
Проблема с символами в Edit


4-20349
BAPBAP
2003-05-07 09:20
2003.07.07
Как скрыть окно приложения?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский