18. juni 2002 - 14:12Der er
9 kommentarer og 4 løsninger
Matematik
Jeg har et par spørgsmål om matematik i delphi: 1. Jeg ved godt at man kan finde kvadratroden af et tal med: sqrt(25); Men hvordan finder man kubikroden o. s. v. altså 3√125, 4√625?
2. Hvis jeg har en ligning, der hedder "x√12 = 2", hvordan finder jeg med delphis hjælp ud af, hvad x er?
3. Når jeg prøver at udregne sinus, bruger jeg sin(tal), men det virker ikke rigtigt, da den får sin(90) til at blive 0,893996663600558, hvor den jo skulle være 1. Hvad skal jeg gøre for at det virker?
2: Du bruger enten en numerisk metode (eks. Newton-Raphson) eller isolerer x, som x = log(12)/log(2) 3: Du kigger på hjælpen til sinus - den tager sikkert radianer som input, hvilket betyder at du skal have din vinkelangivelse i grader konverteret til radianer, hvilket gøres ved:
1) Som Borrisholt ganske rigtigt siger når du skal finde X-roden af et tal så løfter du de bare til 1/x - hvilket du kan gøre med "Power" funktionen (defineret i Math-uniten).
2) Mere eller mindre direkte fra Poly-Pascal <SNIP> Procedure Evaluate(Var szExpr : String; Var fltValue : Float; Var iErrPos : integer); type stdf = (fabs,fsqrt,fsin,fcos,farctan,fln,fexp); stdflist = array[stdf] of string[6]; const { TODO -oPelle -cDX_NICE : Additional "functions" to the Evaluate procedure } stdfun : stdflist = ('ABS','SQRT','SIN','COS','ARCTAN','LN','EXP'); chErr = '?'; chEofLine = #13; var iPos : integer; ch : char;
Procedure NextChar; begin repeat iPos := iPos + 1; if iPos <= length(szExpr) then ch := szExpr[iPos] else ch := chEofLine; until ch <> ' '; end;
Function Expression : Float; var E : Float; Opr : char;
Function Simexpr : Float; var s : Float; opr : char;
Function Term : Float; var t : Float;
Function Signedfactor : Float;
Function Factor : Float; {Delphi 3.0 gives Internal Error: URW376 (Moved to outer function) type stdf = (fabs,fsqrt,fsin,fcos,farctan,fln,fexp); stdflist = array[stdf] of string[6]; const stdfun : stdflist = ('ABS','SQRT','SIN','COS','ARCTAN','LN','EXP'); } var p,e,sl : integer; found : boolean; f : Float; sf : stdf; begin if ch in ['0'..'9'] then begin p := iPos; repeat NextChar until not(ch in ['0'..'9','.'{DecimalSeparator}]); if ch in ['E','e'] then begin NextChar; if ch in ['+','-'] then NextChar; while ch in ['0'..'9'] do NextChar; end; val(copy(szExpr, p, iPos-p), f, e); if e<>0 then begin iPos := p + e - 1; ch := chErr; end; end else if ch='(' then begin NextChar; f := expression; if ch = ')' then NextChar else ch := chErr; end else if ch='X' then begin NextChar; f := fltValue; end else begin found := false; for sf := fabs to fexp do begin if not found then begin sl := length('stdfun[sf]'); if copy(szExpr, iPos, sl) = 'stdfun[sf]' then begin iPos := iPos + sl - 1; NextChar; f := factor; case sf of fabs : f := abs(f); fsqrt : f := sqrt(f); fsin : f := sin(f); fcos : f := cos(f); farctan : f := arctan(f); fln : f := ln(f); fexp : f := exp(f); end; found := true; end; end; end; if not found then ch := chErr; end; factor := f; end;
begin if ch = '-' then begin NextChar; signedfactor := -factor; end else begin signedfactor := factor; end; end;
begin t := signedfactor; while ch = '^' do begin NextChar; t := exp(ln(t)*signedfactor); end; term := t; end;
begin s := term; while ch in ['*','/'] do begin opr := ch; NextChar; case opr of '*' : s:=s*term; '/' : begin TempFloat := term; S := S / TempFloat; end; end; end; simexpr := s; end;
begin e := simexpr; while ch in ['+','-'] do begin opr := ch; NextChar; case opr of '+' : e := e + simexpr; '-' : e := e - simexpr; end; end; expression := e; end;
begin iPos := 0; nextchar; fltValue := expression; if (ch = chEofLine) then iErrpos := 0 else iErrpos := iPos; end;
Function Calc(szExpression : String) : Float; var fltRes : Float; iErrorPos : Integer; begin Try szExpression := StripCh(szExpression, ' '); szExpression := ReplaceCh(szExpression, ',', '.'); Evaluate(szExpression, fltRes, iErrorPos); Result := fltRes; if iErrorPos <> 0 then fltRes := 0; Except On EZeroDivide do Result := 0; end; end; </SNIP> Bemærk at Calc-routinen kalder nogle procedure som ikke her er medtaget men disse kald kan du godt undvære (de fjerner såmænd bare "ulovlige" tegn fra strengen)
3) Som standard operere Delphi trigonomiske funktioner med Radianer og imme med grader. Du skal derfor omregne dine 90 grader til radianer INDEN du bruger SIN-funktionen
Sinus i Delphi regner med radianer... Det samme gør tangens og cosinus.
Hvis du tilføjer Math til uses er der en funktioner der hedder DegToRad (GraderTilRadianer) og RadToDeg (RadianerTilGrader). Når du så skal tage sinus til 90° så bruger du:
function SinusGrader(Deg: Extended): Extended; begin Result := Sin(DegToRad(Deg)); end;
Når du skal finde kubik-roden af noget skal du bare gøre som Borrisholt så rigtigt siger... Nå du tager roden af noget er det nemlig det samme som at opløfte til det tal i minus første...
Altså kubikroden af 17 = 17^(1/3)...
Der kan du bruge Power-funktionen som også findes i Math.
function MinRod(Base, Rod: Extended): Extended; begin Result := Power(Base, 1/Rod); end;
hermansen> Må du i din MinRod lige skulle sikre dig at det ikke var kaldt med en "Rod" der var 0 (hvilket vil give: "Division By Zero") <SNIP> function MinRod(Base, Rod: Extended): Extended; begin if Rod <> 0.0 then Result := Power(Base, 1/Rod) else Result :0 0.0; end;
Men på den anden side så bliver brugeren oplyst om fejlen... Hvis der skal laves mange beregninger, så ville det dog være lidt irriterende i længden! ;)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.