Jump to content

Manual:Expr parser function syntax/sl

From mediawiki.org

Razširitev MediaWiki ParserFunctions omogoča uporabnikom preprosto matematično izračunavanje.

Funkcija expr razčleni matematične izraze in tudi logične (boolean) izraze s števili in booleani (z nizi ne). Skladnja je:

{{ #expr: izraz }}

Presledki niso nujni. Znotraj števil presledki niso dovoljeni.

Podprti operatorji (približno po vrstnem redu prednosti) so not, *, /, div, mod, +, -, round, =, <>, !=, <=, >=, and in or.

Operatorji

[edit]
Operator Operacija Zgled
none {{#expr: 123456789012345|=}} 1.2345678901234E+14
{{#expr: 0.000001|=}} 1.0E-6
+ Unarni znak + {{#expr: +30 * +7|=}} 210
- Unarni znak - (negacija) {{#expr: -30 * -7|=}} 210
not Unarni NOT, logični NOT {{#expr: not 0 * 7|=}} 7
{{#expr: not 30 +7|=}} 7
* Množenje {{#expr: 30*7|=}} 210
/ Deljenje, enako kot div {{#expr: 30/7|=}} 4.2857142857143
div Deljenje, enako kot /,
ne omogoča deljenja celih števil
{{#expr: 30 div 7|=}} 4.2857142857143 (moralo bi biti 4)
{{#expr: 5 div 2 * 2 + 5 mod 2|=}} 6 (moralo bi biti 5)
mod »Modulo«, ostanek po celoštevilčnem deljenju.

Pozor, div in mod sta drugačna kot pri programskih jezikih. To je bilo popravljeno, vendar še ni v uporabi. Glej bugzilla:6068.
{{#expr: 30 mod 7|=}} 2
{{#expr: -8 mod -3|=}} -2
{{#expr: -8 mod +3|=}} -2
{{#expr: 8 mod 2.7|=}} 0 (moralo bi biti 2.6)
{{#expr: 8 mod 3.2|=}} 2 (moralo bi biti 1.6)
{{#expr: 8.9 mod 3|=}} 2 (moralo bi biti 2.9)
+ Seštevanje {{#expr: 30+7|=}} 37
- Odštevanje {{#expr: 30-7|=}} 23
round Zaokroži število na levi na potenco 1/10, vpisano na desni {{#expr: 30/7 round 3|=}} 4.286
{{#expr: 30/7 round 0|=}} 4
{{ #expr: 3456 round -2}} = 3500
= Enako (numerično in logično) {{#expr: 30 = 7|=}} 0
<> Neenako, enako kot != {{#expr: 30 <> 7|=}} 1
!= Neenako, enako kot <>, logični xor {{#expr: 1 != 0|=}} 1
< Manjše kot {{#expr: 30 < 7|=}} 0
> Večje kot {{#expr: 30 > 7|=}} 1
<= Manjše ali enako {{#expr: 30 <= 7|=}} 0
>= Večje ali enako {{#expr: 30 >= 7|=}} 1
and Logični AND {{#expr: 4<5 and 4 mod 2|=}} 0
or Logični OR {{#expr: 4<5 or 4 mod 2|=}} 1

Booleanovi operatorji obravnavajo 0 kot vrednost false (neresnično), vsa druga števila pa kot true (resnično). Vmesni ali končni rezultat true je enak 1. Zgled: {{#expr: (2 < 3) + 1|=}} 2.

Prednost:

  • {{#expr: 2 - 3 + 4 / 5 * 6|=}} 3.8

(+ in - sta si po prednosti enakovredna, prav tako * in /, ki imata prednost pred prvima dvema).

  • {{#expr: 2 = 5 < 3 + 4|=}} 1

(najprej +, nato =, nato <).

  • {{#expr:1.234 + 1.234 round 1 + 1 }} 2.47

(najprej sešteje, nato zaokroži)

  • {{#expr:3 * 4 mod 10 * 10 }} 20

(mod in množenje sta si po prednosti enakovredna, razčlemba poteka z leve na desno)

Prednosti lahko spremenite z oklepaji: {{#expr: (2 + 3) * 4|=}} 20

Presledki povečajo berljivost, za pravilno delovanje pa niso nujni, razen med not in sosednjim operatorjem and/div/mod/not/or/round, in med števili niso dovoljeni:

  • {{#expr:7mod3}} 1
  • {{#expr:7.5round0}} 8
  • {{#expr:0and1}} 0
  • {{#expr:0or not0}} 1
  • {{#expr:0ornot0}} Expression error: Unrecognized word "ornot".
  • {{#expr:123 456}} Expression error: Unexpected number.
  • {{#expr:not not3}} 1
  • {{#expr:notnot3}} Expression error: Unrecognized word "notnot".
  • {{#expr:---2}} -2
  • {{#expr:-+-2}} 2
  • {{#expr:2*-3}} -6
  • {{#expr:-not-not-not0}} -1
  • {{#expr:2*/3}} Expression error: Unexpected / operator.

Številke kot vnos

[edit]

Vodilne ničle in sledeča decimalna vejica (za celo število), kot tudi sledeči ničle v številki z decimalno vejico, so dovoljeni.

  • {{#expr: +01.20}} 1.2
  • {{#expr: 12.}} 12

Te enakovrednosti veljajo tudi za #ifeq in #switch, opisana spodaj.

Znanstvena notacija in operatorji grupiranja v vnosu za izraze niso sprejeti:

  • {{#expr: 2E-05 }} 2.0E-5.
  • Template:Evdn.
  • {{#expr: 123,456}} Expression error: Unrecognized punctuation character ",".

Z določevalcem R (»raw«) vrnejo {{NUMBEROFARTICLES:R}} = 63632 itd. številke brez separatorjev, kar lahko uporabimo pri izračunavanju.

Števila kot izložek

[edit]

Neceloštevilčni rezultat vsebuje decimalno vejico (ali piko, odvisno od krajevne prilagoditve). Števila z absolutno vrednostjo pod 1E-4 in z absolutno vrednostjo enako ali nad 1E+12 so zapisana z znanstveno notacijo. Dobljena števila tako vključujejo:

  • {{#expr: -1234567890*10|=}} -12345678900
  • {{#expr: +1234567890*100|=}} 123456789000
  • {{#expr: -1234567890*1000|=}} -1234567890000
  • {{#expr: +1234567890*10000|=}} 12345678900000
  • {{#expr: -0.1234567890/100|=}} -0.00123456789
  • {{#expr: +0.1234567890/1000|=}} 0.000123456789
  • {{#expr: -0.1234567890/10000|=}} -1.23456789E-5
  • {{#expr: +0.1234567890/100000|=}} 1.23456789E-6

Ker znanstvena notacija kot vnos ni sprejeta, lahko je lahko uporaba z gnezdenjem v primerih, kjer isto sestavljeno računanje z #expr deluje, neuspešna.

Tako:
{{#expr: 1/10000 *2|=}} 0.0002,
Template:Evdn,
{{#expr: 1/100000 *2|=}} 2.0E-5, vendar
Template:Evdn.
Enake težave se lahko pojavijo pri uporabi dolgih časovnih žigov YYYYMMDDhhmmss:
{{CURRENTTIMESTAMP}} 20241121111211,
Template:Evdn.
Časovni žigi brez sekund imajo 12 števk, kar je ravno zadosti kratko:
{{#expr:20241121111211/100}} 202411211112.11

Za pridobitev izložka velikih celih števil v ne-znanstveni notaciji, primerni za vnos v drug račun, glej Template:Tim-sl. Za števila z vejicami kot separatorji grupiranja glej Template:Tim-sl.

Kadar je rezultat zaokroževanja negativnega števila negativen, je rezultat "-0". Temu se izognete tako, da izraz x zamenjate z 0 + ( x ):

  • {{#expr: ( -0.2 round 0 )|=}} -0
  • {{#expr: 1*(-0.2 round 0)|=}} -0
  • {{#expr: 0+(-0.2 round 0)|=}} 0

Točnost

[edit]

Točnost rezultata #expr je manjša od točnosti, ki se uporablja interno v izračunavanju izraza:

  • {{#expr:(2/3)}} 0.66666666666667
  • {{#expr:(2/3)*1000000-666666}} 0.66666666662786
  • Template:Evdn
  • {{#expr:1234567890.1234567890-1234567890}} 0.12345671653748 (zaključek: uporabljenih je 16 ali 17 števk številke 1234567890.1234567890)
  • {{#expr:1234567890.1234567890}} 1234567890.1235 (rezultat je zaokrožen na vsega 12 števk)
  • Template:Evdn
Strojna natančnost ali najmanjši x, pri katerem je 1+x != 1 blizu 0.5^53 + 0.5^106 ali 1.1102230246251566636831481088739149080825883E-16 (glej zgoraj):
{{#expr:1=1+0.00000000000000011102230246251566636831481088739149080826|=}} 0
{{#expr:1=1+0.00000000000000011102230246251566636831481088739149080825|=}} 1
To je za 64=1+52+11 bitov (52 mantissa, 11 eksponent) normalno. Kot razloženo, to ni povezano z najmanjšim rezultatom izraza, večjim od 1:
{{#expr:1+0.000000000004999889392|=}} 1.000000000005
{{#expr:1+0.000000000004999889391|=}} 1.000000000005 pod okrog 1 + 5E-12.

Razvejevanje glede na izraz

[edit]

Funkcija #ifexpr da enega od dveh določenih rezultatov, kar je odvisno od vrednosti booleanovega izraza s števili in booleani (ne pa nizi). Zgled:

{{#ifexpr: {{CURRENTDOW}} = 0 or {{CURRENTDOW}} = 6 | weekend | Mo-Fr}} yields Pon-Pet, ker je danes Thursday z {{CURRENTDOW}} = 4.

Primerjave

[edit]
  1. Enakovrednost števil in nizov lahko ugotavljate s funkcijo #ifeq:.
  2. Posamezen niz lahko z več drugimi primerjate s funkcijo #switch:, ki vrne ustreznega od več določenih rezultatov.
  • {{#switch:FR|UK=London|FR=Pariz|NL=Amsterdam}} NL=Amsterdam
  • {{#switch:UK|UK|GB=London|FR=Pariz}} FR=Pariz
  • {{#switch:ZZ|UK=London|FR=Paris|nima para}} nima para
  • {{#ifeq:3|3.0|1|0}} 1
  • {{#ifeq:3|03|1|0}} 1
  • {{#ifeq:0.00003456|3.456E-05|1|0}} 1
    Vedite, da (v nasprotju z #expr:) #ifeq: kot vnos sprejema tudi eksponencialno notacijo.
  • {{#ifeq:1234567890123|1234567890120|1|0}} 0
  • {{#ifeq:1234567890123|1.23456789012E+12|1|0}} 0
  • {{#ifeq:1234567890120|1.23456789012E+12|1|0}} 1
  • {{#ifeq:1.234567890120E12|1.23456789012E+12|1|0}} 1
    Numerične primerjave niso odvisne od oblike izložka. Primerjaj:
  • {{#expr:1234567890123}} 1234567890123
  • {{#expr:1234567890120}} 1234567890120

#ifeq: omogoča primerjavo nizov z enačaji:

#switch: rezultat #ifeq: rezultat
-1=dobro|odpovej}} odpovej -1|dobro|odpovej}} dobro
a=b=dobro|odpovej}} odpovej a=b|dobro|odpovej}} dobro
a=b=odpovej|dobro}} dobro a=b|odpovej|dobro}} dobro

Dolžina izraza

[edit]

Iskanje absolutne vrednosti numeričnega izraza x, ne da bi uporabili še eno predlogo, vsaj podvoji dolžino izraza:

  • x*(1-2*(x<0))
  • x*{{#ifexpr:x>0|1|-1}}

(Prvi niz ni le krajši, temveč ima tudi to prednost, da je za substitucije potreben en »subst:« ali {{{subst|}}} manj.)

za dolge izraze ne uporabljajte

  • {{#ifexpr:x>0|x|-x}},

saj potroji dolžino.

Podobno za zaokroževanje ali pretvarjanje ne uporabljajte mod, saj podvoji dolžino izraza.

Kdar je rezultat izraza pod 10, podvoji dolžino izraza tudi vodilna ničla:

  • {{#ifexpr:x<10|0}}x

Ta »eksponencialna« rast izrazov z mnogo ponavljanja je posledica pomanjkanja spremenljivk (v smislu programiranja). Do neke mere lahko funkcionalnost spremenljivk dosežemo s predlogami (podrutinami), vendar pa je njihovo pridobivanje iz podatkovne zbirke lahko počasnejše kot razčlemba celo dolgega izraza.

Kadar je število mogočih rezultatov dolgega izraza majhno, omogoča pretvarjanje po želji , vključno z absolutno vrednostjo in izložkom vodilne ničle ipd., ne da bi se izraz ponovil, switch.

Sporočila o napaki

[edit]
Zgledi za vsa poznana sporočila o napaki #expr: in #ifexpr:
Izraz Sporočilo o napaki
{{#expr:1/0}} Division by zero.
{{#expr:2*}} Expression error: Missing operand for *.
{{#expr:1 2}} Expression error: Unexpected number.
{{#ifexpr:1*/2}} Expression error: Unexpected / operator.
{{#expr: 1 (2)}} Expression error: Unexpected ( operator.
{{#expr: (1 }} Expression error: Unclosed bracket.
{{#expr: 1) }} Expression error: Unexpected closing bracket.
{{#expr:2*123,456}}     Expression error: Unrecognized punctuation character ",".
{{#expr:{{{a}}}}} Expression error: Unrecognized punctuation character "{".
{{#ifexpr:3%2}} Expression error: Unrecognized punctuation character "%".
{{#ifexpr:abc}} Expression error: Unrecognized word "abc".
{{#expr:abc.def}} Expression error: Unrecognized word "abc".
{{ #expr:{{ x|102|1000*}} 18 }} da 1.8E+307
{{ #expr:{{ x|102|1000*}} 179 }} gives 1.79E+308
{{ #expr:{{ x|102|1000*}} 180 }} da INF
{{ #expr:{{ x|33|(1+(}} 1 {{ x|33|))}} }} da 34
{{ #expr:{{ x|34|(1+(}} 1 {{ x|34|))}} }} da Expression error: Stack exhausted.
{{#expr:3.4.5.6}} 3.4   (nenamenska nenavadnost)

Opomba: dani niz, tukaj dele izraza, skopira, kakor je določeno (maksimalno 120-krat), predloga Template:Tim-sl. Ta stran v drugih projektih dejansko razčleni substituiran izložek kot 102 faktorja »1000« krat »180«, da dobimo INF (neskončnost).

Wikibesedilo brez sporočil o napaki funkcij razčlenjevalnika, vendar navadno z napako ob uporabi ali poskusu uporabe:

{{{#expr:2*3}}}   {{{#expr:2*3}}}   (trojni oklepaj, celota se tolmači kot oznaka parametra z imenom parametra "#expr:2*3")
{{#expr:2*3}}} 6} (en zaklepaj preveč; zadnji izmed treh se tolmači kot golo besedilo, tako ostala koda deluje prav)
{{{#expr:2*3}} {6 (en uklepaj preveč; prvi izmed treh se tolmači kot golo besedilo, tako ostala koda deluje prav)
{{#expr:2*3} {{#expr:2*3} (premalo oklepajev, kot golo besedilo se tolmači vsa koda)
Nedodelano, vendar informativno sporočilo »neprepoznana beseda« lahko dosežemo namenoma. Prikazana je le prva prepoznana napaka:
{{ #expr: 2*{{ #ifexpr: 3*4>10|preveliko|3*4 }} }} da
Expression error: Unrecognized word "preveliko".,
{{ #expr: 2*{{ #ifexpr: 3*4>10|preveč veliko|3*4 }} }} da
Expression error: Unrecognized word "preve"..

Glej tudi

[edit]