/ Forside / Karriere / Uddannelse / Højere uddannelser / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Højere uddannelser
#NavnPoint
Nordsted1 1588
erling_l 1224
ans 1150
dova 895
gert_h 800
molokyle 661
berpox 610
creamygirl 610
3773 570
10  jomfruane 570
Matematisk syntax?
Fra : Ulrik Jensen


Dato : 16-11-02 14:07

Hej

Jeg er lige i øjeblikket ved at lave en matematisk evaluator, og sidder
med et problem med hensyn til den matematiske syntax. Jeg har lavet den
så den følger standard-prioriteterne, men nu er mit problem dog lidt mere
grovkornet, for de matematik-programmer jeg har testet med er ikke helt
enige med mig i hvad udtrykket "2^3^4" skal give.. Wolframs Mathematica
evaluerer det nemlig som "2^(3^4)", og får så "2417851639229258349412352",
hvorimod mit program evaluerer det som "(2^3)^4", og derfor får "4096"...

Men hvad er rigtigt?

Lige nu arbejder jeg ud fra en model der hedder at operatorer har
følgende prioriteter, plus og minus 3, gange og division 2 og
potensopløftning 1. Det jeg så gør er at jeg deler et udtryk op i en
liste af udtryk, separeret af den vigtigste operator der står udenfor
paranteser i udtrykket... så jeg deler "23+34*2+34" ned til "23",
"34*2" og "34"... derefter gør jeg så det samme på "34*2" osv...

Er der nogen generelle fejl i den model? Den gør jo at 2^3^4 f.eks. ikke
bliver evalueret "rigtigt" (ifølge Mathematica selvfølgelig)... Men er
det et særtilfælde, eller bør jeg lave det helt om?

På forhånd tak.

--
Ulrik Jensen
ulrik@qcom.dk - http://www.minefilm.tk
"It's only a movie, and, after all, we're all grossly overpaid."

 
 
Lasse Reichstein Nie~ (16-11-2002)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 16-11-02 14:26

Ulrik Jensen <ulrik@qcom.dk> writes:

....

> er ikke helt enige med mig i hvad udtrykket "2^3^4" skal give..
> Wolframs Mathematica evaluerer det nemlig som "2^(3^4)", og får så
> "2417851639229258349412352", hvorimod mit program evaluerer det som
> "(2^3)^4", og derfor får "4096"...

> Men hvad er rigtigt?

Jeg ville stole på Wolframs version. Jeg ved ikke om det er en fast
regel, men i matematik ser jeg det kun blive udregnet som Wolfram
gør det.

> Lige nu arbejder jeg ud fra en model der hedder at operatorer har
> følgende prioriteter, plus og minus 3, gange og division 2 og
> potensopløftning 1. Det jeg så gør er at jeg deler et udtryk op i en
> liste af udtryk, separeret af den vigtigste operator der står udenfor
> paranteser i udtrykket... så jeg deler "23+34*2+34" ned til "23",
> "34*2" og "34"... derefter gør jeg så det samme på "34*2" osv...
>
> Er der nogen generelle fejl i den model?

Nej, den er fin. Ikke den mest økonomiske måde at gøre det på, men
hvis man ikke vil til at fedte med parsergeneratorer, så lyder den
til at virke.

> Den gør jo at 2^3^4 f.eks. ikke
> bliver evalueret "rigtigt" (ifølge Mathematica selvfølgelig)... Men er
> det et særtilfælde, eller bør jeg lave det helt om?

Det har faktisk ikke noget at gøre med din måde at dele op på. Problemet
er hvordan du sætter det sammen igen bagefter.

Tag 2+3+4. Det deler du op som 2, 3 og 4, og du husker at der står
plus imellem (og ikke fx minus, som har samme prioritet). Så lægger
du dem sammen fra venstre mod højre: først 2+3=5 og så 5+4=9.

Det virker for plus, minus, gange og division, men det fejler for
potensopløftning. Forskellen mellem fx minus og potensopløftning er at
2-3-4 læses som (2-3)-4, og minus siges at være "venstre-associativ",
mens 2^3^4 læses af fx Mathematica (og de fleste andre) som 2^(3^4).
Der skal du altså starte fra højre, og potensoperatoren kaldes derfor
"højre-associativ". I begge tilfælde giver det det forkerte svar at
regne i den forkerte rækkefølge.

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
'Faith without judgement merely degrades the spirit divine.'

LR (16-11-2002)
Kommentar
Fra : LR


Dato : 16-11-02 14:33

Jeg tror, at 2^3^4 = 4096 er det mest udbredte (left-to-right order). Jeg
gætter på, at Mathematica gør det anderledes for at minde mere om den
håndskrevne potensopløftning med superscript.

Heldigvis er matematik i datalogi (i hvert fald den mere praktiske del med
compilere, mv.) et stort rod uden standarder, så du kan næsten bare gøre som
du vil

Din strategi med opdeling af regneudtrykket er rigtig nok. Det svarer til at
opbygge et træ, hvor hvert blad er et tal og hvert forgreningspunkt er en
regneoperation.

Mvh,

Lasse



"Ulrik Jensen" <ulrik@qcom.dk> wrote in message
news:uk7jdirxt.fsf@qcom.dk...
> Hej
>
> Jeg er lige i øjeblikket ved at lave en matematisk evaluator, og sidder
> med et problem med hensyn til den matematiske syntax. Jeg har lavet den
> så den følger standard-prioriteterne, men nu er mit problem dog lidt mere
> grovkornet, for de matematik-programmer jeg har testet med er ikke helt
> enige med mig i hvad udtrykket "2^3^4" skal give.. Wolframs Mathematica
> evaluerer det nemlig som "2^(3^4)", og får så "2417851639229258349412352",
> hvorimod mit program evaluerer det som "(2^3)^4", og derfor får "4096"...
>
> Men hvad er rigtigt?
>
> Lige nu arbejder jeg ud fra en model der hedder at operatorer har
> følgende prioriteter, plus og minus 3, gange og division 2 og
> potensopløftning 1. Det jeg så gør er at jeg deler et udtryk op i en
> liste af udtryk, separeret af den vigtigste operator der står udenfor
> paranteser i udtrykket... så jeg deler "23+34*2+34" ned til "23",
> "34*2" og "34"... derefter gør jeg så det samme på "34*2" osv...
>
> Er der nogen generelle fejl i den model? Den gør jo at 2^3^4 f.eks. ikke
> bliver evalueret "rigtigt" (ifølge Mathematica selvfølgelig)... Men er
> det et særtilfælde, eller bør jeg lave det helt om?
>
> På forhånd tak.
>
> --
> Ulrik Jensen
> ulrik@qcom.dk - http://www.minefilm.tk
> "It's only a movie, and, after all, we're all grossly overpaid."



Klaus Alexander Seis~ (16-11-2002)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 16-11-02 15:23

LR skrev:

> Jeg tror, at 2^3^4 = 4096 er det mest udbredte

Python er enig med Mathematica:

#v+

>>> 2**3**4
2417851639229258349412352L
>>>

#v-


// Klaus

--
><>    vandag, môre, altyd saam

Claus Rasmussen (16-11-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 16-11-02 22:07

Klaus Alexander Seistrup wrote:

> LR skrev:
>
>> Jeg tror, at 2^3^4 = 4096 er det mest udbredte
>
> Python er enig med Mathematica:

bc er enig med både Python og Mathematica:

2^3^4
2417851639229258349412352

-Claus


LR (17-11-2002)
Kommentar
Fra : LR


Dato : 17-11-02 00:20

TI-grafregnerne (i hvert fald 83+) er enige med Visual Basic om at 2^3^4 =
4096.

Lasse




"Claus Rasmussen" <clr@cc-consult.dk> wrote in message
news:ar6c11$k0m$3@sunsite.dk...
> Klaus Alexander Seistrup wrote:
>
> > LR skrev:
> >
> >> Jeg tror, at 2^3^4 = 4096 er det mest udbredte
> >
> > Python er enig med Mathematica:
>
> bc er enig med både Python og Mathematica:
>
> 2^3^4
> 2417851639229258349412352
>
> -Claus
>



Jonas Jalling (17-11-2002)
Kommentar
Fra : Jonas Jalling


Dato : 17-11-02 02:50

"LR" wrote
> TI-grafregnerne (i hvert fald 83+) er enige med Visual Basic om at 2^3^4 =
> 4096.
>
Min TI-89 er ikke enig...
2^3^4 = 2417851639229258349412352



Bertel Lund Hansen (17-11-2002)
Kommentar
Fra : Bertel Lund Hansen


Dato : 17-11-02 09:31

Jonas Jalling skrev:

>Min TI-89 er ikke enig...
>2^3^4 = 2417851639229258349412352

Min er heller ikke. Den skriver endda selv 2^(3^4) på skærmen.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Jesper G. Poulsen (17-11-2002)
Kommentar
Fra : Jesper G. Poulsen


Dato : 17-11-02 13:37

"LR" <lar@tdcadsl.dk> wrote in message news:ar6jv5$6rd$1@sunsite.dk...
> TI-grafregnerne (i hvert fald 83+) er enige med Visual Basic om at 2^3^4 =
> 4096.

Det samme med HP48SX. HP32S kan ikke indtastes på den måde...


--
Med venlig hilsen/best regards
Jesper G. Poulsen



T. Liljeberg (17-11-2002)
Kommentar
Fra : T. Liljeberg


Dato : 17-11-02 04:54

On Sat, 16 Nov 2002 22:06:52 +0100, Claus Rasmussen
<clr@cc-consult.dk> wrote:

>Klaus Alexander Seistrup wrote:
>
>> LR skrev:
>>
>>> Jeg tror, at 2^3^4 = 4096 er det mest udbredte
>>
>> Python er enig med Mathematica:
>
>bc er enig med både Python og Mathematica:
>
>2^3^4
>2417851639229258349412352

Matlab siger:

$ >> 2^3^4
$
$ ans =
$
$ 4096

Det samme gør Excel og MS Visual Basic (ikke at jeg tillægger hvad M$
mener i denne sammenhæng den store betydning).

Tom

--
Faber quisque fortunae suae.
- Appius Claudius

Klaus Alexander Seis~ (17-11-2002)
Kommentar
Fra : Klaus Alexander Seis~


Dato : 17-11-02 13:50

Claus Rasmussen skrev:

>>> Jeg tror, at 2^3^4 = 4096 er det mest udbredte
>>
>> Python er enig med Mathematica:
>
> bc er enig med både Python og Mathematica:
>
> 2^3^4
> 2417851639229258349412352

Calc er enig med både Python og Mathematica:

#v+

> 2^3^4
2417851639229258349412352
>

#v-


// Klaus

¹) <http://www.isthe.com/chongo/tech/comp/calc/>
& <http://packages.debian.org/apcalc>
--
><>    vandag, môre, altyd saam

Henning Makholm (16-11-2002)
Kommentar
Fra : Henning Makholm


Dato : 16-11-02 18:07

Scripsit "LR" <lar@tdcadsl.dk>

> Jeg tror, at 2^3^4 = 4096 er det mest udbredte (left-to-right order).

Det tror jeg ikke. ^ skulle gerne virke i analogi med løftede
eksponenter i trykt og håndskrevet matematik, og der er

c
b
a

altid notation for a^(b^c). Den alternative betydning (a^b)^c kan
nemlig enklere noteres som a^(bc), så medmindre man ligefrem er ved at
forklare potensregneregler har man sjældent brug for at skrive
(a^b)^c. Derfor er det fornuftigt at a^(b^c) - som der af og til *er*
god grund til at skrive - er det der kan noteres uden parenteser.

--
Henning Makholm "... popping pussies into pies
Wouldn't do in my shop
just the thought of it's enough to make you sick
and I'm telling you them pussy cats is quick ..."

Anders J. Munch (16-11-2002)
Kommentar
Fra : Anders J. Munch


Dato : 16-11-02 15:50

"Ulrik Jensen" <ulrik@qcom.dk> skrev i en meddelelse
news:uk7jdirxt.fsf@qcom.dk...
> Hej
>
> Jeg er lige i øjeblikket ved at lave en matematisk evaluator, og sidder
> med et problem med hensyn til den matematiske syntax. Jeg har lavet den
> så den følger standard-prioriteterne, men nu er mit problem dog lidt mere
> grovkornet, for de matematik-programmer jeg har testet med er ikke helt
> enige med mig i hvad udtrykket "2^3^4" skal give.. Wolframs Mathematica
> evaluerer det nemlig som "2^(3^4)", og får så "2417851639229258349412352",
> hvorimod mit program evaluerer det som "(2^3)^4", og derfor får "4096"...
>
> Men hvad er rigtigt?

[XFUT dk.edb.programmering]

Jeg foreslår en fejlmeddelelse. Sådan noget i stil med "Så brug da
parenteser for helvede, det andet der kan de lærde skændes om i
timevis."

I øvrigt har Mathematica "ret": Potensopløftning er normalt
højreassociativ.

Men det hjælper jo ikke brugeren, der skrev "2^10^20" og forventede at
det terminerede i hans levetid.

>
> Lige nu arbejder jeg ud fra en model der hedder at operatorer har
> følgende prioriteter, plus og minus 3, gange og division 2 og
> potensopløftning 1. Det jeg så gør er at jeg deler et udtryk op i en
> liste af udtryk, separeret af den vigtigste operator der står udenfor
> paranteser i udtrykket... så jeg deler "23+34*2+34" ned til "23",
> "34*2" og "34"... derefter gør jeg så det samme på "34*2" osv...
>
> Er der nogen generelle fejl i den model?

Det skal sikkert nok virke, omend en recursive-descent parser nok
havde været nemmere.

- Anders




Ulrik Jensen (16-11-2002)
Kommentar
Fra : Ulrik Jensen


Dato : 16-11-02 16:43

"Anders J. Munch" <andersjm@inbound.dk> writes:

> [XFUT dk.edb.programmering]

Well, lige nu snakker vi jo primært de matematiske regler, så jeg vil
mene det hører til i dk.videnskab....

> Jeg foreslår en fejlmeddelelse. Sådan noget i stil med "Så brug da
> parenteser for helvede, det andet der kan de lærde skændes om i
> timevis."

Det er nu ligemeget, det er mest for at vide hvad der er den /rigtige/
måde at gøre det på.

> Det skal sikkert nok virke, omend en recursive-descent parser nok
> havde været nemmere.

Den er skam rekursiv, men hvis et udtryk har flere led deler den leddene
op og kører rekursivt på hvert af dem....

--
Ulrik Jensen
ulrik@qcom.dk - http://www.minefilm.tk
"It's only a movie, and, after all, we're all grossly overpaid."

Jeppe Stig Nielsen (16-11-2002)
Kommentar
Fra : Jeppe Stig Nielsen


Dato : 16-11-02 16:49

"Anders J. Munch" wrote:
>
> Jeg foreslår en fejlmeddelelse. Sådan noget i stil med "Så brug da
> parenteser for helvede, det andet der kan de lærde skændes om i
> timevis."

Enig.

>
> I øvrigt har Mathematica "ret": Potensopløftning er normalt
> højreassociativ.

Enig.

>
> Men det hjælper jo ikke brugeren, der skrev "2^10^20" og forventede at
> det terminerede i hans levetid.

Jeg prøver lige med bc:

2^10^20
Runtime error (func=(main), adr=13): exponent too large in raise
(2^10)^20
1606938044258990275541962092341162602522202993782792835301376

De terminerede begge i min levetid (regnetiden var forsvindende).

--
Jeppe Stig Nielsen <URL:http://jeppesn.dk/>. «

"Je n'ai pas eu besoin de cette hypothèse (I had no need of that
hypothesis)" --- Laplace (1749-1827)

Ulrik Jensen (16-11-2002)
Kommentar
Fra : Ulrik Jensen


Dato : 16-11-02 16:51

Jeppe Stig Nielsen <mail@jeppesn.dk> writes:

> Jeg prøver lige med bc:
>
> 2^10^20
> Runtime error (func=(main), adr=13): exponent too large in raise
> (2^10)^20
> 1606938044258990275541962092341162602522202993782792835301376
>
> De terminerede begge i min levetid (regnetiden var forsvindende).

Da min evaluator bruger ANSI C math-lib'et, og jeg endnu ikke har sørget
for at den ikke bliver kaldt med værdier den ikke kan klare, er det den
der i dette tilfælde står for fejlmeddelelsen.

Udtrykket: "2^(10^20)" giver:
pow: OVERFLOW error
Resultat: +INF

Se der var da noget jeg ikke vidste :]

--
Ulrik Jensen
ulrik@qcom.dk - http://www.minefilm.tk
"It's only a movie, and, after all, we're all grossly overpaid."

Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408936
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste