home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / inputs / latex / contrib / other / fp.lha / fp / fp-trigo.sty < prev    next >
Text File  |  1995-04-27  |  29KB  |  1,120 lines

  1. \NeedsTeXFormat{LaTeX2e}
  2. \ProvidesPackage{fp-trigo}[1995/04/14]
  3.  
  4. %version information
  5. \def\FP@trigoversion{0.9e}
  6. \message{%
  7.   `Fixed Point Trigonometry',%
  8.   \space\space\space\space\space\space%
  9.   Version \FP@trigoversion%
  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\FPpi{3.141592653589793238}
  22.  
  23. %unary functions
  24. \def\FPsin#1#2{\FP@calld\FP@sin#1{#2}}
  25. \def\FPcos#1#2{\FP@calld\FP@cos#1{#2}}
  26. \def\FPsincos#1#2#3{\FP@calle\FP@sincos#1#2{#3}}
  27. \def\FPtan#1#2{\FP@calld\FP@tan#1{#2}}
  28. \def\FPcot#1#2{\FP@calld\FP@cot#1{#2}}
  29. \def\FPtancot#1#2#3{\FP@calle\FP@tancot#1#2{#3}}
  30. \def\FParcsin#1#2{\FP@calld\FP@arcsin#1{#2}}
  31. \def\FParccos#1#2{\FP@calld\FP@arccos#1{#2}}
  32. \def\FParcsincos#1#2#3{\FP@calle\FP@arcsincos#1#2{#3}}
  33. \def\FParctan#1#2{\FP@calld\FP@arctan#1{#2}}
  34. \def\FParccot#1#2{\FP@calld\FP@arccot#1{#2}}
  35. \def\FParctancot#1#2#3{\FP@calle\FP@arctancot#1#2{#3}}
  36.  
  37. %%%private fp-area (don't use these macros)%%%
  38.  
  39. %allocate registers
  40.  
  41. \countdef\FP@ls=50
  42. \countdef\FP@lfa=51
  43. \countdef\FP@lfb=52
  44.  
  45. \countdef\FP@loops=53
  46. \countdef\FP@oct=54
  47.  
  48. \countdef\FP@@arccos=55
  49. \countdef\FP@oldvala=56
  50. \countdef\FP@oldvalb=57
  51. \countdef\FP@subfpih=58
  52.  
  53. %compute 0<=x<2pi for value 2pi*n + x
  54.  
  55. \def\FP@modtwopi#1#2{%result is the family {x}
  56.   % #1 integer part of value
  57.   % #2 fractional part of value
  58.   \FP@readvalue{x}{#1}{#2}%
  59.   %
  60.   \ifnum\ifnum\FP@xib=0 1\else0\fi\ifnum\FP@xia<6 1\else0\fi<11\relax
  61.       %compute modulo without caring about sign
  62.       \FP@shift=0\relax%
  63.       \FP@ys=1\FP@yia=628318530\FP@yib=717958647\FP@yfa=692528676\FP@yfb=655900577\relax%2*pi
  64.       \loop%
  65.         \ifnum\FP@xia<100000000\relax%
  66.        \FP@multen{x}%
  67.        \advance\FP@shift-1\relax%
  68.     \repeat%
  69.       \FP@loops=18\relax\advance\FP@loops\FP@shift%
  70.       \loop%
  71.         \ifnum\FP@loops=0\else%
  72.        \advance\FP@loops-1\relax%
  73.        \FP@counttimes%divides x by \FP@times*y
  74.        \FP@divten{y}%
  75.     \repeat%
  76.       \loop%
  77.         \ifnum\FP@shift<0%
  78.       \advance\FP@shift1\relax%
  79.       \FP@divten{x}%
  80.     \repeat%
  81.   \fi%
  82.   %correct the result for negative values (modulo is positive)
  83.   \loop%should be computed only once
  84.     \ifnum\FP@xs<0\relax%
  85.       \advance\FP@xfb-179586477\relax\FP@xfb=-\FP@xfb%
  86.       \ifnum\FP@xfb<0\relax%
  87.     \advance\FP@xfb1000000000\relax%
  88.     \advance\FP@xfa1\relax%
  89.       \fi%
  90.       \advance\FP@xfa-283185307\relax\FP@xfa=-\FP@xfa%
  91.       \ifnum\FP@xfa<0\relax%
  92.     \advance\FP@xfa1000000000\relax%
  93.     \advance\FP@xib1\relax%
  94.       \fi%
  95.       \advance\FP@xib-6\relax\FP@xib=-\FP@xib%
  96.       \ifnum\FP@xib<0%
  97.     \FP@errmessage{Error in calculation: This shouldn't happen!}%
  98.       \else%
  99.     \FP@xs=1\relax%
  100.       \fi%
  101.     \repeat%
  102. }
  103.  
  104. %auxiliary functions
  105.  
  106. \def\FP@trigocmpsval#1#2#3{%
  107.   % #1 macro, which gets the result
  108.   % #2 9 digits integer value
  109.   % #3 9 digits integer value
  110.   \ifnum#2<#3\relax%
  111.     #1=-1\relax%
  112.   \else\ifnum#2>#3\relax%
  113.     #1=1\relax%
  114.   \else%
  115.     #1=0\relax%
  116.   \fi\fi%
  117. }
  118.  
  119. \def\FP@trigocmpval#1#2#3#4#5#6#7{%
  120.   % #1 macro, which gets the result
  121.   % #2 9 digits integer value
  122.   % #3 9 digits integer value
  123.   % #4 9 digits integer value
  124.   % #5 9 digits integer value
  125.   % #6 9 digits integer value
  126.   % #7 9 digits integer value
  127.   %
  128.   \FP@trigocmpsval#1{#2}{#5}%
  129.   \ifnum#1=0\relax\FP@trigocmpsval#1{#3}{#6}\relax\fi%
  130.   \ifnum#1=0\relax\FP@trigocmpsval#1{#4}{#7}\relax\fi%
  131. }
  132.  
  133. \def\FP@trigosub#1#2#3#4#5#6{%
  134.   % #1 resulting fractional part one
  135.   % #2 resulting fractional part two
  136.   % #3 1st value fractional part one
  137.   % #4 1st value fractional part two
  138.   % #5 2nd value fractional part one
  139.   % #6 2nd value fractional part two
  140.   \FP@rfb=#4\relax\advance\FP@rfb-#6\relax%
  141.   \FP@rfa=#3\relax\advance\FP@rfa-#5\relax%
  142.   \ifnum\FP@rfb<0\relax%
  143.     \advance\FP@rfa-1\relax%
  144.     \advance\FP@rfb1000000000\relax%
  145.   \fi%
  146.   \ifnum\FP@rfa<0\relax%
  147.     \advance\FP@rfa1000000000\relax%
  148.   \fi%
  149.   #1=\FP@rfa%
  150.   #2=\FP@rfb%
  151. }
  152.  
  153. %compute octand of value and transform value to one between 0 and pi/4
  154.  
  155. \def\FP@octand#1#2{%resulting values \FP@oct, family {x}
  156.   % #1 integer part of value
  157.   % #2 fractional part of value
  158.   %
  159.   \FP@modtwopi{#1}{#2}%
  160.   %now it is 0<={x}<2pi
  161.   %
  162.   \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{3}{141592653}{589793238}%
  163.   \ifnum\FP@oct>0\relax%
  164.      \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{4}{712388980}{384689858}%
  165.      \ifnum\FP@oct>0\relax%
  166.         \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{5}{497787143}{782138167}%
  167.     \ifnum\FP@oct>0\relax%
  168.        \FP@oct=7\relax%
  169.        \FP@trigosub\FP@xfa\FP@xfb{283185307}{179586477}\FP@xfa\FP@xfb%
  170.     \else%
  171.        \FP@oct=6\relax%
  172.        \FP@trigosub\FP@xfa\FP@xfb\FP@xfa\FP@xfb{712388980}{384689858}%
  173.     \fi%
  174.      \else%
  175.         \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{3}{926990816}{987241548}%
  176.     \ifnum\FP@oct>0\relax%
  177.        \FP@oct=5\relax%
  178.        \FP@trigosub\FP@xfa\FP@xfb{712388980}{384689858}\FP@xfa\FP@xfb%
  179.     \else%
  180.        \FP@oct=4\relax%
  181.        \FP@trigosub\FP@xfa\FP@xfb\FP@xfa\FP@xfb{141592653}{589793238}%
  182.     \fi%
  183.      \fi%
  184.   \else%
  185.      \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{1}{570796326}{794896619}%
  186.      \ifnum\FP@oct>0\relax%
  187.         \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{2}{356194490}{192344929}%
  188.     \ifnum\FP@oct>0\relax%
  189.        \FP@oct=3\relax%
  190.        \FP@trigosub\FP@xfa\FP@xfb{141592653}{589793238}\FP@xfa\FP@xfb%
  191.     \else%
  192.        \FP@oct=2\relax%
  193.        \FP@trigosub\FP@xfa\FP@xfb\FP@xfa\FP@xfb{570796326}{794896619}%
  194.     \fi%
  195.      \else%
  196.         \FP@trigocmpval\FP@oct\FP@xib\FP@xfa\FP@xfb{0}{785398163}{397448310}%
  197.     \ifnum\FP@oct>0\relax%
  198.        \FP@oct=1\relax%
  199.        \FP@trigosub\FP@xfa\FP@xfb{570796326}{794896619}\FP@xfa\FP@xfb%
  200.     \else%
  201.        \FP@oct=0\relax%
  202.     \fi%
  203.      \fi%
  204.   \fi%
  205.   %
  206.   \FP@xib=0\relax%
  207. }
  208.  
  209. %auxiliary functions
  210.  
  211. \def\FP@trigo@mul#1#2#3#4#5#6{%
  212.   % #1 macro which gets fractional part 1
  213.   % #2 macro which fractional part 1
  214.   % #3 first value part 1
  215.   % #4 first value part 2
  216.   % #5 second value part 1
  217.   % #6 second value part 2
  218.   \FP@split\FP@xq\FP@xr\FP@xz{#3}\FP@split\FP@xt\FP@xu\FP@xv{#4}%
  219.   \FP@split\FP@yq\FP@yr\FP@yz{#5}\FP@split\FP@yt\FP@yu\FP@yv{#6}%
  220.   \FP@prod=0\relax%
  221.   \edef\FP@rd{}%
  222.   \FP@@mul vv             \relax\FP@saveshift%
  223.   \FP@@mul vu uv         \relax\FP@saveshift%
  224.   \FP@@mul uu vt tv         \relax\FP@saveshift%
  225.   \FP@@mul ut tu vz zv         \relax\FP@saveshift%
  226.   \FP@@mul tt uz zu vr rv     \relax\FP@saveshift%
  227.   \FP@@mul zt tz ur ru qv vq     \relax\FP@saveshift%
  228.   \FP@@mul zz rt tr qu uq     \relax\FP@saveshift%
  229.   \FP@@mul rz zr qt tq         \relax\FP@saveshift%
  230.   \FP@@mul rr qz zq         \relax\FP@saveshift%
  231.   \FP@@mul qr rq         \relax\FP@saveshift%
  232.   \FP@@mul qq             \relax\FP@saveshift\FP@saveshift%
  233.   \FP@ninesplit\FP@rd#1=\FP@res%
  234.   \FP@ninesplit\FP@rd#2=\FP@res%
  235. }
  236.  
  237. \def\FP@trigo@divn#1#2#3#4#5{%
  238.   % #1 macro which gets fractional part 1
  239.   % #2 macro which gets fractional part 2
  240.   % #3 value part 1
  241.   % #4 value part 2
  242.   % #5 integer (0,..,1000)
  243.   \FP@rega=#3\divide\FP@rega#5%
  244.   \FP@regd=\FP@rega%
  245.   \multiply\FP@rega#5\relax%
  246.   \advance\FP@rega-#3\relax%
  247.   \multiply\FP@rega-1000\relax%
  248.   \FP@regb=#4\divide\FP@regb1000000\relax%
  249.   \advance\FP@rega\FP@regb%
  250.   \FP@regc=\FP@rega\divide\FP@regc#5\relax%
  251.   \FP@rege=\FP@regc\multiply\FP@rege1000000\relax%
  252.   \multiply\FP@regc#5\advance\FP@rega-\FP@regc\multiply\FP@rega1000000\relax%
  253.   \multiply\FP@regb1000000\relax\advance\FP@regb-#4\relax%
  254.   \advance\FP@rega-\FP@regb%
  255.   \divide\FP@rega#5\relax%
  256.   \advance\FP@rege\FP@rega%
  257.   #1=\FP@regd%
  258.   #2=\FP@rege%
  259. }
  260.  
  261. %sine and cosine
  262.  
  263. \def\FP@sincos@loop#1#2{%
  264.   % #1 fractional part 1 of value
  265.   % #2 fractional part 2 of value
  266.   \loop%
  267.      \FP@ls=-\FP@ls%
  268.      \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb{#1}{#2}%
  269.      \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb{#1}{#2}%
  270.      \FP@trigo@divn\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@count%
  271.      \advance\FP@count1\relax%
  272.      \FP@trigo@divn\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@count%
  273.      \advance\FP@count1\relax%
  274.      \ifnum\ifnum\FP@lfa=0 0\else1\fi\ifnum\FP@lfb=0 0\else1\fi>0\relax
  275.         \ifnum\FP@ls>0\relax%
  276.           \advance\FP@rfa\FP@lfa%
  277.       \advance\FP@rfb\FP@lfb%
  278.       \ifnum\FP@rfb<1000000000\relax\else%
  279.         \advance\FP@rfa1\relax%
  280.         \advance\FP@rfb-1000000000\relax%
  281.       \fi%
  282.       \ifnum\FP@rfa<1000000000\relax\else%
  283.         \advance\FP@rib1\relax%
  284.         \advance\FP@rfa-1000000000\relax%
  285.       \fi%
  286.         \else%
  287.           \advance\FP@rfa-\FP@lfa%
  288.       \advance\FP@rfb-\FP@lfb%
  289.       \ifnum\FP@rfb<0\relax%
  290.         \advance\FP@rfa-1\relax%
  291.         \advance\FP@rfb1000000000\relax%
  292.       \fi%
  293.       \ifnum\FP@rfa<0\relax%
  294.         \advance\FP@rib-1\relax%
  295.         \advance\FP@rfa1000000000\relax%
  296.       \fi%
  297.         \fi%
  298.      \repeat%
  299. }
  300.  
  301. %sine for values 0<=v<=pi/4
  302. \def\FP@@sin#1#2{%
  303.   % #1 fractional part 1
  304.   % #2 fractional part 2
  305.   \ifnum\ifnum#1=0 0\else1\fi\ifnum#2=0 0\else1\fi=0\relax%
  306.     \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=0\FP@rfb=0\relax%
  307.   \else%
  308.     \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=#1\FP@rfb=#2\relax%
  309.     \FP@ls=1\FP@lfa=#1\FP@lfb=#2\relax%
  310.     \FP@count=2\relax%
  311.     \FP@sincos@loop{#1}{#2}%
  312.   \fi%
  313. }
  314.      
  315. %cosine for values 0<=v<=pi/4
  316. \def\FP@@cos#1#2{%
  317.   % #1 fractional part 1
  318.   % #2 fractional part 2
  319.   \ifnum\ifnum#1=0 0\else1\fi\ifnum#2=0 0\else1\fi=0\relax%
  320.     \FP@rs=1\FP@ria=0\FP@rib=1\FP@rfa=0\FP@rfb=0\relax%
  321.   \else%
  322.     \FP@ls=-1\FP@lfa=#1\FP@lfb=#2\relax%
  323.     \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@lfa\FP@lfb%
  324.     \FP@trigo@divn\FP@lfa\FP@lfb\FP@lfa\FP@lfb{2}%
  325.     \FP@count=3\relax%
  326.     \FP@rs=1\FP@ria=0\relax%
  327.     \ifnum\FP@lfb=0\relax%
  328.       \ifnum\FP@lfa=0\relax%
  329.         \FP@rib=1\FP@rfa=0\FP@rfb=0\relax%
  330.       \else%
  331.         \FP@rib=0\FP@rfa=1000000000\FP@rfb=0\relax%
  332.       \fi%
  333.     \else%
  334.       \FP@rib=0\FP@rfa=999999999\FP@rfb=1000000000\relax%
  335.     \fi%
  336.     \advance\FP@rfb-\FP@lfb\advance\FP@rfa-\FP@lfa%
  337.     \FP@sincos@loop{#1}{#2}%
  338.   \fi%
  339. }
  340.      
  341. \def\FP@sin#1#2.#3.#4\relax{%
  342.   % #1 macro, which gets the result
  343.   % #2 integer part of value
  344.   % #3 fractional part of value
  345.   % #4 dummy to swallow everything after the 2nd '.'
  346.   %
  347.   \FP@beginmessage{SIN}
  348.   %
  349.   {\FP@octand{#2}{#3}%
  350.    %
  351.    \ifnum\FP@oct<4\relax%
  352.      \ifnum\FP@oct<2\relax%
  353.        \ifnum\FP@oct<1\relax%
  354.          \FP@@sin\FP@xfa\FP@xfb%
  355.        \else%
  356.          \FP@@cos\FP@xfa\FP@xfb%
  357.        \fi%
  358.      \else%
  359.        \ifnum\FP@oct<3\relax%
  360.          \FP@@cos\FP@xfa\FP@xfb%
  361.        \else%
  362.          \FP@@sin\FP@xfa\FP@xfb%
  363.        \fi%
  364.      \fi%
  365.    \else%
  366.      \ifnum\FP@oct<6\relax%
  367.        \ifnum\FP@oct<5\relax%
  368.          \FP@@sin\FP@xfa\FP@xfb%
  369.      \FP@rs=-\FP@rs%
  370.        \else%
  371.          \FP@@cos\FP@xfa\FP@xfb%
  372.      \FP@rs=-\FP@rs%
  373.        \fi%
  374.      \else%
  375.        \ifnum\FP@oct<7\relax%
  376.          \FP@@cos\FP@xfa\FP@xfb%
  377.      \FP@rs=-\FP@rs%
  378.        \else%
  379.          \FP@@sin\FP@xfa\FP@xfb%
  380.      \FP@rs=-\FP@rs%
  381.        \fi%
  382.      \fi%
  383.    \fi%
  384.    %
  385.    \FP@store\FP@tmp{r}%
  386.    \global\let\FP@tmp\FP@tmp%
  387.   }%
  388.   %
  389.   \FP@endmessage{}%
  390.   %
  391.   \let#1\FP@tmp%
  392. }
  393.  
  394. \def\FP@cos#1#2.#3.#4\relax{%
  395.   % #1 macro, which gets the result
  396.   % #2 integer part of value
  397.   % #3 fractional part of value
  398.   % #4 dummy to swallow everything after the 2nd '.'
  399.   %
  400.   \FP@beginmessage{COS}%
  401.   %
  402.   {\FP@octand{#2}{#3}%
  403.    %
  404.    \ifnum\FP@oct<4\relax%
  405.      \ifnum\FP@oct<2\relax%
  406.        \ifnum\FP@oct<1\relax%
  407.          \FP@@cos\FP@xfa\FP@xfb%
  408.        \else%
  409.          \FP@@sin\FP@xfa\FP@xfb%
  410.        \fi%
  411.      \else%
  412.        \ifnum\FP@oct<3\relax%
  413.          \FP@@sin\FP@xfa\FP@xfb%
  414.      \FP@rs=-\FP@rs%
  415.        \else%
  416.          \FP@@cos\FP@xfa\FP@xfb%
  417.      \FP@rs=-\FP@rs%
  418.        \fi%
  419.      \fi%
  420.    \else%
  421.      \ifnum\FP@oct<6\relax%
  422.        \ifnum\FP@oct<5\relax%
  423.          \FP@@cos\FP@xfa\FP@xfb%
  424.      \FP@rs=-\FP@rs%
  425.        \else%
  426.          \FP@@sin\FP@xfa\FP@xfb%
  427.      \FP@rs=-\FP@rs%
  428.        \fi%
  429.      \else%
  430.        \ifnum\FP@oct<7\relax%
  431.          \FP@@sin\FP@xfa\FP@xfb%
  432.        \else%
  433.          \FP@@cos\FP@xfa\FP@xfb%
  434.        \fi%
  435.      \fi%
  436.    \fi%
  437.    %
  438.    \FP@store\FP@tmp{r}%
  439.    \global\let\FP@tmp\FP@tmp%
  440.   }%
  441.   %
  442.   \FP@endmessage{}%
  443.   %
  444.   \let#1\FP@tmp%
  445. }
  446.  
  447. \def\FP@@sincos#1#2{%
  448.   % #1 integer part of value
  449.   % #2 fractional part of value
  450.   %
  451.   \FP@octand{#1}{#2}%
  452.   %
  453.   \ifnum\FP@oct<4\relax%
  454.     \ifnum\FP@oct<2\relax%
  455.       \ifnum\FP@oct<1\relax%
  456.         \FP@@sin\FP@xfa\FP@xfb%
  457.         \FP@store\FP@tmpc{r}%
  458.         \FP@@cos\FP@xfa\FP@xfb%
  459.         \FP@store\FP@tmpb{r}%
  460.       \else%
  461.         \FP@@cos\FP@xfa\FP@xfb%
  462.         \FP@store\FP@tmpc{r}%
  463.         \FP@@sin\FP@xfa\FP@xfb%
  464.         \FP@store\FP@tmpb{r}%
  465.       \fi%
  466.     \else%
  467.       \ifnum\FP@oct<3\relax%
  468.         \FP@@cos\FP@xfa\FP@xfb%
  469.         \FP@store\FP@tmpc{r}%
  470.         \FP@@sin\FP@xfa\FP@xfb%
  471.     \FP@rs=-\FP@rs%
  472.         \FP@store\FP@tmpb{r}%
  473.       \else%
  474.         \FP@@sin\FP@xfa\FP@xfb%
  475.         \FP@store\FP@tmpc{r}%
  476.         \FP@@cos\FP@xfa\FP@xfb%
  477.         \FP@rs=-\FP@rs%
  478.         \FP@store\FP@tmpb{r}%
  479.       \fi%
  480.     \fi%
  481.   \else%
  482.     \ifnum\FP@oct<6\relax%
  483.       \ifnum\FP@oct<5\relax%
  484.         \FP@@sin\FP@xfa\FP@xfb%
  485.         \FP@rs=-\FP@rs%
  486.         \FP@store\FP@tmpc{r}%
  487.         \FP@@cos\FP@xfa\FP@xfb%
  488.     \FP@rs=-\FP@rs%
  489.         \FP@store\FP@tmpb{r}%
  490.       \else%
  491.         \FP@@cos\FP@xfa\FP@xfb%
  492.         \FP@rs=-\FP@rs%
  493.         \FP@store\FP@tmpc{r}%
  494.         \FP@@sin\FP@xfa\FP@xfb%
  495.     \FP@rs=-\FP@rs%
  496.         \FP@store\FP@tmpb{r}%
  497.       \fi%
  498.     \else%
  499.       \ifnum\FP@oct<7\relax%
  500.         \FP@@cos\FP@xfa\FP@xfb%
  501.         \FP@rs=-\FP@rs%
  502.         \FP@store\FP@tmpc{r}%
  503.         \FP@@sin\FP@xfa\FP@xfb%
  504.         \FP@store\FP@tmpb{r}%
  505.       \else%
  506.         \FP@@sin\FP@xfa\FP@xfb%
  507.         \FP@rs=-\FP@rs%
  508.         \FP@store\FP@tmpc{r}%
  509.         \FP@@cos\FP@xfa\FP@xfb%
  510.         \FP@store\FP@tmpb{r}%
  511.       \fi%
  512.     \fi%
  513.   \fi%
  514. }
  515.  
  516. \def\FP@sincos#1#2#3.#4.#5\relax{%
  517.   % #1 macro, which gets the sine result
  518.   % #2 macro, which gets the cosine result
  519.   % #3 integer part of value
  520.   % #4 fractional part of value
  521.   % #5 dummy to swallow everything after the 2nd '.'
  522.   %
  523.   {\FP@beginmessage{SINCOS}%
  524.    %
  525.    \FP@@sincos{#3}{#4}%
  526.    %
  527.    \global\let\FP@tmpc\FP@tmpc%sine
  528.    \global\let\FP@tmpb\FP@tmpb%cosine
  529.    %
  530.    \FP@endmessage{}%
  531.   }%
  532.   %
  533.   \let#1\FP@tmpc%
  534.   \let#2\FP@tmpb%
  535.  }
  536.  
  537. %tan and cot
  538.  
  539. \def\FP@tan#1#2.#3.#4\relax{%
  540.   % #1 macro, which gets the result
  541.   % #2 integer part of value
  542.   % #3 fractional part of value
  543.   % #4 dummy to swallow everything after the 2nd '.'
  544.   %
  545.   \FP@beginmessage{TAN}%
  546.   %
  547.   {\def\FP@beginmessage##1{}%
  548.    \def\FP@endmessage##1{}%
  549.    %
  550.    \FP@@sincos{#2}{#3}%
  551.    %
  552.    \FPdiv\FP@tmp\FP@tmpc\FP@tmpb%
  553.    %
  554.    \global\let\FP@tmp\FP@tmp%
  555.   }%
  556.   %
  557.   \FP@endmessage{}%
  558.   %
  559.   \let#1\FP@tmp%
  560. }
  561.  
  562. \def\FP@cot#1#2.#3.#4\relax{%
  563.   % #1 macro, which gets the result
  564.   % #2 integer part of value
  565.   % #3 fractional part of value
  566.   % #4 dummy to swallow everything after the 2nd '.'
  567.   %
  568.   \FP@beginmessage{COT}%
  569.   %
  570.   {\def\FP@beginmessage##1{}%
  571.    \def\FP@endmessage##1{}%
  572.    %
  573.    \FP@@sincos{#2}{#3}%
  574.    %
  575.    \FPdiv\FP@tmp\FP@tmpb\FP@tmpc%
  576.    %
  577.    \global\let\FP@tmp\FP@tmp%
  578.   }%
  579.   %
  580.   \FP@endmessage{}%
  581.   %
  582.   \let#1\FP@tmp%
  583. }
  584.  
  585. \def\FP@tancot#1#2#3.#4.#5\relax{%
  586.   % #1 macro, which gets the tan result
  587.   % #1 macro, which gets the cot result
  588.   % #3 integer part of value
  589.   % #4 fractional part of value
  590.   % #5 dummy to swallow everything after the 2nd '.'
  591.   %
  592.   \FP@beginmessage{TANCOT}%
  593.   %
  594.   {\def\FP@beginmessage##1{}%
  595.    \def\FP@endmessage##1{}%
  596.    %
  597.    \FP@@sincos{#3}{#4}%
  598.    %
  599.    \FPdiv\FP@tmpd\FP@tmpc\FP@tmpb%
  600.    \FPdiv\FP@tmp\FP@tmpb\FP@tmpc%
  601.    %
  602.    \global\let\FP@tmpd\FP@tmpd%
  603.    \global\let\FP@tmp\FP@tmp%
  604.   }%
  605.   %
  606.   \FP@endmessage{}%
  607.   %
  608.   \let#1\FP@tmpd%
  609.   \let#2\FP@tmp%
  610. }
  611.  
  612. %auxiliary functions
  613.  
  614. % compute x/(x+1) for 0<=x<=1000000
  615. \def\FP@trigo@xy#1#2#3{%
  616.   % #1 macro, which gets fractional part 1
  617.   % #2 macro, which gets fractional part 2
  618.   % #3 natural number
  619.   \FP@rega=#3\relax\FP@regb=\FP@rega\advance\FP@regb1\relax%
  620.   \multiply\FP@rega1000\relax%
  621.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb
  622.   #1=\FP@regc%
  623.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  624.   \multiply\FP@rega1000\relax%
  625.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb%
  626.   \multiply#11000\relax\advance#1\FP@regc%
  627.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  628.   \multiply\FP@rega1000\relax%
  629.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb%
  630.   \multiply#11000\relax\advance#1\FP@regc%
  631.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  632.   \multiply\FP@rega1000\relax%
  633.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb%
  634.   #2=\FP@regc%
  635.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  636.   \multiply\FP@rega1000\relax%
  637.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb%
  638.   \multiply#21000\relax\advance#2\FP@regc%
  639.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  640.   \multiply\FP@rega1000\relax%
  641.   \FP@regc=\FP@rega\divide\FP@regc\FP@regb%
  642.   \multiply#21000\relax\advance#2\FP@regc%
  643.   \multiply\FP@regc\FP@regb\advance\FP@rega-\FP@regc%
  644. }
  645.  
  646. %if x<=0.707106781 then x:=y else x:=y with x^2 + y^2 = 1
  647. %sets \FP@@arccos to 0 if x:=y otherwise to 1
  648. \def\FP@sincos@transform@Rii{%
  649.   \ifnum\FP@xfa>707106781\relax%
  650.     \FP@@arccos=1\relax%
  651.     \FP@trigo@mul\FP@rfa\FP@rfb\FP@xfa\FP@xfb\FP@xfa\FP@xfb%
  652.     \FP@lfa=1000000000\relax%
  653.     \advance\FP@lfa-\FP@rfa%
  654.     \ifnum\FP@rfb>0\relax%
  655.       \advance\FP@lfa-1\relax%
  656.       \FP@lfb=1000000000\relax%
  657.       \advance\FP@lfb-\FP@rfb%
  658.     \else%
  659.       \FP@lfb=0\relax%
  660.     \fi%
  661.     \FP@xia=710000000\FP@xib0\relax%
  662.     \FP@xfa=0\FP@xfb=0\relax%
  663.     \FP@oldvala=0\FP@oldvalb=0\relax%
  664.     \loop%
  665.       \ifnum\ifnum\FP@xia=\FP@xfa0\else1\fi\ifnum\FP@xib=\FP@xfb0\else1\fi>0\relax%
  666.         \FP@rfa\FP@xia\advance\FP@rfa\FP@xfa%
  667.     \FP@rfb\FP@xib\advance\FP@rfb\FP@xfb%
  668.     \divide\FP@rfb2\relax%
  669.     \ifodd\FP@rfa\advance\FP@rfb500000000\relax\fi%
  670.     \divide\FP@rfa2\relax%
  671.     \ifnum\FP@rfb<1000000000\relax\else%
  672.       \advance\FP@rfb-1000000000\relax%
  673.       \advance\FP@rfa1\relax%
  674.     \fi%
  675.     \FP@trigo@mul\FP@ria\FP@rib\FP@rfa\FP@rfb\FP@rfa\FP@rfb%
  676.     \ifnum\FP@ria<\FP@lfa%
  677.       \FP@oct=1\relax%
  678.     \else\ifnum\FP@ria>\FP@lfa%
  679.       \FP@oct=2\relax%
  680.     \else\ifnum\FP@rib<\FP@lfb%
  681.       \FP@oct=1\relax%
  682.     \else\ifnum\FP@rib>\FP@lfb%
  683.       \FP@oct=2\relax%
  684.     \else%
  685.       \FP@oct=3\relax%
  686.     \fi\fi\fi\fi%
  687.     \ifnum\ifnum\FP@ria=\FP@oldvala0\else1\fi\ifnum\FP@rib=\FP@oldvalb0\else1\fi>0\relax%
  688.       \FP@oldvala=\FP@ria\FP@oldvalb=\FP@rib%
  689.     \else%
  690.       \FP@oct=3\relax%
  691.     \fi%
  692.     \ifodd\FP@oct%
  693.       \FP@xfa\FP@rfa\FP@xfb\FP@rfb%
  694.     \fi%
  695.     \ifnum\FP@oct>1\relax%
  696.       \FP@xia\FP@rfa\FP@xib\FP@rfb%
  697.     \fi%
  698.       \repeat%
  699.   \else%
  700.     \FP@@arccos=0\relax%
  701.   \fi%
  702. }
  703.  
  704. %compute arcsin(abs(x)) resp. arccos(abs(x)) for -1<=x<=1
  705. %\FP@@arccos determines whether arcsin or arccos has been computed
  706. \def\FP@arcsincos@loop{%
  707.   \FP@@arccos=0\relax%
  708.   \ifnum\ifnum\FP@xia=0 1\else0\fi\ifnum\FP@xib<2 1\else 0\fi>0\relax%
  709.     \ifnum\FP@xib=1\relax%
  710.       \ifnum\ifnum\FP@xfa=0 1\else0\fi\ifnum\FP@xfb=0 1\else0\fi>10\relax%
  711.         \FP@rs=1\FP@ria=0\FP@rib=1\FP@rfa=570796326\FP@rfb=794896619\relax%
  712.       \else%
  713.         \FP@errmessage{Number too big}%
  714.       \fi%
  715.     \else%
  716.        \ifnum\ifnum\FP@xfa=0 0\else1\fi\ifnum\FP@xfb=0 0\else1\fi=0\relax%
  717.          \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=0\FP@rfb=0\relax%
  718.        \else%
  719.          \FP@sincos@transform@Rii%
  720.          \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=\FP@xfa\FP@rfb=\FP@xfb%
  721.      \FP@ls=1\FP@lfa=\FP@xfa\FP@lfb=\FP@xfb%
  722.      \FP@count=1\relax%
  723.      \loop%
  724.         \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@xfa\FP@xfb%
  725.         \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@xfa\FP@xfb%
  726.         \FP@trigo@xy\FP@yfa\FP@yfb\FP@count%
  727.         \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@yfa\FP@yfb%
  728.         \advance\FP@count2\relax%
  729.         \FP@trigo@divn\FP@yfa\FP@yfb\FP@lfa\FP@lfb\FP@count%
  730.         \ifnum\ifnum\FP@yfa=0 0\else1\fi\ifnum\FP@yfb=0 0\else 1\fi>0\relax%
  731.           \advance\FP@rfa\FP@yfa\advance\FP@rfb\FP@yfb%
  732.           \ifnum\FP@rfb<1000000000\relax\else%
  733.             \advance\FP@rfb-1000000000\relax%
  734.         \advance\FP@rfa1\relax%
  735.           \fi%
  736.           \ifnum\FP@rfa<1000000000\relax\else%
  737.             \advance\FP@rfa-1000000000\relax%
  738.         \advance\FP@rib1\relax%
  739.           \fi%
  740.         \repeat%
  741.        \fi%
  742.     \fi%
  743.   \else%
  744.     \FP@errmessage{Number too big}%
  745.   \fi%
  746. }
  747.  
  748. %compute sign(r)*r:=#1.#2#3-abs(r) (for abs(r)<=#1.#2#3)
  749. \def\FP@subrfrom#1#2#3{%
  750.    % #1 integer part of value to subtract from
  751.    % #2 fractional part 1 of value to subtract from
  752.    % #3 fractional part 2 of value to subtract from
  753.    \FP@ria=#1\relax\advance\FP@ria-\FP@rib\FP@rib\FP@ria%
  754.    \FP@ria=#2\relax\advance\FP@ria-\FP@rfa\FP@rfa\FP@ria%
  755.    \FP@ria=#3\relax\advance\FP@ria-\FP@rfb\FP@rfb\FP@ria%
  756.    \FP@ria=0\relax%
  757.    \ifnum\FP@rfb<0\relax%
  758.      \advance\FP@rfb1000000000\relax%
  759.      \advance\FP@rfa-1\relax%
  760.    \fi%
  761.    \ifnum\FP@rfa<0\relax%
  762.      \advance\FP@rfa1000000000\relax%
  763.      \advance\FP@rib-1\relax%
  764.    \fi%
  765.    \ifnum\FP@rib<0\relax%
  766.      \FP@errmessage{Subtraction lead to unaccepted value}%
  767.    \fi%
  768. }
  769.  
  770. %compute r:= pi/2 - abs(r) (for abs(r)<=pi/2)
  771. \def\FP@pihalf@subr{\FP@subrfrom{1}{570796326}{794896619}}
  772.  
  773. %compute sign(r)*r:= pi-abs(r) (for abs(r)<=pi)
  774. \def\FP@pi@subr{\FP@subrfrom{3}{141592653}{589793238}}
  775.  
  776. %compute arcsin
  777.  
  778. \def\FP@arcsin#1#2.#3.#4\relax{%
  779.   % #1 macro, which gets the result
  780.   % #2 integer part of value
  781.   % #3 fractional part of value
  782.   % #4 dummy to swallow everything after the 2nd '.'
  783.   %
  784.   {\FP@beginmessage{ARCSIN}%
  785.    %
  786.    \FP@readvalue{x}{#2}{#3}%
  787.    %
  788.    \FP@arcsincos@loop%
  789.    %
  790.    \ifnum\FP@@arccos=1\relax%
  791.      \FP@pihalf@subr%
  792.    \fi%
  793.    \FP@rs=\FP@xs%
  794.    %
  795.    \FP@store\FP@tmp{r}%
  796.    %
  797.    \global\let\FP@tmp\FP@tmp%
  798.    %
  799.    \FP@endmessage{}%
  800.   }%
  801.   %
  802.   \let#1\FP@tmp%
  803. }
  804.  
  805. %compute arccos
  806. \def\FP@arccos#1#2.#3.#4\relax{%
  807.   % #1 macro, which gets the result
  808.   % #2 integer part of value
  809.   % #3 fractional part of value
  810.   % #4 dummy to swallow everything after the 2nd '.'
  811.   %
  812.   {\FP@beginmessage{ARCCOS}%
  813.    %
  814.    \FP@readvalue{x}{#2}{#3}%
  815.    %
  816.    \FP@arcsincos@loop%
  817.    %
  818.    \ifnum\FP@@arccos=0\relax%
  819.      \FP@pihalf@subr%
  820.    \fi%
  821.    \FP@rs=1%
  822.    \ifnum\FP@xs<0\relax%
  823.      \FP@pi@subr%
  824.    \fi%
  825.    %
  826.    \FP@store\FP@tmp{r}%
  827.    %
  828.    \global\let\FP@tmp\FP@tmp%
  829.    %
  830.    \FP@endmessage{}%
  831.   }%
  832.   %
  833.   \let#1\FP@tmp%
  834. }
  835.  
  836. %compute arcsin and arccos
  837. \def\FP@arcsincos#1#2#3.#4.#5\relax{%
  838.   % #1 macro, which gets the arcsin-result
  839.   % #2 macro, which gets the arccos-result
  840.   % #3 integer part of value
  841.   % #4 fractional part of value
  842.   % #5 dummy to swallow everything after the 2nd '.'
  843.   %
  844.   {\FP@beginmessage{ARCSINCOS}%
  845.    %
  846.    \FP@readvalue{x}{#3}{#4}%
  847.    %
  848.    \FP@arcsincos@loop%
  849.    %
  850.    \FP@xia\FP@ria\FP@xib\FP@rib\FP@xfa\FP@rfa\FP@xfb\FP@rfb%
  851.    %
  852.    \ifnum\FP@@arccos=1\relax%
  853.      \FP@pihalf@subr%
  854.    \fi%
  855.    \FP@rs=\FP@xs%
  856.    \FP@store\FP@tmpa{r}%
  857.    %
  858.    \FP@ria\FP@xia\FP@rib\FP@xib\FP@rfa\FP@xfa\FP@rfb\FP@xfb%
  859.    %
  860.    \ifnum\FP@@arccos=0\relax%
  861.      \FP@pihalf@subr%
  862.    \fi%
  863.    \FP@rs=1%
  864.    \ifnum\FP@xs<0\relax%
  865.      \FP@pi@subr%
  866.    \fi%
  867.    \FP@store\FP@tmpb{r}%
  868.    %
  869.    \global\let\FP@tmpa\FP@tmpa%
  870.    \global\let\FP@tmpb\FP@tmpb%
  871.    %
  872.    \FP@endmessage{}%
  873.   }%
  874.   %
  875.   \let#1\FP@tmpa%
  876.   \let#2\FP@tmpb%
  877. }
  878.  
  879. %compute arctan and arccot
  880.  
  881. %compute 1/y for y>=1
  882. \def\FP@trigo@inv{%
  883.   \FP@shift=0\relax%
  884.   \FP@xia=1000000000\FP@xib=0\FP@xfa=0\FP@xfb=0\relax%
  885.   \loop%
  886.     \ifnum\FP@yia<100000000\relax%
  887.       \FP@multen{y}%
  888.       \advance\FP@shift1\relax%
  889.     \repeat%
  890.   \FP@ria=0\FP@rib=0\FP@rfa=0\FP@rfb=0\relax%
  891.   \loop%
  892.     \ifFP@zero{y}\else%
  893.       \FP@counttimes%divides x by \FP@times*y
  894.       \FP@divten{y}%
  895.       \FP@multen{r}%
  896.       \advance\FP@rfb\FP@times%
  897.       \ifnum\FP@rfb<1000000000\relax\else%
  898.         \advance\FP@rfa1\advance\FP@rfb-1000000000\relax%
  899.         \ifnum\FP@rfa<1000000000\relax\else%
  900.       \advance\FP@rib1\advance\FP@rfa-1000000000\relax%
  901.           \ifnum\FP@rib<1000000000\relax\else%
  902.         \advance\FP@ria1\advance\FP@rib-1000000000\relax%
  903.           \fi%
  904.     \fi%
  905.       \fi%
  906.     \repeat%
  907.     \loop%
  908.       \ifnum\FP@shift<35\relax%
  909.         \advance\FP@shift1\relax%
  910.         \FP@divten{r}%
  911.       \repeat%
  912. }
  913.  
  914. %compute 1/sqrt(1+x^2) for 0<=x<1
  915. \def\FP@trigo@sq\FP@xfa\FP@xfb{%
  916.   \FP@trigo@mul\FP@yfa\FP@yfb\FP@xfa\FP@xfb\FP@xfa\FP@xfb%
  917.   \ifnum\FP@yfb=0\relax\else%
  918.     \FP@yfb=-\FP@yfb%
  919.     \advance\FP@yfb1000000000\relax%
  920.     \advance\FP@yfa1\relax%
  921.   \fi%
  922.   \FP@yfa=-\FP@yfa%
  923.   \advance\FP@yfa1250000000\relax%
  924.   \FP@trigo@mul\FP@yfa\FP@yfb\FP@yfa\FP@yfb{444444444}{444444444}%
  925.   \FP@lfa=666666666\relax\FP@lfb=666666666\relax%
  926.   \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=\FP@lfa\FP@rfb=\FP@lfb%
  927.   \FP@count=0\relax%
  928.   \loop%
  929.     \advance\FP@count2\relax%
  930.     \FP@trigo@divn\FP@yia\FP@yib{1000000000}{0}\FP@count%
  931.     \ifnum\ifnum\FP@yia=0 0\else1\fi\ifnum\FP@yib=0 0\else1\fi>0\relax%
  932.       \ifnum\FP@yib=0\relax\else%
  933.         \FP@yib=-\FP@yib%
  934.         \advance\FP@yib1000000000\relax%
  935.         \advance\FP@yia1\relax%
  936.       \fi%
  937.       \ifnum\FP@yia=0\relax\else%
  938.         \FP@yia=-\FP@yia%
  939.         \advance\FP@yia1000000000\relax%
  940.       \fi%
  941.       \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@yia\FP@yib%
  942.     \fi%
  943.     \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@yfa\FP@yfb%
  944.     \ifnum\ifnum\FP@lfa=0 0\else1\fi\ifnum\FP@lfb=0 0\else1\fi=0\relax\else%
  945.       \advance\FP@rfb\FP@lfb%
  946.       \ifnum\FP@rfb<1000000000\relax\else%
  947.         \advance\FP@rfa1\relax%
  948.     \advance\FP@rfb-1000000000\relax%
  949.       \fi%
  950.       \advance\FP@rfa\FP@lfa%
  951.       \ifnum\FP@rfa<1000000000\relax\else%
  952.         \advance\FP@rib1\relax%
  953.     \advance\FP@rfa-1000000000\relax%
  954.       \fi%
  955.   \repeat%
  956. }
  957.  
  958. %compute arctan for 0<=x<=0.5
  959. \def\FP@@arctan{%
  960.   \ifnum\ifnum\FP@xfa=0 0\else1\fi\ifnum\FP@xfb=0 0\else1\fi=0\relax%
  961.     \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=0\FP@rfb=0\relax%
  962.   \else%
  963.     \FP@rs=1\FP@ria=0\FP@rib=0\FP@rfa=\FP@xfa\FP@rfb=\FP@xfb%
  964.     \FP@lfa=\FP@xfa\FP@lfb=\FP@xfb%
  965.     \FP@trigo@mul\FP@xfa\FP@xfb\FP@xfa\FP@xfb\FP@xfa\FP@xfb%
  966.     \FP@count=1\relax%
  967.     \FP@regs=1\relax%
  968.     \loop%
  969.       \FP@regs=-\FP@regs%
  970.       \advance\FP@count2\relax%
  971.       \FP@trigo@mul\FP@lfa\FP@lfb\FP@lfa\FP@lfb\FP@xfa\FP@xfb%
  972.       \FP@trigo@divn\FP@yfa\FP@yfb\FP@lfa\FP@lfb\FP@count%
  973.       \ifnum\ifnum\FP@yfa=0 0\else1\fi\ifnum\FP@yfb=0 0\else1\fi>0\relax%
  974.         \ifnum\FP@regs<0\relax%
  975.           \advance\FP@rfb-\FP@yfb%
  976.       \ifnum\FP@rfb<0\relax%
  977.         \advance\FP@rfb1000000000\relax%
  978.         \advance\FP@rfa-1\relax%
  979.       \fi%
  980.       \advance\FP@rfa-\FP@yfa%
  981.       \ifnum\FP@rfa<0\relax%
  982.         \advance\FP@rfa1000000000\relax%
  983.         \advance\FP@rib-1\relax%
  984.       \fi%
  985.         \else%
  986.           \advance\FP@rfb\FP@yfb%
  987.       \ifnum\FP@rfb<1000000000\relax\else%
  988.         \advance\FP@rfb-1000000000\relax%
  989.         \advance\FP@rfa1\relax%
  990.       \fi%
  991.       \advance\FP@rfa\FP@yfa%
  992.       \ifnum\FP@rfa<1000000000\relax\else%
  993.         \advance\FP@rfa-1000000000\relax%
  994.         \advance\FP@rib1\relax%
  995.       \fi%
  996.         \fi%
  997.     \repeat%
  998.   \fi%
  999. }
  1000.  
  1001. %compute arctan
  1002. \def\FP@@arctancot#1#2{%
  1003.   % #1 integer part of value
  1004.   % #2 fractional part of value
  1005.   %
  1006.   \FP@readvalue{x}{#1}{#2}%
  1007.   %
  1008.   \ifnum\ifnum\FP@xia=0 0\else1\fi\ifnum\FP@xib=1 0\else1\fi\ifnum\FP@xfa=0 0\else1\fi\ifnum\FP@xfb=0 0\else1\fi=0\relax%
  1009.     \FP@ria=0\FP@rib=0\FP@rfa=785398163\FP@rfb=397448310\relax%
  1010.     \FP@subfpih=0\relax%
  1011.   \else%
  1012.     \ifnum\ifnum\FP@xia=0 0\else1\fi\ifnum\FP@xib=0 0\else1\fi=0\relax%
  1013.       \FP@subfpih=0\relax%
  1014.     \else%
  1015.       \FP@yia=\FP@xia\FP@yib=\FP@xib\FP@yfa=\FP@xfa\FP@yfb=\FP@xfb%
  1016.       \FP@trigo@inv%
  1017.       \FP@xia=\FP@ria\FP@xib=\FP@rib\FP@xfa=\FP@rfa\FP@xfb=\FP@rfb%
  1018.       \FP@subfpih=1\relax%
  1019.     \fi%
  1020.     \ifnum\FP@xfa>880000000\relax%
  1021.       \FP@trigo@sq\FP@xfa\FP@xfb%
  1022.       \FP@xfa=\FP@rfa\FP@xfb=\FP@rfb%
  1023.       \FP@arcsincos@loop%
  1024.       \ifnum\FP@@arccos=0\relax%
  1025.         \FP@pihalf@subr%
  1026.       \fi%
  1027.     \else%
  1028.       \FP@@arctan\FP@xfa\FP@xfb%
  1029.     \fi%
  1030.   \fi%
  1031.   %
  1032.   \ifnum\FP@subfpih>0\relax%
  1033.     \FP@pihalf@subr%
  1034.   \fi%
  1035.   %
  1036.   \FP@rs=\FP@xs%
  1037. }
  1038.  
  1039. %compute arctan
  1040. \def\FP@arctan#1#2.#3.#4\relax{%
  1041.   % #1 macro, which gets the result
  1042.   % #2 integer part of value
  1043.   % #3 fractional part of value
  1044.   % #4 dummy to swallow everything after the 2nd '.'
  1045.   %
  1046.   {\FP@beginmessage{ARCTAN}%
  1047.    %
  1048.    \FP@@arctancot{#2}{#3}%
  1049.    %
  1050.    \FP@store\FP@tmp{r}%
  1051.    %
  1052.    \global\let\FP@tmp\FP@tmp%
  1053.    %
  1054.    \FP@endmessage{}%
  1055.   }
  1056.   %
  1057.   \let#1\FP@tmp%
  1058. }
  1059.  
  1060. %compute arccot
  1061. \def\FP@arccot#1#2.#3.#4\relax{%
  1062.   % #1 macro, which gets the result
  1063.   % #2 integer part of value
  1064.   % #3 fractional part of value
  1065.   % #4 dummy to swallow everything after the 2nd '.'
  1066.   %
  1067.   {\FP@beginmessage{ARCCOT}%
  1068.    %
  1069.    \FP@@arctancot{#2}{#3}%
  1070.    \ifnum\FP@rs<0\relax%
  1071.      \FP@rs=1\relax%
  1072.      \FP@pihalf@subr%
  1073.      \FP@pi@subr%
  1074.    \else%
  1075.      \FP@pihalf@subr%
  1076.    \fi%
  1077.    %
  1078.    \FP@store\FP@tmp{r}%
  1079.    %
  1080.    \global\let\FP@tmp\FP@tmp%
  1081.    %
  1082.    \FP@endmessage{}%
  1083.   }
  1084.   %
  1085.   \let#1\FP@tmp%
  1086. }
  1087.  
  1088. %compute arctan and arccot
  1089. \def\FP@arctancot#1#2#3.#4.#5\relax{%
  1090.   % #1 macro, which gets the arcsin-result
  1091.   % #2 macro, which gets the arccos-result
  1092.   % #3 integer part of value
  1093.   % #4 fractional part of value
  1094.   % #5 dummy to swallow everything after the 2nd '.'
  1095.   %
  1096.   {\FP@beginmessage{ARCTANCOT}%
  1097.    %
  1098.    \FP@@arctancot{#3}{#4}%
  1099.    \FP@xs\FP@rs\FP@xia\FP@ria\FP@xib\FP@rib\FP@xfa\FP@rfa\FP@xfb\FP@rfb%
  1100.    \FP@store\FP@tmpa{x}%
  1101.    %
  1102.    \ifnum\FP@rs<0\relax%
  1103.      \FP@rs=1\relax%
  1104.      \FP@pihalf@subr%
  1105.      \FP@pi@subr%
  1106.    \else%
  1107.      \FP@pihalf@subr%
  1108.    \fi%
  1109.    \FP@store\FP@tmpb{r}%
  1110.    %
  1111.    \global\let\FP@tmpa\FP@tmpa%
  1112.    \global\let\FP@tmpb\FP@tmpb%
  1113.    %
  1114.    \FP@endmessage{}%
  1115.   }
  1116.   %
  1117.   \let#1\FP@tmpa%
  1118.   \let#2\FP@tmpb%
  1119. }
  1120.