Повдигане на число на степен
Професионалисти! Как да повдигнем число на степен? не в квадрат, а например в 10.436784
трябва ли да си професионалист, за да го направиш? c:=exp(10.436784*log(номер))
Алгебра и само
Благодаря :) . да, но това подхожда ли на Power?
добре и в помощ на почитането на мързела? или не съдба?
Тук бих се изненадал, ако при вас в различни случаи биха били еднакви стойности.
Нещо не разбирам. Сигурно не сте ме разбрали. Sqr(5)=25 Exp(2*log(5))=25 Как си? изненадан? :)))
Защо логаритъма е десетичен? Трябва да е естествено. Паладинът се изпика, но и вие не можете да го копирате сляпо.
Аз се смея. все още се смея. Млин, не спирай.
// нека някой друг каже, // че програмистите не се нуждаят от математика // // Мислех, че всички тук са завършили гимназия.
правописна грешка :) Признавам си :) но понякога трябва да се замислиш :)
. без думи! заради училищната формула се разрази цял спор! може би можем да обсъдим как да изчислим синуса?
>може ли да обсъдим как да изчислим синуса? Наистина, хайде! Нееее, не пишете := Sin(2*Pi); Например, не знам как Delphi Sin изчислява. едва ли през поредицата Тейлър. наистина как? // интерполация :>
И накрая, IMHO, синусът изчислява мат. копроцесор.
Защо, копроцесорът също изчислява Sin по някакъв алгоритъм - прочетете микропрограмата. Например паралелно изчисляване на Sin и Cos - според алгоритъма на Walder.
О, вие Учители. И също така се преструвате, че сте запознати с архитектурата :( Разбира се, можете да броите и така: x^alpha=exp(alpha*ln(x)). Има само един проблем: в асемблера Intel x86 FPU няма команди, които изчисляват 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 (-12^(alpha*log[2](x))? Повишаването до реална степен е реализирано по-добре, отколкото в Delphi (току-що го проверих - все още е там).
Готино! Но, IMHO, въпросът беше "как", а не "колко по-бързо, като се има предвид архитектурата на микропроцесора". Честно казано, бих постъпил по гореспоменатия начин, защото разсъждавам математически. Но твоята версия е страхотна!
> Готино! Но, IMHO, въпросът беше "как", а не"колко по-бързо, > като се има предвид архитектурата на микропроцесора".Е, първо, форум на Delphi, и второ, все още не съм срещал камъни/контролери, които поддържат тези, които поддържат exp и ln. (С изключение на основата на Silicon Graphics и контролери, обработващи сензори за улавяне на движение).
Всичко това е много интересно (благодаря за информацията - не знаех). Но наистина оптимални (от гледна точка на скорост) изчисления и изчисления са просто (именно в тази форма се задава въпросът) нещата са различни. Разбира се, можете да отидете по-дълбоко и да преброите продължителността на изпълнимите микроинструкции на даден процесор / копроцесор и въз основа на това и от дадената точност да напишете програма, която да го прави още по-бърз. Но само в 99% от случаите абсолютно не е необходимо да правите това.
> И ти се правиш на разбирач от архитектура :(къде е това? Кой е това? Е, покажи ми :)
> къде е? кой е това? Нука, покажи :)Ами няма да соча с пръст. Но вие сте чели съобщения и дори сте се разболявали,когато всякакви ****** започват да орат монтове, да хвърлят неясни фрази за архитектура, тръбопроводи, асемблер, математика и техния супер-ум.
ДОБРЕ. Ето част от кода за вас. Нищо сложно. 9 клас по математика.Въведете биномната редица а на степен х. Създайте формуляр с две редакции, един етикет и бутон. Късмет.
използва Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
тип TForm1 = class(TForm) Edit1: TEdit; Редактиране2: TEdit; Бутон1: TButton; Етикет1: TLabel; procedure Button1Click(Sender: TObject); функция X1:реално; функция X2:int64; функция X3:реално; частен < Частни декларации > публични < Публични декларации > край;
var Формуляр1: TForm1; i,j,sum: реален; m, k: байт;
Функция Tform1.X1:real; var i2 :real; започнете i2 := 1; form m := 1 to k do i2 := i2 * ln(i); x1 := i2; край;
Функция Tform1.X2:int64; променлива i2 :int64; започнете i2 := 1; за m := 1 до k направете i2 := i2 * m; x2 := i2; край;
Функция Tform1.X3:real; var i2 :real; започнете i2 := 1; за m := 1 до k направете i2 := i2 * j; x3 := i2; край;
процедура TForm1.Button1Click(Подател: TObject); започнете i := strtofloat(edit1.text); j := strtofloat(edit2.text); сума := 1;
за k := 1 до 20 направи //брой итерации започни сума := сума + X1/X2*X3; край; label1.Caption := floattostr(sum); край;
Всъщност това не е отговорът на въпроса "как?". А синусите и косинусите се изчисляват чрез разширяване в редица (само не помня чия), точно както във всеки калкулатор
> Всъщност това не е отговорът на въпроса "как?". > А синусите и косинусите се изчисляват чрез разширяване в редица (само > не помня чии), точно както ввсеки калкулаторДа, така че той ви поставя в ред на Тейлър и го излага. всичко отдавна е декомпозирано, там на RTL ниво се изпълняват такива алгоритми, за които е страшно да се говори.
> 2 HolyGlory (20.06.03 11:49)Не можеш ли да напишеш процедура?
(Можете да сравните с изпълнението на Power() :) )
2HolyGlory Точно така, вие се съмнявате :-) Но има начало и това е половината от битката