diff options
author | Hans Hagen <pragma@wxs.nl> | 2019-01-07 13:28:56 +0100 |
---|---|---|
committer | Context Git Mirror Bot <phg@phi-gamma.net> | 2019-01-07 13:28:56 +0100 |
commit | bcc5f422cb282c78b890ae719ac1a63eaa5e62aa (patch) | |
tree | 15ad5b0443d5ddff315eeee7426952930879a507 /metapost/context/base/mpiv/mp-base.mpiv | |
parent | b04dda4c73d0f71e78f1fd4979ef04c7e9a669ed (diff) | |
download | context-bcc5f422cb282c78b890ae719ac1a63eaa5e62aa.tar.gz |
2019-01-07 10:16:00
Diffstat (limited to 'metapost/context/base/mpiv/mp-base.mpiv')
-rw-r--r-- | metapost/context/base/mpiv/mp-base.mpiv | 92 |
1 files changed, 51 insertions, 41 deletions
diff --git a/metapost/context/base/mpiv/mp-base.mpiv b/metapost/context/base/mpiv/mp-base.mpiv index 20d747a25..617855473 100644 --- a/metapost/context/base/mpiv/mp-base.mpiv +++ b/metapost/context/base/mpiv/mp-base.mpiv @@ -330,53 +330,18 @@ primarydef w dotprod z = (xpart w * xpart z + ypart w * ypart z) enddef ; -primarydef x**y = - if y = 2 : - x*x - else : - takepower y of x - fi -enddef ; - -def takepower expr y of x = - if x>0 : - mexp(y*mlog x) - elseif (x=0) and (y>0) : - 0 - else : - 1 - if y = floor y : - if y >= 0 : - for n=1 upto y : - *x - endfor - else : - for n=-1 downto y : - /x - endfor - fi - else : - hide(errmessage "Undefined power: " & decimal x & "**" & decimal y) - fi - fi -enddef ; - -% for big number systems: -% % primarydef x**y = -% if y = 1 : -% x -% elseif y = 2 : +% if y = 2 : % x*x -% elseif y = 3 : -% x*x*x % else : % takepower y of x % fi % enddef ; -% -% vardef takepower expr y of x = -% if (x=0) and (y>0) : +% +% def takepower expr y of x = +% if x>0 : +% mexp(y*mlog x) +% elseif (x=0) and (y>0) : % 0 % else : % 1 @@ -396,6 +361,51 @@ enddef ; % fi % enddef ; +% for big number systems: + +primarydef x**y = + if y = 0 : + 1 + elseif x = 0 : + 0 + elseif y < 0 : + 1/(x**-y) + elseif y = 1 : + x + elseif y = 2 : + x*x + elseif y = 3 : + x*x*x + else : + takepower y of x + fi +enddef ; + +def takepower expr y of x = + if y=0 : % isn't x**0 = 1 even if x=0 ? + 1 + elseif x=0 : + 0 + else : + if y = floor y : + 1 + if y >= 0 : + for n=1 upto y : + *x + endfor + else : + for n=-1 downto y : + /x + endfor + fi + elseif x>0 : + mexp(y*mlog x) + else : + -mexp(y*mlog -x) + fi + fi +enddef ; + vardef direction expr t of p = postcontrol t of p - precontrol t of p enddef ; |