Avatar billede simon_jacobsen Nybegynder
28. april 2008 - 10:22 Der er 14 kommentarer og
1 løsning

eksponent(power)

hej

hvis man har plus, minus, gange og dividere, hvordan regner man så eksponent med kommatal.
f.eks.
5^4,743
er ved at skrive functionen i assembler, men mit problem er at jeg har kigget på newton's metode, men der er jeg nød til at benytte en generel rod metode(square root, cube root osv..), men for at kunne lave rod med komma tal, kan jeg ikke finde andre metoder end at benytte eksponent med kommatal, så det jeg søger er en eksponent metode der ikke benytter sig af et "rod" metode.

hvordan gør f.eks. C# i deres Math libery ?

Hilsen
Simon
Avatar billede roenving Novice
28. april 2008 - 12:57 #1
Mon ikke der bruges en anden foruddefineret funktion, nemlig logaritmer ?-)

ln(a^b) = b*ln(a) !-)
Avatar billede simon_jacobsen Nybegynder
28. april 2008 - 13:01 #2
ln() findes ikke som foruddefineret funktion i 68k assembler som jeg koder i - desværre
Avatar billede roenving Novice
28. april 2008 - 13:11 #3
Så er jeg bange for at du må finde og definere den !o]
Avatar billede arne_v Ekspert
28. april 2008 - 15:30 #4
Du skal bruge Taylor udvikling.

Jeg kan give dig lidt C kode som viser algoritmen:

double fun_elm_exp(double x)
{
  double oldtmp;
  double tmp = 1;
  double q1 = 1;
  double q2 = 1;
  int i = 0;
  do {
      oldtmp = tmp;
      i++;
      q1 = q1 * x;
      q2 = q2 * i;
      tmp = tmp + q1/q2;
  } while(!num_eq(tmp,oldtmp));
  return tmp;
}

double fun_exp(double x)
{
  if(x==0) return 1;
  if(x<0) {
      return 1/fun_exp(-x);
  }
  if(x>1) {
      double tmp = fun_exp(x/2);
      return tmp*tmp;
  } else {
      return fun_elm_exp(x);
  }
}
Avatar billede simon_jacobsen Nybegynder
28. april 2008 - 17:05 #5
er bange for jeg har formuleret mig forkert, det jeg søger er hvordan man regner
x^n hvor n er et kommatal.
beklager jeg skrev eksponent funktionen.
Avatar billede arne_v Ekspert
28. april 2008 - 17:12 #6
x^n = exp(log(x^n)) = exp(n*log(x))

saa du skal bare ogsaa have en log funktion
Avatar billede arne_v Ekspert
28. april 2008 - 17:12 #7
double fun_elm_log(double x)
{
  double oldtmp;
  double x1 = x - 1;
  double tmp = 0;
  double q = 1;
  int i = 0;
  do {
      oldtmp = tmp;
      i++;
      q = q * x1;
      tmp = tmp + SIGN(i-1)*q/i;
  } while(!num_eq(tmp,oldtmp));
  return tmp;
}

double fun_log(double x)
{
  if(x>1) {
      return LOG_TWO+fun_log(x/2);
  } else {
      return fun_elm_log(x);
  }
}
Avatar billede simon_jacobsen Nybegynder
28. april 2008 - 17:17 #8
mange tak, det er ikke sådan når man ikke kan sine regne regler ...
du har lige reddet dagen :)
smid lige et svar
Avatar billede arne_v Ekspert
28. april 2008 - 17:43 #9
svar
Avatar billede simon_jacobsen Nybegynder
06. maj 2008 - 00:22 #10
hvad står SIGN for ?
jeg antog umiddelbart at det var om tallet var plus eller minus, men kan ikke lige få log til at give det rigtige.
og Log_TWO har jeg udskiftet med log(2) = 0.301029996 ved ikke om det er der jeg går galt i byen.
Avatar billede arne_v Ekspert
06. maj 2008 - 00:45 #11
SIGN(i) skifter +1 -1 +1 -1 +1 -1 ....

jeg bruger følgende implementation:

const double signval[2] = { 1, -1 };
#define SIGN(n) signval[(n)%2]
Avatar billede arne_v Ekspert
06. maj 2008 - 00:46 #12
num_eq tester for om 2 double er "tæt" på hinanden
Avatar billede arne_v Ekspert
06. maj 2008 - 00:47 #13
Og jeg bruger naturlige logaritmer så:

#define LOG_TWO 0.69314718055994530942
Avatar billede simon_jacobsen Nybegynder
06. maj 2008 - 09:46 #14
du har vel ikke nogle kilder til disse algoritmer ? :)
Avatar billede arne_v Ekspert
07. maj 2008 - 02:36 #15
EXP er hel standard Taylor udvikling.

LOG ved jeg ikke hvor jeg har fundet. Den må kunne googles.
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