Avatar billede hells Nybegynder
18. juni 2002 - 14:12 Der 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?
Avatar billede hells Nybegynder
18. juni 2002 - 14:14 #1
damn, der blev det tegn fucket op.
altså:
√ = det tegn man bruger ved kvaratrod og kubikrod
Avatar billede borrisholt Novice
18. juni 2002 - 14:17 #2
Kig på torry ....

Kubik roden er det somme som at opløfte i (1/3)

Jens B
Avatar billede hells Nybegynder
18. juni 2002 - 14:22 #3
borrisholt > kan du ikke forklare lidt nærmere gerne med kodeeksempel.
jeg er temmeligt meget newbie i delphi
Avatar billede benson Nybegynder
18. juni 2002 - 14:27 #4
REgner Delphi ikke i radianer ? det mener jeg den gør !

Så 90° er det samme som pi/2.
Avatar billede tipsen Nybegynder
18. juni 2002 - 14:27 #5
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:

radianer = 2*pi*grader/360 = pi*grader/180
Avatar billede benson Nybegynder
18. juni 2002 - 14:29 #6
2. x=log(2)/log(8730) eller x=ln(2)/ln(8730)
Avatar billede pellelil Nybegynder
18. juni 2002 - 14:30 #7
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
Avatar billede hermandsen Juniormester
18. juni 2002 - 14:38 #8
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;

Håber det var nok...

//hermandsen
Avatar billede pellelil Nybegynder
18. juni 2002 - 14:47 #9
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;

</SNIP>
Avatar billede hermandsen Juniormester
18. juni 2002 - 14:54 #10
>>pellelil
Arh... Selvfølgelig! Sorry... ;)
Avatar billede pellelil Nybegynder
18. juni 2002 - 15:02 #11
Den er "pisse træls" (altså en DBZ), så det er nok derfor jeg er opmærksom på dem  ;-)
Avatar billede hermandsen Juniormester
18. juni 2002 - 15:04 #12
Hehe... Yep! ;)

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! ;)
Avatar billede hells Nybegynder
18. juni 2002 - 15:34 #13
Mange tak for de gode svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester