home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 1 / GoldFishApril1994_CD2.img / d4xx / d472 / icalc / icalc.doc < prev    next >
Text File  |  1991-04-17  |  20KB  |  661 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.                                ›3micalc ›0m›1mversion 1›0m.›1m0 
  16.  
  17.  
  18.  
  19.                       ›0mA complex-number expression parser 
  20.  
  21.                                by Martin W.Scott 
  22.  
  23.  
  24.  
  25.                                   User Guide 
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.      icalc                         User Guide                         icalc
  69.  
  70.  
  71.      ›1mIntroduction 
  72.  
  73.           ›0m›3micalc  ›0mis  a  terminal-based  calculator;  the  ›1mi ›0mstands for
  74.           ›1mimaginary›0m, denoting the fact that the calculator works  with
  75.           complex numbers  (and the name is also a little pun).  There
  76.           are many calculator  programs  for  the  Amiga,  but  to  my
  77.           knowledge, none  with  this ability.  There are other fairly
  78.           powerful features which are also rare in similar programs.  
  79.  
  80.  
  81.      ›1mComplex Numbers 
  82.  
  83.           ›0mEven if you don't know what a complex number  is,  ›3micalc  ›0mis
  84.           still useful.     It  was  designed  to  be  used  for  real
  85.           calculations too,  and  although  the  behavior  of  certain
  86.           functions is different, this is generally not a problem.  
  87.  
  88.  
  89.      ›1mExpressions 
  90.  
  91.           ›0m›3micalc  ›0maccepts  expressions  in  the usual form for computer
  92.           expressions, i.e.  multiplication must be  explicitly  shown
  93.           by  '*', and function arguments enclosed within parentheses.
  94.           The exception to this is the method  of  inputing  imaginary
  95.           parts of complex numbers.  If you want to enter the number 3
  96.           + 4i, you can type either 
  97.  
  98.               3 + 4i 
  99.  
  100.           or 
  101.  
  102.               3 + 4*i 
  103.  
  104.           but ›3mnot 
  105.  
  106.               ›0m3 + i4 
  107.  
  108.           since  this  would  give an ambiguous grammar - is it i*4 or
  109.           the variable "i4"?  
  110.  
  111.           In  almost  all  circumstances,  the   algebraic   "4i"   is
  112.           preferred, but there is one exception, exponentation "^". If
  113.           you want 3*i^3, you must type 
  114.  
  115.               3*i^3 
  116.  
  117.           and not 
  118.  
  119.               3i^3 
  120.  
  121.           The  former gives the correct result, -3i, whilst the latter
  122.           gives -27i. This is because  the  grammar  sees  "3i"  as  a
  123.           number   in   its   own   right,   and   not   an   implicit
  124.           multiplication.  
  125.  
  126.           See the  appendices  for  the  complete  list  of  commands,
  127.           operators,   constants  and  builtin  functions  that  ›3micalc
  128.           ›0msupports.   Expressions  are  separated   by   newlines   or
  129.  
  130.  
  131.      icalc                            -2-                       version 1.0
  132.  
  133.  
  134.      icalc                         User Guide                         icalc
  135.  
  136.  
  137.           semi-colons ';'. Comments are introduced by '#'; the rest of
  138.           the input line is ignored.  
  139.  
  140.  
  141.      ›1mSample Expressions 
  142.  
  143.  
  144.               ›0mx=1-i # an assignment statement 
  145.  
  146.           assigns to variable x the value 1-i.  
  147.  
  148.               # and now, two statements separated by a semi-colon 
  149.  
  150.               sqr(x); x*sqr(x); 
  151.  
  152.           displays the values -2i and -2-2i.  
  153.  
  154.               2*sin(x)*cos(x) - sin(2*x) 
  155.  
  156.           displays the value 4.4408920985e-16 + 4.4408920985e-16i. The
  157.           answer should  be  0, and indeed is very close to that.  The
  158.           inaccuracy results because each term has a value as close to
  159.           the actual value as the computer's  internal  representation
  160.           of numbers  can  hold.    This  behaviour  is common to most
  161.           programs.  
  162.  
  163.  
  164.      ›1mStarting icalc 
  165.  
  166.        ›0mCLI Usage 
  167.  
  168.           The synopsis for icalc is 
  169.  
  170.               icalc [file-list] 
  171.  
  172.           where file-list is a list of input files.  ›3micalc  ›0mwill  read
  173.           (process) the files in the list and exit.  Thus, if you wish
  174.           to  also  use  the program interactively, you should specify
  175.           one of the files as a dash "-"; this is taken to  mean  "use
  176.           standard input".    You  can  obviously redirect output to a
  177.           file if you wish (and redirect input from a file,  but  this
  178.           is generally  unnecessary).    For example, if you wanted to
  179.           use definitions contained in a file  called  "trig.ic",  and
  180.           then type some expressions in at the terminal, you would use 
  181.  
  182.               icalc trig.ic - 
  183.  
  184.           to start  the  program.  I recommend you use a stack size of
  185.           about 20K when running ›3micalc.  ›0mIf  no  file-list  is  given,
  186.           ›3micalc ›0mstarts an interactive session.  
  187.  
  188.        Workbench Usage 
  189.  
  190.           To  start  ›3micalc ›0mfrom the Workbench, simply double-click its
  191.           icon.   You  may  also  pass  arguments  (definition/command
  192.           files)  to ›3micalc ›0min the usual Workbench manner (shift-select
  193.           etc.).  ›3micalc ›0msession.  You can specify  the  window  to  be
  194.           opened  by  modifying the WINDOW tooltype (click once on the
  195.  
  196.  
  197.      icalc                            -3-                       version 1.0
  198.  
  199.  
  200.      icalc                         User Guide                         icalc
  201.  
  202.  
  203.           ›3micalc ›0micon, and select "Info" from the Workbench menu).  
  204.  
  205.           You may also set the default tool  of  a  definition  file's
  206.           project icon  to be ›3micalc.  ›0mThen simply double clicking that
  207.           icon  will  launch  ›3micalc  ›0mand  read  the  definition  file.
  208.           Remember, however, to set the project icon's stack to 20000,
  209.           or you will get a stack overflow error.  
  210.  
  211.        Exiting icalc 
  212.  
  213.           To  end  an interactive session of ›3micalc ›0m(from either CLI or
  214.           Workbench) use the commands "quit" or "exit".  You can  also
  215.           type ^\ (press the control key and '\' simultaneously).  
  216.  
  217.  
  218.      ›1mVariables 
  219.  
  220.           ›0mVariables  in  ›3micalc ›0mcan be named arbitrarily, as long as no
  221.           name conflicts with a pre-defined symbol name, such  as  sin
  222.           or  PI.  The standard conventions apply: the first character
  223.           must be a letter,  followed  by  a  string  of  letters  and
  224.           digits.  Case  is  significant.  Variables are introduced by
  225.           using them; If  a  variable  is  used  before  it  has  been
  226.           initialized  (i.e.  has  had  a value assigned to it), ›3micalc
  227.           ›0mwill warn the user and use the value zero.  Assignments  can
  228.           appear   anywhere   in   an  expression,  and  are  in  fact
  229.           expressions in their own right (as in C).  So,  you  can  do
  230.           things like 
  231.  
  232.               apple = banana = apricot = 34 
  233.  
  234.           to assign   the   value   34  to  these  variables.    Since
  235.           assignments  are  expressions,   their   value   being   the
  236.           assignment value, you can also do 
  237.  
  238.               apple = sqr(banana = 12) 
  239.  
  240.           which  assigns the value 12 to "banana", and 144 to "apple".
  241.           You can of course assign new values to existing variables.  
  242.  
  243.  
  244.      ›1mConstants and ans 
  245.  
  246.           ›0m›3micalc ›0mcomes with several predefined  constants,  e.g.    PI,
  247.           GAMMA etc.    You  cannot  assign a new value to a constant.
  248.           There is a special constant, "ans",  which  isn't  really  a
  249.           constant  at  all,  but is made so to prevent assignments to
  250.           it.  "ans" contains the value of  the  previously  evaluated
  251.           expression, and so is useful when splitting a calculation up
  252.           into smaller chunks.  
  253.  
  254.               1 + 2 + 3 
  255.                           6 
  256.  
  257.               ans * 12 
  258.                           72 
  259.  
  260.           You can  also  use  it for recursive formulas.  For example,
  261.  
  262.  
  263.      icalc                            -4-                       version 1.0
  264.  
  265.  
  266.      icalc                         User Guide                         icalc
  267.  
  268.  
  269.           the logistic equation xnext = rx(1-x) for parameter r = 3.5,
  270.           initial x = 0.4 could be iterated as follows: 
  271.  
  272.               r = 3.5; 0.4 # initialize r and ans 
  273.                           3.5 
  274.                           0.4 
  275.  
  276.               r*ans*(1-ans) 
  277.                           0.84 
  278.  
  279.               r*ans*(1-ans) 
  280.                           0.4704 
  281.  
  282.               r*ans*(1-ans) 
  283.                           0.87193344 
  284.  
  285.               r*ans*(1-ans) 
  286.                           0.390829306734 
  287.  
  288.           and so on.  Of course, you needn't use "ans" here; you could
  289.           just use assignments to "x", but it illustrates  the  point.
  290.           If  you're  going to do things like this (and even if you're
  291.           not) I suggest you use NEWCON:, Conman, or  something  along
  292.           those lines,  it  makes life ›3mmuch ›0measier.  There is a neater
  293.           way to do this sort of  stuff  using  the  "repeat"  command
  294.           which is explained later.  
  295.  
  296.  
  297.      ›1mBuiltin Functions 
  298.  
  299.           ›0m›3micalc  ›0mcomes  with  many builtin functions, for example sin,
  300.           cos, sqrt, exp, ln etc.  There are  some  special  functions
  301.           for complex numbers too, namely Im, Re, arg, norm.  They all
  302.           take   real   or   complex   arguments,  which  can  be  any
  303.           expression.  For example, 
  304.  
  305.               asin(sin(1)) 
  306.  
  307.           returns the value 1 as expected.  But ...  
  308.  
  309.               asin(sin(1-i)) 
  310.  
  311.           returns 1.484116283319 - 0.831157682449i;  this  is  because
  312.           the inverse  of sin is a many-valued function.  asin returns
  313.           a value in  the  PVR  (principal  value  range)  as  do  all
  314.           many-valued functions  in  ›3micalc.    ›0mThe PVR is defined (for
  315.           this program anyway) as the interval [-PI,PI).  When working
  316.           with complex numbers, you should always bear  in  mind  that
  317.           almost  all  the  trigonometric  functions  are many-valued,
  318.           because they are defined in terms  of  the  exponential  and
  319.           logarithmic functions.  Another thing to bear in mind if you
  320.           intend working with reals is that things like 
  321.  
  322.               ln(-1) 
  323.  
  324.           return a value, 3.14159265359i (PI*i) in this case.  
  325.  
  326.  
  327.  
  328.  
  329.      icalc                            -5-                       version 1.0
  330.  
  331.  
  332.      icalc                         User Guide                         icalc
  333.  
  334.  
  335.      ›1mUser›0m-›1mdefined Functions 
  336.  
  337.           ›0mA  browse  through  the list of builtin functions may show a
  338.           number  of  surprising  omissions,   including   gaga(z)   =
  339.           sin(sqrt(z)).   Well,  not  to  worry, ›3micalc ›0mlets you define
  340.           your own, and they can then be  used  just  like  any  other
  341.           function.  You define functions in the following manner: 
  342.  
  343.               func <name> ( <parameter> ) = <expr> 
  344.  
  345.           so to define gaga(z), use 
  346.  
  347.               func gaga(z) = sin(sqrt(z)) 
  348.  
  349.           Note  that  z  is  ›3mlocal  ›0mto  the  function,  not  a  global
  350.           variable.  Thus, if z  is  defined  as  a  variable,  it  is
  351.           unaltered when you call gaga.  There is a sample file called
  352.           "trig.icalc"   in  this  distribution  defining  every  trig
  353.           function you care to mention,  and  a  few  other  functions
  354.           too.  
  355.  
  356.           At   the   moment,   functions   are   restricted  to  being
  357.           single-parameter.   I  will  add  multi-parameter  functions
  358.           soon.  Also, as with most programming languages, don't write
  359.           circular  definitions;  ›3micalc  ›0mdoes not detect them, and you
  360.           will swiftly run out of stack.    Recursive  functions  fall
  361.           into  this  category, as there is no way to specify terminal
  362.           cases - see the Improvements section below.  
  363.  
  364.  
  365.      ›1mCommands 
  366.  
  367.           ›0m›3micalc ›0mhas a few commands to make life easier.  
  368.  
  369.        quit 
  370.        exit 
  371.           not surprisingly, these commands terminate ›3micalc.  
  372.  
  373.        ›0msilent 
  374.           tells ›3micalc ›0mnot to display the results  of  expressions,  or
  375.           inform you  that  a function has been defined.  It is useful
  376.           for initialization files containing lots of definitions.  
  377.  
  378.        verbose 
  379.           This is the inverse function of "silent"; it turns  back  on
  380.           the display of results, etc.  
  381.  
  382.        prec <num-digits> 
  383.           allows  you  to modify the way results are displayed; values
  384.           are printed with <num-digits> decimal places,  if  possible.
  385.           The  default  is  12. For C programmers: numbers are printed
  386.           using fprintf with "%.*lg" format string;  the  asterisk  is
  387.           replaced  with the (integer) value of the internal precision
  388.           variable, set by this command.  
  389.  
  390.        help 
  391.           reminds you what other commands are available.  
  392.  
  393.  
  394.  
  395.      icalc                            -6-                       version 1.0
  396.  
  397.  
  398.      icalc                         User Guide                         icalc
  399.  
  400.  
  401.        vars 
  402.           lists all currently defined variables and their values.  
  403.  
  404.        consts 
  405.           lists all predefined constants and their values.  
  406.  
  407.        builtins 
  408.           lists all built-in functions available.  
  409.  
  410.        functions 
  411.           lists all defined user-functions.  
  412.  
  413.  
  414.      ›1mThe repeat Construct 
  415.  
  416.           ›0mThis is a timesaving facility with a number of  uses.    The
  417.           structure of a repeat command is 
  418.  
  419.               repeat <number> <expr> 
  420.  
  421.           where  number  is  the  number  of  times  to  evaluate  the
  422.           expression expr.  The usefulness of this construct  is  best
  423.           illustrated by example: say you wanted to sum the expression
  424.           1/n² from 1 to 100; you could do 
  425.  
  426.               sum = n = 0 
  427.                           0 
  428.  
  429.               silent; repeat 100 sum = sum+1/sqr(n=n+1); verbose;n;sum 
  430.                           100 
  431.                           1.634983900185 
  432.  
  433.           Now  you  may want to sum to 200, to get a beter idea of the
  434.           limit (your analysis course  has  told  you  it  converges).
  435.           Just  retype  the  last line (or press the up-arrow if using
  436.           NEWCON: etc.) 
  437.  
  438.               silent; repeat 100 sum = sum+1/sqr(n=n+1); verbose;n;sum 
  439.                           200 
  440.                           1.639946546015 
  441.  
  442.           and you could repeat this process indefinitely.    Note  the
  443.           use  of the silent-verbose pair around the repeat statement.
  444.           This speeds things up quite a bit, and saves your eyes  too.
  445.           Of  course, if you're interested in each stage, you can omit
  446.           them.  Another example: compound interest  5% p.a.,  initial
  447.           capital $1000.  
  448.  
  449.               c = 1000 
  450.                           1000 
  451.  
  452.               repeat 20 c = c*1.05 
  453.                           1050 
  454.                           1102.5 
  455.                           1157.625 
  456.                           : 
  457.                           : 
  458.                           2653.297705144415 
  459.  
  460.  
  461.      icalc                            -7-                       version 1.0
  462.  
  463.  
  464.      icalc                         User Guide                         icalc
  465.  
  466.  
  467.      ›1mBugs 
  468.  
  469.           ›0mWhat bugs?  Well, I'm sure there must be the odd one or two,
  470.           but I  haven't  noticed.  Should you find any, please let me
  471.           know and I'll try to fix them.   If  there's  something  you
  472.           hate  about  ›3micalc  ›0mand  would like changed, again drop me a
  473.           line.  
  474.  
  475.  
  476.      ›1mImprovements 
  477.  
  478.           ›0mThere's a lot of scope for extension/improvement  to  ›3micalc.
  479.           ›0mHere's my list: 
  480.  
  481.             o  allow  modification  of the PVR. Should be fairly easy,
  482.                but is there much point?  
  483.  
  484.             o  make ›3micalc ›0mmore  like  a  little  language,  by  adding
  485.                if-then-else, while  etc.    This requires some sort of
  486.                comparison method; equality is easy, but since there is
  487.                no ordering of complex numbers, how to imlement  >,  >=
  488.                etc?   I  have some ideas, but if you would like to see
  489.                these extensions, let me know, along with your  opinion
  490.                on the best comparison method.  
  491.  
  492.             o  load/save environment,  i.e.    dump all vars to a file
  493.                for reloading later.  
  494.  
  495.             o  print  actual   function   definitions   when   listing
  496.                user-defined functions.  
  497.  
  498.             o  get  rid  of small errors creeping in (like the example
  499.                in the Sample expressions section).  
  500.  
  501.             o  etc...  
  502.  
  503.  
  504.      ›1mCompiling 
  505.  
  506.           ›0m›3micalc ›0mwas written using Lattice C (version 5.10a) but should
  507.           compile with no problems with Manx C. I used the version  of
  508.           bison on Fish #136; if you're using a later version or Yacc,
  509.           you may need to change the makefile.  
  510.  
  511.           The  code  is  meant  to be portable, so Amiga-specific code
  512.           (currently only the Workbench interface) is #ifdef'd.  Also,
  513.           to  implement  the  WINDOW  tooltype,  I've  used a slightly
  514.           modified version of  Lattice's  _main  function;  since  I'm
  515.           probably  not  permitted  to distribute the modified source,
  516.           I've included just the compiled module, myumain.o.  
  517.  
  518.  
  519.      ›1mCredits 
  520.  
  521.           ›0mThanks to the GNU team for bison (it makes these  things  so
  522.           much  easier  to write and modify) and to William Loftus for
  523.           the Amiga port.  
  524.  
  525.  
  526.  
  527.      icalc                            -8-                       version 1.0
  528.  
  529.  
  530.      icalc                         User Guide                         icalc
  531.  
  532.  
  533.           Thanks also to Steve Koren for Sksh, and Mike  Meyer  et  al
  534.           for   Mg3;   together   they   make   a   great  development
  535.           environment.  
  536.  
  537.           This is my first bison-based project, and  I  learnt  a  lot
  538.           from  "The  Unix Programming Environment" by Brian Kernighan
  539.           and Rob Pike. Their "hoc" calculator was a  model  for  this
  540.           (although there are major differences too).  
  541.  
  542.  
  543.      ›1mThe Bottom Line 
  544.  
  545.           ›0mAlthough  contributions are not required, they would be most
  546.           welcome (I'm a poor student).  Don't let  that  inhibit  you
  547.           from sending bug reports, praise, suggestions, etc.  I'd get
  548.           most  pleasure  from  hearing  if  anyone actually uses this
  549.           bloody program!  
  550.  
  551.           Send mail to: 
  552.  
  553.               Martin W. Scott,
  554.               23 Drum Brae North,
  555.               Edinburgh, EH4 8AT
  556.               SCOTLAND.
  557.  
  558.           Thanks for reading this far. The appendices follow.
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566.  
  567.  
  568.  
  569.  
  570.  
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.      icalc                            -9-                       version 1.0
  594.  
  595.  
  596.      icalc                         User Guide                         icalc
  597.  
  598.  
  599.      ›1mAppendix 1 ›0m- ›1mOperators ›0m(›1min order order of precedence›0m) 
  600.  
  601.           =        assignment
  602.           +        addition
  603.           -        subtraction, unary minus
  604.           *        multiplication
  605.           /        division
  606.           ^        exponentation
  607.           '        conjugate: z' = conjugate of z
  608.  
  609.  
  610.      ›1mAppendix 2 ›0m- ›1mConstants      
  611.  
  612.           ›0mPI       4*atan(1)
  613.           E        exp(1)
  614.           GAMMA    Euler's constant, 0.57721566...
  615.           DEG      Number of degrees in one radian
  616.           PHI      Golden ratio 1.61803398...
  617.           LOG10    ln(10)
  618.           LOG2     ln(2)
  619.  
  620.  
  621.      ›1mAppendix 3 ›0m- ›1mBuiltin functions     
  622.  
  623.           ›0msin      trigonometric functions
  624.           cos
  625.           tan
  626.           asin     inverse trigonometric functions
  627.           acos 
  628.           atan
  629.           sinh     hyperbolic trigonometric functions
  630.           cosh
  631.           tanh
  632.           exp      exponential function
  633.           ln       natural logarithm
  634.           sqr      square
  635.           sqrt     square root
  636.           conj     conjugate (see also ' operator)
  637.           abs      absolute value
  638.           norm     not really norm; if z=x+iy, norm(z) = x²+y²
  639.           arg      principal argument
  640.           Re       real part of complex number
  641.           Im       imaginary part of complex number
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.      icalc                            -10-                      version 1.0
  660.  
  661.