summaryrefslogtreecommitdiff
path: root/metapost/context/base/mpiv/mp-base.mpiv
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2019-01-07 13:28:56 +0100
committerContext Git Mirror Bot <phg@phi-gamma.net>2019-01-07 13:28:56 +0100
commitbcc5f422cb282c78b890ae719ac1a63eaa5e62aa (patch)
tree15ad5b0443d5ddff315eeee7426952930879a507 /metapost/context/base/mpiv/mp-base.mpiv
parentb04dda4c73d0f71e78f1fd4979ef04c7e9a669ed (diff)
downloadcontext-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.mpiv92
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 ;