home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / inputs / latex / contrib / other / fp.lha / fp / fp-exp.sty < prev    next >
Text File  |  1995-04-03  |  17KB  |  501 lines

  1. \NeedsTeXFormat{LaTeX2e}
  2. \ProvidesPackage{fp-exp}[1995/04/03]
  3.  
  4. %version information
  5. \def\FP@expversion{0.7e}
  6. \message{%
  7.   `Fixed Point Exponentiation',%
  8.   \space\space\space\space%
  9.   Version \FP@expversion%
  10.   \space (C) Michael Mehlich%
  11.   \space\space\space\space\space\space\space%
  12.   \space\space\space\space\space\space%
  13. }
  14.  
  15. %resolve dependencies
  16. \RequirePackage{fp-basic}
  17.  
  18. %%%public area (macros which may be used)%%%
  19.  
  20. %constants
  21. \edef\FPe{2.718281828459045235}
  22. %unary functions
  23. \def\FPexp#1#2{\FP@calld\FP@exp#1{#2}}
  24. \def\FPln#1#2{\FP@calld\FP@ln#1{#2}}
  25. %binary functions
  26. \def\FPpow#1#2#3{\FP@pow#1{#2}{#3}}
  27. \def\FProot#1#2#3{\FP@root#1{#2}{#3}}
  28.  
  29. %%%private fp-area (don't use these macros)%%%
  30.  
  31. %allocation of registers
  32.  
  33. \countdef\FP@ls=50
  34. \countdef\FP@lfa=51
  35. \countdef\FP@lfb=52
  36.  
  37. \countdef\FP@regd=53
  38. \countdef\FP@rege=54
  39.  
  40. %compute e pow x
  41.  
  42. \expandafter\edef\csname FP@e0\endcsname{1.000000000000000000}
  43. \expandafter\edef\csname FP@e1\endcsname{2.718281828459045235}
  44. \expandafter\edef\csname FP@e2\endcsname{7.389056098930650227}
  45. \expandafter\edef\csname FP@e3\endcsname{20.085536923187667741}
  46. \expandafter\edef\csname FP@e4\endcsname{54.598150033144239078}
  47. \expandafter\edef\csname FP@e5\endcsname{148.413159102576603421}
  48. \expandafter\edef\csname FP@e6\endcsname{403.428793492735122608}
  49. \expandafter\edef\csname FP@e7\endcsname{1096.633158428458599264}
  50. \expandafter\edef\csname FP@e8\endcsname{2980.957987041728274744}
  51. \expandafter\edef\csname FP@e9\endcsname{8103.083927575384007710}
  52. \expandafter\edef\csname FP@e10\endcsname{22026.465794806716516958}
  53. \expandafter\edef\csname FP@e11\endcsname{59874.141715197818455326}
  54. \expandafter\edef\csname FP@e12\endcsname{162754.791419003920808005}
  55. \expandafter\edef\csname FP@e13\endcsname{442413.392008920503326103}
  56. \expandafter\edef\csname FP@e14\endcsname{1202604.284164776777749237}
  57. \expandafter\edef\csname FP@e15\endcsname{3269017.372472110639301855}
  58. \expandafter\edef\csname FP@e16\endcsname{8886110.520507872636763024}
  59. \expandafter\edef\csname FP@e17\endcsname{24154952.753575298214775435}
  60. \expandafter\edef\csname FP@e18\endcsname{65659969.137330511138786503}
  61. \expandafter\edef\csname FP@e19\endcsname{178482300.963187260844910034}
  62. \expandafter\edef\csname FP@e20\endcsname{485165195.409790277969106831}
  63. \expandafter\edef\csname FP@e21\endcsname{1318815734.483214697209998884}
  64. \expandafter\edef\csname FP@e22\endcsname{3584912846.131591561681159946}
  65. \expandafter\edef\csname FP@e23\endcsname{9744803446.248902600034632685}
  66. \expandafter\edef\csname FP@e24\endcsname{26489122129.843472294139162153}
  67. \expandafter\edef\csname FP@e25\endcsname{72004899337.385872524161351466}
  68. \expandafter\edef\csname FP@e26\endcsname{195729609428.838764269776397876}
  69. \expandafter\edef\csname FP@e27\endcsname{532048240601.798616683747304341}
  70. \expandafter\edef\csname FP@e28\endcsname{1446257064291.475173677047422997}
  71. \expandafter\edef\csname FP@e29\endcsname{3931334297144.042074388620580844}
  72. \expandafter\edef\csname FP@e30\endcsname{10686474581524.462146990468650741}
  73. \expandafter\edef\csname FP@e31\endcsname{29048849665247.425231085682111680}
  74. \expandafter\edef\csname FP@e32\endcsname{78962960182680.695160978022635108}
  75. \expandafter\edef\csname FP@e33\endcsname{214643579785916.064624297761531261}
  76. \expandafter\edef\csname FP@e34\endcsname{583461742527454.881402902734610391}
  77. \expandafter\edef\csname FP@e35\endcsname{1586013452313430.728129644625774660}
  78. \expandafter\edef\csname FP@e36\endcsname{4311231547115195.227113422292856925}
  79. \expandafter\edef\csname FP@e37\endcsname{11719142372802611.308772939791190195}
  80. \expandafter\edef\csname FP@e38\endcsname{31855931757113756.220328671701298646}
  81. \expandafter\edef\csname FP@e39\endcsname{86593400423993746.953606932719264934}
  82. \expandafter\edef\csname FP@e40\endcsname{235385266837019985.407899910749034805}
  83. \expandafter\edef\csname FP@e41\endcsname{639843493530054949.222663403515570819}
  84.  
  85. \expandafter\edef\csname FP@e-0\endcsname{1.000000000000000000}
  86. \expandafter\edef\csname FP@e-1\endcsname{0.367879441171442322}
  87. \expandafter\edef\csname FP@e-2\endcsname{0.135335283236612692}
  88. \expandafter\edef\csname FP@e-3\endcsname{0.049787068367863943}
  89. \expandafter\edef\csname FP@e-4\endcsname{0.018315638888734180}
  90. \expandafter\edef\csname FP@e-5\endcsname{0.006737946999085467}
  91. \expandafter\edef\csname FP@e-6\endcsname{0.002478752176666358}
  92. \expandafter\edef\csname FP@e-7\endcsname{0.000911881965554516}
  93. \expandafter\edef\csname FP@e-8\endcsname{0.000335462627902512}
  94. \expandafter\edef\csname FP@e-9\endcsname{0.000123409804086680}
  95. \expandafter\edef\csname FP@e-10\endcsname{0.000045399929762485}
  96. \expandafter\edef\csname FP@e-11\endcsname{0.000016701700790246}
  97. \expandafter\edef\csname FP@e-12\endcsname{0.000006144212353328}
  98. \expandafter\edef\csname FP@e-13\endcsname{0.000002260329406981}
  99. \expandafter\edef\csname FP@e-14\endcsname{0.000000831528719104}
  100. \expandafter\edef\csname FP@e-15\endcsname{0.000000305902320502}
  101. \expandafter\edef\csname FP@e-16\endcsname{0.000000112535174719}
  102. \expandafter\edef\csname FP@e-17\endcsname{0.000000041399377188}
  103. \expandafter\edef\csname FP@e-18\endcsname{0.000000015229979745}
  104. \expandafter\edef\csname FP@e-19\endcsname{0.000000005602796438}
  105. \expandafter\edef\csname FP@e-20\endcsname{0.000000002061153622}
  106. \expandafter\edef\csname FP@e-21\endcsname{0.000000000758256043}
  107. \expandafter\edef\csname FP@e-22\endcsname{0.000000000278946809}
  108. \expandafter\edef\csname FP@e-23\endcsname{0.000000000102618796}
  109. \expandafter\edef\csname FP@e-24\endcsname{0.000000000037751345}
  110. \expandafter\edef\csname FP@e-25\endcsname{0.000000000013887944}
  111. \expandafter\edef\csname FP@e-26\endcsname{0.000000000005109089}
  112. \expandafter\edef\csname FP@e-27\endcsname{0.000000000001879529}
  113. \expandafter\edef\csname FP@e-28\endcsname{0.000000000000691440}
  114. \expandafter\edef\csname FP@e-29\endcsname{0.000000000000254367}
  115. \expandafter\edef\csname FP@e-30\endcsname{0.000000000000093576}
  116. \expandafter\edef\csname FP@e-31\endcsname{0.000000000000034425}
  117. \expandafter\edef\csname FP@e-32\endcsname{0.000000000000012664}
  118. \expandafter\edef\csname FP@e-33\endcsname{0.000000000000004659}
  119. \expandafter\edef\csname FP@e-34\endcsname{0.000000000000001714}
  120. \expandafter\edef\csname FP@e-35\endcsname{0.000000000000000631}
  121. \expandafter\edef\csname FP@e-36\endcsname{0.000000000000000232}
  122. \expandafter\edef\csname FP@e-37\endcsname{0.000000000000000085}
  123. \expandafter\edef\csname FP@e-38\endcsname{0.000000000000000031}
  124. \expandafter\edef\csname FP@e-39\endcsname{0.000000000000000012}
  125. \expandafter\edef\csname FP@e-40\endcsname{0.000000000000000004}
  126. \expandafter\edef\csname FP@e-41\endcsname{0.000000000000000002}
  127. \expandafter\edef\csname FP@e-42\endcsname{0.000000000000000001}
  128.  
  129. \def\FP@exp@mul#1#2#3#4#5#6{%
  130.   % #1 macro which gets fractional part 1
  131.   % #2 macro which fractional part 1
  132.   % #3 first value part 1
  133.   % #4 first value part 2
  134.   % #5 second value part 1
  135.   % #6 second value part 2
  136.   \FP@split\FP@xq\FP@xr\FP@xz{#3}\FP@split\FP@xt\FP@xu\FP@xv{#4}%
  137.   \FP@split\FP@yq\FP@yr\FP@yz{#5}\FP@split\FP@yt\FP@yu\FP@yv{#6}%
  138.   \FP@prod=0\relax%
  139.   \edef\FP@rd{}%
  140.   \FP@@mul vv             \relax\FP@saveshift%
  141.   \FP@@mul vu uv         \relax\FP@saveshift%
  142.   \FP@@mul uu vt tv         \relax\FP@saveshift%
  143.   \FP@@mul ut tu vz zv         \relax\FP@saveshift%
  144.   \FP@@mul tt uz zu vr rv     \relax\FP@saveshift%
  145.   \FP@@mul zt tz ur ru qv vq     \relax\FP@saveshift%
  146.   \FP@@mul zz rt tr qu uq     \relax\FP@saveshift%
  147.   \FP@@mul rz zr qt tq         \relax\FP@saveshift%
  148.   \FP@@mul rr qz zq         \relax\FP@saveshift%
  149.   \FP@@mul qr rq         \relax\FP@saveshift%
  150.   \FP@@mul qq             \relax\FP@saveshift\FP@saveshift%
  151.   \FP@ninesplit\FP@rd#1=\FP@res%
  152.   \FP@ninesplit\FP@rd#2=\FP@res%
  153. }
  154.  
  155. \def\FP@exp@divn#1#2#3#4#5{%
  156.   % #1 macro which gets fractional part 1
  157.   % #2 macro which fractional part 1
  158.   % #3 value part 1
  159.   % #4 value part 2
  160.   % #5 integer (0,..,1000)
  161.   \FP@rega=#3\divide\FP@rega#5%
  162.   \FP@regd=\FP@rega%
  163.   \multiply\FP@rega#5\relax%
  164.   \advance\FP@rega-#3\relax%
  165.   \multiply\FP@rega-1000\relax%
  166.   \FP@regb=#4\divide\FP@regb1000000\relax%
  167.   \advance\FP@rega\FP@regb%
  168.   \FP@regc=\FP@rega\divide\FP@regc#5\relax%
  169.   \FP@rege=\FP@regc\multiply\FP@rege1000000\relax%
  170.   \multiply\FP@regc#5\advance\FP@rega-\FP@regc\multiply\FP@rega1000000\relax%
  171.   \multiply\FP@regb1000000\relax\advance\FP@regb-#4\relax%
  172.   \advance\FP@rega-\FP@regb%
  173.   \divide\FP@rega#5\relax%
  174.   \advance\FP@rege\FP@rega%
  175.   #1=\FP@regd%
  176.   #2=\FP@rege%
  177. }
  178.  
  179. %exp (for values between -1 and 1)
  180. \def\FP@@exp#1#2#3#4{%
  181.   % #1 macro which gets the result
  182.   % #2 sign
  183.   % #3 fractional part 1
  184.   % #4 fractional part 2
  185.   \ifnum\ifnum#3=0 0\else1\fi\ifnum#4=0 0\else1\fi=0\relax%
  186.     \edef#1{1}%
  187.   \else%
  188.     \FP@rs=1\relax%
  189.     \FP@ria=0\relax%
  190.     \ifnum#2>0\relax%
  191.       \FP@rib=1\relax%
  192.       \FP@rfa=#3\relax%
  193.       \FP@rfb=#4\relax%
  194.     \else%
  195.       \FP@rib=0\relax%
  196.       \ifnum#4=0\relax%
  197.         \FP@rfa=1000000000\relax\FP@rfb=0\relax%
  198.       \else%
  199.         \FP@rfa=999999999\relax\FP@rfb=1000000000\relax%
  200.       \fi%
  201.       \advance\FP@rfa-#3\relax%
  202.       \advance\FP@rfb-#4\relax%
  203.     \fi%
  204.     \FP@ls=#2\relax%
  205.     \FP@lfa=#3\relax%
  206.     \FP@lfb=#4\relax%
  207.     \FP@count=1\relax%
  208.     \loop%
  209.       \advance\FP@count1\relax%
  210.       \multiply\FP@ls#2\relax%
  211.       \FP@exp@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb#3#4\relax%
  212.       \FP@exp@divn\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@count%
  213.       \ifnum\ifnum\FP@lfa=0 0\else1\fi\ifnum\FP@lfb=0 0\else1\fi>0\relax%
  214.         \ifnum\FP@ls>0\relax%
  215.           \advance\FP@rfa\FP@lfa%
  216.       \advance\FP@rfb\FP@lfb%
  217.       \ifnum\FP@rfb<1000000000\relax\else%
  218.         \advance\FP@rfa1\relax%
  219.         \advance\FP@rfb-1000000000\relax%
  220.       \fi%
  221.       \ifnum\FP@rfa<1000000000\relax\else%
  222.         \advance\FP@rib1\relax%
  223.         \advance\FP@rfa-1000000000\relax%
  224.       \fi%
  225.         \else%
  226.           \advance\FP@rfa-\FP@lfa%
  227.       \advance\FP@rfb-\FP@lfb%
  228.       \ifnum\FP@rfb<0\relax%
  229.         \advance\FP@rfa-1\relax%
  230.         \advance\FP@rfb1000000000\relax%
  231.       \fi%
  232.       \ifnum\FP@rfa<0\relax%
  233.         \advance\FP@rib-1\relax%
  234.         \advance\FP@rfa1000000000\relax%
  235.       \fi%
  236.         \fi%
  237.       \repeat%
  238.     \FP@store#1{r}%
  239.   \fi%
  240. }
  241.  
  242. \def\FP@exp#1#2.#3.#4\relax{%
  243.   % #1 macro which gets the result
  244.   % #2 integer part of value
  245.   % #3 fractional part of value
  246.   % #4 dummy to swallow everthing after the 2nd '.'
  247.   %
  248.   \FP@beginmessage{EXP}%
  249.   %
  250.   {\def\FP@beginmessage##1{}%
  251.    \def\FP@endmessage##1{}%
  252.    \FP@readvalue{x}{#2}{#3}%
  253.    \ifnum\FP@xia=0\relax%
  254.       \ifnum\FP@xs<0\relax%
  255.         \ifnum\FP@xib>42\relax%
  256.           \edef\FP@tmp{0}%
  257.         \else%
  258.           \edef\FP@tmp{\csname FP@e-\the\FP@xib\endcsname}%
  259.         \fi%
  260.       \else%
  261.         \ifnum\FP@xib>41\relax%
  262.           \FP@errmessage{Overflow}%
  263.         \else%
  264.           \edef\FP@tmp{\csname FP@e\the\FP@xib\endcsname}%
  265.         \fi%
  266.       \fi%
  267.       \FP@@exp\FP@tmpa\FP@xs\FP@xfa\FP@xfb%
  268.       \FPmul\FP@tmp\FP@tmpa\FP@tmp%
  269.       \global\let\FP@tmp=\FP@tmp%
  270.    \else%
  271.      \FP@errmessage{Overflow}%
  272.    \fi%
  273.   }%
  274.   %
  275.   \FP@endmessage{}%
  276.   %
  277.   \let#1\FP@tmp%
  278. }
  279.  
  280. %compute ln x
  281.  
  282. \expandafter\edef\csname FP@ln2-0\endcsname{0.000000000000000000}
  283. \expandafter\edef\csname FP@ln2-1\endcsname{0.693147180559945309}
  284. \expandafter\edef\csname FP@ln2-2\endcsname{1.386294361119890618}
  285. \expandafter\edef\csname FP@ln2-3\endcsname{2.079441541679835928}
  286.  
  287. \expandafter\edef\csname FP@ln10-0\endcsname{0.000000000000000000}
  288. \expandafter\edef\csname FP@ln10-1\endcsname{2.302585092994045684}
  289. \expandafter\edef\csname FP@ln10-2\endcsname{4.605170185988091368}
  290. \expandafter\edef\csname FP@ln10-3\endcsname{6.907755278982137052}
  291. \expandafter\edef\csname FP@ln10-4\endcsname{9.210340371976182736}
  292. \expandafter\edef\csname FP@ln10-5\endcsname{11.512925464970228420}
  293. \expandafter\edef\csname FP@ln10-6\endcsname{13.815510557964274104}
  294. \expandafter\edef\csname FP@ln10-7\endcsname{16.118095650958319788}
  295. \expandafter\edef\csname FP@ln10-8\endcsname{18.420680743952365472}
  296. \expandafter\edef\csname FP@ln10-9\endcsname{20.723265836946411156}
  297. \expandafter\edef\csname FP@ln10-10\endcsname{23.025850929940456840}
  298. \expandafter\edef\csname FP@ln10-11\endcsname{25.328436022934502524}
  299. \expandafter\edef\csname FP@ln10-12\endcsname{27.631021115928548208}
  300. \expandafter\edef\csname FP@ln10-13\endcsname{29.933606208922593892}
  301. \expandafter\edef\csname FP@ln10-14\endcsname{32.236191301916639576}
  302. \expandafter\edef\csname FP@ln10-15\endcsname{34.538776394910685260}
  303. \expandafter\edef\csname FP@ln10-16\endcsname{36.841361487904730944}
  304. \expandafter\edef\csname FP@ln10-17\endcsname{39.143946580898776628}
  305. \expandafter\edef\csname FP@ln10-18\endcsname{41.446531673892822312}
  306.  
  307. \def\FP@ln@divtwo#1#2#3#4#5#6{%
  308.   % #1 macro which gets integer part
  309.   % #2 macro which gets fractional part 1
  310.   % #3 macro which fractional part 2
  311.   % #4 integer part 1
  312.   % #5 fractional part 1
  313.   % #6 fractional part 2
  314.   #1=#4\relax%
  315.   #2=#5\relax\ifodd#4\advance#21000000000\relax\fi%
  316.   #3=#6\relax\ifodd#5\advance#31000000000\relax\fi%
  317.   \divide#32\relax%
  318.   \divide#22\relax%
  319.   \divide#12\relax%
  320. }
  321.  
  322. %ln for values between (1 and 2)
  323. \def\FP@@ln#1#2#3#4{%
  324.   % #1 macro which gets the result
  325.   % #2 integer part (1 or 2)
  326.   % #3 fractional part 1
  327.   % #4 fractional part 2
  328.   {\FP@xs=1\FP@xia=0\FP@xib=#2\FP@xfa=#3\FP@xfb=#4%
  329.    {\advance\FP@xib-1\relax\FP@store\FP@tmpa{x}\global\let\FP@tmpa\FP@tmpa}%
  330.    {\advance\FP@xib+1\relax\FP@store\FP@tmpb{x}\global\let\FP@tmpb\FP@tmpb}%
  331.    \FPdiv\FP@tmpa\FP@tmpa\FP@tmpb%
  332.    %
  333.    \def\next##1.##2.##3\relax{\FP@readvalue{x}{##1}{##2}}%
  334.    \expandafter\next\FP@tmpa..\relax%
  335.    %
  336.    \FP@lfa=\FP@xfa%
  337.    \FP@lfb=\FP@xfb%
  338.    %
  339.    \FP@rs=1\relax%
  340.    \FP@ria=0\relax%
  341.    \FP@rib=0\relax%
  342.    \FP@rfa=\FP@xfa%
  343.    \FP@rfb=\FP@xfb%
  344.    %
  345.    \FP@count=1\relax%
  346.    \FP@exp@mul\FP@xfa\FP@xfb\FP@xfa\FP@xfb\FP@xfa\FP@xfb%
  347.    %
  348.    \loop%
  349.      \advance\FP@count2\relax%
  350.      \FP@exp@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@xfa\FP@xfb%
  351.      \ifnum\ifnum\FP@lfa=0 0\else1\fi\ifnum\FP@lfb=0 0\else1\fi=0\relax\else%
  352.        \FP@exp@divn\FP@yfa\FP@yfb\FP@lfa\FP@lfb\FP@count%
  353.        \advance\FP@rfb\FP@yfb%
  354.        \advance\FP@rfa\FP@yfa%
  355.        \ifnum\FP@rfb<1000000000\relax\else%
  356.          \advance\FP@rfa1\relax%
  357.      \advance\FP@rfb-1000000000\relax%
  358.        \fi%
  359.        \ifnum\FP@rfa<1000000000\relax\else%
  360.          \advance\FP@rib1\relax%
  361.      \advance\FP@rfa-1000000000\relax%
  362.        \fi%
  363.      \repeat%
  364.    %
  365.    \advance\FP@rfa\FP@rfa%
  366.    \ifnum\FP@rfb<500000000\relax\else%
  367.      \advance\FP@rfa1\relax%
  368.      \advance\FP@rfb-500000000\relax%
  369.    \fi%
  370.    \advance\FP@rfb\FP@rfb%
  371.    %
  372.    \FP@store\FP@tmpa{r}%
  373.    %
  374.    \global\let\FP@tmpa\FP@tmpa%
  375.   }%
  376.   %
  377.   \let#1\FP@tmpa%
  378. }
  379.  
  380. \def\FP@ln#1#2.#3.#4\relax{%
  381.   % #1 macro which gets the result
  382.   % #2 integer part of value
  383.   % #3 fractional part of value
  384.   % #4 dummy to swallow everthing after the 2nd '.'
  385.   %
  386.   \FP@beginmessage{LN}%
  387.   %
  388.   {\def\FP@beginmessage##1{}%
  389.    \def\FP@endmessage##1{}%
  390.    %
  391.    \FP@readvalue{x}{#2}{#3}%
  392.    %
  393.    \ifFP@zero{x}%
  394.      \FP@errmessage{Logarithm of zero}%
  395.    \else\ifnum\FP@xs<0\relax%
  396.      \FP@errmessage{Logarithm of negative value}%
  397.    \else%
  398.      \FP@count=0\relax%
  399.      \loop%
  400.         \ifnum\ifnum\FP@xia>0 1\else0\fi\ifnum\FP@xib>9 1\else0\fi>0\relax%
  401.           \advance\FP@count1\relax%
  402.           \FP@divten{x}%
  403.         \repeat%
  404.      \loop%
  405.        \ifnum\ifnum\FP@xia=0 0\else1\fi\ifnum\FP@xib=0 0\else1\fi=0\relax%
  406.          \advance\FP@count-1\relax%
  407.      \FP@multen{x}%
  408.        \repeat%
  409.      \ifnum\FP@count<0\relax%
  410.        \FP@count=-\FP@count%
  411.        \edef\FP@tmpc{-\csname FP@ln10-\the\FP@count\endcsname}%
  412.      \else%
  413.        \edef\FP@tmpc{\csname FP@ln10-\the\FP@count\endcsname}%
  414.      \fi%
  415.      \FP@count=0\relax%
  416.      \loop%
  417.        \ifnum\FP@xib<2\relax\else%
  418.          \advance\FP@count1\relax%
  419.          \FP@ln@divtwo\FP@xib\FP@xfa\FP@xfb\FP@xib\FP@xfa\FP@xfb%
  420.        \repeat%
  421.      \FPadd\FP@tmpc\FP@tmpc{\csname FP@ln2-\the\FP@count\endcsname}%
  422.      \FP@@ln\FP@tmpb\FP@xib\FP@xfa\FP@xfb%
  423.      \FPadd\FP@tmp\FP@tmpc\FP@tmpb%
  424.    \fi\fi%
  425.    %
  426.    \global\let\FP@tmp\FP@tmp%
  427.   }%
  428.   %
  429.   \FP@endmessage{}%
  430.   %
  431.   \let#1\FP@tmp%
  432. }
  433.  
  434. %compute x pow y
  435.  
  436. \def\FP@pow@zero#1{%
  437.   \FPifzero{#1}%
  438.     \FP@errmessage{0-th pow of 0 not defined}%
  439.   \else
  440.     \edef\FP@tmp{0}%
  441.   \fi%
  442. }
  443.  
  444. \def\FP@pow#1#2#3{
  445.   % #1 macro, which gets the result
  446.   % #2 base
  447.   % #3 exponent
  448.   %
  449.   \FP@beginmessage{POW}%
  450.   %
  451.   {\def\FP@beginmessage##1{}%
  452.    \def\FP@endmessage##1{}%
  453.    %
  454.    \FPifzero{#2}%
  455.      \FP@pow@zero{#3}%
  456.    \else%
  457.      \FPln\FP@tmpd{#2}%
  458.      \FPmul\FP@tmpd\FP@tmpd{#3}%
  459.      \FPexp\FP@tmp\FP@tmpd%
  460.    \fi%
  461.    %
  462.    \global\let\FP@tmp\FP@tmp%
  463.   }%
  464.   %
  465.   \FP@endmessage{}%
  466.   %
  467.   \let#1\FP@tmp%
  468. }
  469.  
  470. %compute y-th root of x
  471.  
  472. \def\FP@root#1#2#3{%
  473.   % #1 macro, which gets the result
  474.   % #2 base
  475.   % #3 which root
  476.   %
  477.   \FP@beginmessage{ROOT}%
  478.   %
  479.   {\def\FP@beginmessage##1{}%
  480.    \def\FP@endmessage##1{}%
  481.    %
  482.    \FPifzero{#3}%
  483.      \FP@errmessage{0-th root not defined}%
  484.    \fi%
  485.    %
  486.    \FPifzero{#2}%
  487.      \edef\FP@tmp{0}%
  488.    \else%
  489.      \FPln\FP@tmpd{#2}%
  490.      \FPdiv\FP@tmpd\FP@tmpd{#3}%
  491.      \FPexp\FP@tmp\FP@tmpd%
  492.    \fi%
  493.    %
  494.    \global\let\FP@tmp\FP@tmp%
  495.   }%
  496.   %
  497.   \FP@endmessage{}%
  498.   %
  499.   \let#1\FP@tmp%
  500. }
  501.