(Formulas, Composition Basics): Lower the precedence of negation.
[bpt/emacs.git] / doc / misc / calc.texi
CommitLineData
4009494e
GM
1\input texinfo @c -*-texinfo-*-
2@comment %**start of header (This is for running Texinfo on a region.)
3@c smallbook
db78a8cb 4@setfilename ../../info/calc
4009494e
GM
5@c [title]
6@settitle GNU Emacs Calc 2.1 Manual
7@setchapternewpage odd
8@comment %**end of header (This is for running Texinfo on a region.)
9
10@c The following macros are used for conditional output for single lines.
11@c @texline foo
12@c `foo' will appear only in TeX output
13@c @infoline foo
14@c `foo' will appear only in non-TeX output
15
16@c @expr{expr} will typeset an expression;
17@c $x$ in TeX, @samp{x} otherwise.
18
19@iftex
20@macro texline
21@end macro
22@alias infoline=comment
23@alias expr=math
24@alias tfn=code
25@alias mathit=expr
26@macro cpi{}
27@math{@pi{}}
28@end macro
29@macro cpiover{den}
30@math{@pi/\den\}
31@end macro
32@end iftex
33
34@ifnottex
35@alias texline=comment
36@macro infoline{stuff}
37\stuff\
38@end macro
39@alias expr=samp
40@alias tfn=t
41@alias mathit=i
42@macro cpi{}
43@expr{pi}
44@end macro
45@macro cpiover{den}
46@expr{pi/\den\}
47@end macro
48@end ifnottex
49
50
51@tex
52% Suggested by Karl Berry <karl@@freefriends.org>
53\gdef\!{\mskip-\thinmuskip}
54@end tex
55
56@c Fix some other things specifically for this manual.
57@iftex
58@finalout
59@mathcode`@:=`@: @c Make Calc fractions come out right in math mode
60@tex
61\gdef\coloneq{\mathrel{\mathord:\mathord=}}
62
63\gdef\beforedisplay{\vskip-10pt}
64\gdef\afterdisplay{\vskip-5pt}
65\gdef\beforedisplayh{\vskip-25pt}
66\gdef\afterdisplayh{\vskip-10pt}
67@end tex
68@newdimen@kyvpos @kyvpos=0pt
69@newdimen@kyhpos @kyhpos=0pt
70@newcount@calcclubpenalty @calcclubpenalty=1000
71@ignore
72@newcount@calcpageno
73@newtoks@calcoldeverypar @calcoldeverypar=@everypar
74@everypar={@calceverypar@the@calcoldeverypar}
75@ifx@turnoffactive@undefinedzzz@def@turnoffactive{}@fi
76@ifx@ninett@undefinedzzz@font@ninett=cmtt9@fi
77@catcode`@\=0 \catcode`\@=11
78\r@ggedbottomtrue
79\catcode`\@=0 @catcode`@\=@active
80@end ignore
81@end iftex
82
83@copying
84This file documents Calc, the GNU Emacs calculator.
85
86Copyright @copyright{} 1990, 1991, 2001, 2002, 2003, 2004,
872005, 2006, 2007 Free Software Foundation, Inc.
88
89@quotation
90Permission is granted to copy, distribute and/or modify this document
91under the terms of the GNU Free Documentation License, Version 1.2 or
92any later version published by the Free Software Foundation; with the
93Invariant Sections being just ``GNU GENERAL PUBLIC LICENSE'', with the
94Front-Cover texts being ``A GNU Manual,'' and with the Back-Cover
95Texts as in (a) below. A copy of the license is included in the section
96entitled ``GNU Free Documentation License.''
97
98(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
99this GNU Manual, like GNU software. Copies published by the Free
100Software Foundation raise funds for GNU development.''
101@end quotation
102@end copying
103
104@dircategory Emacs
105@direntry
106* Calc: (calc). Advanced desk calculator and mathematical tool.
107@end direntry
108
109@titlepage
110@sp 6
111@center @titlefont{Calc Manual}
112@sp 4
113@center GNU Emacs Calc Version 2.1
114@c [volume]
115@sp 5
116@center Dave Gillespie
117@center daveg@@synaptics.com
118@page
119
120@vskip 0pt plus 1filll
121Copyright @copyright{} 1990, 1991, 2001, 2002, 2003, 2004,
122 2005, 2006, 2007 Free Software Foundation, Inc.
123@insertcopying
124@end titlepage
125
126
127@summarycontents
128
129@c [end]
130
131@contents
132
133@c [begin]
134@ifnottex
135@node Top, Getting Started, (dir), (dir)
136@chapter The GNU Emacs Calculator
137
138@noindent
139@dfn{Calc} is an advanced desk calculator and mathematical tool
140written by Dave Gillespie that runs as part of the GNU Emacs environment.
141
142This manual, also written (mostly) by Dave Gillespie, is divided into
143three major parts: ``Getting Started,'' the ``Calc Tutorial,'' and the
144``Calc Reference.'' The Tutorial introduces all the major aspects of
145Calculator use in an easy, hands-on way. The remainder of the manual is
146a complete reference to the features of the Calculator.
147@end ifnottex
148
149@ifinfo
150For help in the Emacs Info system (which you are using to read this
151file), type @kbd{?}. (You can also type @kbd{h} to run through a
152longer Info tutorial.)
153@end ifinfo
154
155@menu
156* Getting Started:: General description and overview.
157@ifinfo
158* Interactive Tutorial::
159@end ifinfo
160* Tutorial:: A step-by-step introduction for beginners.
161
162* Introduction:: Introduction to the Calc reference manual.
163* Data Types:: Types of objects manipulated by Calc.
164* Stack and Trail:: Manipulating the stack and trail buffers.
165* Mode Settings:: Adjusting display format and other modes.
166* Arithmetic:: Basic arithmetic functions.
167* Scientific Functions:: Transcendentals and other scientific functions.
168* Matrix Functions:: Operations on vectors and matrices.
169* Algebra:: Manipulating expressions algebraically.
170* Units:: Operations on numbers with units.
171* Store and Recall:: Storing and recalling variables.
172* Graphics:: Commands for making graphs of data.
173* Kill and Yank:: Moving data into and out of Calc.
174* Keypad Mode:: Operating Calc from a keypad.
175* Embedded Mode:: Working with formulas embedded in a file.
176* Programming:: Calc as a programmable calculator.
177
178* Copying:: How you can copy and share Calc.
179* GNU Free Documentation License:: The license for this documentation.
180* Customizing Calc:: Customizing Calc.
181* Reporting Bugs:: How to report bugs and make suggestions.
182
183* Summary:: Summary of Calc commands and functions.
184
185* Key Index:: The standard Calc key sequences.
186* Command Index:: The interactive Calc commands.
187* Function Index:: Functions (in algebraic formulas).
188* Concept Index:: General concepts.
189* Variable Index:: Variables used by Calc (both user and internal).
190* Lisp Function Index:: Internal Lisp math functions.
191@end menu
192
193@ifinfo
194@node Getting Started, Interactive Tutorial, Top, Top
195@end ifinfo
196@ifnotinfo
197@node Getting Started, Tutorial, Top, Top
198@end ifnotinfo
199@chapter Getting Started
200@noindent
201This chapter provides a general overview of Calc, the GNU Emacs
202Calculator: What it is, how to start it and how to exit from it,
203and what are the various ways that it can be used.
204
205@menu
206* What is Calc::
207* About This Manual::
208* Notations Used in This Manual::
209* Demonstration of Calc::
210* Using Calc::
211* History and Acknowledgements::
212@end menu
213
214@node What is Calc, About This Manual, Getting Started, Getting Started
215@section What is Calc?
216
217@noindent
218@dfn{Calc} is an advanced calculator and mathematical tool that runs as
219part of the GNU Emacs environment. Very roughly based on the HP-28/48
220series of calculators, its many features include:
221
222@itemize @bullet
223@item
224Choice of algebraic or RPN (stack-based) entry of calculations.
225
226@item
227Arbitrary precision integers and floating-point numbers.
228
229@item
230Arithmetic on rational numbers, complex numbers (rectangular and polar),
231error forms with standard deviations, open and closed intervals, vectors
232and matrices, dates and times, infinities, sets, quantities with units,
233and algebraic formulas.
234
235@item
236Mathematical operations such as logarithms and trigonometric functions.
237
238@item
239Programmer's features (bitwise operations, non-decimal numbers).
240
241@item
242Financial functions such as future value and internal rate of return.
243
244@item
245Number theoretical features such as prime factorization and arithmetic
246modulo @var{m} for any @var{m}.
247
248@item
249Algebraic manipulation features, including symbolic calculus.
250
251@item
252Moving data to and from regular editing buffers.
253
254@item
255Embedded mode for manipulating Calc formulas and data directly
256inside any editing buffer.
257
258@item
259Graphics using GNUPLOT, a versatile (and free) plotting program.
260
261@item
262Easy programming using keyboard macros, algebraic formulas,
263algebraic rewrite rules, or extended Emacs Lisp.
264@end itemize
265
266Calc tries to include a little something for everyone; as a result it is
267large and might be intimidating to the first-time user. If you plan to
268use Calc only as a traditional desk calculator, all you really need to
269read is the ``Getting Started'' chapter of this manual and possibly the
270first few sections of the tutorial. As you become more comfortable with
271the program you can learn its additional features. Calc does not
272have the scope and depth of a fully-functional symbolic math package,
273but Calc has the advantages of convenience, portability, and freedom.
274
275@node About This Manual, Notations Used in This Manual, What is Calc, Getting Started
276@section About This Manual
277
278@noindent
279This document serves as a complete description of the GNU Emacs
280Calculator. It works both as an introduction for novices, and as
281a reference for experienced users. While it helps to have some
282experience with GNU Emacs in order to get the most out of Calc,
283this manual ought to be readable even if you don't know or use Emacs
284regularly.
285
286The manual is divided into three major parts:@: the ``Getting
287Started'' chapter you are reading now, the Calc tutorial (chapter 2),
288and the Calc reference manual (the remaining chapters and appendices).
289@c [when-split]
290@c This manual has been printed in two volumes, the @dfn{Tutorial} and the
291@c @dfn{Reference}. Both volumes include a copy of the ``Getting Started''
292@c chapter.
293
294If you are in a hurry to use Calc, there is a brief ``demonstration''
295below which illustrates the major features of Calc in just a couple of
296pages. If you don't have time to go through the full tutorial, this
297will show you everything you need to know to begin.
298@xref{Demonstration of Calc}.
299
300The tutorial chapter walks you through the various parts of Calc
301with lots of hands-on examples and explanations. If you are new
302to Calc and you have some time, try going through at least the
303beginning of the tutorial. The tutorial includes about 70 exercises
304with answers. These exercises give you some guided practice with
305Calc, as well as pointing out some interesting and unusual ways
306to use its features.
307
308The reference section discusses Calc in complete depth. You can read
309the reference from start to finish if you want to learn every aspect
310of Calc. Or, you can look in the table of contents or the Concept
311Index to find the parts of the manual that discuss the things you
312need to know.
313
314@cindex Marginal notes
315Every Calc keyboard command is listed in the Calc Summary, and also
316in the Key Index. Algebraic functions, @kbd{M-x} commands, and
317variables also have their own indices.
318@texline Each
319@infoline In the printed manual, each
320paragraph that is referenced in the Key or Function Index is marked
321in the margin with its index entry.
322
323@c [fix-ref Help Commands]
324You can access this manual on-line at any time within Calc by
325pressing the @kbd{h i} key sequence. Outside of the Calc window,
326you can press @kbd{C-x * i} to read the manual on-line. Also, you
327can jump directly to the Tutorial by pressing @kbd{h t} or @kbd{C-x * t},
328or to the Summary by pressing @kbd{h s} or @kbd{C-x * s}. Within Calc,
329you can also go to the part of the manual describing any Calc key,
330function, or variable using @w{@kbd{h k}}, @kbd{h f}, or @kbd{h v},
331respectively. @xref{Help Commands}.
332
333@ifnottex
334The Calc manual can be printed, but because the manual is so large, you
335should only make a printed copy if you really need it. To print the
336manual, you will need the @TeX{} typesetting program (this is a free
337program by Donald Knuth at Stanford University) as well as the
338@file{texindex} program and @file{texinfo.tex} file, both of which can
339be obtained from the FSF as part of the @code{texinfo} package.
340To print the Calc manual in one huge tome, you will need the
341source code to this manual, @file{calc.texi}, available as part of the
342Emacs source. Once you have this file, type @kbd{texi2dvi calc.texi}.
343Alternatively, change to the @file{man} subdirectory of the Emacs
344source distribution, and type @kbd{make calc.dvi}. (Don't worry if you
345get some ``overfull box'' warnings while @TeX{} runs.)
346The result will be a device-independent output file called
347@file{calc.dvi}, which you must print in whatever way is right
348for your system. On many systems, the command is
349
350@example
351lpr -d calc.dvi
352@end example
353
354@noindent
355or
356
357@example
358dvips calc.dvi
359@end example
360@end ifnottex
361@c Printed copies of this manual are also available from the Free Software
362@c Foundation.
363
364@node Notations Used in This Manual, Demonstration of Calc, About This Manual, Getting Started
365@section Notations Used in This Manual
366
367@noindent
368This section describes the various notations that are used
369throughout the Calc manual.
370
371In keystroke sequences, uppercase letters mean you must hold down
372the shift key while typing the letter. Keys pressed with Control
373held down are shown as @kbd{C-x}. Keys pressed with Meta held down
374are shown as @kbd{M-x}. Other notations are @key{RET} for the
375Return key, @key{SPC} for the space bar, @key{TAB} for the Tab key,
376@key{DEL} for the Delete key, and @key{LFD} for the Line-Feed key.
377The @key{DEL} key is called Backspace on some keyboards, it is
378whatever key you would use to correct a simple typing error when
379regularly using Emacs.
380
381(If you don't have the @key{LFD} or @key{TAB} keys on your keyboard,
382the @kbd{C-j} and @kbd{C-i} keys are equivalent to them, respectively.
383If you don't have a Meta key, look for Alt or Extend Char. You can
384also press @key{ESC} or @kbd{C-[} first to get the same effect, so
385that @kbd{M-x}, @kbd{@key{ESC} x}, and @kbd{C-[ x} are all equivalent.)
386
387Sometimes the @key{RET} key is not shown when it is ``obvious''
388that you must press @key{RET} to proceed. For example, the @key{RET}
389is usually omitted in key sequences like @kbd{M-x calc-keypad @key{RET}}.
390
391Commands are generally shown like this: @kbd{p} (@code{calc-precision})
392or @kbd{C-x * k} (@code{calc-keypad}). This means that the command is
393normally used by pressing the @kbd{p} key or @kbd{C-x * k} key sequence,
394but it also has the full-name equivalent shown, e.g., @kbd{M-x calc-precision}.
395
396Commands that correspond to functions in algebraic notation
397are written: @kbd{C} (@code{calc-cos}) [@code{cos}]. This means
398the @kbd{C} key is equivalent to @kbd{M-x calc-cos}, and that
399the corresponding function in an algebraic-style formula would
400be @samp{cos(@var{x})}.
401
402A few commands don't have key equivalents: @code{calc-sincos}
403[@code{sincos}].
404
405@node Demonstration of Calc, Using Calc, Notations Used in This Manual, Getting Started
406@section A Demonstration of Calc
407
408@noindent
409@cindex Demonstration of Calc
410This section will show some typical small problems being solved with
411Calc. The focus is more on demonstration than explanation, but
412everything you see here will be covered more thoroughly in the
413Tutorial.
414
415To begin, start Emacs if necessary (usually the command @code{emacs}
416does this), and type @kbd{C-x * c} to start the
417Calculator. (You can also use @kbd{M-x calc} if this doesn't work.
418@xref{Starting Calc}, for various ways of starting the Calculator.)
419
420Be sure to type all the sample input exactly, especially noting the
421difference between lower-case and upper-case letters. Remember,
422@key{RET}, @key{TAB}, @key{DEL}, and @key{SPC} are the Return, Tab,
423Delete, and Space keys.
424
425@strong{RPN calculation.} In RPN, you type the input number(s) first,
426then the command to operate on the numbers.
427
428@noindent
429Type @kbd{2 @key{RET} 3 + Q} to compute
430@texline @math{\sqrt{2+3} = 2.2360679775}.
431@infoline the square root of 2+3, which is 2.2360679775.
432
433@noindent
434Type @kbd{P 2 ^} to compute
435@texline @math{\pi^2 = 9.86960440109}.
436@infoline the value of `pi' squared, 9.86960440109.
437
438@noindent
439Type @key{TAB} to exchange the order of these two results.
440
441@noindent
442Type @kbd{- I H S} to subtract these results and compute the Inverse
443Hyperbolic sine of the difference, 2.72996136574.
444
445@noindent
446Type @key{DEL} to erase this result.
447
448@strong{Algebraic calculation.} You can also enter calculations using
449conventional ``algebraic'' notation. To enter an algebraic formula,
450use the apostrophe key.
451
452@noindent
453Type @kbd{' sqrt(2+3) @key{RET}} to compute
454@texline @math{\sqrt{2+3}}.
455@infoline the square root of 2+3.
456
457@noindent
458Type @kbd{' pi^2 @key{RET}} to enter
459@texline @math{\pi^2}.
460@infoline `pi' squared.
461To evaluate this symbolic formula as a number, type @kbd{=}.
462
463@noindent
464Type @kbd{' arcsinh($ - $$) @key{RET}} to subtract the second-most-recent
465result from the most-recent and compute the Inverse Hyperbolic sine.
466
467@strong{Keypad mode.} If you are using the X window system, press
468@w{@kbd{C-x * k}} to get Keypad mode. (If you don't use X, skip to
469the next section.)
470
471@noindent
472Click on the @key{2}, @key{ENTER}, @key{3}, @key{+}, and @key{SQRT}
473``buttons'' using your left mouse button.
474
475@noindent
476Click on @key{PI}, @key{2}, and @tfn{y^x}.
477
478@noindent
479Click on @key{INV}, then @key{ENTER} to swap the two results.
480
481@noindent
482Click on @key{-}, @key{INV}, @key{HYP}, and @key{SIN}.
483
484@noindent
485Click on @key{<-} to erase the result, then click @key{OFF} to turn
486the Keypad Calculator off.
487
488@strong{Grabbing data.} Type @kbd{C-x * x} if necessary to exit Calc.
489Now select the following numbers as an Emacs region: ``Mark'' the
490front of the list by typing @kbd{C-@key{SPC}} or @kbd{C-@@} there,
491then move to the other end of the list. (Either get this list from
492the on-line copy of this manual, accessed by @w{@kbd{C-x * i}}, or just
493type these numbers into a scratch file.) Now type @kbd{C-x * g} to
494``grab'' these numbers into Calc.
495
496@example
497@group
4981.23 1.97
4991.6 2
5001.19 1.08
501@end group
502@end example
503
504@noindent
505The result @samp{[1.23, 1.97, 1.6, 2, 1.19, 1.08]} is a Calc ``vector.''
506Type @w{@kbd{V R +}} to compute the sum of these numbers.
507
508@noindent
509Type @kbd{U} to Undo this command, then type @kbd{V R *} to compute
510the product of the numbers.
511
512@noindent
513You can also grab data as a rectangular matrix. Place the cursor on
514the upper-leftmost @samp{1} and set the mark, then move to just after
515the lower-right @samp{8} and press @kbd{C-x * r}.
516
517@noindent
518Type @kbd{v t} to transpose this
519@texline @math{3\times2}
520@infoline 3x2
521matrix into a
522@texline @math{2\times3}
523@infoline 2x3
524matrix. Type @w{@kbd{v u}} to unpack the rows into two separate
525vectors. Now type @w{@kbd{V R + @key{TAB} V R +}} to compute the sums
526of the two original columns. (There is also a special
527grab-and-sum-columns command, @kbd{C-x * :}.)
528
529@strong{Units conversion.} Units are entered algebraically.
530Type @w{@kbd{' 43 mi/hr @key{RET}}} to enter the quantity 43 miles-per-hour.
531Type @w{@kbd{u c km/hr @key{RET}}}. Type @w{@kbd{u c m/s @key{RET}}}.
532
533@strong{Date arithmetic.} Type @kbd{t N} to get the current date and
534time. Type @kbd{90 +} to find the date 90 days from now. Type
535@kbd{' <25 dec 87> @key{RET}} to enter a date, then @kbd{- 7 /} to see how
536many weeks have passed since then.
537
538@strong{Algebra.} Algebraic entries can also include formulas
539or equations involving variables. Type @kbd{@w{' [x + y} = a, x y = 1] @key{RET}}
540to enter a pair of equations involving three variables.
541(Note the leading apostrophe in this example; also, note that the space
542between @samp{x y} is required.) Type @w{@kbd{a S x,y @key{RET}}} to solve
543these equations for the variables @expr{x} and @expr{y}.
544
545@noindent
546Type @kbd{d B} to view the solutions in more readable notation.
547Type @w{@kbd{d C}} to view them in C language notation, @kbd{d T}
548to view them in the notation for the @TeX{} typesetting system,
549and @kbd{d L} to view them in the notation for the La@TeX{} typesetting
550system. Type @kbd{d N} to return to normal notation.
551
552@noindent
553Type @kbd{7.5}, then @kbd{s l a @key{RET}} to let @expr{a = 7.5} in these formulas.
554(That's a letter @kbd{l}, not a numeral @kbd{1}.)
555
556@ifnotinfo
557@strong{Help functions.} You can read about any command in the on-line
558manual. Type @kbd{C-x * c} to return to Calc after each of these
559commands: @kbd{h k t N} to read about the @kbd{t N} command,
560@kbd{h f sqrt @key{RET}} to read about the @code{sqrt} function, and
561@kbd{h s} to read the Calc summary.
562@end ifnotinfo
563@ifinfo
564@strong{Help functions.} You can read about any command in the on-line
565manual. Remember to type the letter @kbd{l}, then @kbd{C-x * c}, to
566return here after each of these commands: @w{@kbd{h k t N}} to read
567about the @w{@kbd{t N}} command, @kbd{h f sqrt @key{RET}} to read about the
568@code{sqrt} function, and @kbd{h s} to read the Calc summary.
569@end ifinfo
570
571Press @key{DEL} repeatedly to remove any leftover results from the stack.
572To exit from Calc, press @kbd{q} or @kbd{C-x * c} again.
573
574@node Using Calc, History and Acknowledgements, Demonstration of Calc, Getting Started
575@section Using Calc
576
577@noindent
578Calc has several user interfaces that are specialized for
579different kinds of tasks. As well as Calc's standard interface,
580there are Quick mode, Keypad mode, and Embedded mode.
581
582@menu
583* Starting Calc::
584* The Standard Interface::
585* Quick Mode Overview::
586* Keypad Mode Overview::
587* Standalone Operation::
588* Embedded Mode Overview::
589* Other C-x * Commands::
590@end menu
591
592@node Starting Calc, The Standard Interface, Using Calc, Using Calc
593@subsection Starting Calc
594
595@noindent
596On most systems, you can type @kbd{C-x *} to start the Calculator.
597The key sequence @kbd{C-x *} is bound to the command @code{calc-dispatch},
598which can be rebound if convenient (@pxref{Customizing Calc}).
599
600When you press @kbd{C-x *}, Emacs waits for you to press a second key to
601complete the command. In this case, you will follow @kbd{C-x *} with a
602letter (upper- or lower-case, it doesn't matter for @kbd{C-x *}) that says
603which Calc interface you want to use.
604
605To get Calc's standard interface, type @kbd{C-x * c}. To get
606Keypad mode, type @kbd{C-x * k}. Type @kbd{C-x * ?} to get a brief
607list of the available options, and type a second @kbd{?} to get
608a complete list.
609
610To ease typing, @kbd{C-x * *} also works to start Calc. It starts the
611same interface (either @kbd{C-x * c} or @w{@kbd{C-x * k}}) that you last
612used, selecting the @kbd{C-x * c} interface by default.
613
614If @kbd{C-x *} doesn't work for you, you can always type explicit
615commands like @kbd{M-x calc} (for the standard user interface) or
616@w{@kbd{M-x calc-keypad}} (for Keypad mode). First type @kbd{M-x}
617(that's Meta with the letter @kbd{x}), then, at the prompt,
618type the full command (like @kbd{calc-keypad}) and press Return.
619
620The same commands (like @kbd{C-x * c} or @kbd{C-x * *}) that start
621the Calculator also turn it off if it is already on.
622
623@node The Standard Interface, Quick Mode Overview, Starting Calc, Using Calc
624@subsection The Standard Calc Interface
625
626@noindent
627@cindex Standard user interface
628Calc's standard interface acts like a traditional RPN calculator,
629operated by the normal Emacs keyboard. When you type @kbd{C-x * c}
630to start the Calculator, the Emacs screen splits into two windows
631with the file you were editing on top and Calc on the bottom.
632
633@smallexample
634@group
635
636...
637--**-Emacs: myfile (Fundamental)----All----------------------
638--- Emacs Calculator Mode --- |Emacs Calculator Trail
6392: 17.3 | 17.3
6401: -5 | 3
641 . | 2
642 | 4
643 | * 8
644 | ->-5
645 |
646--%%-Calc: 12 Deg (Calculator)----All----- --%%-Emacs: *Calc Trail*
647@end group
648@end smallexample
649
650In this figure, the mode-line for @file{myfile} has moved up and the
651``Calculator'' window has appeared below it. As you can see, Calc
652actually makes two windows side-by-side. The lefthand one is
653called the @dfn{stack window} and the righthand one is called the
654@dfn{trail window.} The stack holds the numbers involved in the
655calculation you are currently performing. The trail holds a complete
656record of all calculations you have done. In a desk calculator with
657a printer, the trail corresponds to the paper tape that records what
658you do.
659
660In this case, the trail shows that four numbers (17.3, 3, 2, and 4)
661were first entered into the Calculator, then the 2 and 4 were
662multiplied to get 8, then the 3 and 8 were subtracted to get @mathit{-5}.
663(The @samp{>} symbol shows that this was the most recent calculation.)
664The net result is the two numbers 17.3 and @mathit{-5} sitting on the stack.
665
666Most Calculator commands deal explicitly with the stack only, but
667there is a set of commands that allow you to search back through
668the trail and retrieve any previous result.
669
670Calc commands use the digits, letters, and punctuation keys.
671Shifted (i.e., upper-case) letters are different from lowercase
672letters. Some letters are @dfn{prefix} keys that begin two-letter
673commands. For example, @kbd{e} means ``enter exponent'' and shifted
674@kbd{E} means @expr{e^x}. With the @kbd{d} (``display modes'') prefix
675the letter ``e'' takes on very different meanings: @kbd{d e} means
676``engineering notation'' and @kbd{d E} means ``@dfn{eqn} language mode.''
677
678There is nothing stopping you from switching out of the Calc
679window and back into your editing window, say by using the Emacs
680@w{@kbd{C-x o}} (@code{other-window}) command. When the cursor is
681inside a regular window, Emacs acts just like normal. When the
682cursor is in the Calc stack or trail windows, keys are interpreted
683as Calc commands.
684
685When you quit by pressing @kbd{C-x * c} a second time, the Calculator
686windows go away but the actual Stack and Trail are not gone, just
687hidden. When you press @kbd{C-x * c} once again you will get the
688same stack and trail contents you had when you last used the
689Calculator.
690
691The Calculator does not remember its state between Emacs sessions.
692Thus if you quit Emacs and start it again, @kbd{C-x * c} will give you
693a fresh stack and trail. There is a command (@kbd{m m}) that lets
694you save your favorite mode settings between sessions, though.
695One of the things it saves is which user interface (standard or
696Keypad) you last used; otherwise, a freshly started Emacs will
697always treat @kbd{C-x * *} the same as @kbd{C-x * c}.
698
699The @kbd{q} key is another equivalent way to turn the Calculator off.
700
701If you type @kbd{C-x * b} first and then @kbd{C-x * c}, you get a
702full-screen version of Calc (@code{full-calc}) in which the stack and
703trail windows are still side-by-side but are now as tall as the whole
704Emacs screen. When you press @kbd{q} or @kbd{C-x * c} again to quit,
705the file you were editing before reappears. The @kbd{C-x * b} key
706switches back and forth between ``big'' full-screen mode and the
707normal partial-screen mode.
708
709Finally, @kbd{C-x * o} (@code{calc-other-window}) is like @kbd{C-x * c}
710except that the Calc window is not selected. The buffer you were
711editing before remains selected instead. @kbd{C-x * o} is a handy
712way to switch out of Calc momentarily to edit your file; type
713@kbd{C-x * c} to switch back into Calc when you are done.
714
715@node Quick Mode Overview, Keypad Mode Overview, The Standard Interface, Using Calc
716@subsection Quick Mode (Overview)
717
718@noindent
719@dfn{Quick mode} is a quick way to use Calc when you don't need the
720full complexity of the stack and trail. To use it, type @kbd{C-x * q}
721(@code{quick-calc}) in any regular editing buffer.
722
723Quick mode is very simple: It prompts you to type any formula in
724standard algebraic notation (like @samp{4 - 2/3}) and then displays
725the result at the bottom of the Emacs screen (@mathit{3.33333333333}
726in this case). You are then back in the same editing buffer you
727were in before, ready to continue editing or to type @kbd{C-x * q}
728again to do another quick calculation. The result of the calculation
729will also be in the Emacs ``kill ring'' so that a @kbd{C-y} command
730at this point will yank the result into your editing buffer.
731
732Calc mode settings affect Quick mode, too, though you will have to
733go into regular Calc (with @kbd{C-x * c}) to change the mode settings.
734
735@c [fix-ref Quick Calculator mode]
736@xref{Quick Calculator}, for further information.
737
738@node Keypad Mode Overview, Standalone Operation, Quick Mode Overview, Using Calc
739@subsection Keypad Mode (Overview)
740
741@noindent
742@dfn{Keypad mode} is a mouse-based interface to the Calculator.
743It is designed for use with terminals that support a mouse. If you
744don't have a mouse, you will have to operate Keypad mode with your
745arrow keys (which is probably more trouble than it's worth).
746
747Type @kbd{C-x * k} to turn Keypad mode on or off. Once again you
748get two new windows, this time on the righthand side of the screen
749instead of at the bottom. The upper window is the familiar Calc
750Stack; the lower window is a picture of a typical calculator keypad.
751
752@tex
753\dimen0=\pagetotal%
754\advance \dimen0 by 24\baselineskip%
755\ifdim \dimen0>\pagegoal \vfill\eject \fi%
756\medskip
757@end tex
758@smallexample
759@group
760|--- Emacs Calculator Mode ---
761|2: 17.3
762|1: -5
763| .
764|--%%-Calc: 12 Deg (Calcul
765|----+-----Calc 2.1------+----1
766|FLR |CEIL|RND |TRNC|CLN2|FLT |
767|----+----+----+----+----+----|
768| LN |EXP | |ABS |IDIV|MOD |
769|----+----+----+----+----+----|
770|SIN |COS |TAN |SQRT|y^x |1/x |
771|----+----+----+----+----+----|
772| ENTER |+/- |EEX |UNDO| <- |
773|-----+---+-+--+--+-+---++----|
774| INV | 7 | 8 | 9 | / |
775|-----+-----+-----+-----+-----|
776| HYP | 4 | 5 | 6 | * |
777|-----+-----+-----+-----+-----|
778|EXEC | 1 | 2 | 3 | - |
779|-----+-----+-----+-----+-----|
780| OFF | 0 | . | PI | + |
781|-----+-----+-----+-----+-----+
782@end group
783@end smallexample
784
785Keypad mode is much easier for beginners to learn, because there
786is no need to memorize lots of obscure key sequences. But not all
787commands in regular Calc are available on the Keypad. You can
788always switch the cursor into the Calc stack window to use
789standard Calc commands if you need. Serious Calc users, though,
790often find they prefer the standard interface over Keypad mode.
791
792To operate the Calculator, just click on the ``buttons'' of the
793keypad using your left mouse button. To enter the two numbers
794shown here you would click @w{@kbd{1 7 .@: 3 ENTER 5 +/- ENTER}}; to
795add them together you would then click @kbd{+} (to get 12.3 on
796the stack).
797
798If you click the right mouse button, the top three rows of the
799keypad change to show other sets of commands, such as advanced
800math functions, vector operations, and operations on binary
801numbers.
802
803Because Keypad mode doesn't use the regular keyboard, Calc leaves
804the cursor in your original editing buffer. You can type in
805this buffer in the usual way while also clicking on the Calculator
806keypad. One advantage of Keypad mode is that you don't need an
807explicit command to switch between editing and calculating.
808
809If you press @kbd{C-x * b} first, you get a full-screen Keypad mode
810(@code{full-calc-keypad}) with three windows: The keypad in the lower
811left, the stack in the lower right, and the trail on top.
812
813@c [fix-ref Keypad Mode]
814@xref{Keypad Mode}, for further information.
815
816@node Standalone Operation, Embedded Mode Overview, Keypad Mode Overview, Using Calc
817@subsection Standalone Operation
818
819@noindent
820@cindex Standalone Operation
821If you are not in Emacs at the moment but you wish to use Calc,
822you must start Emacs first. If all you want is to run Calc, you
823can give the commands:
824
825@example
826emacs -f full-calc
827@end example
828
829@noindent
830or
831
832@example
833emacs -f full-calc-keypad
834@end example
835
836@noindent
837which run a full-screen Calculator (as if by @kbd{C-x * b C-x * c}) or
838a full-screen X-based Calculator (as if by @kbd{C-x * b C-x * k}).
839In standalone operation, quitting the Calculator (by pressing
840@kbd{q} or clicking on the keypad @key{EXIT} button) quits Emacs
841itself.
842
843@node Embedded Mode Overview, Other C-x * Commands, Standalone Operation, Using Calc
844@subsection Embedded Mode (Overview)
845
846@noindent
847@dfn{Embedded mode} is a way to use Calc directly from inside an
848editing buffer. Suppose you have a formula written as part of a
849document like this:
850
851@smallexample
852@group
853The derivative of
854
855 ln(ln(x))
856
857is
858@end group
859@end smallexample
860
861@noindent
862and you wish to have Calc compute and format the derivative for
863you and store this derivative in the buffer automatically. To
864do this with Embedded mode, first copy the formula down to where
865you want the result to be:
866
867@smallexample
868@group
869The derivative of
870
871 ln(ln(x))
872
873is
874
875 ln(ln(x))
876@end group
877@end smallexample
878
879Now, move the cursor onto this new formula and press @kbd{C-x * e}.
880Calc will read the formula (using the surrounding blank lines to
881tell how much text to read), then push this formula (invisibly)
882onto the Calc stack. The cursor will stay on the formula in the
883editing buffer, but the buffer's mode line will change to look
884like the Calc mode line (with mode indicators like @samp{12 Deg}
885and so on). Even though you are still in your editing buffer,
886the keyboard now acts like the Calc keyboard, and any new result
887you get is copied from the stack back into the buffer. To take
888the derivative, you would type @kbd{a d x @key{RET}}.
889
890@smallexample
891@group
892The derivative of
893
894 ln(ln(x))
895
896is
897
8981 / ln(x) x
899@end group
900@end smallexample
901
902To make this look nicer, you might want to press @kbd{d =} to center
903the formula, and even @kbd{d B} to use Big display mode.
904
905@smallexample
906@group
907The derivative of
908
909 ln(ln(x))
910
911is
912% [calc-mode: justify: center]
913% [calc-mode: language: big]
914
915 1
916 -------
917 ln(x) x
918@end group
919@end smallexample
920
921Calc has added annotations to the file to help it remember the modes
922that were used for this formula. They are formatted like comments
923in the @TeX{} typesetting language, just in case you are using @TeX{} or
924La@TeX{}. (In this example @TeX{} is not being used, so you might want
925to move these comments up to the top of the file or otherwise put them
926out of the way.)
927
928As an extra flourish, we can add an equation number using a
929righthand label: Type @kbd{d @} (1) @key{RET}}.
930
931@smallexample
932@group
933% [calc-mode: justify: center]
934% [calc-mode: language: big]
935% [calc-mode: right-label: " (1)"]
936
937 1
938 ------- (1)
939 ln(x) x
940@end group
941@end smallexample
942
943To leave Embedded mode, type @kbd{C-x * e} again. The mode line
944and keyboard will revert to the way they were before.
945
946The related command @kbd{C-x * w} operates on a single word, which
947generally means a single number, inside text. It uses any
948non-numeric characters rather than blank lines to delimit the
949formula it reads. Here's an example of its use:
950
951@smallexample
952A slope of one-third corresponds to an angle of 1 degrees.
953@end smallexample
954
955Place the cursor on the @samp{1}, then type @kbd{C-x * w} to enable
956Embedded mode on that number. Now type @kbd{3 /} (to get one-third),
957and @kbd{I T} (the Inverse Tangent converts a slope into an angle),
958then @w{@kbd{C-x * w}} again to exit Embedded mode.
959
960@smallexample
961A slope of one-third corresponds to an angle of 18.4349488229 degrees.
962@end smallexample
963
964@c [fix-ref Embedded Mode]
965@xref{Embedded Mode}, for full details.
966
967@node Other C-x * Commands, , Embedded Mode Overview, Using Calc
968@subsection Other @kbd{C-x *} Commands
969
970@noindent
971Two more Calc-related commands are @kbd{C-x * g} and @kbd{C-x * r},
972which ``grab'' data from a selected region of a buffer into the
973Calculator. The region is defined in the usual Emacs way, by
974a ``mark'' placed at one end of the region, and the Emacs
975cursor or ``point'' placed at the other.
976
977The @kbd{C-x * g} command reads the region in the usual left-to-right,
978top-to-bottom order. The result is packaged into a Calc vector
979of numbers and placed on the stack. Calc (in its standard
980user interface) is then started. Type @kbd{v u} if you want
981to unpack this vector into separate numbers on the stack. Also,
982@kbd{C-u C-x * g} interprets the region as a single number or
983formula.
984
985The @kbd{C-x * r} command reads a rectangle, with the point and
986mark defining opposite corners of the rectangle. The result
987is a matrix of numbers on the Calculator stack.
988
989Complementary to these is @kbd{C-x * y}, which ``yanks'' the
990value at the top of the Calc stack back into an editing buffer.
991If you type @w{@kbd{C-x * y}} while in such a buffer, the value is
992yanked at the current position. If you type @kbd{C-x * y} while
993in the Calc buffer, Calc makes an educated guess as to which
994editing buffer you want to use. The Calc window does not have
995to be visible in order to use this command, as long as there
996is something on the Calc stack.
997
998Here, for reference, is the complete list of @kbd{C-x *} commands.
999The shift, control, and meta keys are ignored for the keystroke
1000following @kbd{C-x *}.
1001
1002@noindent
1003Commands for turning Calc on and off:
1004
1005@table @kbd
1006@item *
1007Turn Calc on or off, employing the same user interface as last time.
1008
1009@item =, +, -, /, \, &, #
1010Alternatives for @kbd{*}.
1011
1012@item C
1013Turn Calc on or off using its standard bottom-of-the-screen
1014interface. If Calc is already turned on but the cursor is not
1015in the Calc window, move the cursor into the window.
1016
1017@item O
1018Same as @kbd{C}, but don't select the new Calc window. If
1019Calc is already turned on and the cursor is in the Calc window,
1020move it out of that window.
1021
1022@item B
1023Control whether @kbd{C-x * c} and @kbd{C-x * k} use the full screen.
1024
1025@item Q
1026Use Quick mode for a single short calculation.
1027
1028@item K
1029Turn Calc Keypad mode on or off.
1030
1031@item E
1032Turn Calc Embedded mode on or off at the current formula.
1033
1034@item J
1035Turn Calc Embedded mode on or off, select the interesting part.
1036
1037@item W
1038Turn Calc Embedded mode on or off at the current word (number).
1039
1040@item Z
1041Turn Calc on in a user-defined way, as defined by a @kbd{Z I} command.
1042
1043@item X
1044Quit Calc; turn off standard, Keypad, or Embedded mode if on.
1045(This is like @kbd{q} or @key{OFF} inside of Calc.)
1046@end table
1047@iftex
1048@sp 2
1049@end iftex
1050
1051@noindent
1052Commands for moving data into and out of the Calculator:
1053
1054@table @kbd
1055@item G
1056Grab the region into the Calculator as a vector.
1057
1058@item R
1059Grab the rectangular region into the Calculator as a matrix.
1060
1061@item :
1062Grab the rectangular region and compute the sums of its columns.
1063
1064@item _
1065Grab the rectangular region and compute the sums of its rows.
1066
1067@item Y
1068Yank a value from the Calculator into the current editing buffer.
1069@end table
1070@iftex
1071@sp 2
1072@end iftex
1073
1074@noindent
1075Commands for use with Embedded mode:
1076
1077@table @kbd
1078@item A
1079``Activate'' the current buffer. Locate all formulas that
1080contain @samp{:=} or @samp{=>} symbols and record their locations
1081so that they can be updated automatically as variables are changed.
1082
1083@item D
1084Duplicate the current formula immediately below and select
1085the duplicate.
1086
1087@item F
1088Insert a new formula at the current point.
1089
1090@item N
1091Move the cursor to the next active formula in the buffer.
1092
1093@item P
1094Move the cursor to the previous active formula in the buffer.
1095
1096@item U
1097Update (i.e., as if by the @kbd{=} key) the formula at the current point.
1098
1099@item `
1100Edit (as if by @code{calc-edit}) the formula at the current point.
1101@end table
1102@iftex
1103@sp 2
1104@end iftex
1105
1106@noindent
1107Miscellaneous commands:
1108
1109@table @kbd
1110@item I
1111Run the Emacs Info system to read the Calc manual.
1112(This is the same as @kbd{h i} inside of Calc.)
1113
1114@item T
1115Run the Emacs Info system to read the Calc Tutorial.
1116
1117@item S
1118Run the Emacs Info system to read the Calc Summary.
1119
1120@item L
1121Load Calc entirely into memory. (Normally the various parts
1122are loaded only as they are needed.)
1123
1124@item M
1125Read a region of written keystroke names (like @kbd{C-n a b c @key{RET}})
1126and record them as the current keyboard macro.
1127
1128@item 0
1129(This is the ``zero'' digit key.) Reset the Calculator to
1130its initial state: Empty stack, and initial mode settings.
1131@end table
1132
1133@node History and Acknowledgements, , Using Calc, Getting Started
1134@section History and Acknowledgements
1135
1136@noindent
1137Calc was originally started as a two-week project to occupy a lull
1138in the author's schedule. Basically, a friend asked if I remembered
1139the value of
1140@texline @math{2^{32}}.
1141@infoline @expr{2^32}.
1142I didn't offhand, but I said, ``that's easy, just call up an
1143@code{xcalc}.'' @code{Xcalc} duly reported that the answer to our
1144question was @samp{4.294967e+09}---with no way to see the full ten
1145digits even though we knew they were there in the program's memory! I
1146was so annoyed, I vowed to write a calculator of my own, once and for
1147all.
1148
1149I chose Emacs Lisp, a) because I had always been curious about it
1150and b) because, being only a text editor extension language after
1151all, Emacs Lisp would surely reach its limits long before the project
1152got too far out of hand.
1153
1154To make a long story short, Emacs Lisp turned out to be a distressingly
1155solid implementation of Lisp, and the humble task of calculating
1156turned out to be more open-ended than one might have expected.
1157
1158Emacs Lisp didn't have built-in floating point math (now it does), so
4bb49b43
JB
1159this had to be simulated in software. In fact, Emacs integers would
1160only comfortably fit six decimal digits or so---not enough for a decent
1161calculator. So I had to write my own high-precision integer code as
1162well, and once I had this I figured that arbitrary-size integers were
1163just as easy as large integers. Arbitrary floating-point precision was
1164the logical next step. Also, since the large integer arithmetic was
1165there anyway it seemed only fair to give the user direct access to it,
1166which in turn made it practical to support fractions as well as floats.
1167All these features inspired me to look around for other data types that
1168might be worth having.
4009494e
GM
1169
1170Around this time, my friend Rick Koshi showed me his nifty new HP-28
1171calculator. It allowed the user to manipulate formulas as well as
1172numerical quantities, and it could also operate on matrices. I
1173decided that these would be good for Calc to have, too. And once
1174things had gone this far, I figured I might as well take a look at
1175serious algebra systems for further ideas. Since these systems did
1176far more than I could ever hope to implement, I decided to focus on
1177rewrite rules and other programming features so that users could
1178implement what they needed for themselves.
1179
1180Rick complained that matrices were hard to read, so I put in code to
1181format them in a 2D style. Once these routines were in place, Big mode
1182was obligatory. Gee, what other language modes would be useful?
1183
1184Scott Hemphill and Allen Knutson, two friends with a strong mathematical
1185bent, contributed ideas and algorithms for a number of Calc features
1186including modulo forms, primality testing, and float-to-fraction conversion.
1187
1188Units were added at the eager insistence of Mass Sivilotti. Later,
1189Ulrich Mueller at CERN and Przemek Klosowski at NIST provided invaluable
1190expert assistance with the units table. As far as I can remember, the
1191idea of using algebraic formulas and variables to represent units dates
1192back to an ancient article in Byte magazine about muMath, an early
1193algebra system for microcomputers.
1194
1195Many people have contributed to Calc by reporting bugs and suggesting
1196features, large and small. A few deserve special mention: Tim Peters,
1197who helped develop the ideas that led to the selection commands, rewrite
1198rules, and many other algebra features;
1199@texline Fran\c{c}ois
1200@infoline Francois
1201Pinard, who contributed an early prototype of the Calc Summary appendix
1202as well as providing valuable suggestions in many other areas of Calc;
1203Carl Witty, whose eagle eyes discovered many typographical and factual
1204errors in the Calc manual; Tim Kay, who drove the development of
1205Embedded mode; Ove Ewerlid, who made many suggestions relating to the
1206algebra commands and contributed some code for polynomial operations;
f10d0e80 1207Randal Schwartz, who suggested the @code{calc-eval} function; Juha
4009494e 1208Sarlin, who first worked out how to split Calc into quickly-loading
f10d0e80
JB
1209parts; Bob Weiner, who helped immensely with the Lucid Emacs port; and
1210Robert J. Chassell, who suggested the Calc Tutorial and exercises as
1211well as many other things.
4009494e
GM
1212
1213@cindex Bibliography
1214@cindex Knuth, Art of Computer Programming
1215@cindex Numerical Recipes
1216@c Should these be expanded into more complete references?
1217Among the books used in the development of Calc were Knuth's @emph{Art
1218of Computer Programming} (especially volume II, @emph{Seminumerical
1219Algorithms}); @emph{Numerical Recipes} by Press, Flannery, Teukolsky,
1220and Vetterling; Bevington's @emph{Data Reduction and Error Analysis
1221for the Physical Sciences}; @emph{Concrete Mathematics} by Graham,
1222Knuth, and Patashnik; Steele's @emph{Common Lisp, the Language}; the
1223@emph{CRC Standard Math Tables} (William H. Beyer, ed.); and
1224Abramowitz and Stegun's venerable @emph{Handbook of Mathematical
1225Functions}. Also, of course, Calc could not have been written without
1226the excellent @emph{GNU Emacs Lisp Reference Manual}, by Bil Lewis and
1227Dan LaLiberte.
1228
1229Final thanks go to Richard Stallman, without whose fine implementations
1230of the Emacs editor, language, and environment, Calc would have been
1231finished in two weeks.
1232
1233@c [tutorial]
1234
1235@ifinfo
1236@c This node is accessed by the `C-x * t' command.
1237@node Interactive Tutorial, Tutorial, Getting Started, Top
1238@chapter Tutorial
1239
1240@noindent
1241Some brief instructions on using the Emacs Info system for this tutorial:
1242
1243Press the space bar and Delete keys to go forward and backward in a
1244section by screenfuls (or use the regular Emacs scrolling commands
1245for this).
1246
1247Press @kbd{n} or @kbd{p} to go to the Next or Previous section.
1248If the section has a @dfn{menu}, press a digit key like @kbd{1}
1249or @kbd{2} to go to a sub-section from the menu. Press @kbd{u} to
1250go back up from a sub-section to the menu it is part of.
1251
1252Exercises in the tutorial all have cross-references to the
1253appropriate page of the ``answers'' section. Press @kbd{f}, then
1254the exercise number, to see the answer to an exercise. After
1255you have followed a cross-reference, you can press the letter
1256@kbd{l} to return to where you were before.
1257
1258You can press @kbd{?} at any time for a brief summary of Info commands.
1259
1260Press @kbd{1} now to enter the first section of the Tutorial.
1261
1262@menu
1263* Tutorial::
1264@end menu
1265
1266@node Tutorial, Introduction, Interactive Tutorial, Top
1267@end ifinfo
1268@ifnotinfo
1269@node Tutorial, Introduction, Getting Started, Top
1270@end ifnotinfo
1271@chapter Tutorial
1272
1273@noindent
1274This chapter explains how to use Calc and its many features, in
1275a step-by-step, tutorial way. You are encouraged to run Calc and
1276work along with the examples as you read (@pxref{Starting Calc}).
1277If you are already familiar with advanced calculators, you may wish
1278@c [not-split]
1279to skip on to the rest of this manual.
1280@c [when-split]
1281@c to skip on to volume II of this manual, the @dfn{Calc Reference}.
1282
1283@c [fix-ref Embedded Mode]
1284This tutorial describes the standard user interface of Calc only.
1285The Quick mode and Keypad mode interfaces are fairly
1286self-explanatory. @xref{Embedded Mode}, for a description of
1287the Embedded mode interface.
1288
1289The easiest way to read this tutorial on-line is to have two windows on
1290your Emacs screen, one with Calc and one with the Info system. (If you
1291have a printed copy of the manual you can use that instead.) Press
1292@kbd{C-x * c} to turn Calc on or to switch into the Calc window, and
1293press @kbd{C-x * i} to start the Info system or to switch into its window.
1294
1295This tutorial is designed to be done in sequence. But the rest of this
1296manual does not assume you have gone through the tutorial. The tutorial
1297does not cover everything in the Calculator, but it touches on most
1298general areas.
1299
1300@ifnottex
1301You may wish to print out a copy of the Calc Summary and keep notes on
1302it as you learn Calc. @xref{About This Manual}, to see how to make a
1303printed summary. @xref{Summary}.
1304@end ifnottex
1305@iftex
1306The Calc Summary at the end of the reference manual includes some blank
1307space for your own use. You may wish to keep notes there as you learn
1308Calc.
1309@end iftex
1310
1311@menu
1312* Basic Tutorial::
1313* Arithmetic Tutorial::
1314* Vector/Matrix Tutorial::
1315* Types Tutorial::
1316* Algebra Tutorial::
1317* Programming Tutorial::
1318
1319* Answers to Exercises::
1320@end menu
1321
1322@node Basic Tutorial, Arithmetic Tutorial, Tutorial, Tutorial
1323@section Basic Tutorial
1324
1325@noindent
1326In this section, we learn how RPN and algebraic-style calculations
1327work, how to undo and redo an operation done by mistake, and how
1328to control various modes of the Calculator.
1329
1330@menu
1331* RPN Tutorial:: Basic operations with the stack.
1332* Algebraic Tutorial:: Algebraic entry; variables.
1333* Undo Tutorial:: If you make a mistake: Undo and the trail.
1334* Modes Tutorial:: Common mode-setting commands.
1335@end menu
1336
1337@node RPN Tutorial, Algebraic Tutorial, Basic Tutorial, Basic Tutorial
1338@subsection RPN Calculations and the Stack
1339
1340@cindex RPN notation
1341@ifnottex
1342@noindent
1343Calc normally uses RPN notation. You may be familiar with the RPN
1344system from Hewlett-Packard calculators, FORTH, or PostScript.
1345(Reverse Polish Notation, RPN, is named after the Polish mathematician
1346Jan Lukasiewicz.)
1347@end ifnottex
1348@tex
1349\noindent
1350Calc normally uses RPN notation. You may be familiar with the RPN
1351system from Hewlett-Packard calculators, FORTH, or PostScript.
1352(Reverse Polish Notation, RPN, is named after the Polish mathematician
1353Jan \L ukasiewicz.)
1354@end tex
1355
1356The central component of an RPN calculator is the @dfn{stack}. A
1357calculator stack is like a stack of dishes. New dishes (numbers) are
1358added at the top of the stack, and numbers are normally only removed
1359from the top of the stack.
1360
1361@cindex Operators
1362@cindex Operands
1363In an operation like @expr{2+3}, the 2 and 3 are called the @dfn{operands}
1364and the @expr{+} is the @dfn{operator}. In an RPN calculator you always
1365enter the operands first, then the operator. Each time you type a
1366number, Calc adds or @dfn{pushes} it onto the top of the Stack.
1367When you press an operator key like @kbd{+}, Calc @dfn{pops} the appropriate
1368number of operands from the stack and pushes back the result.
1369
1370Thus we could add the numbers 2 and 3 in an RPN calculator by typing:
1371@kbd{2 @key{RET} 3 @key{RET} +}. (The @key{RET} key, Return, corresponds to
1372the @key{ENTER} key on traditional RPN calculators.) Try this now if
1373you wish; type @kbd{C-x * c} to switch into the Calc window (you can type
1374@kbd{C-x * c} again or @kbd{C-x * o} to switch back to the Tutorial window).
1375The first four keystrokes ``push'' the numbers 2 and 3 onto the stack.
1376The @kbd{+} key ``pops'' the top two numbers from the stack, adds them,
1377and pushes the result (5) back onto the stack. Here's how the stack
1378will look at various points throughout the calculation:
1379
1380@smallexample
1381@group
1382 . 1: 2 2: 2 1: 5 .
1383 . 1: 3 .
1384 .
1385
1386 C-x * c 2 @key{RET} 3 @key{RET} + @key{DEL}
1387@end group
1388@end smallexample
1389
1390The @samp{.} symbol is a marker that represents the top of the stack.
1391Note that the ``top'' of the stack is really shown at the bottom of
1392the Stack window. This may seem backwards, but it turns out to be
1393less distracting in regular use.
1394
1395@cindex Stack levels
1396@cindex Levels of stack
1397The numbers @samp{1:} and @samp{2:} on the left are @dfn{stack level
1398numbers}. Old RPN calculators always had four stack levels called
1399@expr{x}, @expr{y}, @expr{z}, and @expr{t}. Calc's stack can grow
1400as large as you like, so it uses numbers instead of letters. Some
1401stack-manipulation commands accept a numeric argument that says
1402which stack level to work on. Normal commands like @kbd{+} always
1403work on the top few levels of the stack.
1404
1405@c [fix-ref Truncating the Stack]
1406The Stack buffer is just an Emacs buffer, and you can move around in
1407it using the regular Emacs motion commands. But no matter where the
1408cursor is, even if you have scrolled the @samp{.} marker out of
1409view, most Calc commands always move the cursor back down to level 1
1410before doing anything. It is possible to move the @samp{.} marker
1411upwards through the stack, temporarily ``hiding'' some numbers from
1412commands like @kbd{+}. This is called @dfn{stack truncation} and
1413we will not cover it in this tutorial; @pxref{Truncating the Stack},
1414if you are interested.
1415
1416You don't really need the second @key{RET} in @kbd{2 @key{RET} 3
1417@key{RET} +}. That's because if you type any operator name or
1418other non-numeric key when you are entering a number, the Calculator
1419automatically enters that number and then does the requested command.
1420Thus @kbd{2 @key{RET} 3 +} will work just as well.
1421
1422Examples in this tutorial will often omit @key{RET} even when the
1423stack displays shown would only happen if you did press @key{RET}:
1424
1425@smallexample
1426@group
14271: 2 2: 2 1: 5
1428 . 1: 3 .
1429 .
1430
1431 2 @key{RET} 3 +
1432@end group
1433@end smallexample
1434
1435@noindent
1436Here, after pressing @kbd{3} the stack would really show @samp{1: 2}
1437with @samp{Calc:@: 3} in the minibuffer. In these situations, you can
1438press the optional @key{RET} to see the stack as the figure shows.
1439
1440(@bullet{}) @strong{Exercise 1.} (This tutorial will include exercises
1441at various points. Try them if you wish. Answers to all the exercises
1442are located at the end of the Tutorial chapter. Each exercise will
1443include a cross-reference to its particular answer. If you are
1444reading with the Emacs Info system, press @kbd{f} and the
1445exercise number to go to the answer, then the letter @kbd{l} to
1446return to where you were.)
1447
1448@noindent
1449Here's the first exercise: What will the keystrokes @kbd{1 @key{RET} 2
1450@key{RET} 3 @key{RET} 4 + * -} compute? (@samp{*} is the symbol for
1451multiplication.) Figure it out by hand, then try it with Calc to see
1452if you're right. @xref{RPN Answer 1, 1}. (@bullet{})
1453
1454(@bullet{}) @strong{Exercise 2.} Compute
1455@texline @math{(2\times4) + (7\times9.4) + {5\over4}}
1456@infoline @expr{2*4 + 7*9.5 + 5/4}
1457using the stack. @xref{RPN Answer 2, 2}. (@bullet{})
1458
1459The @key{DEL} key is called Backspace on some keyboards. It is
1460whatever key you would use to correct a simple typing error when
1461regularly using Emacs. The @key{DEL} key pops and throws away the
1462top value on the stack. (You can still get that value back from
1463the Trail if you should need it later on.) There are many places
1464in this tutorial where we assume you have used @key{DEL} to erase the
1465results of the previous example at the beginning of a new example.
1466In the few places where it is really important to use @key{DEL} to
1467clear away old results, the text will remind you to do so.
1468
1469(It won't hurt to let things accumulate on the stack, except that
1470whenever you give a display-mode-changing command Calc will have to
1471spend a long time reformatting such a large stack.)
1472
1473Since the @kbd{-} key is also an operator (it subtracts the top two
1474stack elements), how does one enter a negative number? Calc uses
1475the @kbd{_} (underscore) key to act like the minus sign in a number.
1476So, typing @kbd{-5 @key{RET}} won't work because the @kbd{-} key
1477will try to do a subtraction, but @kbd{_5 @key{RET}} works just fine.
1478
1479You can also press @kbd{n}, which means ``change sign.'' It changes
1480the number at the top of the stack (or the number being entered)
1481from positive to negative or vice-versa: @kbd{5 n @key{RET}}.
1482
1483@cindex Duplicating a stack entry
1484If you press @key{RET} when you're not entering a number, the effect
1485is to duplicate the top number on the stack. Consider this calculation:
1486
1487@smallexample
1488@group
14891: 3 2: 3 1: 9 2: 9 1: 81
1490 . 1: 3 . 1: 9 .
1491 . .
1492
1493 3 @key{RET} @key{RET} * @key{RET} *
1494@end group
1495@end smallexample
1496
1497@noindent
1498(Of course, an easier way to do this would be @kbd{3 @key{RET} 4 ^},
1499to raise 3 to the fourth power.)
1500
1501The space-bar key (denoted @key{SPC} here) performs the same function
1502as @key{RET}; you could replace all three occurrences of @key{RET} in
1503the above example with @key{SPC} and the effect would be the same.
1504
1505@cindex Exchanging stack entries
1506Another stack manipulation key is @key{TAB}. This exchanges the top
1507two stack entries. Suppose you have computed @kbd{2 @key{RET} 3 +}
1508to get 5, and then you realize what you really wanted to compute
1509was @expr{20 / (2+3)}.
1510
1511@smallexample
1512@group
15131: 5 2: 5 2: 20 1: 4
1514 . 1: 20 1: 5 .
1515 . .
1516
1517 2 @key{RET} 3 + 20 @key{TAB} /
1518@end group
1519@end smallexample
1520
1521@noindent
1522Planning ahead, the calculation would have gone like this:
1523
1524@smallexample
1525@group
15261: 20 2: 20 3: 20 2: 20 1: 4
1527 . 1: 2 2: 2 1: 5 .
1528 . 1: 3 .
1529 .
1530
1531 20 @key{RET} 2 @key{RET} 3 + /
1532@end group
1533@end smallexample
1534
1535A related stack command is @kbd{M-@key{TAB}} (hold @key{META} and type
1536@key{TAB}). It rotates the top three elements of the stack upward,
1537bringing the object in level 3 to the top.
1538
1539@smallexample
1540@group
15411: 10 2: 10 3: 10 3: 20 3: 30
1542 . 1: 20 2: 20 2: 30 2: 10
1543 . 1: 30 1: 10 1: 20
1544 . . .
1545
1546 10 @key{RET} 20 @key{RET} 30 @key{RET} M-@key{TAB} M-@key{TAB}
1547@end group
1548@end smallexample
1549
1550(@bullet{}) @strong{Exercise 3.} Suppose the numbers 10, 20, and 30 are
1551on the stack. Figure out how to add one to the number in level 2
1552without affecting the rest of the stack. Also figure out how to add
1553one to the number in level 3. @xref{RPN Answer 3, 3}. (@bullet{})
1554
1555Operations like @kbd{+}, @kbd{-}, @kbd{*}, @kbd{/}, and @kbd{^} pop two
1556arguments from the stack and push a result. Operations like @kbd{n} and
1557@kbd{Q} (square root) pop a single number and push the result. You can
1558think of them as simply operating on the top element of the stack.
1559
1560@smallexample
1561@group
15621: 3 1: 9 2: 9 1: 25 1: 5
1563 . . 1: 16 . .
1564 .
1565
1566 3 @key{RET} @key{RET} * 4 @key{RET} @key{RET} * + Q
1567@end group
1568@end smallexample
1569
1570@noindent
1571(Note that capital @kbd{Q} means to hold down the Shift key while
1572typing @kbd{q}. Remember, plain unshifted @kbd{q} is the Quit command.)
1573
1574@cindex Pythagorean Theorem
1575Here we've used the Pythagorean Theorem to determine the hypotenuse of a
1576right triangle. Calc actually has a built-in command for that called
1577@kbd{f h}, but let's suppose we can't remember the necessary keystrokes.
1578We can still enter it by its full name using @kbd{M-x} notation:
1579
1580@smallexample
1581@group
15821: 3 2: 3 1: 5
1583 . 1: 4 .
1584 .
1585
1586 3 @key{RET} 4 @key{RET} M-x calc-hypot
1587@end group
1588@end smallexample
1589
1590All Calculator commands begin with the word @samp{calc-}. Since it
1591gets tiring to type this, Calc provides an @kbd{x} key which is just
1592like the regular Emacs @kbd{M-x} key except that it types the @samp{calc-}
1593prefix for you:
1594
1595@smallexample
1596@group
15971: 3 2: 3 1: 5
1598 . 1: 4 .
1599 .
1600
1601 3 @key{RET} 4 @key{RET} x hypot
1602@end group
1603@end smallexample
1604
1605What happens if you take the square root of a negative number?
1606
1607@smallexample
1608@group
16091: 4 1: -4 1: (0, 2)
1610 . . .
1611
1612 4 @key{RET} n Q
1613@end group
1614@end smallexample
1615
1616@noindent
1617The notation @expr{(a, b)} represents a complex number.
1618Complex numbers are more traditionally written @expr{a + b i};
1619Calc can display in this format, too, but for now we'll stick to the
1620@expr{(a, b)} notation.
1621
1622If you don't know how complex numbers work, you can safely ignore this
1623feature. Complex numbers only arise from operations that would be
1624errors in a calculator that didn't have complex numbers. (For example,
1625taking the square root or logarithm of a negative number produces a
1626complex result.)
1627
1628Complex numbers are entered in the notation shown. The @kbd{(} and
1629@kbd{,} and @kbd{)} keys manipulate ``incomplete complex numbers.''
1630
1631@smallexample
1632@group
16331: ( ... 2: ( ... 1: (2, ... 1: (2, ... 1: (2, 3)
1634 . 1: 2 . 3 .
1635 . .
1636
1637 ( 2 , 3 )
1638@end group
1639@end smallexample
1640
1641You can perform calculations while entering parts of incomplete objects.
1642However, an incomplete object cannot actually participate in a calculation:
1643
1644@smallexample
1645@group
16461: ( ... 2: ( ... 3: ( ... 1: ( ... 1: ( ...
1647 . 1: 2 2: 2 5 5
1648 . 1: 3 . .
1649 .
1650 (error)
1651 ( 2 @key{RET} 3 + +
1652@end group
1653@end smallexample
1654
1655@noindent
1656Adding 5 to an incomplete object makes no sense, so the last command
1657produces an error message and leaves the stack the same.
1658
1659Incomplete objects can't participate in arithmetic, but they can be
1660moved around by the regular stack commands.
1661
1662@smallexample
1663@group
16642: 2 3: 2 3: 3 1: ( ... 1: (2, 3)
16651: 3 2: 3 2: ( ... 2 .
1666 . 1: ( ... 1: 2 3
1667 . . .
1668
16692 @key{RET} 3 @key{RET} ( M-@key{TAB} M-@key{TAB} )
1670@end group
1671@end smallexample
1672
1673@noindent
1674Note that the @kbd{,} (comma) key did not have to be used here.
1675When you press @kbd{)} all the stack entries between the incomplete
1676entry and the top are collected, so there's never really a reason
1677to use the comma. It's up to you.
1678
1679(@bullet{}) @strong{Exercise 4.} To enter the complex number @expr{(2, 3)},
1680your friend Joe typed @kbd{( 2 , @key{SPC} 3 )}. What happened?
1681(Joe thought of a clever way to correct his mistake in only two
1682keystrokes, but it didn't quite work. Try it to find out why.)
1683@xref{RPN Answer 4, 4}. (@bullet{})
1684
1685Vectors are entered the same way as complex numbers, but with square
1686brackets in place of parentheses. We'll meet vectors again later in
1687the tutorial.
1688
1689Any Emacs command can be given a @dfn{numeric prefix argument} by
1690typing a series of @key{META}-digits beforehand. If @key{META} is
1691awkward for you, you can instead type @kbd{C-u} followed by the
1692necessary digits. Numeric prefix arguments can be negative, as in
1693@kbd{M-- M-3 M-5} or @w{@kbd{C-u - 3 5}}. Calc commands use numeric
1694prefix arguments in a variety of ways. For example, a numeric prefix
1695on the @kbd{+} operator adds any number of stack entries at once:
1696
1697@smallexample
1698@group
16991: 10 2: 10 3: 10 3: 10 1: 60
1700 . 1: 20 2: 20 2: 20 .
1701 . 1: 30 1: 30
1702 . .
1703
1704 10 @key{RET} 20 @key{RET} 30 @key{RET} C-u 3 +
1705@end group
1706@end smallexample
1707
1708For stack manipulation commands like @key{RET}, a positive numeric
1709prefix argument operates on the top @var{n} stack entries at once. A
1710negative argument operates on the entry in level @var{n} only. An
1711argument of zero operates on the entire stack. In this example, we copy
1712the second-to-top element of the stack:
1713
1714@smallexample
1715@group
17161: 10 2: 10 3: 10 3: 10 4: 10
1717 . 1: 20 2: 20 2: 20 3: 20
1718 . 1: 30 1: 30 2: 30
1719 . . 1: 20
1720 .
1721
1722 10 @key{RET} 20 @key{RET} 30 @key{RET} C-u -2 @key{RET}
1723@end group
1724@end smallexample
1725
1726@cindex Clearing the stack
1727@cindex Emptying the stack
1728Another common idiom is @kbd{M-0 @key{DEL}}, which clears the stack.
1729(The @kbd{M-0} numeric prefix tells @key{DEL} to operate on the
1730entire stack.)
1731
1732@node Algebraic Tutorial, Undo Tutorial, RPN Tutorial, Basic Tutorial
1733@subsection Algebraic-Style Calculations
1734
1735@noindent
1736If you are not used to RPN notation, you may prefer to operate the
1737Calculator in Algebraic mode, which is closer to the way
1738non-RPN calculators work. In Algebraic mode, you enter formulas
1739in traditional @expr{2+3} notation.
1740
1741@strong{Warning:} Note that @samp{/} has lower precedence than
1742@samp{*}, so that @samp{a/b*c} is interpreted as @samp{a/(b*c)}. See
1743below for details.
1744
1745You don't really need any special ``mode'' to enter algebraic formulas.
1746You can enter a formula at any time by pressing the apostrophe (@kbd{'})
1747key. Answer the prompt with the desired formula, then press @key{RET}.
1748The formula is evaluated and the result is pushed onto the RPN stack.
1749If you don't want to think in RPN at all, you can enter your whole
1750computation as a formula, read the result from the stack, then press
1751@key{DEL} to delete it from the stack.
1752
1753Try pressing the apostrophe key, then @kbd{2+3+4}, then @key{RET}.
1754The result should be the number 9.
1755
1756Algebraic formulas use the operators @samp{+}, @samp{-}, @samp{*},
1757@samp{/}, and @samp{^}. You can use parentheses to make the order
1758of evaluation clear. In the absence of parentheses, @samp{^} is
1759evaluated first, then @samp{*}, then @samp{/}, then finally
1760@samp{+} and @samp{-}. For example, the expression
1761
1762@example
17632 + 3*4*5 / 6*7^8 - 9
1764@end example
1765
1766@noindent
1767is equivalent to
1768
1769@example
17702 + ((3*4*5) / (6*(7^8)) - 9
1771@end example
1772
1773@noindent
1774or, in large mathematical notation,
1775
1776@ifnottex
1777@example
1778@group
1779 3 * 4 * 5
17802 + --------- - 9
1781 8
1782 6 * 7
1783@end group
1784@end example
1785@end ifnottex
1786@tex
1787\turnoffactive
1788\beforedisplay
1789$$ 2 + { 3 \times 4 \times 5 \over 6 \times 7^8 } - 9 $$
1790\afterdisplay
1791@end tex
1792
1793@noindent
1794The result of this expression will be the number @mathit{-6.99999826533}.
1795
1796Calc's order of evaluation is the same as for most computer languages,
1797except that @samp{*} binds more strongly than @samp{/}, as the above
1798example shows. As in normal mathematical notation, the @samp{*} symbol
1799can often be omitted: @samp{2 a} is the same as @samp{2*a}.
1800
1801Operators at the same level are evaluated from left to right, except
1802that @samp{^} is evaluated from right to left. Thus, @samp{2-3-4} is
1803equivalent to @samp{(2-3)-4} or @mathit{-5}, whereas @samp{2^3^4} is equivalent
1804to @samp{2^(3^4)} (a very large integer; try it!).
1805
1806If you tire of typing the apostrophe all the time, there is
1807Algebraic mode, where Calc automatically senses
1808when you are about to type an algebraic expression. To enter this
1809mode, press the two letters @w{@kbd{m a}}. (An @samp{Alg} indicator
1810should appear in the Calc window's mode line.)
1811
1812Press @kbd{m a}, then @kbd{2+3+4} with no apostrophe, then @key{RET}.
1813
1814In Algebraic mode, when you press any key that would normally begin
1815entering a number (such as a digit, a decimal point, or the @kbd{_}
1816key), or if you press @kbd{(} or @kbd{[}, Calc automatically begins
1817an algebraic entry.
1818
1819Functions which do not have operator symbols like @samp{+} and @samp{*}
1820must be entered in formulas using function-call notation. For example,
1821the function name corresponding to the square-root key @kbd{Q} is
1822@code{sqrt}. To compute a square root in a formula, you would use
1823the notation @samp{sqrt(@var{x})}.
1824
1825Press the apostrophe, then type @kbd{sqrt(5*2) - 3}. The result should
1826be @expr{0.16227766017}.
1827
1828Note that if the formula begins with a function name, you need to use
1829the apostrophe even if you are in Algebraic mode. If you type @kbd{arcsin}
1830out of the blue, the @kbd{a r} will be taken as an Algebraic Rewrite
1831command, and the @kbd{csin} will be taken as the name of the rewrite
1832rule to use!
1833
1834Some people prefer to enter complex numbers and vectors in algebraic
1835form because they find RPN entry with incomplete objects to be too
1836distracting, even though they otherwise use Calc as an RPN calculator.
1837
1838Still in Algebraic mode, type:
1839
1840@smallexample
1841@group
18421: (2, 3) 2: (2, 3) 1: (8, -1) 2: (8, -1) 1: (9, -1)
1843 . 1: (1, -2) . 1: 1 .
1844 . .
1845
1846 (2,3) @key{RET} (1,-2) @key{RET} * 1 @key{RET} +
1847@end group
1848@end smallexample
1849
1850Algebraic mode allows us to enter complex numbers without pressing
1851an apostrophe first, but it also means we need to press @key{RET}
1852after every entry, even for a simple number like @expr{1}.
1853
1854(You can type @kbd{C-u m a} to enable a special Incomplete Algebraic
1855mode in which the @kbd{(} and @kbd{[} keys use algebraic entry even
1856though regular numeric keys still use RPN numeric entry. There is also
1857Total Algebraic mode, started by typing @kbd{m t}, in which all
1858normal keys begin algebraic entry. You must then use the @key{META} key
1859to type Calc commands: @kbd{M-m t} to get back out of Total Algebraic
1860mode, @kbd{M-q} to quit, etc.)
1861
1862If you're still in Algebraic mode, press @kbd{m a} again to turn it off.
1863
1864Actual non-RPN calculators use a mixture of algebraic and RPN styles.
1865In general, operators of two numbers (like @kbd{+} and @kbd{*})
1866use algebraic form, but operators of one number (like @kbd{n} and @kbd{Q})
1867use RPN form. Also, a non-RPN calculator allows you to see the
1868intermediate results of a calculation as you go along. You can
1869accomplish this in Calc by performing your calculation as a series
1870of algebraic entries, using the @kbd{$} sign to tie them together.
1871In an algebraic formula, @kbd{$} represents the number on the top
1872of the stack. Here, we perform the calculation
1873@texline @math{\sqrt{2\times4+1}},
1874@infoline @expr{sqrt(2*4+1)},
1875which on a traditional calculator would be done by pressing
1876@kbd{2 * 4 + 1 =} and then the square-root key.
1877
1878@smallexample
1879@group
18801: 8 1: 9 1: 3
1881 . . .
1882
1883 ' 2*4 @key{RET} $+1 @key{RET} Q
1884@end group
1885@end smallexample
1886
1887@noindent
1888Notice that we didn't need to press an apostrophe for the @kbd{$+1},
1889because the dollar sign always begins an algebraic entry.
1890
1891(@bullet{}) @strong{Exercise 1.} How could you get the same effect as
1892pressing @kbd{Q} but using an algebraic entry instead? How about
1893if the @kbd{Q} key on your keyboard were broken?
1894@xref{Algebraic Answer 1, 1}. (@bullet{})
1895
1896The notations @kbd{$$}, @kbd{$$$}, and so on stand for higher stack
1897entries. For example, @kbd{' $$+$ @key{RET}} is just like typing @kbd{+}.
1898
1899Algebraic formulas can include @dfn{variables}. To store in a
1900variable, press @kbd{s s}, then type the variable name, then press
1901@key{RET}. (There are actually two flavors of store command:
1902@kbd{s s} stores a number in a variable but also leaves the number
1903on the stack, while @w{@kbd{s t}} removes a number from the stack and
1904stores it in the variable.) A variable name should consist of one
1905or more letters or digits, beginning with a letter.
1906
1907@smallexample
1908@group
19091: 17 . 1: a + a^2 1: 306
1910 . . .
1911
1912 17 s t a @key{RET} ' a+a^2 @key{RET} =
1913@end group
1914@end smallexample
1915
1916@noindent
1917The @kbd{=} key @dfn{evaluates} a formula by replacing all its
1918variables by the values that were stored in them.
1919
1920For RPN calculations, you can recall a variable's value on the
1921stack either by entering its name as a formula and pressing @kbd{=},
1922or by using the @kbd{s r} command.
1923
1924@smallexample
1925@group
19261: 17 2: 17 3: 17 2: 17 1: 306
1927 . 1: 17 2: 17 1: 289 .
1928 . 1: 2 .
1929 .
1930
1931 s r a @key{RET} ' a @key{RET} = 2 ^ +
1932@end group
1933@end smallexample
1934
1935If you press a single digit for a variable name (as in @kbd{s t 3}, you
1936get one of ten @dfn{quick variables} @code{q0} through @code{q9}.
1937They are ``quick'' simply because you don't have to type the letter
1938@code{q} or the @key{RET} after their names. In fact, you can type
1939simply @kbd{s 3} as a shorthand for @kbd{s s 3}, and likewise for
1940@kbd{t 3} and @w{@kbd{r 3}}.
1941
1942Any variables in an algebraic formula for which you have not stored
1943values are left alone, even when you evaluate the formula.
1944
1945@smallexample
1946@group
19471: 2 a + 2 b 1: 34 + 2 b
1948 . .
1949
1950 ' 2a+2b @key{RET} =
1951@end group
1952@end smallexample
1953
1954Calls to function names which are undefined in Calc are also left
1955alone, as are calls for which the value is undefined.
1956
1957@smallexample
1958@group
19591: 2 + log10(0) + log10(x) + log10(5, 6) + foo(3)
1960 .
1961
1962 ' log10(100) + log10(0) + log10(x) + log10(5,6) + foo(3) @key{RET}
1963@end group
1964@end smallexample
1965
1966@noindent
1967In this example, the first call to @code{log10} works, but the other
1968calls are not evaluated. In the second call, the logarithm is
1969undefined for that value of the argument; in the third, the argument
1970is symbolic, and in the fourth, there are too many arguments. In the
1971fifth case, there is no function called @code{foo}. You will see a
1972``Wrong number of arguments'' message referring to @samp{log10(5,6)}.
1973Press the @kbd{w} (``why'') key to see any other messages that may
1974have arisen from the last calculation. In this case you will get
1975``logarithm of zero,'' then ``number expected: @code{x}''. Calc
1976automatically displays the first message only if the message is
1977sufficiently important; for example, Calc considers ``wrong number
1978of arguments'' and ``logarithm of zero'' to be important enough to
1979report automatically, while a message like ``number expected: @code{x}''
1980will only show up if you explicitly press the @kbd{w} key.
1981
1982(@bullet{}) @strong{Exercise 2.} Joe entered the formula @samp{2 x y},
1983stored 5 in @code{x}, pressed @kbd{=}, and got the expected result,
1984@samp{10 y}. He then tried the same for the formula @samp{2 x (1+y)},
1985expecting @samp{10 (1+y)}, but it didn't work. Why not?
1986@xref{Algebraic Answer 2, 2}. (@bullet{})
1987
1988(@bullet{}) @strong{Exercise 3.} What result would you expect
1989@kbd{1 @key{RET} 0 /} to give? What if you then type @kbd{0 *}?
1990@xref{Algebraic Answer 3, 3}. (@bullet{})
1991
1992One interesting way to work with variables is to use the
1993@dfn{evaluates-to} (@samp{=>}) operator. It works like this:
1994Enter a formula algebraically in the usual way, but follow
1995the formula with an @samp{=>} symbol. (There is also an @kbd{s =}
1996command which builds an @samp{=>} formula using the stack.) On
1997the stack, you will see two copies of the formula with an @samp{=>}
1998between them. The lefthand formula is exactly like you typed it;
1999the righthand formula has been evaluated as if by typing @kbd{=}.
2000
2001@smallexample
2002@group
20032: 2 + 3 => 5 2: 2 + 3 => 5
20041: 2 a + 2 b => 34 + 2 b 1: 2 a + 2 b => 20 + 2 b
2005 . .
2006
2007' 2+3 => @key{RET} ' 2a+2b @key{RET} s = 10 s t a @key{RET}
2008@end group
2009@end smallexample
2010
2011@noindent
2012Notice that the instant we stored a new value in @code{a}, all
2013@samp{=>} operators already on the stack that referred to @expr{a}
2014were updated to use the new value. With @samp{=>}, you can push a
2015set of formulas on the stack, then change the variables experimentally
2016to see the effects on the formulas' values.
2017
2018You can also ``unstore'' a variable when you are through with it:
2019
2020@smallexample
2021@group
20222: 2 + 5 => 5
20231: 2 a + 2 b => 2 a + 2 b
2024 .
2025
2026 s u a @key{RET}
2027@end group
2028@end smallexample
2029
2030We will encounter formulas involving variables and functions again
2031when we discuss the algebra and calculus features of the Calculator.
2032
2033@node Undo Tutorial, Modes Tutorial, Algebraic Tutorial, Basic Tutorial
2034@subsection Undo and Redo
2035
2036@noindent
2037If you make a mistake, you can usually correct it by pressing shift-@kbd{U},
2038the ``undo'' command. First, clear the stack (@kbd{M-0 @key{DEL}}) and exit
2039and restart Calc (@kbd{C-x * * C-x * *}) to make sure things start off
2040with a clean slate. Now:
2041
2042@smallexample
2043@group
20441: 2 2: 2 1: 8 2: 2 1: 6
2045 . 1: 3 . 1: 3 .
2046 . .
2047
2048 2 @key{RET} 3 ^ U *
2049@end group
2050@end smallexample
2051
2052You can undo any number of times. Calc keeps a complete record of
2053all you have done since you last opened the Calc window. After the
2054above example, you could type:
2055
2056@smallexample
2057@group
20581: 6 2: 2 1: 2 . .
2059 . 1: 3 .
2060 .
2061 (error)
2062 U U U U
2063@end group
2064@end smallexample
2065
2066You can also type @kbd{D} to ``redo'' a command that you have undone
2067mistakenly.
2068
2069@smallexample
2070@group
2071 . 1: 2 2: 2 1: 6 1: 6
2072 . 1: 3 . .
2073 .
2074 (error)
2075 D D D D
2076@end group
2077@end smallexample
2078
2079@noindent
2080It was not possible to redo past the @expr{6}, since that was placed there
2081by something other than an undo command.
2082
2083@cindex Time travel
2084You can think of undo and redo as a sort of ``time machine.'' Press
2085@kbd{U} to go backward in time, @kbd{D} to go forward. If you go
2086backward and do something (like @kbd{*}) then, as any science fiction
2087reader knows, you have changed your future and you cannot go forward
2088again. Thus, the inability to redo past the @expr{6} even though there
2089was an earlier undo command.
2090
2091You can always recall an earlier result using the Trail. We've ignored
2092the trail so far, but it has been faithfully recording everything we
2093did since we loaded the Calculator. If the Trail is not displayed,
2094press @kbd{t d} now to turn it on.
2095
2096Let's try grabbing an earlier result. The @expr{8} we computed was
2097undone by a @kbd{U} command, and was lost even to Redo when we pressed
2098@kbd{*}, but it's still there in the trail. There should be a little
2099@samp{>} arrow (the @dfn{trail pointer}) resting on the last trail
2100entry. If there isn't, press @kbd{t ]} to reset the trail pointer.
2101Now, press @w{@kbd{t p}} to move the arrow onto the line containing
2102@expr{8}, and press @w{@kbd{t y}} to ``yank'' that number back onto the
2103stack.
2104
2105If you press @kbd{t ]} again, you will see that even our Yank command
2106went into the trail.
2107
2108Let's go further back in time. Earlier in the tutorial we computed
2109a huge integer using the formula @samp{2^3^4}. We don't remember
2110what it was, but the first digits were ``241''. Press @kbd{t r}
2111(which stands for trail-search-reverse), then type @kbd{241}.
2112The trail cursor will jump back to the next previous occurrence of
2113the string ``241'' in the trail. This is just a regular Emacs
2114incremental search; you can now press @kbd{C-s} or @kbd{C-r} to
2115continue the search forwards or backwards as you like.
2116
2117To finish the search, press @key{RET}. This halts the incremental
2118search and leaves the trail pointer at the thing we found. Now we
2119can type @kbd{t y} to yank that number onto the stack. If we hadn't
2120remembered the ``241'', we could simply have searched for @kbd{2^3^4},
2121then pressed @kbd{@key{RET} t n} to halt and then move to the next item.
2122
2123You may have noticed that all the trail-related commands begin with
2124the letter @kbd{t}. (The store-and-recall commands, on the other hand,
2125all began with @kbd{s}.) Calc has so many commands that there aren't
2126enough keys for all of them, so various commands are grouped into
2127two-letter sequences where the first letter is called the @dfn{prefix}
2128key. If you type a prefix key by accident, you can press @kbd{C-g}
2129to cancel it. (In fact, you can press @kbd{C-g} to cancel almost
2130anything in Emacs.) To get help on a prefix key, press that key
2131followed by @kbd{?}. Some prefixes have several lines of help,
2132so you need to press @kbd{?} repeatedly to see them all.
2133You can also type @kbd{h h} to see all the help at once.
2134
2135Try pressing @kbd{t ?} now. You will see a line of the form,
2136
2137@smallexample
2138trail/time: Display; Fwd, Back; Next, Prev, Here, [, ]; Yank: [MORE] t-
2139@end smallexample
2140
2141@noindent
2142The word ``trail'' indicates that the @kbd{t} prefix key contains
2143trail-related commands. Each entry on the line shows one command,
2144with a single capital letter showing which letter you press to get
2145that command. We have used @kbd{t n}, @kbd{t p}, @kbd{t ]}, and
2146@kbd{t y} so far. The @samp{[MORE]} means you can press @kbd{?}
2147again to see more @kbd{t}-prefix commands. Notice that the commands
2148are roughly divided (by semicolons) into related groups.
2149
2150When you are in the help display for a prefix key, the prefix is
2151still active. If you press another key, like @kbd{y} for example,
2152it will be interpreted as a @kbd{t y} command. If all you wanted
2153was to look at the help messages, press @kbd{C-g} afterwards to cancel
2154the prefix.
2155
2156One more way to correct an error is by editing the stack entries.
2157The actual Stack buffer is marked read-only and must not be edited
2158directly, but you can press @kbd{`} (the backquote or accent grave)
2159to edit a stack entry.
2160
2161Try entering @samp{3.141439} now. If this is supposed to represent
2162@cpi{}, it's got several errors. Press @kbd{`} to edit this number.
2163Now use the normal Emacs cursor motion and editing keys to change
2164the second 4 to a 5, and to transpose the 3 and the 9. When you
2165press @key{RET}, the number on the stack will be replaced by your
2166new number. This works for formulas, vectors, and all other types
2167of values you can put on the stack. The @kbd{`} key also works
2168during entry of a number or algebraic formula.
2169
2170@node Modes Tutorial, , Undo Tutorial, Basic Tutorial
2171@subsection Mode-Setting Commands
2172
2173@noindent
2174Calc has many types of @dfn{modes} that affect the way it interprets
2175your commands or the way it displays data. We have already seen one
2176mode, namely Algebraic mode. There are many others, too; we'll
2177try some of the most common ones here.
2178
2179Perhaps the most fundamental mode in Calc is the current @dfn{precision}.
2180Notice the @samp{12} on the Calc window's mode line:
2181
2182@smallexample
2183--%%-Calc: 12 Deg (Calculator)----All------
2184@end smallexample
2185
2186@noindent
2187Most of the symbols there are Emacs things you don't need to worry
2188about, but the @samp{12} and the @samp{Deg} are mode indicators.
2189The @samp{12} means that calculations should always be carried to
219012 significant figures. That is why, when we type @kbd{1 @key{RET} 7 /},
2191we get @expr{0.142857142857} with exactly 12 digits, not counting
2192leading and trailing zeros.
2193
2194You can set the precision to anything you like by pressing @kbd{p},
2195then entering a suitable number. Try pressing @kbd{p 30 @key{RET}},
2196then doing @kbd{1 @key{RET} 7 /} again:
2197
2198@smallexample
2199@group
22001: 0.142857142857
22012: 0.142857142857142857142857142857
2202 .
2203@end group
2204@end smallexample
2205
2206Although the precision can be set arbitrarily high, Calc always
2207has to have @emph{some} value for the current precision. After
2208all, the true value @expr{1/7} is an infinitely repeating decimal;
2209Calc has to stop somewhere.
2210
2211Of course, calculations are slower the more digits you request.
2212Press @w{@kbd{p 12}} now to set the precision back down to the default.
2213
2214Calculations always use the current precision. For example, even
2215though we have a 30-digit value for @expr{1/7} on the stack, if
2216we use it in a calculation in 12-digit mode it will be rounded
2217down to 12 digits before it is used. Try it; press @key{RET} to
2218duplicate the number, then @w{@kbd{1 +}}. Notice that the @key{RET}
2219key didn't round the number, because it doesn't do any calculation.
2220But the instant we pressed @kbd{+}, the number was rounded down.
2221
2222@smallexample
2223@group
22241: 0.142857142857
22252: 0.142857142857142857142857142857
22263: 1.14285714286
2227 .
2228@end group
2229@end smallexample
2230
2231@noindent
2232In fact, since we added a digit on the left, we had to lose one
2233digit on the right from even the 12-digit value of @expr{1/7}.
2234
2235How did we get more than 12 digits when we computed @samp{2^3^4}? The
2236answer is that Calc makes a distinction between @dfn{integers} and
2237@dfn{floating-point} numbers, or @dfn{floats}. An integer is a number
2238that does not contain a decimal point. There is no such thing as an
2239``infinitely repeating fraction integer,'' so Calc doesn't have to limit
2240itself. If you asked for @samp{2^10000} (don't try this!), you would
2241have to wait a long time but you would eventually get an exact answer.
2242If you ask for @samp{2.^10000}, you will quickly get an answer which is
2243correct only to 12 places. The decimal point tells Calc that it should
2244use floating-point arithmetic to get the answer, not exact integer
2245arithmetic.
2246
2247You can use the @kbd{F} (@code{calc-floor}) command to convert a
2248floating-point value to an integer, and @kbd{c f} (@code{calc-float})
2249to convert an integer to floating-point form.
2250
2251Let's try entering that last calculation:
2252
2253@smallexample
2254@group
22551: 2. 2: 2. 1: 1.99506311689e3010
2256 . 1: 10000 .
2257 .
2258
2259 2.0 @key{RET} 10000 @key{RET} ^
2260@end group
2261@end smallexample
2262
2263@noindent
2264@cindex Scientific notation, entry of
2265Notice the letter @samp{e} in there. It represents ``times ten to the
2266power of,'' and is used by Calc automatically whenever writing the
2267number out fully would introduce more extra zeros than you probably
2268want to see. You can enter numbers in this notation, too.
2269
2270@smallexample
2271@group
22721: 2. 2: 2. 1: 1.99506311678e3010
2273 . 1: 10000. .
2274 .
2275
2276 2.0 @key{RET} 1e4 @key{RET} ^
2277@end group
2278@end smallexample
2279
2280@cindex Round-off errors
2281@noindent
2282Hey, the answer is different! Look closely at the middle columns
2283of the two examples. In the first, the stack contained the
2284exact integer @expr{10000}, but in the second it contained
2285a floating-point value with a decimal point. When you raise a
2286number to an integer power, Calc uses repeated squaring and
2287multiplication to get the answer. When you use a floating-point
2288power, Calc uses logarithms and exponentials. As you can see,
2289a slight error crept in during one of these methods. Which
2290one should we trust? Let's raise the precision a bit and find
2291out:
2292
2293@smallexample
2294@group
2295 . 1: 2. 2: 2. 1: 1.995063116880828e3010
2296 . 1: 10000. .
2297 .
2298
2299 p 16 @key{RET} 2. @key{RET} 1e4 ^ p 12 @key{RET}
2300@end group
2301@end smallexample
2302
2303@noindent
2304@cindex Guard digits
2305Presumably, it doesn't matter whether we do this higher-precision
2306calculation using an integer or floating-point power, since we
2307have added enough ``guard digits'' to trust the first 12 digits
2308no matter what. And the verdict is@dots{} Integer powers were more
2309accurate; in fact, the result was only off by one unit in the
2310last place.
2311
2312@cindex Guard digits
2313Calc does many of its internal calculations to a slightly higher
2314precision, but it doesn't always bump the precision up enough.
2315In each case, Calc added about two digits of precision during
2316its calculation and then rounded back down to 12 digits
2317afterward. In one case, it was enough; in the other, it
2318wasn't. If you really need @var{x} digits of precision, it
2319never hurts to do the calculation with a few extra guard digits.
2320
2321What if we want guard digits but don't want to look at them?
2322We can set the @dfn{float format}. Calc supports four major
2323formats for floating-point numbers, called @dfn{normal},
2324@dfn{fixed-point}, @dfn{scientific notation}, and @dfn{engineering
2325notation}. You get them by pressing @w{@kbd{d n}}, @kbd{d f},
2326@kbd{d s}, and @kbd{d e}, respectively. In each case, you can
2327supply a numeric prefix argument which says how many digits
2328should be displayed. As an example, let's put a few numbers
2329onto the stack and try some different display modes. First,
2330use @kbd{M-0 @key{DEL}} to clear the stack, then enter the four
2331numbers shown here:
2332
2333@smallexample
2334@group
23354: 12345 4: 12345 4: 12345 4: 12345 4: 12345
23363: 12345. 3: 12300. 3: 1.2345e4 3: 1.23e4 3: 12345.000
23372: 123.45 2: 123. 2: 1.2345e2 2: 1.23e2 2: 123.450
23381: 12.345 1: 12.3 1: 1.2345e1 1: 1.23e1 1: 12.345
2339 . . . . .
2340
2341 d n M-3 d n d s M-3 d s M-3 d f
2342@end group
2343@end smallexample
2344
2345@noindent
2346Notice that when we typed @kbd{M-3 d n}, the numbers were rounded down
2347to three significant digits, but then when we typed @kbd{d s} all
2348five significant figures reappeared. The float format does not
2349affect how numbers are stored, it only affects how they are
2350displayed. Only the current precision governs the actual rounding
2351of numbers in the Calculator's memory.
2352
2353Engineering notation, not shown here, is like scientific notation
2354except the exponent (the power-of-ten part) is always adjusted to be
2355a multiple of three (as in ``kilo,'' ``micro,'' etc.). As a result
2356there will be one, two, or three digits before the decimal point.
2357
2358Whenever you change a display-related mode, Calc redraws everything
2359in the stack. This may be slow if there are many things on the stack,
2360so Calc allows you to type shift-@kbd{H} before any mode command to
2361prevent it from updating the stack. Anything Calc displays after the
2362mode-changing command will appear in the new format.
2363
2364@smallexample
2365@group
23664: 12345 4: 12345 4: 12345 4: 12345 4: 12345
23673: 12345.000 3: 12345.000 3: 12345.000 3: 1.2345e4 3: 12345.
23682: 123.450 2: 123.450 2: 1.2345e1 2: 1.2345e1 2: 123.45
23691: 12.345 1: 1.2345e1 1: 1.2345e2 1: 1.2345e2 1: 12.345
2370 . . . . .
2371
2372 H d s @key{DEL} U @key{TAB} d @key{SPC} d n
2373@end group
2374@end smallexample
2375
2376@noindent
2377Here the @kbd{H d s} command changes to scientific notation but without
2378updating the screen. Deleting the top stack entry and undoing it back
2379causes it to show up in the new format; swapping the top two stack
2380entries reformats both entries. The @kbd{d @key{SPC}} command refreshes the
2381whole stack. The @kbd{d n} command changes back to the normal float
2382format; since it doesn't have an @kbd{H} prefix, it also updates all
2383the stack entries to be in @kbd{d n} format.
2384
2385Notice that the integer @expr{12345} was not affected by any
2386of the float formats. Integers are integers, and are always
2387displayed exactly.
2388
2389@cindex Large numbers, readability
2390Large integers have their own problems. Let's look back at
2391the result of @kbd{2^3^4}.
2392
2393@example
23942417851639229258349412352
2395@end example
2396
2397@noindent
2398Quick---how many digits does this have? Try typing @kbd{d g}:
2399
2400@example
24012,417,851,639,229,258,349,412,352
2402@end example
2403
2404@noindent
2405Now how many digits does this have? It's much easier to tell!
2406We can actually group digits into clumps of any size. Some
2407people prefer @kbd{M-5 d g}:
2408
2409@example
241024178,51639,22925,83494,12352
2411@end example
2412
2413Let's see what happens to floating-point numbers when they are grouped.
2414First, type @kbd{p 25 @key{RET}} to make sure we have enough precision
2415to get ourselves into trouble. Now, type @kbd{1e13 /}:
2416
2417@example
241824,17851,63922.9258349412352
2419@end example
2420
2421@noindent
2422The integer part is grouped but the fractional part isn't. Now try
2423@kbd{M-- M-5 d g} (that's meta-minus-sign, meta-five):
2424
2425@example
242624,17851,63922.92583,49412,352
2427@end example
2428
2429If you find it hard to tell the decimal point from the commas, try
2430changing the grouping character to a space with @kbd{d , @key{SPC}}:
2431
2432@example
243324 17851 63922.92583 49412 352
2434@end example
2435
2436Type @kbd{d , ,} to restore the normal grouping character, then
2437@kbd{d g} again to turn grouping off. Also, press @kbd{p 12} to
2438restore the default precision.
2439
2440Press @kbd{U} enough times to get the original big integer back.
2441(Notice that @kbd{U} does not undo each mode-setting command; if
2442you want to undo a mode-setting command, you have to do it yourself.)
2443Now, type @kbd{d r 16 @key{RET}}:
2444
2445@example
244616#200000000000000000000
2447@end example
2448
2449@noindent
2450The number is now displayed in @dfn{hexadecimal}, or ``base-16'' form.
2451Suddenly it looks pretty simple; this should be no surprise, since we
2452got this number by computing a power of two, and 16 is a power of 2.
2453In fact, we can use @w{@kbd{d r 2 @key{RET}}} to see it in actual binary
2454form:
2455
2456@example
24572#1000000000000000000000000000000000000000000000000000000 @dots{}
2458@end example
2459
2460@noindent
2461We don't have enough space here to show all the zeros! They won't
2462fit on a typical screen, either, so you will have to use horizontal
2463scrolling to see them all. Press @kbd{<} and @kbd{>} to scroll the
2464stack window left and right by half its width. Another way to view
2465something large is to press @kbd{`} (back-quote) to edit the top of
2466stack in a separate window. (Press @kbd{C-c C-c} when you are done.)
2467
2468You can enter non-decimal numbers using the @kbd{#} symbol, too.
2469Let's see what the hexadecimal number @samp{5FE} looks like in
2470binary. Type @kbd{16#5FE} (the letters can be typed in upper or
2471lower case; they will always appear in upper case). It will also
2472help to turn grouping on with @kbd{d g}:
2473
2474@example
24752#101,1111,1110
2476@end example
2477
2478Notice that @kbd{d g} groups by fours by default if the display radix
2479is binary or hexadecimal, but by threes if it is decimal, octal, or any
2480other radix.
2481
2482Now let's see that number in decimal; type @kbd{d r 10}:
2483
2484@example
24851,534
2486@end example
2487
2488Numbers are not @emph{stored} with any particular radix attached. They're
2489just numbers; they can be entered in any radix, and are always displayed
2490in whatever radix you've chosen with @kbd{d r}. The current radix applies
2491to integers, fractions, and floats.
2492
2493@cindex Roundoff errors, in non-decimal numbers
2494(@bullet{}) @strong{Exercise 1.} Your friend Joe tried to enter one-third
2495as @samp{3#0.1} in @kbd{d r 3} mode with a precision of 12. He got
2496@samp{3#0.0222222...} (with 25 2's) in the display. When he multiplied
2497that by three, he got @samp{3#0.222222...} instead of the expected
2498@samp{3#1}. Next, Joe entered @samp{3#0.2} and, to his great relief,
2499saw @samp{3#0.2} on the screen. But when he typed @kbd{2 /}, he got
2500@samp{3#0.10000001} (some zeros omitted). What's going on here?
2501@xref{Modes Answer 1, 1}. (@bullet{})
2502
2503@cindex Scientific notation, in non-decimal numbers
2504(@bullet{}) @strong{Exercise 2.} Scientific notation works in non-decimal
2505modes in the natural way (the exponent is a power of the radix instead of
2506a power of ten, although the exponent itself is always written in decimal).
2507Thus @samp{8#1.23e3 = 8#1230.0}. Suppose we have the hexadecimal number
2508@samp{f.e8f} times 16 to the 15th power: We write @samp{16#f.e8fe15}.
2509What is wrong with this picture? What could we write instead that would
2510work better? @xref{Modes Answer 2, 2}. (@bullet{})
2511
2512The @kbd{m} prefix key has another set of modes, relating to the way
2513Calc interprets your inputs and does computations. Whereas @kbd{d}-prefix
2514modes generally affect the way things look, @kbd{m}-prefix modes affect
2515the way they are actually computed.
2516
2517The most popular @kbd{m}-prefix mode is the @dfn{angular mode}. Notice
2518the @samp{Deg} indicator in the mode line. This means that if you use
2519a command that interprets a number as an angle, it will assume the
2520angle is measured in degrees. For example,
2521
2522@smallexample
2523@group
25241: 45 1: 0.707106781187 1: 0.500000000001 1: 0.5
2525 . . . .
2526
2527 45 S 2 ^ c 1
2528@end group
2529@end smallexample
2530
2531@noindent
2532The shift-@kbd{S} command computes the sine of an angle. The sine
2533of 45 degrees is
2534@texline @math{\sqrt{2}/2};
2535@infoline @expr{sqrt(2)/2};
2536squaring this yields @expr{2/4 = 0.5}. However, there has been a slight
2537roundoff error because the representation of
2538@texline @math{\sqrt{2}/2}
2539@infoline @expr{sqrt(2)/2}
2540wasn't exact. The @kbd{c 1} command is a handy way to clean up numbers
2541in this case; it temporarily reduces the precision by one digit while it
2542re-rounds the number on the top of the stack.
2543
2544@cindex Roundoff errors, examples
2545(@bullet{}) @strong{Exercise 3.} Your friend Joe computed the sine
2546of 45 degrees as shown above, then, hoping to avoid an inexact
2547result, he increased the precision to 16 digits before squaring.
2548What happened? @xref{Modes Answer 3, 3}. (@bullet{})
2549
2550To do this calculation in radians, we would type @kbd{m r} first.
2551(The indicator changes to @samp{Rad}.) 45 degrees corresponds to
2552@cpiover{4} radians. To get @cpi{}, press the @kbd{P} key. (Once
2553again, this is a shifted capital @kbd{P}. Remember, unshifted
2554@kbd{p} sets the precision.)
2555
2556@smallexample
2557@group
25581: 3.14159265359 1: 0.785398163398 1: 0.707106781187
2559 . . .
2560
2561 P 4 / m r S
2562@end group
2563@end smallexample
2564
2565Likewise, inverse trigonometric functions generate results in
2566either radians or degrees, depending on the current angular mode.
2567
2568@smallexample
2569@group
25701: 0.707106781187 1: 0.785398163398 1: 45.
2571 . . .
2572
2573 .5 Q m r I S m d U I S
2574@end group
2575@end smallexample
2576
2577@noindent
2578Here we compute the Inverse Sine of
2579@texline @math{\sqrt{0.5}},
2580@infoline @expr{sqrt(0.5)},
2581first in radians, then in degrees.
2582
2583Use @kbd{c d} and @kbd{c r} to convert a number from radians to degrees
2584and vice-versa.
2585
2586@smallexample
2587@group
25881: 45 1: 0.785398163397 1: 45.
2589 . . .
2590
2591 45 c r c d
2592@end group
2593@end smallexample
2594
2595Another interesting mode is @dfn{Fraction mode}. Normally,
2596dividing two integers produces a floating-point result if the
2597quotient can't be expressed as an exact integer. Fraction mode
2598causes integer division to produce a fraction, i.e., a rational
2599number, instead.
2600
2601@smallexample
2602@group
26032: 12 1: 1.33333333333 1: 4:3
26041: 9 . .
2605 .
2606
2607 12 @key{RET} 9 / m f U / m f
2608@end group
2609@end smallexample
2610
2611@noindent
2612In the first case, we get an approximate floating-point result.
2613In the second case, we get an exact fractional result (four-thirds).
2614
2615You can enter a fraction at any time using @kbd{:} notation.
2616(Calc uses @kbd{:} instead of @kbd{/} as the fraction separator
2617because @kbd{/} is already used to divide the top two stack
2618elements.) Calculations involving fractions will always
2619produce exact fractional results; Fraction mode only says
2620what to do when dividing two integers.
2621
2622@cindex Fractions vs. floats
2623@cindex Floats vs. fractions
2624(@bullet{}) @strong{Exercise 4.} If fractional arithmetic is exact,
2625why would you ever use floating-point numbers instead?
2626@xref{Modes Answer 4, 4}. (@bullet{})
2627
2628Typing @kbd{m f} doesn't change any existing values in the stack.
2629In the above example, we had to Undo the division and do it over
2630again when we changed to Fraction mode. But if you use the
2631evaluates-to operator you can get commands like @kbd{m f} to
2632recompute for you.
2633
2634@smallexample
2635@group
26361: 12 / 9 => 1.33333333333 1: 12 / 9 => 1.333 1: 12 / 9 => 4:3
2637 . . .
2638
2639 ' 12/9 => @key{RET} p 4 @key{RET} m f
2640@end group
2641@end smallexample
2642
2643@noindent
2644In this example, the righthand side of the @samp{=>} operator
2645on the stack is recomputed when we change the precision, then
2646again when we change to Fraction mode. All @samp{=>} expressions
2647on the stack are recomputed every time you change any mode that
2648might affect their values.
2649
2650@node Arithmetic Tutorial, Vector/Matrix Tutorial, Basic Tutorial, Tutorial
2651@section Arithmetic Tutorial
2652
2653@noindent
2654In this section, we explore the arithmetic and scientific functions
2655available in the Calculator.
2656
2657The standard arithmetic commands are @kbd{+}, @kbd{-}, @kbd{*}, @kbd{/},
2658and @kbd{^}. Each normally takes two numbers from the top of the stack
2659and pushes back a result. The @kbd{n} and @kbd{&} keys perform
2660change-sign and reciprocal operations, respectively.
2661
2662@smallexample
2663@group
26641: 5 1: 0.2 1: 5. 1: -5. 1: 5.
2665 . . . . .
2666
2667 5 & & n n
2668@end group
2669@end smallexample
2670
2671@cindex Binary operators
2672You can apply a ``binary operator'' like @kbd{+} across any number of
2673stack entries by giving it a numeric prefix. You can also apply it
2674pairwise to several stack elements along with the top one if you use
2675a negative prefix.
2676
2677@smallexample
2678@group
26793: 2 1: 9 3: 2 4: 2 3: 12
26802: 3 . 2: 3 3: 3 2: 13
26811: 4 1: 4 2: 4 1: 14
2682 . . 1: 10 .
2683 .
2684
26852 @key{RET} 3 @key{RET} 4 M-3 + U 10 M-- M-3 +
2686@end group
2687@end smallexample
2688
2689@cindex Unary operators
2690You can apply a ``unary operator'' like @kbd{&} to the top @var{n}
2691stack entries with a numeric prefix, too.
2692
2693@smallexample
2694@group
26953: 2 3: 0.5 3: 0.5
26962: 3 2: 0.333333333333 2: 3.
26971: 4 1: 0.25 1: 4.
2698 . . .
2699
27002 @key{RET} 3 @key{RET} 4 M-3 & M-2 &
2701@end group
2702@end smallexample
2703
2704Notice that the results here are left in floating-point form.
2705We can convert them back to integers by pressing @kbd{F}, the
2706``floor'' function. This function rounds down to the next lower
2707integer. There is also @kbd{R}, which rounds to the nearest
2708integer.
2709
2710@smallexample
2711@group
27127: 2. 7: 2 7: 2
27136: 2.4 6: 2 6: 2
27145: 2.5 5: 2 5: 3
27154: 2.6 4: 2 4: 3
27163: -2. 3: -2 3: -2
27172: -2.4 2: -3 2: -2
27181: -2.6 1: -3 1: -3
2719 . . .
2720
2721 M-7 F U M-7 R
2722@end group
2723@end smallexample
2724
2725Since dividing-and-flooring (i.e., ``integer quotient'') is such a
2726common operation, Calc provides a special command for that purpose, the
2727backslash @kbd{\}. Another common arithmetic operator is @kbd{%}, which
2728computes the remainder that would arise from a @kbd{\} operation, i.e.,
2729the ``modulo'' of two numbers. For example,
2730
2731@smallexample
2732@group
27332: 1234 1: 12 2: 1234 1: 34
27341: 100 . 1: 100 .
2735 . .
2736
27371234 @key{RET} 100 \ U %
2738@end group
2739@end smallexample
2740
2741These commands actually work for any real numbers, not just integers.
2742
2743@smallexample
2744@group
27452: 3.1415 1: 3 2: 3.1415 1: 0.1415
27461: 1 . 1: 1 .
2747 . .
2748
27493.1415 @key{RET} 1 \ U %
2750@end group
2751@end smallexample
2752
2753(@bullet{}) @strong{Exercise 1.} The @kbd{\} command would appear to be a
2754frill, since you could always do the same thing with @kbd{/ F}. Think
2755of a situation where this is not true---@kbd{/ F} would be inadequate.
2756Now think of a way you could get around the problem if Calc didn't
2757provide a @kbd{\} command. @xref{Arithmetic Answer 1, 1}. (@bullet{})
2758
2759We've already seen the @kbd{Q} (square root) and @kbd{S} (sine)
2760commands. Other commands along those lines are @kbd{C} (cosine),
2761@kbd{T} (tangent), @kbd{E} (@expr{e^x}) and @kbd{L} (natural
2762logarithm). These can be modified by the @kbd{I} (inverse) and
2763@kbd{H} (hyperbolic) prefix keys.
2764
2765Let's compute the sine and cosine of an angle, and verify the
2766identity
2767@texline @math{\sin^2x + \cos^2x = 1}.
2768@infoline @expr{sin(x)^2 + cos(x)^2 = 1}.
2769We'll arbitrarily pick @mathit{-64} degrees as a good value for @expr{x}.
2770With the angular mode set to degrees (type @w{@kbd{m d}}), do:
2771
2772@smallexample
2773@group
27742: -64 2: -64 2: -0.89879 2: -0.89879 1: 1.
27751: -64 1: -0.89879 1: -64 1: 0.43837 .
2776 . . . .
2777
2778 64 n @key{RET} @key{RET} S @key{TAB} C f h
2779@end group
2780@end smallexample
2781
2782@noindent
2783(For brevity, we're showing only five digits of the results here.
2784You can of course do these calculations to any precision you like.)
2785
2786Remember, @kbd{f h} is the @code{calc-hypot}, or square-root of sum
2787of squares, command.
2788
2789Another identity is
2790@texline @math{\displaystyle\tan x = {\sin x \over \cos x}}.
2791@infoline @expr{tan(x) = sin(x) / cos(x)}.
2792@smallexample
2793@group
2794
27952: -0.89879 1: -2.0503 1: -64.
27961: 0.43837 . .
2797 .
2798
2799 U / I T
2800@end group
2801@end smallexample
2802
2803A physical interpretation of this calculation is that if you move
2804@expr{0.89879} units downward and @expr{0.43837} units to the right,
2805your direction of motion is @mathit{-64} degrees from horizontal. Suppose
2806we move in the opposite direction, up and to the left:
2807
2808@smallexample
2809@group
28102: -0.89879 2: 0.89879 1: -2.0503 1: -64.
28111: 0.43837 1: -0.43837 . .
2812 . .
2813
2814 U U M-2 n / I T
2815@end group
2816@end smallexample
2817
2818@noindent
2819How can the angle be the same? The answer is that the @kbd{/} operation
2820loses information about the signs of its inputs. Because the quotient
2821is negative, we know exactly one of the inputs was negative, but we
2822can't tell which one. There is an @kbd{f T} [@code{arctan2}] function which
2823computes the inverse tangent of the quotient of a pair of numbers.
2824Since you feed it the two original numbers, it has enough information
2825to give you a full 360-degree answer.
2826
2827@smallexample
2828@group
28292: 0.89879 1: 116. 3: 116. 2: 116. 1: 180.
28301: -0.43837 . 2: -0.89879 1: -64. .
2831 . 1: 0.43837 .
2832 .
2833
2834 U U f T M-@key{RET} M-2 n f T -
2835@end group
2836@end smallexample
2837
2838@noindent
2839The resulting angles differ by 180 degrees; in other words, they
2840point in opposite directions, just as we would expect.
2841
2842The @key{META}-@key{RET} we used in the third step is the
2843``last-arguments'' command. It is sort of like Undo, except that it
2844restores the arguments of the last command to the stack without removing
2845the command's result. It is useful in situations like this one,
2846where we need to do several operations on the same inputs. We could
2847have accomplished the same thing by using @kbd{M-2 @key{RET}} to duplicate
2848the top two stack elements right after the @kbd{U U}, then a pair of
2849@kbd{M-@key{TAB}} commands to cycle the 116 up around the duplicates.
2850
2851A similar identity is supposed to hold for hyperbolic sines and cosines,
2852except that it is the @emph{difference}
2853@texline @math{\cosh^2x - \sinh^2x}
2854@infoline @expr{cosh(x)^2 - sinh(x)^2}
2855that always equals one. Let's try to verify this identity.
2856
2857@smallexample
2858@group
28592: -64 2: -64 2: -64 2: 9.7192e54 2: 9.7192e54
28601: -64 1: -3.1175e27 1: 9.7192e54 1: -64 1: 9.7192e54
2861 . . . . .
2862
2863 64 n @key{RET} @key{RET} H C 2 ^ @key{TAB} H S 2 ^
2864@end group
2865@end smallexample
2866
2867@noindent
2868@cindex Roundoff errors, examples
2869Something's obviously wrong, because when we subtract these numbers
2870the answer will clearly be zero! But if you think about it, if these
2871numbers @emph{did} differ by one, it would be in the 55th decimal
2872place. The difference we seek has been lost entirely to roundoff
2873error.
2874
2875We could verify this hypothesis by doing the actual calculation with,
2876say, 60 decimal places of precision. This will be slow, but not
2877enormously so. Try it if you wish; sure enough, the answer is
28780.99999, reasonably close to 1.
2879
2880Of course, a more reasonable way to verify the identity is to use
2881a more reasonable value for @expr{x}!
2882
2883@cindex Common logarithm
2884Some Calculator commands use the Hyperbolic prefix for other purposes.
2885The logarithm and exponential functions, for example, work to the base
2886@expr{e} normally but use base-10 instead if you use the Hyperbolic
2887prefix.
2888
2889@smallexample
2890@group
28911: 1000 1: 6.9077 1: 1000 1: 3
2892 . . . .
2893
2894 1000 L U H L
2895@end group
2896@end smallexample
2897
2898@noindent
2899First, we mistakenly compute a natural logarithm. Then we undo
2900and compute a common logarithm instead.
2901
2902The @kbd{B} key computes a general base-@var{b} logarithm for any
2903value of @var{b}.
2904
2905@smallexample
2906@group
29072: 1000 1: 3 1: 1000. 2: 1000. 1: 6.9077
29081: 10 . . 1: 2.71828 .
2909 . .
2910
2911 1000 @key{RET} 10 B H E H P B
2912@end group
2913@end smallexample
2914
2915@noindent
2916Here we first use @kbd{B} to compute the base-10 logarithm, then use
2917the ``hyperbolic'' exponential as a cheap hack to recover the number
29181000, then use @kbd{B} again to compute the natural logarithm. Note
2919that @kbd{P} with the hyperbolic prefix pushes the constant @expr{e}
2920onto the stack.
2921
2922You may have noticed that both times we took the base-10 logarithm
2923of 1000, we got an exact integer result. Calc always tries to give
2924an exact rational result for calculations involving rational numbers
2925where possible. But when we used @kbd{H E}, the result was a
2926floating-point number for no apparent reason. In fact, if we had
2927computed @kbd{10 @key{RET} 3 ^} we @emph{would} have gotten an
2928exact integer 1000. But the @kbd{H E} command is rigged to generate
2929a floating-point result all of the time so that @kbd{1000 H E} will
2930not waste time computing a thousand-digit integer when all you
2931probably wanted was @samp{1e1000}.
2932
2933(@bullet{}) @strong{Exercise 2.} Find a pair of integer inputs to
2934the @kbd{B} command for which Calc could find an exact rational
2935result but doesn't. @xref{Arithmetic Answer 2, 2}. (@bullet{})
2936
2937The Calculator also has a set of functions relating to combinatorics
2938and statistics. You may be familiar with the @dfn{factorial} function,
2939which computes the product of all the integers up to a given number.
2940
2941@smallexample
2942@group
29431: 100 1: 93326215443... 1: 100. 1: 9.3326e157
2944 . . . .
2945
2946 100 ! U c f !
2947@end group
2948@end smallexample
2949
2950@noindent
2951Recall, the @kbd{c f} command converts the integer or fraction at the
2952top of the stack to floating-point format. If you take the factorial
2953of a floating-point number, you get a floating-point result
2954accurate to the current precision. But if you give @kbd{!} an
2955exact integer, you get an exact integer result (158 digits long
2956in this case).
2957
2958If you take the factorial of a non-integer, Calc uses a generalized
2959factorial function defined in terms of Euler's Gamma function
2960@texline @math{\Gamma(n)}
2961@infoline @expr{gamma(n)}
2962(which is itself available as the @kbd{f g} command).
2963
2964@smallexample
2965@group
29663: 4. 3: 24. 1: 5.5 1: 52.342777847
29672: 4.5 2: 52.3427777847 . .
29681: 5. 1: 120.
2969 . .
2970
2971 M-3 ! M-0 @key{DEL} 5.5 f g
2972@end group
2973@end smallexample
2974
2975@noindent
2976Here we verify the identity
2977@texline @math{n! = \Gamma(n+1)}.
2978@infoline @expr{@var{n}!@: = gamma(@var{n}+1)}.
2979
2980The binomial coefficient @var{n}-choose-@var{m}
2981@texline or @math{\displaystyle {n \choose m}}
2982is defined by
2983@texline @math{\displaystyle {n! \over m! \, (n-m)!}}
2984@infoline @expr{n!@: / m!@: (n-m)!}
2985for all reals @expr{n} and @expr{m}. The intermediate results in this
2986formula can become quite large even if the final result is small; the
2987@kbd{k c} command computes a binomial coefficient in a way that avoids
2988large intermediate values.
2989
2990The @kbd{k} prefix key defines several common functions out of
2991combinatorics and number theory. Here we compute the binomial
2992coefficient 30-choose-20, then determine its prime factorization.
2993
2994@smallexample
2995@group
29962: 30 1: 30045015 1: [3, 3, 5, 7, 11, 13, 23, 29]
29971: 20 . .
2998 .
2999
3000 30 @key{RET} 20 k c k f
3001@end group
3002@end smallexample
3003
3004@noindent
3005You can verify these prime factors by using @kbd{v u} to ``unpack''
3006this vector into 8 separate stack entries, then @kbd{M-8 *} to
3007multiply them back together. The result is the original number,
300830045015.
3009
3010@cindex Hash tables
3011Suppose a program you are writing needs a hash table with at least
301210000 entries. It's best to use a prime number as the actual size
3013of a hash table. Calc can compute the next prime number after 10000:
3014
3015@smallexample
3016@group
30171: 10000 1: 10007 1: 9973
3018 . . .
3019
3020 10000 k n I k n
3021@end group
3022@end smallexample
3023
3024@noindent
3025Just for kicks we've also computed the next prime @emph{less} than
302610000.
3027
3028@c [fix-ref Financial Functions]
3029@xref{Financial Functions}, for a description of the Calculator
3030commands that deal with business and financial calculations (functions
3031like @code{pv}, @code{rate}, and @code{sln}).
3032
3033@c [fix-ref Binary Number Functions]
3034@xref{Binary Functions}, to read about the commands for operating
3035on binary numbers (like @code{and}, @code{xor}, and @code{lsh}).
3036
3037@node Vector/Matrix Tutorial, Types Tutorial, Arithmetic Tutorial, Tutorial
3038@section Vector/Matrix Tutorial
3039
3040@noindent
3041A @dfn{vector} is a list of numbers or other Calc data objects.
3042Calc provides a large set of commands that operate on vectors. Some
3043are familiar operations from vector analysis. Others simply treat
3044a vector as a list of objects.
3045
3046@menu
3047* Vector Analysis Tutorial::
3048* Matrix Tutorial::
3049* List Tutorial::
3050@end menu
3051
3052@node Vector Analysis Tutorial, Matrix Tutorial, Vector/Matrix Tutorial, Vector/Matrix Tutorial
3053@subsection Vector Analysis
3054
3055@noindent
3056If you add two vectors, the result is a vector of the sums of the
3057elements, taken pairwise.
3058
3059@smallexample
3060@group
30611: [1, 2, 3] 2: [1, 2, 3] 1: [8, 8, 3]
3062 . 1: [7, 6, 0] .
3063 .
3064
3065 [1,2,3] s 1 [7 6 0] s 2 +
3066@end group
3067@end smallexample
3068
3069@noindent
3070Note that we can separate the vector elements with either commas or
3071spaces. This is true whether we are using incomplete vectors or
3072algebraic entry. The @kbd{s 1} and @kbd{s 2} commands save these
3073vectors so we can easily reuse them later.
3074
3075If you multiply two vectors, the result is the sum of the products
3076of the elements taken pairwise. This is called the @dfn{dot product}
3077of the vectors.
3078
3079@smallexample
3080@group
30812: [1, 2, 3] 1: 19
30821: [7, 6, 0] .
3083 .
3084
3085 r 1 r 2 *
3086@end group
3087@end smallexample
3088
3089@cindex Dot product
3090The dot product of two vectors is equal to the product of their
3091lengths times the cosine of the angle between them. (Here the vector
3092is interpreted as a line from the origin @expr{(0,0,0)} to the
3093specified point in three-dimensional space.) The @kbd{A}
3094(absolute value) command can be used to compute the length of a
3095vector.
3096
3097@smallexample
3098@group
30993: 19 3: 19 1: 0.550782 1: 56.579
31002: [1, 2, 3] 2: 3.741657 . .
31011: [7, 6, 0] 1: 9.219544
3102 . .
3103
3104 M-@key{RET} M-2 A * / I C
3105@end group
3106@end smallexample
3107
3108@noindent
3109First we recall the arguments to the dot product command, then
3110we compute the absolute values of the top two stack entries to
3111obtain the lengths of the vectors, then we divide the dot product
3112by the product of the lengths to get the cosine of the angle.
3113The inverse cosine finds that the angle between the vectors
3114is about 56 degrees.
3115
3116@cindex Cross product
3117@cindex Perpendicular vectors
3118The @dfn{cross product} of two vectors is a vector whose length
3119is the product of the lengths of the inputs times the sine of the
3120angle between them, and whose direction is perpendicular to both
3121input vectors. Unlike the dot product, the cross product is
3122defined only for three-dimensional vectors. Let's double-check
3123our computation of the angle using the cross product.
3124
3125@smallexample
3126@group
31272: [1, 2, 3] 3: [-18, 21, -8] 1: [-0.52, 0.61, -0.23] 1: 56.579
31281: [7, 6, 0] 2: [1, 2, 3] . .
3129 . 1: [7, 6, 0]
3130 .
3131
3132 r 1 r 2 V C s 3 M-@key{RET} M-2 A * / A I S
3133@end group
3134@end smallexample
3135
3136@noindent
3137First we recall the original vectors and compute their cross product,
3138which we also store for later reference. Now we divide the vector
3139by the product of the lengths of the original vectors. The length of
3140this vector should be the sine of the angle; sure enough, it is!
3141
3142@c [fix-ref General Mode Commands]
3143Vector-related commands generally begin with the @kbd{v} prefix key.
3144Some are uppercase letters and some are lowercase. To make it easier
3145to type these commands, the shift-@kbd{V} prefix key acts the same as
3146the @kbd{v} key. (@xref{General Mode Commands}, for a way to make all
3147prefix keys have this property.)
3148
3149If we take the dot product of two perpendicular vectors we expect
3150to get zero, since the cosine of 90 degrees is zero. Let's check
3151that the cross product is indeed perpendicular to both inputs:
3152
3153@smallexample
3154@group
31552: [1, 2, 3] 1: 0 2: [7, 6, 0] 1: 0
31561: [-18, 21, -8] . 1: [-18, 21, -8] .
3157 . .
3158
3159 r 1 r 3 * @key{DEL} r 2 r 3 *
3160@end group
3161@end smallexample
3162
3163@cindex Normalizing a vector
3164@cindex Unit vectors
3165(@bullet{}) @strong{Exercise 1.} Given a vector on the top of the
3166stack, what keystrokes would you use to @dfn{normalize} the
3167vector, i.e., to reduce its length to one without changing its
3168direction? @xref{Vector Answer 1, 1}. (@bullet{})
3169
3170(@bullet{}) @strong{Exercise 2.} Suppose a certain particle can be
3171at any of several positions along a ruler. You have a list of
3172those positions in the form of a vector, and another list of the
3173probabilities for the particle to be at the corresponding positions.
3174Find the average position of the particle.
3175@xref{Vector Answer 2, 2}. (@bullet{})
3176
3177@node Matrix Tutorial, List Tutorial, Vector Analysis Tutorial, Vector/Matrix Tutorial
3178@subsection Matrices
3179
3180@noindent
3181A @dfn{matrix} is just a vector of vectors, all the same length.
3182This means you can enter a matrix using nested brackets. You can
3183also use the semicolon character to enter a matrix. We'll show
3184both methods here:
3185
3186@smallexample
3187@group
31881: [ [ 1, 2, 3 ] 1: [ [ 1, 2, 3 ]
3189 [ 4, 5, 6 ] ] [ 4, 5, 6 ] ]
3190 . .
3191
3192 [[1 2 3] [4 5 6]] ' [1 2 3; 4 5 6] @key{RET}
3193@end group
3194@end smallexample
3195
3196@noindent
3197We'll be using this matrix again, so type @kbd{s 4} to save it now.
3198
3199Note that semicolons work with incomplete vectors, but they work
3200better in algebraic entry. That's why we use the apostrophe in
3201the second example.
3202
3203When two matrices are multiplied, the lefthand matrix must have
3204the same number of columns as the righthand matrix has rows.
3205Row @expr{i}, column @expr{j} of the result is effectively the
3206dot product of row @expr{i} of the left matrix by column @expr{j}
3207of the right matrix.
3208
3209If we try to duplicate this matrix and multiply it by itself,
3210the dimensions are wrong and the multiplication cannot take place:
3211
3212@smallexample
3213@group
32141: [ [ 1, 2, 3 ] * [ [ 1, 2, 3 ]
3215 [ 4, 5, 6 ] ] [ 4, 5, 6 ] ]
3216 .
3217
3218 @key{RET} *
3219@end group
3220@end smallexample
3221
3222@noindent
3223Though rather hard to read, this is a formula which shows the product
3224of two matrices. The @samp{*} function, having invalid arguments, has
3225been left in symbolic form.
3226
3227We can multiply the matrices if we @dfn{transpose} one of them first.
3228
3229@smallexample
3230@group
32312: [ [ 1, 2, 3 ] 1: [ [ 14, 32 ] 1: [ [ 17, 22, 27 ]
3232 [ 4, 5, 6 ] ] [ 32, 77 ] ] [ 22, 29, 36 ]
32331: [ [ 1, 4 ] . [ 27, 36, 45 ] ]
3234 [ 2, 5 ] .
3235 [ 3, 6 ] ]
3236 .
3237
3238 U v t * U @key{TAB} *
3239@end group
3240@end smallexample
3241
3242Matrix multiplication is not commutative; indeed, switching the
3243order of the operands can even change the dimensions of the result
3244matrix, as happened here!
3245
3246If you multiply a plain vector by a matrix, it is treated as a
3247single row or column depending on which side of the matrix it is
3248on. The result is a plain vector which should also be interpreted
3249as a row or column as appropriate.
3250
3251@smallexample
3252@group
32532: [ [ 1, 2, 3 ] 1: [14, 32]
3254 [ 4, 5, 6 ] ] .
32551: [1, 2, 3]
3256 .
3257
3258 r 4 r 1 *
3259@end group
3260@end smallexample
3261
3262Multiplying in the other order wouldn't work because the number of
3263rows in the matrix is different from the number of elements in the
3264vector.
3265
3266(@bullet{}) @strong{Exercise 1.} Use @samp{*} to sum along the rows
3267of the above
3268@texline @math{2\times3}
3269@infoline 2x3
3270matrix to get @expr{[6, 15]}. Now use @samp{*} to sum along the columns
3271to get @expr{[5, 7, 9]}.
3272@xref{Matrix Answer 1, 1}. (@bullet{})
3273
3274@cindex Identity matrix
3275An @dfn{identity matrix} is a square matrix with ones along the
3276diagonal and zeros elsewhere. It has the property that multiplication
3277by an identity matrix, on the left or on the right, always produces
3278the original matrix.
3279
3280@smallexample
3281@group
32821: [ [ 1, 2, 3 ] 2: [ [ 1, 2, 3 ] 1: [ [ 1, 2, 3 ]
3283 [ 4, 5, 6 ] ] [ 4, 5, 6 ] ] [ 4, 5, 6 ] ]
3284 . 1: [ [ 1, 0, 0 ] .
3285 [ 0, 1, 0 ]
3286 [ 0, 0, 1 ] ]
3287 .
3288
3289 r 4 v i 3 @key{RET} *
3290@end group
3291@end smallexample
3292
3293If a matrix is square, it is often possible to find its @dfn{inverse},
3294that is, a matrix which, when multiplied by the original matrix, yields
3295an identity matrix. The @kbd{&} (reciprocal) key also computes the
3296inverse of a matrix.
3297
3298@smallexample
3299@group
33001: [ [ 1, 2, 3 ] 1: [ [ -2.4, 1.2, -0.2 ]
3301 [ 4, 5, 6 ] [ 2.8, -1.4, 0.4 ]
3302 [ 7, 6, 0 ] ] [ -0.73333, 0.53333, -0.2 ] ]
3303 . .
3304
3305 r 4 r 2 | s 5 &
3306@end group
3307@end smallexample
3308
3309@noindent
3310The vertical bar @kbd{|} @dfn{concatenates} numbers, vectors, and
3311matrices together. Here we have used it to add a new row onto
3312our matrix to make it square.
3313
3314We can multiply these two matrices in either order to get an identity.
3315
3316@smallexample
3317@group
33181: [ [ 1., 0., 0. ] 1: [ [ 1., 0., 0. ]
3319 [ 0., 1., 0. ] [ 0., 1., 0. ]
3320 [ 0., 0., 1. ] ] [ 0., 0., 1. ] ]
3321 . .
3322
3323 M-@key{RET} * U @key{TAB} *
3324@end group
3325@end smallexample
3326
3327@cindex Systems of linear equations
3328@cindex Linear equations, systems of
3329Matrix inverses are related to systems of linear equations in algebra.
3330Suppose we had the following set of equations:
3331
3332@ifnottex
3333@group
3334@example
3335 a + 2b + 3c = 6
3336 4a + 5b + 6c = 2
3337 7a + 6b = 3
3338@end example
3339@end group
3340@end ifnottex
3341@tex
3342\turnoffactive
3343\beforedisplayh
3344$$ \openup1\jot \tabskip=0pt plus1fil
3345\halign to\displaywidth{\tabskip=0pt
3346 $\hfil#$&$\hfil{}#{}$&
3347 $\hfil#$&$\hfil{}#{}$&
3348 $\hfil#$&${}#\hfil$\tabskip=0pt plus1fil\cr
3349 a&+&2b&+&3c&=6 \cr
3350 4a&+&5b&+&6c&=2 \cr
3351 7a&+&6b& & &=3 \cr}
3352$$
3353\afterdisplayh
3354@end tex
3355
3356@noindent
3357This can be cast into the matrix equation,
3358
3359@ifnottex
3360@group
3361@example
3362 [ [ 1, 2, 3 ] [ [ a ] [ [ 6 ]
3363 [ 4, 5, 6 ] * [ b ] = [ 2 ]
3364 [ 7, 6, 0 ] ] [ c ] ] [ 3 ] ]
3365@end example
3366@end group
3367@end ifnottex
3368@tex
3369\turnoffactive
3370\beforedisplay
3371$$ \pmatrix{ 1 & 2 & 3 \cr 4 & 5 & 6 \cr 7 & 6 & 0 }
3372 \times
3373 \pmatrix{ a \cr b \cr c } = \pmatrix{ 6 \cr 2 \cr 3 }
3374$$
3375\afterdisplay
3376@end tex
3377
3378We can solve this system of equations by multiplying both sides by the
3379inverse of the matrix. Calc can do this all in one step:
3380
3381@smallexample
3382@group
33832: [6, 2, 3] 1: [-12.6, 15.2, -3.93333]
33841: [ [ 1, 2, 3 ] .
3385 [ 4, 5, 6 ]
3386 [ 7, 6, 0 ] ]
3387 .
3388
3389 [6,2,3] r 5 /
3390@end group
3391@end smallexample
3392
3393@noindent
3394The result is the @expr{[a, b, c]} vector that solves the equations.
3395(Dividing by a square matrix is equivalent to multiplying by its
3396inverse.)
3397
3398Let's verify this solution:
3399
3400@smallexample
3401@group
34022: [ [ 1, 2, 3 ] 1: [6., 2., 3.]
3403 [ 4, 5, 6 ] .
3404 [ 7, 6, 0 ] ]
34051: [-12.6, 15.2, -3.93333]
3406 .
3407
3408 r 5 @key{TAB} *
3409@end group
3410@end smallexample
3411
3412@noindent
3413Note that we had to be careful about the order in which we multiplied
3414the matrix and vector. If we multiplied in the other order, Calc would
3415assume the vector was a row vector in order to make the dimensions
3416come out right, and the answer would be incorrect. If you
3417don't feel safe letting Calc take either interpretation of your
3418vectors, use explicit
3419@texline @math{N\times1}
3420@infoline Nx1
3421or
3422@texline @math{1\times N}
3423@infoline 1xN
3424matrices instead. In this case, you would enter the original column
3425vector as @samp{[[6], [2], [3]]} or @samp{[6; 2; 3]}.
3426
3427(@bullet{}) @strong{Exercise 2.} Algebraic entry allows you to make
3428vectors and matrices that include variables. Solve the following
3429system of equations to get expressions for @expr{x} and @expr{y}
3430in terms of @expr{a} and @expr{b}.
3431
3432@ifnottex
3433@group
3434@example
3435 x + a y = 6
3436 x + b y = 10
3437@end example
3438@end group
3439@end ifnottex
3440@tex
3441\turnoffactive
3442\beforedisplay
3443$$ \eqalign{ x &+ a y = 6 \cr
3444 x &+ b y = 10}
3445$$
3446\afterdisplay
3447@end tex
3448
3449@noindent
3450@xref{Matrix Answer 2, 2}. (@bullet{})
3451
3452@cindex Least-squares for over-determined systems
3453@cindex Over-determined systems of equations
3454(@bullet{}) @strong{Exercise 3.} A system of equations is ``over-determined''
3455if it has more equations than variables. It is often the case that
3456there are no values for the variables that will satisfy all the
3457equations at once, but it is still useful to find a set of values
3458which ``nearly'' satisfy all the equations. In terms of matrix equations,
3459you can't solve @expr{A X = B} directly because the matrix @expr{A}
3460is not square for an over-determined system. Matrix inversion works
3461only for square matrices. One common trick is to multiply both sides
3462on the left by the transpose of @expr{A}:
3463@ifnottex
3464@samp{trn(A)*A*X = trn(A)*B}.
3465@end ifnottex
3466@tex
3467\turnoffactive
3468$A^T A \, X = A^T B$, where $A^T$ is the transpose \samp{trn(A)}.
3469@end tex
3470Now
3471@texline @math{A^T A}
3472@infoline @expr{trn(A)*A}
3473is a square matrix so a solution is possible. It turns out that the
3474@expr{X} vector you compute in this way will be a ``least-squares''
3475solution, which can be regarded as the ``closest'' solution to the set
3476of equations. Use Calc to solve the following over-determined
3477system:
3478
3479@ifnottex
3480@group
3481@example
3482 a + 2b + 3c = 6
3483 4a + 5b + 6c = 2
3484 7a + 6b = 3
3485 2a + 4b + 6c = 11
3486@end example
3487@end group
3488@end ifnottex
3489@tex
3490\turnoffactive
3491\beforedisplayh
3492$$ \openup1\jot \tabskip=0pt plus1fil
3493\halign to\displaywidth{\tabskip=0pt
3494 $\hfil#$&$\hfil{}#{}$&
3495 $\hfil#$&$\hfil{}#{}$&
3496 $\hfil#$&${}#\hfil$\tabskip=0pt plus1fil\cr
3497 a&+&2b&+&3c&=6 \cr
3498 4a&+&5b&+&6c&=2 \cr
3499 7a&+&6b& & &=3 \cr
3500 2a&+&4b&+&6c&=11 \cr}
3501$$
3502\afterdisplayh
3503@end tex
3504
3505@noindent
3506@xref{Matrix Answer 3, 3}. (@bullet{})
3507
3508@node List Tutorial, , Matrix Tutorial, Vector/Matrix Tutorial
3509@subsection Vectors as Lists
3510
3511@noindent
3512@cindex Lists
3513Although Calc has a number of features for manipulating vectors and
3514matrices as mathematical objects, you can also treat vectors as
3515simple lists of values. For example, we saw that the @kbd{k f}
3516command returns a vector which is a list of the prime factors of a
3517number.
3518
3519You can pack and unpack stack entries into vectors:
3520
3521@smallexample
3522@group
35233: 10 1: [10, 20, 30] 3: 10
35242: 20 . 2: 20
35251: 30 1: 30
3526 . .
3527
3528 M-3 v p v u
3529@end group
3530@end smallexample
3531
3532You can also build vectors out of consecutive integers, or out
3533of many copies of a given value:
3534
3535@smallexample
3536@group
35371: [1, 2, 3, 4] 2: [1, 2, 3, 4] 2: [1, 2, 3, 4]
3538 . 1: 17 1: [17, 17, 17, 17]
3539 . .
3540
3541 v x 4 @key{RET} 17 v b 4 @key{RET}
3542@end group
3543@end smallexample
3544
3545You can apply an operator to every element of a vector using the
3546@dfn{map} command.
3547
3548@smallexample
3549@group
35501: [17, 34, 51, 68] 1: [289, 1156, 2601, 4624] 1: [17, 34, 51, 68]
3551 . . .
3552
3553 V M * 2 V M ^ V M Q
3554@end group
3555@end smallexample
3556
3557@noindent
3558In the first step, we multiply the vector of integers by the vector
3559of 17's elementwise. In the second step, we raise each element to
3560the power two. (The general rule is that both operands must be
3561vectors of the same length, or else one must be a vector and the
3562other a plain number.) In the final step, we take the square root
3563of each element.
3564
3565(@bullet{}) @strong{Exercise 1.} Compute a vector of powers of two
3566from
3567@texline @math{2^{-4}}
3568@infoline @expr{2^-4}
3569to @expr{2^4}. @xref{List Answer 1, 1}. (@bullet{})
3570
3571You can also @dfn{reduce} a binary operator across a vector.
3572For example, reducing @samp{*} computes the product of all the
3573elements in the vector:
3574
3575@smallexample
3576@group
35771: 123123 1: [3, 7, 11, 13, 41] 1: 123123
3578 . . .
3579
3580 123123 k f V R *
3581@end group
3582@end smallexample
3583
3584@noindent
3585In this example, we decompose 123123 into its prime factors, then
3586multiply those factors together again to yield the original number.
3587
3588We could compute a dot product ``by hand'' using mapping and
3589reduction:
3590
3591@smallexample
3592@group
35932: [1, 2, 3] 1: [7, 12, 0] 1: 19
35941: [7, 6, 0] . .
3595 .
3596
3597 r 1 r 2 V M * V R +
3598@end group
3599@end smallexample
3600
3601@noindent
3602Recalling two vectors from the previous section, we compute the
3603sum of pairwise products of the elements to get the same answer
3604for the dot product as before.
3605
3606A slight variant of vector reduction is the @dfn{accumulate} operation,
3607@kbd{V U}. This produces a vector of the intermediate results from
3608a corresponding reduction. Here we compute a table of factorials:
3609
3610@smallexample
3611@group
36121: [1, 2, 3, 4, 5, 6] 1: [1, 2, 6, 24, 120, 720]
3613 . .
3614
3615 v x 6 @key{RET} V U *
3616@end group
3617@end smallexample
3618
3619Calc allows vectors to grow as large as you like, although it gets
3620rather slow if vectors have more than about a hundred elements.
3621Actually, most of the time is spent formatting these large vectors
3622for display, not calculating on them. Try the following experiment
3623(if your computer is very fast you may need to substitute a larger
3624vector size).
3625
3626@smallexample
3627@group
36281: [1, 2, 3, 4, ... 1: [2, 3, 4, 5, ...
3629 . .
3630
3631 v x 500 @key{RET} 1 V M +
3632@end group
3633@end smallexample
3634
3635Now press @kbd{v .} (the letter @kbd{v}, then a period) and try the
3636experiment again. In @kbd{v .} mode, long vectors are displayed
3637``abbreviated'' like this:
3638
3639@smallexample
3640@group
36411: [1, 2, 3, ..., 500] 1: [2, 3, 4, ..., 501]
3642 . .
3643
3644 v x 500 @key{RET} 1 V M +
3645@end group
3646@end smallexample
3647
3648@noindent
3649(where now the @samp{...} is actually part of the Calc display).
3650You will find both operations are now much faster. But notice that
3651even in @w{@kbd{v .}} mode, the full vectors are still shown in the Trail.
3652Type @w{@kbd{t .}} to cause the trail to abbreviate as well, and try the
3653experiment one more time. Operations on long vectors are now quite
3654fast! (But of course if you use @kbd{t .} you will lose the ability
3655to get old vectors back using the @kbd{t y} command.)
3656
3657An easy way to view a full vector when @kbd{v .} mode is active is
3658to press @kbd{`} (back-quote) to edit the vector; editing always works
3659with the full, unabbreviated value.
3660
3661@cindex Least-squares for fitting a straight line
3662@cindex Fitting data to a line
3663@cindex Line, fitting data to
3664@cindex Data, extracting from buffers
3665@cindex Columns of data, extracting
3666As a larger example, let's try to fit a straight line to some data,
3667using the method of least squares. (Calc has a built-in command for
3668least-squares curve fitting, but we'll do it by hand here just to
3669practice working with vectors.) Suppose we have the following list
3670of values in a file we have loaded into Emacs:
3671
3672@smallexample
3673 x y
3674 --- ---
3675 1.34 0.234
3676 1.41 0.298
3677 1.49 0.402
3678 1.56 0.412
3679 1.64 0.466
3680 1.73 0.473
3681 1.82 0.601
3682 1.91 0.519
3683 2.01 0.603
3684 2.11 0.637
3685 2.22 0.645
3686 2.33 0.705
3687 2.45 0.917
3688 2.58 1.009
3689 2.71 0.971
3690 2.85 1.062
3691 3.00 1.148
3692 3.15 1.157
3693 3.32 1.354
3694@end smallexample
3695
3696@noindent
3697If you are reading this tutorial in printed form, you will find it
3698easiest to press @kbd{C-x * i} to enter the on-line Info version of
3699the manual and find this table there. (Press @kbd{g}, then type
3700@kbd{List Tutorial}, to jump straight to this section.)
3701
3702Position the cursor at the upper-left corner of this table, just
3703to the left of the @expr{1.34}. Press @kbd{C-@@} to set the mark.
3704(On your system this may be @kbd{C-2}, @kbd{C-@key{SPC}}, or @kbd{NUL}.)
3705Now position the cursor to the lower-right, just after the @expr{1.354}.
3706You have now defined this region as an Emacs ``rectangle.'' Still
3707in the Info buffer, type @kbd{C-x * r}. This command
3708(@code{calc-grab-rectangle}) will pop you back into the Calculator, with
3709the contents of the rectangle you specified in the form of a matrix.
3710
3711@smallexample
3712@group
37131: [ [ 1.34, 0.234 ]
3714 [ 1.41, 0.298 ]
3715 @dots{}
3716@end group
3717@end smallexample
3718
3719@noindent
3720(You may wish to use @kbd{v .} mode to abbreviate the display of this
3721large matrix.)
3722
3723We want to treat this as a pair of lists. The first step is to
3724transpose this matrix into a pair of rows. Remember, a matrix is
3725just a vector of vectors. So we can unpack the matrix into a pair
3726of row vectors on the stack.
3727
3728@smallexample
3729@group
37301: [ [ 1.34, 1.41, 1.49, ... ] 2: [1.34, 1.41, 1.49, ... ]
3731 [ 0.234, 0.298, 0.402, ... ] ] 1: [0.234, 0.298, 0.402, ... ]
3732 . .
3733
3734 v t v u
3735@end group
3736@end smallexample
3737
3738@noindent
3739Let's store these in quick variables 1 and 2, respectively.
3740
3741@smallexample
3742@group
37431: [1.34, 1.41, 1.49, ... ] .
3744 .
3745
3746 t 2 t 1
3747@end group
3748@end smallexample
3749
3750@noindent
3751(Recall that @kbd{t 2} is a variant of @kbd{s 2} that removes the
3752stored value from the stack.)
3753
3754In a least squares fit, the slope @expr{m} is given by the formula
3755
3756@ifnottex
3757@example
3758m = (N sum(x y) - sum(x) sum(y)) / (N sum(x^2) - sum(x)^2)
3759@end example
3760@end ifnottex
3761@tex
3762\turnoffactive
3763\beforedisplay
3764$$ m = {N \sum x y - \sum x \sum y \over
3765 N \sum x^2 - \left( \sum x \right)^2} $$
3766\afterdisplay
3767@end tex
3768
3769@noindent
3770where
3771@texline @math{\sum x}
3772@infoline @expr{sum(x)}
3773represents the sum of all the values of @expr{x}. While there is an
3774actual @code{sum} function in Calc, it's easier to sum a vector using a
3775simple reduction. First, let's compute the four different sums that
3776this formula uses.
3777
3778@smallexample
3779@group
37801: 41.63 1: 98.0003
3781 . .
3782
3783 r 1 V R + t 3 r 1 2 V M ^ V R + t 4
3784
3785@end group
3786@end smallexample
3787@noindent
3788@smallexample
3789@group
37901: 13.613 1: 33.36554
3791 . .
3792
3793 r 2 V R + t 5 r 1 r 2 V M * V R + t 6
3794@end group
3795@end smallexample
3796
3797@ifnottex
3798@noindent
3799These are @samp{sum(x)}, @samp{sum(x^2)}, @samp{sum(y)}, and @samp{sum(x y)},
3800respectively. (We could have used @kbd{*} to compute @samp{sum(x^2)} and
3801@samp{sum(x y)}.)
3802@end ifnottex
3803@tex
3804\turnoffactive
3805These are $\sum x$, $\sum x^2$, $\sum y$, and $\sum x y$,
3806respectively. (We could have used \kbd{*} to compute $\sum x^2$ and
3807$\sum x y$.)
3808@end tex
3809
3810Finally, we also need @expr{N}, the number of data points. This is just
3811the length of either of our lists.
3812
3813@smallexample
3814@group
38151: 19
3816 .
3817
3818 r 1 v l t 7
3819@end group
3820@end smallexample
3821
3822@noindent
3823(That's @kbd{v} followed by a lower-case @kbd{l}.)
3824
3825Now we grind through the formula:
3826
3827@smallexample
3828@group
38291: 633.94526 2: 633.94526 1: 67.23607
3830 . 1: 566.70919 .
3831 .
3832
3833 r 7 r 6 * r 3 r 5 * -
3834
3835@end group
3836@end smallexample
3837@noindent
3838@smallexample
3839@group
38402: 67.23607 3: 67.23607 2: 67.23607 1: 0.52141679
38411: 1862.0057 2: 1862.0057 1: 128.9488 .
3842 . 1: 1733.0569 .
3843 .
3844
3845 r 7 r 4 * r 3 2 ^ - / t 8
3846@end group
3847@end smallexample
3848
3849That gives us the slope @expr{m}. The y-intercept @expr{b} can now
3850be found with the simple formula,
3851
3852@ifnottex
3853@example
3854b = (sum(y) - m sum(x)) / N
3855@end example
3856@end ifnottex
3857@tex
3858\turnoffactive
3859\beforedisplay
3860$$ b = {\sum y - m \sum x \over N} $$
3861\afterdisplay
3862\vskip10pt
3863@end tex
3864
3865@smallexample
3866@group
38671: 13.613 2: 13.613 1: -8.09358 1: -0.425978
3868 . 1: 21.70658 . .
3869 .
3870
3871 r 5 r 8 r 3 * - r 7 / t 9
3872@end group
3873@end smallexample
3874
3875Let's ``plot'' this straight line approximation,
3876@texline @math{y \approx m x + b},
3877@infoline @expr{m x + b},
3878and compare it with the original data.
3879
3880@smallexample
3881@group
38821: [0.699, 0.735, ... ] 1: [0.273, 0.309, ... ]
3883 . .
3884
3885 r 1 r 8 * r 9 + s 0
3886@end group
3887@end smallexample
3888
3889@noindent
3890Notice that multiplying a vector by a constant, and adding a constant
3891to a vector, can be done without mapping commands since these are
3892common operations from vector algebra. As far as Calc is concerned,
3893we've just been doing geometry in 19-dimensional space!
3894
3895We can subtract this vector from our original @expr{y} vector to get
3896a feel for the error of our fit. Let's find the maximum error:
3897
3898@smallexample
3899@group
39001: [0.0387, 0.0112, ... ] 1: [0.0387, 0.0112, ... ] 1: 0.0897
3901 . . .
3902
3903 r 2 - V M A V R X
3904@end group
3905@end smallexample
3906
3907@noindent
3908First we compute a vector of differences, then we take the absolute
3909values of these differences, then we reduce the @code{max} function
3910across the vector. (The @code{max} function is on the two-key sequence
3911@kbd{f x}; because it is so common to use @code{max} in a vector
3912operation, the letters @kbd{X} and @kbd{N} are also accepted for
3913@code{max} and @code{min} in this context. In general, you answer
3914the @kbd{V M} or @kbd{V R} prompt with the actual key sequence that
3915invokes the function you want. You could have typed @kbd{V R f x} or
3916even @kbd{V R x max @key{RET}} if you had preferred.)
3917
3918If your system has the GNUPLOT program, you can see graphs of your
3919data and your straight line to see how well they match. (If you have
3920GNUPLOT 3.0 or higher, the following instructions will work regardless
3921of the kind of display you have. Some GNUPLOT 2.0, non-X-windows systems
3922may require additional steps to view the graphs.)
3923
3924Let's start by plotting the original data. Recall the ``@var{x}'' and ``@var{y}''
3925vectors onto the stack and press @kbd{g f}. This ``fast'' graphing
3926command does everything you need to do for simple, straightforward
3927plotting of data.
3928
3929@smallexample
3930@group
39312: [1.34, 1.41, 1.49, ... ]
39321: [0.234, 0.298, 0.402, ... ]
3933 .
3934
3935 r 1 r 2 g f
3936@end group
3937@end smallexample
3938
3939If all goes well, you will shortly get a new window containing a graph
3940of the data. (If not, contact your GNUPLOT or Calc installer to find
3941out what went wrong.) In the X window system, this will be a separate
3942graphics window. For other kinds of displays, the default is to
3943display the graph in Emacs itself using rough character graphics.
3944Press @kbd{q} when you are done viewing the character graphics.
3945
3946Next, let's add the line we got from our least-squares fit.
3947@ifinfo
3948(If you are reading this tutorial on-line while running Calc, typing
3949@kbd{g a} may cause the tutorial to disappear from its window and be
3950replaced by a buffer named @samp{*Gnuplot Commands*}. The tutorial
3951will reappear when you terminate GNUPLOT by typing @kbd{g q}.)
3952@end ifinfo
3953
3954@smallexample
3955@group
39562: [1.34, 1.41, 1.49, ... ]
39571: [0.273, 0.309, 0.351, ... ]
3958 .
3959
3960 @key{DEL} r 0 g a g p
3961@end group
3962@end smallexample
3963
3964It's not very useful to get symbols to mark the data points on this
3965second curve; you can type @kbd{g S g p} to remove them. Type @kbd{g q}
3966when you are done to remove the X graphics window and terminate GNUPLOT.
3967
3968(@bullet{}) @strong{Exercise 2.} An earlier exercise showed how to do
3969least squares fitting to a general system of equations. Our 19 data
3970points are really 19 equations of the form @expr{y_i = m x_i + b} for
3971different pairs of @expr{(x_i,y_i)}. Use the matrix-transpose method
3972to solve for @expr{m} and @expr{b}, duplicating the above result.
3973@xref{List Answer 2, 2}. (@bullet{})
3974
3975@cindex Geometric mean
3976(@bullet{}) @strong{Exercise 3.} If the input data do not form a
3977rectangle, you can use @w{@kbd{C-x * g}} (@code{calc-grab-region})
3978to grab the data the way Emacs normally works with regions---it reads
3979left-to-right, top-to-bottom, treating line breaks the same as spaces.
3980Use this command to find the geometric mean of the following numbers.
3981(The geometric mean is the @var{n}th root of the product of @var{n} numbers.)
3982
3983@example
39842.3 6 22 15.1 7
3985 15 14 7.5
3986 2.5
3987@end example
3988
3989@noindent
3990The @kbd{C-x * g} command accepts numbers separated by spaces or commas,
3991with or without surrounding vector brackets.
3992@xref{List Answer 3, 3}. (@bullet{})
3993
3994@ifnottex
3995As another example, a theorem about binomial coefficients tells
3996us that the alternating sum of binomial coefficients
3997@var{n}-choose-0 minus @var{n}-choose-1 plus @var{n}-choose-2, and so
3998on up to @var{n}-choose-@var{n},
3999always comes out to zero. Let's verify this
4000for @expr{n=6}.
4001@end ifnottex
4002@tex
4003As another example, a theorem about binomial coefficients tells
4004us that the alternating sum of binomial coefficients
4005${n \choose 0} - {n \choose 1} + {n \choose 2} - \cdots \pm {n \choose n}$
4006always comes out to zero. Let's verify this
4007for \cite{n=6}.
4008@end tex
4009
4010@smallexample
4011@group
40121: [1, 2, 3, 4, 5, 6, 7] 1: [0, 1, 2, 3, 4, 5, 6]
4013 . .
4014
4015 v x 7 @key{RET} 1 -
4016
4017@end group
4018@end smallexample
4019@noindent
4020@smallexample
4021@group
40221: [1, -6, 15, -20, 15, -6, 1] 1: 0
4023 . .
4024
4025 V M ' (-1)^$ choose(6,$) @key{RET} V R +
4026@end group
4027@end smallexample
4028
4029The @kbd{V M '} command prompts you to enter any algebraic expression
4030to define the function to map over the vector. The symbol @samp{$}
4031inside this expression represents the argument to the function.
4032The Calculator applies this formula to each element of the vector,
4033substituting each element's value for the @samp{$} sign(s) in turn.
4034
4035To define a two-argument function, use @samp{$$} for the first
4036argument and @samp{$} for the second: @kbd{V M ' $$-$ @key{RET}} is
4037equivalent to @kbd{V M -}. This is analogous to regular algebraic
4038entry, where @samp{$$} would refer to the next-to-top stack entry
4039and @samp{$} would refer to the top stack entry, and @kbd{' $$-$ @key{RET}}
4040would act exactly like @kbd{-}.
4041
4042Notice that the @kbd{V M '} command has recorded two things in the
4043trail: The result, as usual, and also a funny-looking thing marked
4044@samp{oper} that represents the operator function you typed in.
4045The function is enclosed in @samp{< >} brackets, and the argument is
4046denoted by a @samp{#} sign. If there were several arguments, they
4047would be shown as @samp{#1}, @samp{#2}, and so on. (For example,
4048@kbd{V M ' $$-$} will put the function @samp{<#1 - #2>} on the
4049trail.) This object is a ``nameless function''; you can use nameless
4050@w{@samp{< >}} notation to answer the @kbd{V M '} prompt if you like.
4051Nameless function notation has the interesting, occasionally useful
4052property that a nameless function is not actually evaluated until
4053it is used. For example, @kbd{V M ' $+random(2.0)} evaluates
4054@samp{random(2.0)} once and adds that random number to all elements
4055of the vector, but @kbd{V M ' <#+random(2.0)>} evaluates the
4056@samp{random(2.0)} separately for each vector element.
4057
4058Another group of operators that are often useful with @kbd{V M} are
4059the relational operators: @kbd{a =}, for example, compares two numbers
4060and gives the result 1 if they are equal, or 0 if not. Similarly,
4061@w{@kbd{a <}} checks for one number being less than another.
4062
4063Other useful vector operations include @kbd{v v}, to reverse a
4064vector end-for-end; @kbd{V S}, to sort the elements of a vector
4065into increasing order; and @kbd{v r} and @w{@kbd{v c}}, to extract
4066one row or column of a matrix, or (in both cases) to extract one
4067element of a plain vector. With a negative argument, @kbd{v r}
4068and @kbd{v c} instead delete one row, column, or vector element.
4069
4070@cindex Divisor functions
4071(@bullet{}) @strong{Exercise 4.} The @expr{k}th @dfn{divisor function}
4072@tex
4073$\sigma_k(n)$
4074@end tex
4075is the sum of the @expr{k}th powers of all the divisors of an
4076integer @expr{n}. Figure out a method for computing the divisor
4077function for reasonably small values of @expr{n}. As a test,
4078the 0th and 1st divisor functions of 30 are 8 and 72, respectively.
4079@xref{List Answer 4, 4}. (@bullet{})
4080
4081@cindex Square-free numbers
4082@cindex Duplicate values in a list
4083(@bullet{}) @strong{Exercise 5.} The @kbd{k f} command produces a
4084list of prime factors for a number. Sometimes it is important to
4085know that a number is @dfn{square-free}, i.e., that no prime occurs
4086more than once in its list of prime factors. Find a sequence of
4087keystrokes to tell if a number is square-free; your method should
4088leave 1 on the stack if it is, or 0 if it isn't.
4089@xref{List Answer 5, 5}. (@bullet{})
4090
4091@cindex Triangular lists
4092(@bullet{}) @strong{Exercise 6.} Build a list of lists that looks
4093like the following diagram. (You may wish to use the @kbd{v /}
4094command to enable multi-line display of vectors.)
4095
4096@smallexample
4097@group
40981: [ [1],
4099 [1, 2],
4100 [1, 2, 3],
4101 [1, 2, 3, 4],
4102 [1, 2, 3, 4, 5],
4103 [1, 2, 3, 4, 5, 6] ]
4104@end group
4105@end smallexample
4106
4107@noindent
4108@xref{List Answer 6, 6}. (@bullet{})
4109
4110(@bullet{}) @strong{Exercise 7.} Build the following list of lists.
4111
4112@smallexample
4113@group
41141: [ [0],
4115 [1, 2],
4116 [3, 4, 5],
4117 [6, 7, 8, 9],
4118 [10, 11, 12, 13, 14],
4119 [15, 16, 17, 18, 19, 20] ]
4120@end group
4121@end smallexample
4122
4123@noindent
4124@xref{List Answer 7, 7}. (@bullet{})
4125
4126@cindex Maximizing a function over a list of values
4127@c [fix-ref Numerical Solutions]
4128(@bullet{}) @strong{Exercise 8.} Compute a list of values of Bessel's
4129@texline @math{J_1(x)}
4130@infoline @expr{J1}
4131function @samp{besJ(1,x)} for @expr{x} from 0 to 5 in steps of 0.25.
4132Find the value of @expr{x} (from among the above set of values) for
4133which @samp{besJ(1,x)} is a maximum. Use an ``automatic'' method,
4134i.e., just reading along the list by hand to find the largest value
4135is not allowed! (There is an @kbd{a X} command which does this kind
4136of thing automatically; @pxref{Numerical Solutions}.)
4137@xref{List Answer 8, 8}. (@bullet{})
4138
4139@cindex Digits, vectors of
4140(@bullet{}) @strong{Exercise 9.} You are given an integer in the range
4141@texline @math{0 \le N < 10^m}
4142@infoline @expr{0 <= N < 10^m}
4143for @expr{m=12} (i.e., an integer of less than
4144twelve digits). Convert this integer into a vector of @expr{m}
4145digits, each in the range from 0 to 9. In vector-of-digits notation,
4146add one to this integer to produce a vector of @expr{m+1} digits
4147(since there could be a carry out of the most significant digit).
4148Convert this vector back into a regular integer. A good integer
4149to try is 25129925999. @xref{List Answer 9, 9}. (@bullet{})
4150
4151(@bullet{}) @strong{Exercise 10.} Your friend Joe tried to use
4152@kbd{V R a =} to test if all numbers in a list were equal. What
4153happened? How would you do this test? @xref{List Answer 10, 10}. (@bullet{})
4154
4155(@bullet{}) @strong{Exercise 11.} The area of a circle of radius one
4156is @cpi{}. The area of the
4157@texline @math{2\times2}
4158@infoline 2x2
4159square that encloses that circle is 4. So if we throw @var{n} darts at
4160random points in the square, about @cpiover{4} of them will land inside
4161the circle. This gives us an entertaining way to estimate the value of
4162@cpi{}. The @w{@kbd{k r}}
4163command picks a random number between zero and the value on the stack.
4164We could get a random floating-point number between @mathit{-1} and 1 by typing
4165@w{@kbd{2.0 k r 1 -}}. Build a vector of 100 random @expr{(x,y)} points in
4166this square, then use vector mapping and reduction to count how many
4167points lie inside the unit circle. Hint: Use the @kbd{v b} command.
4168@xref{List Answer 11, 11}. (@bullet{})
4169
4170@cindex Matchstick problem
4171(@bullet{}) @strong{Exercise 12.} The @dfn{matchstick problem} provides
4172another way to calculate @cpi{}. Say you have an infinite field
4173of vertical lines with a spacing of one inch. Toss a one-inch matchstick
4174onto the field. The probability that the matchstick will land crossing
4175a line turns out to be
4176@texline @math{2/\pi}.
4177@infoline @expr{2/pi}.
4178Toss 100 matchsticks to estimate @cpi{}. (If you want still more fun,
4179the probability that the GCD (@w{@kbd{k g}}) of two large integers is
4180one turns out to be
4181@texline @math{6/\pi^2}.
4182@infoline @expr{6/pi^2}.
4183That provides yet another way to estimate @cpi{}.)
4184@xref{List Answer 12, 12}. (@bullet{})
4185
4186(@bullet{}) @strong{Exercise 13.} An algebraic entry of a string in
4187double-quote marks, @samp{"hello"}, creates a vector of the numerical
4188(ASCII) codes of the characters (here, @expr{[104, 101, 108, 108, 111]}).
4189Sometimes it is convenient to compute a @dfn{hash code} of a string,
4190which is just an integer that represents the value of that string.
4191Two equal strings have the same hash code; two different strings
4192@dfn{probably} have different hash codes. (For example, Calc has
4193over 400 function names, but Emacs can quickly find the definition for
4194any given name because it has sorted the functions into ``buckets'' by
4195their hash codes. Sometimes a few names will hash into the same bucket,
4196but it is easier to search among a few names than among all the names.)
4197One popular hash function is computed as follows: First set @expr{h = 0}.
4198Then, for each character from the string in turn, set @expr{h = 3h + c_i}
4199where @expr{c_i} is the character's ASCII code. If we have 511 buckets,
4200we then take the hash code modulo 511 to get the bucket number. Develop a
4201simple command or commands for converting string vectors into hash codes.
4202The hash code for @samp{"Testing, 1, 2, 3"} is 1960915098, which modulo
4203511 is 121. @xref{List Answer 13, 13}. (@bullet{})
4204
4205(@bullet{}) @strong{Exercise 14.} The @kbd{H V R} and @kbd{H V U}
4206commands do nested function evaluations. @kbd{H V U} takes a starting
4207value and a number of steps @var{n} from the stack; it then applies the
4208function you give to the starting value 0, 1, 2, up to @var{n} times
4209and returns a vector of the results. Use this command to create a
4210``random walk'' of 50 steps. Start with the two-dimensional point
4211@expr{(0,0)}; then take one step a random distance between @mathit{-1} and 1
4212in both @expr{x} and @expr{y}; then take another step, and so on. Use the
4213@kbd{g f} command to display this random walk. Now modify your random
4214walk to walk a unit distance, but in a random direction, at each step.
4215(Hint: The @code{sincos} function returns a vector of the cosine and
4216sine of an angle.) @xref{List Answer 14, 14}. (@bullet{})
4217
4218@node Types Tutorial, Algebra Tutorial, Vector/Matrix Tutorial, Tutorial
4219@section Types Tutorial
4220
4221@noindent
4222Calc understands a variety of data types as well as simple numbers.
4223In this section, we'll experiment with each of these types in turn.
4224
4225The numbers we've been using so far have mainly been either @dfn{integers}
4226or @dfn{floats}. We saw that floats are usually a good approximation to
4227the mathematical concept of real numbers, but they are only approximations
4228and are susceptible to roundoff error. Calc also supports @dfn{fractions},
4229which can exactly represent any rational number.
4230
4231@smallexample
4232@group
42331: 3628800 2: 3628800 1: 518400:7 1: 518414:7 1: 7:518414
4234 . 1: 49 . . .
4235 .
4236
4237 10 ! 49 @key{RET} : 2 + &
4238@end group
4239@end smallexample
4240
4241@noindent
4242The @kbd{:} command divides two integers to get a fraction; @kbd{/}
4243would normally divide integers to get a floating-point result.
4244Notice we had to type @key{RET} between the @kbd{49} and the @kbd{:}
4245since the @kbd{:} would otherwise be interpreted as part of a
4246fraction beginning with 49.
4247
4248You can convert between floating-point and fractional format using
4249@kbd{c f} and @kbd{c F}:
4250
4251@smallexample
4252@group
42531: 1.35027217629e-5 1: 7:518414
4254 . .
4255
4256 c f c F
4257@end group
4258@end smallexample
4259
4260The @kbd{c F} command replaces a floating-point number with the
4261``simplest'' fraction whose floating-point representation is the
4262same, to within the current precision.
4263
4264@smallexample
4265@group
42661: 3.14159265359 1: 1146408:364913 1: 3.1416 1: 355:113
4267 . . . .
4268
4269 P c F @key{DEL} p 5 @key{RET} P c F
4270@end group
4271@end smallexample
4272
4273(@bullet{}) @strong{Exercise 1.} A calculation has produced the
4274result 1.26508260337. You suspect it is the square root of the
4275product of @cpi{} and some rational number. Is it? (Be sure
4276to allow for roundoff error!) @xref{Types Answer 1, 1}. (@bullet{})
4277
4278@dfn{Complex numbers} can be stored in both rectangular and polar form.
4279
4280@smallexample
4281@group
42821: -9 1: (0, 3) 1: (3; 90.) 1: (6; 90.) 1: (2.4495; 45.)
4283 . . . . .
4284
4285 9 n Q c p 2 * Q
4286@end group
4287@end smallexample
4288
4289@noindent
4290The square root of @mathit{-9} is by default rendered in rectangular form
4291(@w{@expr{0 + 3i}}), but we can convert it to polar form (3 with a
4292phase angle of 90 degrees). All the usual arithmetic and scientific
4293operations are defined on both types of complex numbers.
4294
4295Another generalized kind of number is @dfn{infinity}. Infinity
4296isn't really a number, but it can sometimes be treated like one.
4297Calc uses the symbol @code{inf} to represent positive infinity,
4298i.e., a value greater than any real number. Naturally, you can
4299also write @samp{-inf} for minus infinity, a value less than any
4300real number. The word @code{inf} can only be input using
4301algebraic entry.
4302
4303@smallexample
4304@group
43052: inf 2: -inf 2: -inf 2: -inf 1: nan
43061: -17 1: -inf 1: -inf 1: inf .
4307 . . . .
4308
4309' inf @key{RET} 17 n * @key{RET} 72 + A +
4310@end group
4311@end smallexample
4312
4313@noindent
4314Since infinity is infinitely large, multiplying it by any finite
4315number (like @mathit{-17}) has no effect, except that since @mathit{-17}
4316is negative, it changes a plus infinity to a minus infinity.
4317(``A huge positive number, multiplied by @mathit{-17}, yields a huge
4318negative number.'') Adding any finite number to infinity also
4319leaves it unchanged. Taking an absolute value gives us plus
4320infinity again. Finally, we add this plus infinity to the minus
4321infinity we had earlier. If you work it out, you might expect
4322the answer to be @mathit{-72} for this. But the 72 has been completely
4323lost next to the infinities; by the time we compute @w{@samp{inf - inf}}
4324the finite difference between them, if any, is undetectable.
4325So we say the result is @dfn{indeterminate}, which Calc writes
4326with the symbol @code{nan} (for Not A Number).
4327
4328Dividing by zero is normally treated as an error, but you can get
4329Calc to write an answer in terms of infinity by pressing @kbd{m i}
4330to turn on Infinite mode.
4331
4332@smallexample
4333@group
43343: nan 2: nan 2: nan 2: nan 1: nan
43352: 1 1: 1 / 0 1: uinf 1: uinf .
43361: 0 . . .
4337 .
4338
4339 1 @key{RET} 0 / m i U / 17 n * +
4340@end group
4341@end smallexample
4342
4343@noindent
4344Dividing by zero normally is left unevaluated, but after @kbd{m i}
4345it instead gives an infinite result. The answer is actually
4346@code{uinf}, ``undirected infinity.'' If you look at a graph of
4347@expr{1 / x} around @w{@expr{x = 0}}, you'll see that it goes toward
4348plus infinity as you approach zero from above, but toward minus
4349infinity as you approach from below. Since we said only @expr{1 / 0},
4350Calc knows that the answer is infinite but not in which direction.
4351That's what @code{uinf} means. Notice that multiplying @code{uinf}
4352by a negative number still leaves plain @code{uinf}; there's no
4353point in saying @samp{-uinf} because the sign of @code{uinf} is
4354unknown anyway. Finally, we add @code{uinf} to our @code{nan},
4355yielding @code{nan} again. It's easy to see that, because
4356@code{nan} means ``totally unknown'' while @code{uinf} means
4357``unknown sign but known to be infinite,'' the more mysterious
4358@code{nan} wins out when it is combined with @code{uinf}, or, for
4359that matter, with anything else.
4360
4361(@bullet{}) @strong{Exercise 2.} Predict what Calc will answer
4362for each of these formulas: @samp{inf / inf}, @samp{exp(inf)},
4363@samp{exp(-inf)}, @samp{sqrt(-inf)}, @samp{sqrt(uinf)},
4364@samp{abs(uinf)}, @samp{ln(0)}.
4365@xref{Types Answer 2, 2}. (@bullet{})
4366
4367(@bullet{}) @strong{Exercise 3.} We saw that @samp{inf - inf = nan},
4368which stands for an unknown value. Can @code{nan} stand for
4369a complex number? Can it stand for infinity?
4370@xref{Types Answer 3, 3}. (@bullet{})
4371
4372@dfn{HMS forms} represent a value in terms of hours, minutes, and
4373seconds.
4374
4375@smallexample
4376@group
43771: 2@@ 30' 0" 1: 3@@ 30' 0" 2: 3@@ 30' 0" 1: 2.
4378 . . 1: 1@@ 45' 0." .
4379 .
4380
4381 2@@ 30' @key{RET} 1 + @key{RET} 2 / /
4382@end group
4383@end smallexample
4384
4385HMS forms can also be used to hold angles in degrees, minutes, and
4386seconds.
4387
4388@smallexample
4389@group
43901: 0.5 1: 26.56505 1: 26@@ 33' 54.18" 1: 0.44721
4391 . . . .
4392
4393 0.5 I T c h S
4394@end group
4395@end smallexample
4396
4397@noindent
4398First we convert the inverse tangent of 0.5 to degrees-minutes-seconds
4399form, then we take the sine of that angle. Note that the trigonometric
4400functions will accept HMS forms directly as input.
4401
4402@cindex Beatles
4403(@bullet{}) @strong{Exercise 4.} The Beatles' @emph{Abbey Road} is
440447 minutes and 26 seconds long, and contains 17 songs. What is the
4405average length of a song on @emph{Abbey Road}? If the Extended Disco
4406Version of @emph{Abbey Road} added 20 seconds to the length of each
4407song, how long would the album be? @xref{Types Answer 4, 4}. (@bullet{})
4408
4409A @dfn{date form} represents a date, or a date and time. Dates must
4410be entered using algebraic entry. Date forms are surrounded by
4411@samp{< >} symbols; most standard formats for dates are recognized.
4412
4413@smallexample
4414@group
44152: <Sun Jan 13, 1991> 1: 2.25
44161: <6:00pm Thu Jan 10, 1991> .
4417 .
4418
4419' <13 Jan 1991>, <1/10/91, 6pm> @key{RET} -
4420@end group
4421@end smallexample
4422
4423@noindent
4424In this example, we enter two dates, then subtract to find the
4425number of days between them. It is also possible to add an
4426HMS form or a number (of days) to a date form to get another
4427date form.
4428
4429@smallexample
4430@group
44311: <4:45:59pm Mon Jan 14, 1991> 1: <2:50:59am Thu Jan 17, 1991>
4432 . .
4433
4434 t N 2 + 10@@ 5' +
4435@end group
4436@end smallexample
4437
4438@c [fix-ref Date Arithmetic]
4439@noindent
4440The @kbd{t N} (``now'') command pushes the current date and time on the
4441stack; then we add two days, ten hours and five minutes to the date and
4442time. Other date-and-time related commands include @kbd{t J}, which
4443does Julian day conversions, @kbd{t W}, which finds the beginning of
4444the week in which a date form lies, and @kbd{t I}, which increments a
4445date by one or several months. @xref{Date Arithmetic}, for more.
4446
4447(@bullet{}) @strong{Exercise 5.} How many days until the next
4448Friday the 13th? @xref{Types Answer 5, 5}. (@bullet{})
4449
4450(@bullet{}) @strong{Exercise 6.} How many leap years will there be
4451between now and the year 10001 A.D.? @xref{Types Answer 6, 6}. (@bullet{})
4452
4453@cindex Slope and angle of a line
4454@cindex Angle and slope of a line
4455An @dfn{error form} represents a mean value with an attached standard
4456deviation, or error estimate. Suppose our measurements indicate that
4457a certain telephone pole is about 30 meters away, with an estimated
4458error of 1 meter, and 8 meters tall, with an estimated error of 0.2
4459meters. What is the slope of a line from here to the top of the
4460pole, and what is the equivalent angle in degrees?
4461
4462@smallexample
4463@group
44641: 8 +/- 0.2 2: 8 +/- 0.2 1: 0.266 +/- 0.011 1: 14.93 +/- 0.594
4465 . 1: 30 +/- 1 . .
4466 .
4467
4468 8 p .2 @key{RET} 30 p 1 / I T
4469@end group
4470@end smallexample
4471
4472@noindent
4473This means that the angle is about 15 degrees, and, assuming our
4474original error estimates were valid standard deviations, there is about
4475a 60% chance that the result is correct within 0.59 degrees.
4476
4477@cindex Torus, volume of
4478(@bullet{}) @strong{Exercise 7.} The volume of a torus (a donut shape) is
4479@texline @math{2 \pi^2 R r^2}
4480@infoline @w{@expr{2 pi^2 R r^2}}
4481where @expr{R} is the radius of the circle that
4482defines the center of the tube and @expr{r} is the radius of the tube
4483itself. Suppose @expr{R} is 20 cm and @expr{r} is 4 cm, each known to
4484within 5 percent. What is the volume and the relative uncertainty of
4485the volume? @xref{Types Answer 7, 7}. (@bullet{})
4486
4487An @dfn{interval form} represents a range of values. While an
4488error form is best for making statistical estimates, intervals give
4489you exact bounds on an answer. Suppose we additionally know that
4490our telephone pole is definitely between 28 and 31 meters away,
4491and that it is between 7.7 and 8.1 meters tall.
4492
4493@smallexample
4494@group
44951: [7.7 .. 8.1] 2: [7.7 .. 8.1] 1: [0.24 .. 0.28] 1: [13.9 .. 16.1]
4496 . 1: [28 .. 31] . .
4497 .
4498
4499 [ 7.7 .. 8.1 ] [ 28 .. 31 ] / I T
4500@end group
4501@end smallexample
4502
4503@noindent
4504If our bounds were correct, then the angle to the top of the pole
4505is sure to lie in the range shown.
4506
4507The square brackets around these intervals indicate that the endpoints
4508themselves are allowable values. In other words, the distance to the
4509telephone pole is between 28 and 31, @emph{inclusive}. You can also
4510make an interval that is exclusive of its endpoints by writing
4511parentheses instead of square brackets. You can even make an interval
4512which is inclusive (``closed'') on one end and exclusive (``open'') on
4513the other.
4514
4515@smallexample
4516@group
45171: [1 .. 10) 1: (0.1 .. 1] 2: (0.1 .. 1] 1: (0.2 .. 3)
4518 . . 1: [2 .. 3) .
4519 .
4520
4521 [ 1 .. 10 ) & [ 2 .. 3 ) *
4522@end group
4523@end smallexample
4524
4525@noindent
4526The Calculator automatically keeps track of which end values should
4527be open and which should be closed. You can also make infinite or
4528semi-infinite intervals by using @samp{-inf} or @samp{inf} for one
4529or both endpoints.
4530
4531(@bullet{}) @strong{Exercise 8.} What answer would you expect from
4532@samp{@w{1 /} @w{(0 .. 10)}}? What about @samp{@w{1 /} @w{(-10 .. 0)}}? What
4533about @samp{@w{1 /} @w{[0 .. 10]}} (where the interval actually includes
4534zero)? What about @samp{@w{1 /} @w{(-10 .. 10)}}?
4535@xref{Types Answer 8, 8}. (@bullet{})
4536
4537(@bullet{}) @strong{Exercise 9.} Two easy ways of squaring a number
4538are @kbd{@key{RET} *} and @w{@kbd{2 ^}}. Normally these produce the same
4539answer. Would you expect this still to hold true for interval forms?
4540If not, which of these will result in a larger interval?
4541@xref{Types Answer 9, 9}. (@bullet{})
4542
4543A @dfn{modulo form} is used for performing arithmetic modulo @var{m}.
4544For example, arithmetic involving time is generally done modulo 12
4545or 24 hours.
4546
4547@smallexample
4548@group
45491: 17 mod 24 1: 3 mod 24 1: 21 mod 24 1: 9 mod 24
4550 . . . .
4551
4552 17 M 24 @key{RET} 10 + n 5 /
4553@end group
4554@end smallexample
4555
4556@noindent
4557In this last step, Calc has divided by 5 modulo 24; i.e., it has found a
4558new number which, when multiplied by 5 modulo 24, produces the original
4559number, 21. If @var{m} is prime and the divisor is not a multiple of
4560@var{m}, it is always possible to find such a number. For non-prime
4561@var{m} like 24, it is only sometimes possible.
4562
4563@smallexample
4564@group
45651: 10 mod 24 1: 16 mod 24 1: 1000000... 1: 16
4566 . . . .
4567
4568 10 M 24 @key{RET} 100 ^ 10 @key{RET} 100 ^ 24 %
4569@end group
4570@end smallexample
4571
4572@noindent
4573These two calculations get the same answer, but the first one is
4574much more efficient because it avoids the huge intermediate value
4575that arises in the second one.
4576
4577@cindex Fermat, primality test of
4578(@bullet{}) @strong{Exercise 10.} A theorem of Pierre de Fermat
4579says that
4580@texline @w{@math{x^{n-1} \bmod n = 1}}
4581@infoline @expr{x^(n-1) mod n = 1}
4582if @expr{n} is a prime number and @expr{x} is an integer less than
4583@expr{n}. If @expr{n} is @emph{not} a prime number, this will
4584@emph{not} be true for most values of @expr{x}. Thus we can test
4585informally if a number is prime by trying this formula for several
4586values of @expr{x}. Use this test to tell whether the following numbers
4587are prime: 811749613, 15485863. @xref{Types Answer 10, 10}. (@bullet{})
4588
4589It is possible to use HMS forms as parts of error forms, intervals,
4590modulo forms, or as the phase part of a polar complex number.
4591For example, the @code{calc-time} command pushes the current time
4592of day on the stack as an HMS/modulo form.
4593
4594@smallexample
4595@group
45961: 17@@ 34' 45" mod 24@@ 0' 0" 1: 6@@ 22' 15" mod 24@@ 0' 0"
4597 . .
4598
4599 x time @key{RET} n
4600@end group
4601@end smallexample
4602
4603@noindent
4604This calculation tells me it is six hours and 22 minutes until midnight.
4605
4606(@bullet{}) @strong{Exercise 11.} A rule of thumb is that one year
4607is about
4608@texline @math{\pi \times 10^7}
4609@infoline @w{@expr{pi * 10^7}}
4610seconds. What time will it be that many seconds from right now?
4611@xref{Types Answer 11, 11}. (@bullet{})
4612
4613(@bullet{}) @strong{Exercise 12.} You are preparing to order packaging
4614for the CD release of the Extended Disco Version of @emph{Abbey Road}.
4615You are told that the songs will actually be anywhere from 20 to 60
4616seconds longer than the originals. One CD can hold about 75 minutes
4617of music. Should you order single or double packages?
4618@xref{Types Answer 12, 12}. (@bullet{})
4619
4620Another kind of data the Calculator can manipulate is numbers with
4621@dfn{units}. This isn't strictly a new data type; it's simply an
4622application of algebraic expressions, where we use variables with
4623suggestive names like @samp{cm} and @samp{in} to represent units
4624like centimeters and inches.
4625
4626@smallexample
4627@group
46281: 2 in 1: 5.08 cm 1: 0.027778 fath 1: 0.0508 m
4629 . . . .
4630
4631 ' 2in @key{RET} u c cm @key{RET} u c fath @key{RET} u b
4632@end group
4633@end smallexample
4634
4635@noindent
4636We enter the quantity ``2 inches'' (actually an algebraic expression
4637which means two times the variable @samp{in}), then we convert it
4638first to centimeters, then to fathoms, then finally to ``base'' units,
4639which in this case means meters.
4640
4641@smallexample
4642@group
46431: 9 acre 1: 3 sqrt(acre) 1: 190.84 m 1: 190.84 m + 30 cm
4644 . . . .
4645
4646 ' 9 acre @key{RET} Q u s ' $+30 cm @key{RET}
4647
4648@end group
4649@end smallexample
4650@noindent
4651@smallexample
4652@group
46531: 191.14 m 1: 36536.3046 m^2 1: 365363046 cm^2
4654 . . .
4655
4656 u s 2 ^ u c cgs
4657@end group
4658@end smallexample
4659
4660@noindent
4661Since units expressions are really just formulas, taking the square
4662root of @samp{acre} is undefined. After all, @code{acre} might be an
4663algebraic variable that you will someday assign a value. We use the
4664``units-simplify'' command to simplify the expression with variables
4665being interpreted as unit names.
4666
4667In the final step, we have converted not to a particular unit, but to a
4668units system. The ``cgs'' system uses centimeters instead of meters
4669as its standard unit of length.
4670
4671There is a wide variety of units defined in the Calculator.
4672
4673@smallexample
4674@group
46751: 55 mph 1: 88.5139 kph 1: 88.5139 km / hr 1: 8.201407e-8 c
4676 . . . .
4677
4678 ' 55 mph @key{RET} u c kph @key{RET} u c km/hr @key{RET} u c c @key{RET}
4679@end group
4680@end smallexample
4681
4682@noindent
4683We express a speed first in miles per hour, then in kilometers per
4684hour, then again using a slightly more explicit notation, then
4685finally in terms of fractions of the speed of light.
4686
4687Temperature conversions are a bit more tricky. There are two ways to
4688interpret ``20 degrees Fahrenheit''---it could mean an actual
4689temperature, or it could mean a change in temperature. For normal
4690units there is no difference, but temperature units have an offset
4691as well as a scale factor and so there must be two explicit commands
4692for them.
4693
4694@smallexample
4695@group
46961: 20 degF 1: 11.1111 degC 1: -20:3 degC 1: -6.666 degC
4697 . . . .
4698
4699 ' 20 degF @key{RET} u c degC @key{RET} U u t degC @key{RET} c f
4700@end group
4701@end smallexample
4702
4703@noindent
4704First we convert a change of 20 degrees Fahrenheit into an equivalent
4705change in degrees Celsius (or Centigrade). Then, we convert the
4706absolute temperature 20 degrees Fahrenheit into Celsius. Since
4707this comes out as an exact fraction, we then convert to floating-point
4708for easier comparison with the other result.
4709
4710For simple unit conversions, you can put a plain number on the stack.
4711Then @kbd{u c} and @kbd{u t} will prompt for both old and new units.
4712When you use this method, you're responsible for remembering which
4713numbers are in which units:
4714
4715@smallexample
4716@group
47171: 55 1: 88.5139 1: 8.201407e-8
4718 . . .
4719
4720 55 u c mph @key{RET} kph @key{RET} u c km/hr @key{RET} c @key{RET}
4721@end group
4722@end smallexample
4723
4724To see a complete list of built-in units, type @kbd{u v}. Press
4725@w{@kbd{C-x * c}} again to re-enter the Calculator when you're done looking
4726at the units table.
4727
4728(@bullet{}) @strong{Exercise 13.} How many seconds are there really
4729in a year? @xref{Types Answer 13, 13}. (@bullet{})
4730
4731@cindex Speed of light
4732(@bullet{}) @strong{Exercise 14.} Supercomputer designs are limited by
4733the speed of light (and of electricity, which is nearly as fast).
4734Suppose a computer has a 4.1 ns (nanosecond) clock cycle, and its
4735cabinet is one meter across. Is speed of light going to be a
4736significant factor in its design? @xref{Types Answer 14, 14}. (@bullet{})
4737
4738(@bullet{}) @strong{Exercise 15.} Sam the Slug normally travels about
4739five yards in an hour. He has obtained a supply of Power Pills; each
4740Power Pill he eats doubles his speed. How many Power Pills can he
4741swallow and still travel legally on most US highways?
4742@xref{Types Answer 15, 15}. (@bullet{})
4743
4744@node Algebra Tutorial, Programming Tutorial, Types Tutorial, Tutorial
4745@section Algebra and Calculus Tutorial
4746
4747@noindent
4748This section shows how to use Calc's algebra facilities to solve
4749equations, do simple calculus problems, and manipulate algebraic
4750formulas.
4751
4752@menu
4753* Basic Algebra Tutorial::
4754* Rewrites Tutorial::
4755@end menu
4756
4757@node Basic Algebra Tutorial, Rewrites Tutorial, Algebra Tutorial, Algebra Tutorial
4758@subsection Basic Algebra
4759
4760@noindent
4761If you enter a formula in Algebraic mode that refers to variables,
4762the formula itself is pushed onto the stack. You can manipulate
4763formulas as regular data objects.
4764
4765@smallexample
4766@group
47671: 2 x^2 - 6 1: 6 - 2 x^2 1: (6 - 2 x^2) (3 x^2 + y)
4768 . . .
4769
4770 ' 2x^2-6 @key{RET} n ' 3x^2+y @key{RET} *
4771@end group
4772@end smallexample
4773
4774(@bullet{}) @strong{Exercise 1.} Do @kbd{' x @key{RET} Q 2 ^} and
4775@kbd{' x @key{RET} 2 ^ Q} both wind up with the same result (@samp{x})?
4776Why or why not? @xref{Algebra Answer 1, 1}. (@bullet{})
4777
4778There are also commands for doing common algebraic operations on
4779formulas. Continuing with the formula from the last example,
4780
4781@smallexample
4782@group
47831: 18 x^2 + 6 y - 6 x^4 - 2 x^2 y 1: (18 - 2 y) x^2 - 6 x^4 + 6 y
4784 . .
4785
4786 a x a c x @key{RET}
4787@end group
4788@end smallexample
4789
4790@noindent
4791First we ``expand'' using the distributive law, then we ``collect''
4792terms involving like powers of @expr{x}.
4793
4794Let's find the value of this expression when @expr{x} is 2 and @expr{y}
4795is one-half.
4796
4797@smallexample
4798@group
47991: 17 x^2 - 6 x^4 + 3 1: -25
4800 . .
4801
4802 1:2 s l y @key{RET} 2 s l x @key{RET}
4803@end group
4804@end smallexample
4805
4806@noindent
4807The @kbd{s l} command means ``let''; it takes a number from the top of
4808the stack and temporarily assigns it as the value of the variable
4809you specify. It then evaluates (as if by the @kbd{=} key) the
4810next expression on the stack. After this command, the variable goes
4811back to its original value, if any.
4812
4813(An earlier exercise in this tutorial involved storing a value in the
4814variable @code{x}; if this value is still there, you will have to
4815unstore it with @kbd{s u x @key{RET}} before the above example will work
4816properly.)
4817
4818@cindex Maximum of a function using Calculus
4819Let's find the maximum value of our original expression when @expr{y}
4820is one-half and @expr{x} ranges over all possible values. We can
4821do this by taking the derivative with respect to @expr{x} and examining
4822values of @expr{x} for which the derivative is zero. If the second
4823derivative of the function at that value of @expr{x} is negative,
4824the function has a local maximum there.
4825
4826@smallexample
4827@group
48281: 17 x^2 - 6 x^4 + 3 1: 34 x - 24 x^3
4829 . .
4830
4831 U @key{DEL} s 1 a d x @key{RET} s 2
4832@end group
4833@end smallexample
4834
4835@noindent
4836Well, the derivative is clearly zero when @expr{x} is zero. To find
4837the other root(s), let's divide through by @expr{x} and then solve:
4838
4839@smallexample
4840@group
48411: (34 x - 24 x^3) / x 1: 34 x / x - 24 x^3 / x 1: 34 - 24 x^2
4842 . . .
4843
4844 ' x @key{RET} / a x a s
4845
4846@end group
4847@end smallexample
4848@noindent
4849@smallexample
4850@group
48511: 34 - 24 x^2 = 0 1: x = 1.19023
4852 . .
4853
4854 0 a = s 3 a S x @key{RET}
4855@end group
4856@end smallexample
4857
4858@noindent
4859Notice the use of @kbd{a s} to ``simplify'' the formula. When the
4860default algebraic simplifications don't do enough, you can use
4861@kbd{a s} to tell Calc to spend more time on the job.
4862
4863Now we compute the second derivative and plug in our values of @expr{x}:
4864
4865@smallexample
4866@group
48671: 1.19023 2: 1.19023 2: 1.19023
4868 . 1: 34 x - 24 x^3 1: 34 - 72 x^2
4869 . .
4870
4871 a . r 2 a d x @key{RET} s 4
4872@end group
4873@end smallexample
4874
4875@noindent
4876(The @kbd{a .} command extracts just the righthand side of an equation.
4877Another method would have been to use @kbd{v u} to unpack the equation
4878@w{@samp{x = 1.19}} to @samp{x} and @samp{1.19}, then use @kbd{M-- M-2 @key{DEL}}
4879to delete the @samp{x}.)
4880
4881@smallexample
4882@group
48832: 34 - 72 x^2 1: -68. 2: 34 - 72 x^2 1: 34
48841: 1.19023 . 1: 0 .
4885 . .
4886
4887 @key{TAB} s l x @key{RET} U @key{DEL} 0 s l x @key{RET}
4888@end group
4889@end smallexample
4890
4891@noindent
4892The first of these second derivatives is negative, so we know the function
4893has a maximum value at @expr{x = 1.19023}. (The function also has a
4894local @emph{minimum} at @expr{x = 0}.)
4895
4896When we solved for @expr{x}, we got only one value even though
4897@expr{34 - 24 x^2 = 0} is a quadratic equation that ought to have
4898two solutions. The reason is that @w{@kbd{a S}} normally returns a
4899single ``principal'' solution. If it needs to come up with an
4900arbitrary sign (as occurs in the quadratic formula) it picks @expr{+}.
4901If it needs an arbitrary integer, it picks zero. We can get a full
4902solution by pressing @kbd{H} (the Hyperbolic flag) before @kbd{a S}.
4903
4904@smallexample
4905@group
49061: 34 - 24 x^2 = 0 1: x = 1.19023 s1 1: x = -1.19023
4907 . . .
4908
4909 r 3 H a S x @key{RET} s 5 1 n s l s1 @key{RET}
4910@end group
4911@end smallexample
4912
4913@noindent
4914Calc has invented the variable @samp{s1} to represent an unknown sign;
4915it is supposed to be either @mathit{+1} or @mathit{-1}. Here we have used
4916the ``let'' command to evaluate the expression when the sign is negative.
4917If we plugged this into our second derivative we would get the same,
4918negative, answer, so @expr{x = -1.19023} is also a maximum.
4919
4920To find the actual maximum value, we must plug our two values of @expr{x}
4921into the original formula.
4922
4923@smallexample
4924@group
49252: 17 x^2 - 6 x^4 + 3 1: 24.08333 s1^2 - 12.04166 s1^4 + 3
49261: x = 1.19023 s1 .
4927 .
4928
4929 r 1 r 5 s l @key{RET}
4930@end group
4931@end smallexample
4932
4933@noindent
4934(Here we see another way to use @kbd{s l}; if its input is an equation
4935with a variable on the lefthand side, then @kbd{s l} treats the equation
4936like an assignment to that variable if you don't give a variable name.)
4937
4938It's clear that this will have the same value for either sign of
4939@code{s1}, but let's work it out anyway, just for the exercise:
4940
4941@smallexample
4942@group
49432: [-1, 1] 1: [15.04166, 15.04166]
49441: 24.08333 s1^2 ... .
4945 .
4946
4947 [ 1 n , 1 ] @key{TAB} V M $ @key{RET}
4948@end group
4949@end smallexample
4950
4951@noindent
4952Here we have used a vector mapping operation to evaluate the function
4953at several values of @samp{s1} at once. @kbd{V M $} is like @kbd{V M '}
4954except that it takes the formula from the top of the stack. The
4955formula is interpreted as a function to apply across the vector at the
4956next-to-top stack level. Since a formula on the stack can't contain
4957@samp{$} signs, Calc assumes the variables in the formula stand for
4958different arguments. It prompts you for an @dfn{argument list}, giving
4959the list of all variables in the formula in alphabetical order as the
4960default list. In this case the default is @samp{(s1)}, which is just
4961what we want so we simply press @key{RET} at the prompt.
4962
4963If there had been several different values, we could have used
4964@w{@kbd{V R X}} to find the global maximum.
4965
4966Calc has a built-in @kbd{a P} command that solves an equation using
4967@w{@kbd{H a S}} and returns a vector of all the solutions. It simply
4968automates the job we just did by hand. Applied to our original
4969cubic polynomial, it would produce the vector of solutions
4970@expr{[1.19023, -1.19023, 0]}. (There is also an @kbd{a X} command
4971which finds a local maximum of a function. It uses a numerical search
4972method rather than examining the derivatives, and thus requires you
4973to provide some kind of initial guess to show it where to look.)
4974
4975(@bullet{}) @strong{Exercise 2.} Given a vector of the roots of a
4976polynomial (such as the output of an @kbd{a P} command), what
4977sequence of commands would you use to reconstruct the original
4978polynomial? (The answer will be unique to within a constant
4979multiple; choose the solution where the leading coefficient is one.)
4980@xref{Algebra Answer 2, 2}. (@bullet{})
4981
4982The @kbd{m s} command enables Symbolic mode, in which formulas
4983like @samp{sqrt(5)} that can't be evaluated exactly are left in
4984symbolic form rather than giving a floating-point approximate answer.
4985Fraction mode (@kbd{m f}) is also useful when doing algebra.
4986
4987@smallexample
4988@group
49892: 34 x - 24 x^3 2: 34 x - 24 x^3
49901: 34 x - 24 x^3 1: [sqrt(51) / 6, sqrt(51) / -6, 0]
4991 . .
4992
4993 r 2 @key{RET} m s m f a P x @key{RET}
4994@end group
4995@end smallexample
4996
4997One more mode that makes reading formulas easier is Big mode.
4998
4999@smallexample
5000@group
5001 3
50022: 34 x - 24 x
5003
5004 ____ ____
5005 V 51 V 51
50061: [-----, -----, 0]
5007 6 -6
5008
5009 .
5010
5011 d B
5012@end group
5013@end smallexample
5014
5015Here things like powers, square roots, and quotients and fractions
5016are displayed in a two-dimensional pictorial form. Calc has other
5017language modes as well, such as C mode, FORTRAN mode, @TeX{} mode
5018and La@TeX{} mode.
5019
5020@smallexample
5021@group
50222: 34*x - 24*pow(x, 3) 2: 34*x - 24*x**3
50231: @{sqrt(51) / 6, sqrt(51) / -6, 0@} 1: /sqrt(51) / 6, sqrt(51) / -6, 0/
5024 . .
5025
5026 d C d F
5027
5028@end group
5029@end smallexample
5030@noindent
5031@smallexample
5032@group
50333: 34 x - 24 x^3
50342: [@{\sqrt@{51@} \over 6@}, @{\sqrt@{51@} \over -6@}, 0]
50351: @{2 \over 3@} \sqrt@{5@}
5036 .
5037
5038 d T ' 2 \sqrt@{5@} \over 3 @key{RET}
5039@end group
5040@end smallexample
5041
5042@noindent
5043As you can see, language modes affect both entry and display of
5044formulas. They affect such things as the names used for built-in
5045functions, the set of arithmetic operators and their precedences,
5046and notations for vectors and matrices.
5047
5048Notice that @samp{sqrt(51)} may cause problems with older
5049implementations of C and FORTRAN, which would require something more
5050like @samp{sqrt(51.0)}. It is always wise to check over the formulas
5051produced by the various language modes to make sure they are fully
5052correct.
5053
5054Type @kbd{m s}, @kbd{m f}, and @kbd{d N} to reset these modes. (You
5055may prefer to remain in Big mode, but all the examples in the tutorial
5056are shown in normal mode.)
5057
5058@cindex Area under a curve
5059What is the area under the portion of this curve from @expr{x = 1} to @expr{2}?
5060This is simply the integral of the function:
5061
5062@smallexample
5063@group
50641: 17 x^2 - 6 x^4 + 3 1: 5.6666 x^3 - 1.2 x^5 + 3 x
5065 . .
5066
5067 r 1 a i x
5068@end group
5069@end smallexample
5070
5071@noindent
5072We want to evaluate this at our two values for @expr{x} and subtract.
5073One way to do it is again with vector mapping and reduction:
5074
5075@smallexample
5076@group
50772: [2, 1] 1: [12.93333, 7.46666] 1: 5.46666
50781: 5.6666 x^3 ... . .
5079
5080 [ 2 , 1 ] @key{TAB} V M $ @key{RET} V R -
5081@end group
5082@end smallexample
5083
5084(@bullet{}) @strong{Exercise 3.} Find the integral from 1 to @expr{y}
5085of
5086@texline @math{x \sin \pi x}
5087@infoline @w{@expr{x sin(pi x)}}
5088(where the sine is calculated in radians). Find the values of the
5089integral for integers @expr{y} from 1 to 5. @xref{Algebra Answer 3,
50903}. (@bullet{})
5091
5092Calc's integrator can do many simple integrals symbolically, but many
5093others are beyond its capabilities. Suppose we wish to find the area
5094under the curve
5095@texline @math{\sin x \ln x}
5096@infoline @expr{sin(x) ln(x)}
5097over the same range of @expr{x}. If you entered this formula and typed
5098@kbd{a i x @key{RET}} (don't bother to try this), Calc would work for a
5099long time but would be unable to find a solution. In fact, there is no
5100closed-form solution to this integral. Now what do we do?
5101
5102@cindex Integration, numerical
5103@cindex Numerical integration
5104One approach would be to do the integral numerically. It is not hard
5105to do this by hand using vector mapping and reduction. It is rather
5106slow, though, since the sine and logarithm functions take a long time.
5107We can save some time by reducing the working precision.
5108
5109@smallexample
5110@group
51113: 10 1: [1, 1.1, 1.2, ... , 1.8, 1.9]
51122: 1 .
51131: 0.1
5114 .
5115
5116 10 @key{RET} 1 @key{RET} .1 @key{RET} C-u v x
5117@end group
5118@end smallexample
5119
5120@noindent
5121(Note that we have used the extended version of @kbd{v x}; we could
5122also have used plain @kbd{v x} as follows: @kbd{v x 10 @key{RET} 9 + .1 *}.)
5123
5124@smallexample
5125@group
51262: [1, 1.1, ... ] 1: [0., 0.084941, 0.16993, ... ]
51271: sin(x) ln(x) .
5128 .
5129
5130 ' sin(x) ln(x) @key{RET} s 1 m r p 5 @key{RET} V M $ @key{RET}
5131
5132@end group
5133@end smallexample
5134@noindent
5135@smallexample
5136@group
51371: 3.4195 0.34195
5138 . .
5139
5140 V R + 0.1 *
5141@end group
5142@end smallexample
5143
5144@noindent
5145(If you got wildly different results, did you remember to switch
5146to Radians mode?)
5147
5148Here we have divided the curve into ten segments of equal width;
5149approximating these segments as rectangular boxes (i.e., assuming
5150the curve is nearly flat at that resolution), we compute the areas
5151of the boxes (height times width), then sum the areas. (It is
5152faster to sum first, then multiply by the width, since the width
5153is the same for every box.)
5154
5155The true value of this integral turns out to be about 0.374, so
5156we're not doing too well. Let's try another approach.
5157
5158@smallexample
5159@group
51601: sin(x) ln(x) 1: 0.84147 x - 0.84147 + 0.11957 (x - 1)^2 - ...
5161 . .
5162
5163 r 1 a t x=1 @key{RET} 4 @key{RET}
5164@end group
5165@end smallexample
5166
5167@noindent
5168Here we have computed the Taylor series expansion of the function
5169about the point @expr{x=1}. We can now integrate this polynomial
5170approximation, since polynomials are easy to integrate.
5171
5172@smallexample
5173@group
51741: 0.42074 x^2 + ... 1: [-0.0446, -0.42073] 1: 0.3761
5175 . . .
5176
5177 a i x @key{RET} [ 2 , 1 ] @key{TAB} V M $ @key{RET} V R -
5178@end group
5179@end smallexample
5180
5181@noindent
5182Better! By increasing the precision and/or asking for more terms
5183in the Taylor series, we can get a result as accurate as we like.
5184(Taylor series converge better away from singularities in the
5185function such as the one at @code{ln(0)}, so it would also help to
5186expand the series about the points @expr{x=2} or @expr{x=1.5} instead
5187of @expr{x=1}.)
5188
5189@cindex Simpson's rule
5190@cindex Integration by Simpson's rule
5191(@bullet{}) @strong{Exercise 4.} Our first method approximated the
5192curve by stairsteps of width 0.1; the total area was then the sum
5193of the areas of the rectangles under these stairsteps. Our second
5194method approximated the function by a polynomial, which turned out
5195to be a better approximation than stairsteps. A third method is
5196@dfn{Simpson's rule}, which is like the stairstep method except
5197that the steps are not required to be flat. Simpson's rule boils
5198down to the formula,
5199
5200@ifnottex
5201@example
5202(h/3) * (f(a) + 4 f(a+h) + 2 f(a+2h) + 4 f(a+3h) + ...
5203 + 2 f(a+(n-2)*h) + 4 f(a+(n-1)*h) + f(a+n*h))
5204@end example
5205@end ifnottex
5206@tex
5207\turnoffactive
5208\beforedisplay
5209$$ \displaylines{
5210 \qquad {h \over 3} (f(a) + 4 f(a+h) + 2 f(a+2h) + 4 f(a+3h) + \cdots
5211 \hfill \cr \hfill {} + 2 f(a+(n-2)h) + 4 f(a+(n-1)h) + f(a+n h)) \qquad
5212} $$
5213\afterdisplay
5214@end tex
5215
5216@noindent
5217where @expr{n} (which must be even) is the number of slices and @expr{h}
5218is the width of each slice. These are 10 and 0.1 in our example.
5219For reference, here is the corresponding formula for the stairstep
5220method:
5221
5222@ifnottex
5223@example
5224h * (f(a) + f(a+h) + f(a+2h) + f(a+3h) + ...
5225 + f(a+(n-2)*h) + f(a+(n-1)*h))
5226@end example
5227@end ifnottex
5228@tex
5229\turnoffactive
5230\beforedisplay
5231$$ h (f(a) + f(a+h) + f(a+2h) + f(a+3h) + \cdots
5232 + f(a+(n-2)h) + f(a+(n-1)h)) $$
5233\afterdisplay
5234@end tex
5235
5236Compute the integral from 1 to 2 of
5237@texline @math{\sin x \ln x}
5238@infoline @expr{sin(x) ln(x)}
5239using Simpson's rule with 10 slices.
5240@xref{Algebra Answer 4, 4}. (@bullet{})
5241
5242Calc has a built-in @kbd{a I} command for doing numerical integration.
5243It uses @dfn{Romberg's method}, which is a more sophisticated cousin
5244of Simpson's rule. In particular, it knows how to keep refining the
5245result until the current precision is satisfied.
5246
5247@c [fix-ref Selecting Sub-Formulas]
5248Aside from the commands we've seen so far, Calc also provides a
5249large set of commands for operating on parts of formulas. You
5250indicate the desired sub-formula by placing the cursor on any part
5251of the formula before giving a @dfn{selection} command. Selections won't
5252be covered in the tutorial; @pxref{Selecting Subformulas}, for
5253details and examples.
5254
5255@c hard exercise: simplify (2^(n r) - 2^(r*(n - 1))) / (2^r - 1) 2^(n - 1)
5256@c to 2^((n-1)*(r-1)).
5257
5258@node Rewrites Tutorial, , Basic Algebra Tutorial, Algebra Tutorial
5259@subsection Rewrite Rules
5260
5261@noindent
5262No matter how many built-in commands Calc provided for doing algebra,
5263there would always be something you wanted to do that Calc didn't have
5264in its repertoire. So Calc also provides a @dfn{rewrite rule} system
5265that you can use to define your own algebraic manipulations.
5266
5267Suppose we want to simplify this trigonometric formula:
5268
5269@smallexample
5270@group
52711: 1 / cos(x) - sin(x) tan(x)
5272 .
5273
5274 ' 1/cos(x) - sin(x) tan(x) @key{RET} s 1
5275@end group
5276@end smallexample
5277
5278@noindent
5279If we were simplifying this by hand, we'd probably replace the
5280@samp{tan} with a @samp{sin/cos} first, then combine over a common
5281denominator. There is no Calc command to do the former; the @kbd{a n}
5282algebra command will do the latter but we'll do both with rewrite
5283rules just for practice.
5284
5285Rewrite rules are written with the @samp{:=} symbol.
5286
5287@smallexample
5288@group
52891: 1 / cos(x) - sin(x)^2 / cos(x)
5290 .
5291
5292 a r tan(a) := sin(a)/cos(a) @key{RET}
5293@end group
5294@end smallexample
5295
5296@noindent
5297(The ``assignment operator'' @samp{:=} has several uses in Calc. All
5298by itself the formula @samp{tan(a) := sin(a)/cos(a)} doesn't do anything,
5299but when it is given to the @kbd{a r} command, that command interprets
5300it as a rewrite rule.)
5301
5302The lefthand side, @samp{tan(a)}, is called the @dfn{pattern} of the
5303rewrite rule. Calc searches the formula on the stack for parts that
5304match the pattern. Variables in a rewrite pattern are called
5305@dfn{meta-variables}, and when matching the pattern each meta-variable
5306can match any sub-formula. Here, the meta-variable @samp{a} matched
5307the actual variable @samp{x}.
5308
5309When the pattern part of a rewrite rule matches a part of the formula,
5310that part is replaced by the righthand side with all the meta-variables
5311substituted with the things they matched. So the result is
5312@samp{sin(x) / cos(x)}. Calc's normal algebraic simplifications then
5313mix this in with the rest of the original formula.
5314
5315To merge over a common denominator, we can use another simple rule:
5316
5317@smallexample
5318@group
53191: (1 - sin(x)^2) / cos(x)
5320 .
5321
5322 a r a/x + b/x := (a+b)/x @key{RET}
5323@end group
5324@end smallexample
5325
5326This rule points out several interesting features of rewrite patterns.
5327First, if a meta-variable appears several times in a pattern, it must
5328match the same thing everywhere. This rule detects common denominators
5329because the same meta-variable @samp{x} is used in both of the
5330denominators.
5331
5332Second, meta-variable names are independent from variables in the
5333target formula. Notice that the meta-variable @samp{x} here matches
5334the subformula @samp{cos(x)}; Calc never confuses the two meanings of
5335@samp{x}.
5336
5337And third, rewrite patterns know a little bit about the algebraic
5338properties of formulas. The pattern called for a sum of two quotients;
5339Calc was able to match a difference of two quotients by matching
5340@samp{a = 1}, @samp{b = -sin(x)^2}, and @samp{x = cos(x)}.
5341
5342@c [fix-ref Algebraic Properties of Rewrite Rules]
5343We could just as easily have written @samp{a/x - b/x := (a-b)/x} for
5344the rule. It would have worked just the same in all cases. (If we
5345really wanted the rule to apply only to @samp{+} or only to @samp{-},
5346we could have used the @code{plain} symbol. @xref{Algebraic Properties
5347of Rewrite Rules}, for some examples of this.)
5348
5349One more rewrite will complete the job. We want to use the identity
5350@samp{sin(x)^2 + cos(x)^2 = 1}, but of course we must first rearrange
5351the identity in a way that matches our formula. The obvious rule
5352would be @samp{@w{1 - sin(x)^2} := cos(x)^2}, but a little thought shows
5353that the rule @samp{sin(x)^2 := 1 - cos(x)^2} will also work. The
5354latter rule has a more general pattern so it will work in many other
5355situations, too.
5356
5357@smallexample
5358@group
53591: (1 + cos(x)^2 - 1) / cos(x) 1: cos(x)
5360 . .
5361
5362 a r sin(x)^2 := 1 - cos(x)^2 @key{RET} a s
5363@end group
5364@end smallexample
5365
5366You may ask, what's the point of using the most general rule if you
5367have to type it in every time anyway? The answer is that Calc allows
5368you to store a rewrite rule in a variable, then give the variable
5369name in the @kbd{a r} command. In fact, this is the preferred way to
5370use rewrites. For one, if you need a rule once you'll most likely
5371need it again later. Also, if the rule doesn't work quite right you
5372can simply Undo, edit the variable, and run the rule again without
5373having to retype it.
5374
5375@smallexample
5376@group
5377' tan(x) := sin(x)/cos(x) @key{RET} s t tsc @key{RET}
5378' a/x + b/x := (a+b)/x @key{RET} s t merge @key{RET}
5379' sin(x)^2 := 1 - cos(x)^2 @key{RET} s t sinsqr @key{RET}
5380
53811: 1 / cos(x) - sin(x) tan(x) 1: cos(x)
5382 . .
5383
5384 r 1 a r tsc @key{RET} a r merge @key{RET} a r sinsqr @key{RET} a s
5385@end group
5386@end smallexample
5387
5388To edit a variable, type @kbd{s e} and the variable name, use regular
5389Emacs editing commands as necessary, then type @kbd{C-c C-c} to store
5390the edited value back into the variable.
5391You can also use @w{@kbd{s e}} to create a new variable if you wish.
5392
5393Notice that the first time you use each rule, Calc puts up a ``compiling''
5394message briefly. The pattern matcher converts rules into a special
5395optimized pattern-matching language rather than using them directly.
5396This allows @kbd{a r} to apply even rather complicated rules very
5397efficiently. If the rule is stored in a variable, Calc compiles it
5398only once and stores the compiled form along with the variable. That's
5399another good reason to store your rules in variables rather than
5400entering them on the fly.
5401
5402(@bullet{}) @strong{Exercise 1.} Type @kbd{m s} to get Symbolic
5403mode, then enter the formula @samp{@w{(2 + sqrt(2))} / @w{(1 + sqrt(2))}}.
5404Using a rewrite rule, simplify this formula by multiplying the top and
5405bottom by the conjugate @w{@samp{1 - sqrt(2)}}. The result will have
5406to be expanded by the distributive law; do this with another
5407rewrite. @xref{Rewrites Answer 1, 1}. (@bullet{})
5408
5409The @kbd{a r} command can also accept a vector of rewrite rules, or
5410a variable containing a vector of rules.
5411
5412@smallexample
5413@group
54141: [tsc, merge, sinsqr] 1: [tan(x) := sin(x) / cos(x), ... ]
5415 . .
5416
5417 ' [tsc,merge,sinsqr] @key{RET} =
5418
5419@end group
5420@end smallexample
5421@noindent
5422@smallexample
5423@group
54241: 1 / cos(x) - sin(x) tan(x) 1: cos(x)
5425 . .
5426
5427 s t trig @key{RET} r 1 a r trig @key{RET} a s
5428@end group
5429@end smallexample
5430
5431@c [fix-ref Nested Formulas with Rewrite Rules]
5432Calc tries all the rules you give against all parts of the formula,
5433repeating until no further change is possible. (The exact order in
5434which things are tried is rather complex, but for simple rules like
5435the ones we've used here the order doesn't really matter.
5436@xref{Nested Formulas with Rewrite Rules}.)
5437
5438Calc actually repeats only up to 100 times, just in case your rule set
5439has gotten into an infinite loop. You can give a numeric prefix argument
5440to @kbd{a r} to specify any limit. In particular, @kbd{M-1 a r} does
5441only one rewrite at a time.
5442
5443@smallexample
5444@group
54451: 1 / cos(x) - sin(x)^2 / cos(x) 1: (1 - sin(x)^2) / cos(x)
5446 . .
5447
5448 r 1 M-1 a r trig @key{RET} M-1 a r trig @key{RET}
5449@end group
5450@end smallexample
5451
5452You can type @kbd{M-0 a r} if you want no limit at all on the number
5453of rewrites that occur.
5454
5455Rewrite rules can also be @dfn{conditional}. Simply follow the rule
5456with a @samp{::} symbol and the desired condition. For example,
5457
5458@smallexample
5459@group
54601: exp(2 pi i) + exp(3 pi i) + exp(4 pi i)
5461 .
5462
5463 ' exp(2 pi i) + exp(3 pi i) + exp(4 pi i) @key{RET}
5464
5465@end group
5466@end smallexample
5467@noindent
5468@smallexample
5469@group
54701: 1 + exp(3 pi i) + 1
5471 .
5472
5473 a r exp(k pi i) := 1 :: k % 2 = 0 @key{RET}
5474@end group
5475@end smallexample
5476
5477@noindent
5478(Recall, @samp{k % 2} is the remainder from dividing @samp{k} by 2,
5479which will be zero only when @samp{k} is an even integer.)
5480
5481An interesting point is that the variables @samp{pi} and @samp{i}
5482were matched literally rather than acting as meta-variables.
5483This is because they are special-constant variables. The special
5484constants @samp{e}, @samp{phi}, and so on also match literally.
5485A common error with rewrite
5486rules is to write, say, @samp{f(a,b,c,d,e) := g(a+b+c+d+e)}, expecting
5487to match any @samp{f} with five arguments but in fact matching
5488only when the fifth argument is literally @samp{e}!
5489
5490@cindex Fibonacci numbers
5491@ignore
5492@starindex
5493@end ignore
5494@tindex fib
5495Rewrite rules provide an interesting way to define your own functions.
5496Suppose we want to define @samp{fib(n)} to produce the @var{n}th
5497Fibonacci number. The first two Fibonacci numbers are each 1;
5498later numbers are formed by summing the two preceding numbers in
5499the sequence. This is easy to express in a set of three rules:
5500
5501@smallexample
5502@group
5503' [fib(1) := 1, fib(2) := 1, fib(n) := fib(n-1) + fib(n-2)] @key{RET} s t fib
5504
55051: fib(7) 1: 13
5506 . .
5507
5508 ' fib(7) @key{RET} a r fib @key{RET}
5509@end group
5510@end smallexample
5511
5512One thing that is guaranteed about the order that rewrites are tried
5513is that, for any given subformula, earlier rules in the rule set will
5514be tried for that subformula before later ones. So even though the
5515first and third rules both match @samp{fib(1)}, we know the first will
5516be used preferentially.
5517
5518This rule set has one dangerous bug: Suppose we apply it to the
5519formula @samp{fib(x)}? (Don't actually try this.) The third rule
5520will match @samp{fib(x)} and replace it with @w{@samp{fib(x-1) + fib(x-2)}}.
5521Each of these will then be replaced to get @samp{fib(x-2) + 2 fib(x-3) +
5522fib(x-4)}, and so on, expanding forever. What we really want is to apply
5523the third rule only when @samp{n} is an integer greater than two. Type
5524@w{@kbd{s e fib @key{RET}}}, then edit the third rule to:
5525
5526@smallexample
5527fib(n) := fib(n-1) + fib(n-2) :: integer(n) :: n > 2
5528@end smallexample
5529
5530@noindent
5531Now:
5532
5533@smallexample
5534@group
55351: fib(6) + fib(x) + fib(0) 1: 8 + fib(x) + fib(0)
5536 . .
5537
5538 ' fib(6)+fib(x)+fib(0) @key{RET} a r fib @key{RET}
5539@end group
5540@end smallexample
5541
5542@noindent
5543We've created a new function, @code{fib}, and a new command,
5544@w{@kbd{a r fib @key{RET}}}, which means ``evaluate all @code{fib} calls in
5545this formula.'' To make things easier still, we can tell Calc to
5546apply these rules automatically by storing them in the special
5547variable @code{EvalRules}.
5548
5549@smallexample
5550@group
55511: [fib(1) := ...] . 1: [8, 13]
5552 . .
5553
5554 s r fib @key{RET} s t EvalRules @key{RET} ' [fib(6), fib(7)] @key{RET}
5555@end group
5556@end smallexample
5557
5558It turns out that this rule set has the problem that it does far
5559more work than it needs to when @samp{n} is large. Consider the
5560first few steps of the computation of @samp{fib(6)}:
5561
5562@smallexample
5563@group
5564fib(6) =
5565fib(5) + fib(4) =
5566fib(4) + fib(3) + fib(3) + fib(2) =
5567fib(3) + fib(2) + fib(2) + fib(1) + fib(2) + fib(1) + 1 = ...
5568@end group
5569@end smallexample
5570
5571@noindent
5572Note that @samp{fib(3)} appears three times here. Unless Calc's
5573algebraic simplifier notices the multiple @samp{fib(3)}s and combines
5574them (and, as it happens, it doesn't), this rule set does lots of
5575needless recomputation. To cure the problem, type @code{s e EvalRules}
5576to edit the rules (or just @kbd{s E}, a shorthand command for editing
5577@code{EvalRules}) and add another condition:
5578
5579@smallexample
5580fib(n) := fib(n-1) + fib(n-2) :: integer(n) :: n > 2 :: remember
5581@end smallexample
5582
5583@noindent
5584If a @samp{:: remember} condition appears anywhere in a rule, then if
5585that rule succeeds Calc will add another rule that describes that match
5586to the front of the rule set. (Remembering works in any rule set, but
5587for technical reasons it is most effective in @code{EvalRules}.) For
5588example, if the rule rewrites @samp{fib(7)} to something that evaluates
5589to 13, then the rule @samp{fib(7) := 13} will be added to the rule set.
5590
5591Type @kbd{' fib(8) @key{RET}} to compute the eighth Fibonacci number, then
5592type @kbd{s E} again to see what has happened to the rule set.
5593
5594With the @code{remember} feature, our rule set can now compute
5595@samp{fib(@var{n})} in just @var{n} steps. In the process it builds
5596up a table of all Fibonacci numbers up to @var{n}. After we have
5597computed the result for a particular @var{n}, we can get it back
5598(and the results for all smaller @var{n}) later in just one step.
5599
5600All Calc operations will run somewhat slower whenever @code{EvalRules}
5601contains any rules. You should type @kbd{s u EvalRules @key{RET}} now to
5602un-store the variable.
5603
5604(@bullet{}) @strong{Exercise 2.} Sometimes it is possible to reformulate
5605a problem to reduce the amount of recursion necessary to solve it.
5606Create a rule that, in about @var{n} simple steps and without recourse
5607to the @code{remember} option, replaces @samp{fib(@var{n}, 1, 1)} with
5608@samp{fib(1, @var{x}, @var{y})} where @var{x} and @var{y} are the
5609@var{n}th and @var{n+1}st Fibonacci numbers, respectively. This rule is
5610rather clunky to use, so add a couple more rules to make the ``user
5611interface'' the same as for our first version: enter @samp{fib(@var{n})},
5612get back a plain number. @xref{Rewrites Answer 2, 2}. (@bullet{})
5613
5614There are many more things that rewrites can do. For example, there
5615are @samp{&&&} and @samp{|||} pattern operators that create ``and''
5616and ``or'' combinations of rules. As one really simple example, we
5617could combine our first two Fibonacci rules thusly:
5618
5619@example
5620[fib(1 ||| 2) := 1, fib(n) := ... ]
5621@end example
5622
5623@noindent
5624That means ``@code{fib} of something matching either 1 or 2 rewrites
5625to 1.''
5626
5627You can also make meta-variables optional by enclosing them in @code{opt}.
5628For example, the pattern @samp{a + b x} matches @samp{2 + 3 x} but not
5629@samp{2 + x} or @samp{3 x} or @samp{x}. The pattern @samp{opt(a) + opt(b) x}
5630matches all of these forms, filling in a default of zero for @samp{a}
5631and one for @samp{b}.
5632
5633(@bullet{}) @strong{Exercise 3.} Your friend Joe had @samp{2 + 3 x}
5634on the stack and tried to use the rule
5635@samp{opt(a) + opt(b) x := f(a, b, x)}. What happened?
5636@xref{Rewrites Answer 3, 3}. (@bullet{})
5637
5638(@bullet{}) @strong{Exercise 4.} Starting with a positive integer @expr{a},
5639divide @expr{a} by two if it is even, otherwise compute @expr{3 a + 1}.
5640Now repeat this step over and over. A famous unproved conjecture
5641is that for any starting @expr{a}, the sequence always eventually
5642reaches 1. Given the formula @samp{seq(@var{a}, 0)}, write a set of
5643rules that convert this into @samp{seq(1, @var{n})} where @var{n}
5644is the number of steps it took the sequence to reach the value 1.
5645Now enhance the rules to accept @samp{seq(@var{a})} as a starting
5646configuration, and to stop with just the number @var{n} by itself.
5647Now make the result be a vector of values in the sequence, from @var{a}
5648to 1. (The formula @samp{@var{x}|@var{y}} appends the vectors @var{x}
5649and @var{y}.) For example, rewriting @samp{seq(6)} should yield the
5650vector @expr{[6, 3, 10, 5, 16, 8, 4, 2, 1]}.
5651@xref{Rewrites Answer 4, 4}. (@bullet{})
5652
5653(@bullet{}) @strong{Exercise 5.} Define, using rewrite rules, a function
5654@samp{nterms(@var{x})} that returns the number of terms in the sum
5655@var{x}, or 1 if @var{x} is not a sum. (A @dfn{sum} for our purposes
5656is one or more non-sum terms separated by @samp{+} or @samp{-} signs,
5657so that @expr{2 - 3 (x + y) + x y} is a sum of three terms.)
5658@xref{Rewrites Answer 5, 5}. (@bullet{})
5659
5660(@bullet{}) @strong{Exercise 6.} A Taylor series for a function is an
5661infinite series that exactly equals the value of that function at
5662values of @expr{x} near zero.
5663
5664@ifnottex
5665@example
5666cos(x) = 1 - x^2 / 2! + x^4 / 4! - x^6 / 6! + ...
5667@end example
5668@end ifnottex
5669@tex
5670\turnoffactive
5671\beforedisplay
5672$$ \cos x = 1 - {x^2 \over 2!} + {x^4 \over 4!} - {x^6 \over 6!} + \cdots $$
5673\afterdisplay
5674@end tex
5675
5676The @kbd{a t} command produces a @dfn{truncated Taylor series} which
5677is obtained by dropping all the terms higher than, say, @expr{x^2}.
5678Calc represents the truncated Taylor series as a polynomial in @expr{x}.
5679Mathematicians often write a truncated series using a ``big-O'' notation
5680that records what was the lowest term that was truncated.
5681
5682@ifnottex
5683@example
5684cos(x) = 1 - x^2 / 2! + O(x^3)
5685@end example
5686@end ifnottex
5687@tex
5688\turnoffactive
5689\beforedisplay
5690$$ \cos x = 1 - {x^2 \over 2!} + O(x^3) $$
5691\afterdisplay
5692@end tex
5693
5694@noindent
5695The meaning of @expr{O(x^3)} is ``a quantity which is negligibly small
5696if @expr{x^3} is considered negligibly small as @expr{x} goes to zero.''
5697
5698The exercise is to create rewrite rules that simplify sums and products of
5699power series represented as @samp{@var{polynomial} + O(@var{var}^@var{n})}.
5700For example, given @samp{1 - x^2 / 2 + O(x^3)} and @samp{x - x^3 / 6 + O(x^4)}
5701on the stack, we want to be able to type @kbd{*} and get the result
5702@samp{x - 2:3 x^3 + O(x^4)}. Don't worry if the terms of the sum are
5703rearranged or if @kbd{a s} needs to be typed after rewriting. (This one
5704is rather tricky; the solution at the end of this chapter uses 6 rewrite
5705rules. Hint: The @samp{constant(x)} condition tests whether @samp{x} is
5706a number.) @xref{Rewrites Answer 6, 6}. (@bullet{})
5707
5708Just for kicks, try adding the rule @code{2+3 := 6} to @code{EvalRules}.
5709What happens? (Be sure to remove this rule afterward, or you might get
5710a nasty surprise when you use Calc to balance your checkbook!)
5711
5712@xref{Rewrite Rules}, for the whole story on rewrite rules.
5713
5714@node Programming Tutorial, Answers to Exercises, Algebra Tutorial, Tutorial
5715@section Programming Tutorial
5716
5717@noindent
5718The Calculator is written entirely in Emacs Lisp, a highly extensible
5719language. If you know Lisp, you can program the Calculator to do
5720anything you like. Rewrite rules also work as a powerful programming
5721system. But Lisp and rewrite rules take a while to master, and often
5722all you want to do is define a new function or repeat a command a few
5723times. Calc has features that allow you to do these things easily.
5724
5725One very limited form of programming is defining your own functions.
5726Calc's @kbd{Z F} command allows you to define a function name and
5727key sequence to correspond to any formula. Programming commands use
5728the shift-@kbd{Z} prefix; the user commands they create use the lower
5729case @kbd{z} prefix.
5730
5731@smallexample
5732@group
57331: 1 + x + x^2 / 2 + x^3 / 6 1: 1 + x + x^2 / 2 + x^3 / 6
5734 . .
5735
5736 ' 1 + x + x^2/2! + x^3/3! @key{RET} Z F e myexp @key{RET} @key{RET} @key{RET} y
5737@end group
5738@end smallexample
5739
5740This polynomial is a Taylor series approximation to @samp{exp(x)}.
5741The @kbd{Z F} command asks a number of questions. The above answers
5742say that the key sequence for our function should be @kbd{z e}; the
5743@kbd{M-x} equivalent should be @code{calc-myexp}; the name of the
5744function in algebraic formulas should also be @code{myexp}; the
5745default argument list @samp{(x)} is acceptable; and finally @kbd{y}
5746answers the question ``leave it in symbolic form for non-constant
5747arguments?''
5748
5749@smallexample
5750@group
57511: 1.3495 2: 1.3495 3: 1.3495
5752 . 1: 1.34986 2: 1.34986
5753 . 1: myexp(a + 1)
5754 .
5755
5756 .3 z e .3 E ' a+1 @key{RET} z e
5757@end group
5758@end smallexample
5759
5760@noindent
5761First we call our new @code{exp} approximation with 0.3 as an
5762argument, and compare it with the true @code{exp} function. Then
5763we note that, as requested, if we try to give @kbd{z e} an
5764argument that isn't a plain number, it leaves the @code{myexp}
5765function call in symbolic form. If we had answered @kbd{n} to the
5766final question, @samp{myexp(a + 1)} would have evaluated by plugging
5767in @samp{a + 1} for @samp{x} in the defining formula.
5768
5769@cindex Sine integral Si(x)
5770@ignore
5771@starindex
5772@end ignore
5773@tindex Si
5774(@bullet{}) @strong{Exercise 1.} The ``sine integral'' function
5775@texline @math{{\rm Si}(x)}
5776@infoline @expr{Si(x)}
5777is defined as the integral of @samp{sin(t)/t} for
5778@expr{t = 0} to @expr{x} in radians. (It was invented because this
5779integral has no solution in terms of basic functions; if you give it
5780to Calc's @kbd{a i} command, it will ponder it for a long time and then
5781give up.) We can use the numerical integration command, however,
5782which in algebraic notation is written like @samp{ninteg(f(t), t, 0, x)}
5783with any integrand @samp{f(t)}. Define a @kbd{z s} command and
5784@code{Si} function that implement this. You will need to edit the
5785default argument list a bit. As a test, @samp{Si(1)} should return
57860.946083. (If you don't get this answer, you might want to check that
5787Calc is in Radians mode. Also, @code{ninteg} will run a lot faster if
5788you reduce the precision to, say, six digits beforehand.)
5789@xref{Programming Answer 1, 1}. (@bullet{})
5790
5791The simplest way to do real ``programming'' of Emacs is to define a
5792@dfn{keyboard macro}. A keyboard macro is simply a sequence of
5793keystrokes which Emacs has stored away and can play back on demand.
5794For example, if you find yourself typing @kbd{H a S x @key{RET}} often,
5795you may wish to program a keyboard macro to type this for you.
5796
5797@smallexample
5798@group
57991: y = sqrt(x) 1: x = y^2
5800 . .
5801
5802 ' y=sqrt(x) @key{RET} C-x ( H a S x @key{RET} C-x )
5803
58041: y = cos(x) 1: x = s1 arccos(y) + 2 pi n1
5805 . .
5806
5807 ' y=cos(x) @key{RET} X
5808@end group
5809@end smallexample
5810
5811@noindent
5812When you type @kbd{C-x (}, Emacs begins recording. But it is also
5813still ready to execute your keystrokes, so you're really ``training''
5814Emacs by walking it through the procedure once. When you type
5815@w{@kbd{C-x )}}, the macro is recorded. You can now type @kbd{X} to
5816re-execute the same keystrokes.
5817
5818You can give a name to your macro by typing @kbd{Z K}.
5819
5820@smallexample
5821@group
58221: . 1: y = x^4 1: x = s2 sqrt(s1 sqrt(y))
5823 . .
5824
5825 Z K x @key{RET} ' y=x^4 @key{RET} z x
5826@end group
5827@end smallexample
5828
5829@noindent
5830Notice that we use shift-@kbd{Z} to define the command, and lower-case
5831@kbd{z} to call it up.
5832
5833Keyboard macros can call other macros.
5834
5835@smallexample
5836@group
58371: abs(x) 1: x = s1 y 1: 2 / x 1: x = 2 / y
5838 . . . .
5839
5840 ' abs(x) @key{RET} C-x ( ' y @key{RET} a = z x C-x ) ' 2/x @key{RET} X
5841@end group
5842@end smallexample
5843
5844(@bullet{}) @strong{Exercise 2.} Define a keyboard macro to negate
5845the item in level 3 of the stack, without disturbing the rest of
5846the stack. @xref{Programming Answer 2, 2}. (@bullet{})
5847
5848(@bullet{}) @strong{Exercise 3.} Define keyboard macros to compute
5849the following functions:
5850
5851@enumerate
5852@item
5853Compute
5854@texline @math{\displaystyle{\sin x \over x}},
5855@infoline @expr{sin(x) / x},
5856where @expr{x} is the number on the top of the stack.
5857
5858@item
5859Compute the base-@expr{b} logarithm, just like the @kbd{B} key except
5860the arguments are taken in the opposite order.
5861
5862@item
5863Produce a vector of integers from 1 to the integer on the top of
5864the stack.
5865@end enumerate
5866@noindent
5867@xref{Programming Answer 3, 3}. (@bullet{})
5868
5869(@bullet{}) @strong{Exercise 4.} Define a keyboard macro to compute
5870the average (mean) value of a list of numbers.
5871@xref{Programming Answer 4, 4}. (@bullet{})
5872
5873In many programs, some of the steps must execute several times.
5874Calc has @dfn{looping} commands that allow this. Loops are useful
5875inside keyboard macros, but actually work at any time.
5876
5877@smallexample
5878@group
58791: x^6 2: x^6 1: 360 x^2
5880 . 1: 4 .
5881 .
5882
5883 ' x^6 @key{RET} 4 Z < a d x @key{RET} Z >
5884@end group
5885@end smallexample
5886
5887@noindent
5888Here we have computed the fourth derivative of @expr{x^6} by
5889enclosing a derivative command in a ``repeat loop'' structure.
5890This structure pops a repeat count from the stack, then
5891executes the body of the loop that many times.
5892
5893If you make a mistake while entering the body of the loop,
5894type @w{@kbd{Z C-g}} to cancel the loop command.
5895
5896@cindex Fibonacci numbers
5897Here's another example:
5898
5899@smallexample
5900@group
59013: 1 2: 10946
59022: 1 1: 17711
59031: 20 .
5904 .
5905
59061 @key{RET} @key{RET} 20 Z < @key{TAB} C-j + Z >
5907@end group
5908@end smallexample
5909
5910@noindent
5911The numbers in levels 2 and 1 should be the 21st and 22nd Fibonacci
5912numbers, respectively. (To see what's going on, try a few repetitions
5913of the loop body by hand; @kbd{C-j}, also on the Line-Feed or @key{LFD}
5914key if you have one, makes a copy of the number in level 2.)
5915
5916@cindex Golden ratio
5917@cindex Phi, golden ratio
5918A fascinating property of the Fibonacci numbers is that the @expr{n}th
5919Fibonacci number can be found directly by computing
5920@texline @math{\phi^n / \sqrt{5}}
5921@infoline @expr{phi^n / sqrt(5)}
5922and then rounding to the nearest integer, where
5923@texline @math{\phi} (``phi''),
5924@infoline @expr{phi},
5925the ``golden ratio,'' is
5926@texline @math{(1 + \sqrt{5}) / 2}.
5927@infoline @expr{(1 + sqrt(5)) / 2}.
5928(For convenience, this constant is available from the @code{phi}
5929variable, or the @kbd{I H P} command.)
5930
5931@smallexample
5932@group
59331: 1.61803 1: 24476.0000409 1: 10945.9999817 1: 10946
5934 . . . .
5935
5936 I H P 21 ^ 5 Q / R
5937@end group
5938@end smallexample
5939
5940@cindex Continued fractions
5941(@bullet{}) @strong{Exercise 5.} The @dfn{continued fraction}
5942representation of
5943@texline @math{\phi}
5944@infoline @expr{phi}
5945is
5946@texline @math{1 + 1/(1 + 1/(1 + 1/( \ldots )))}.
5947@infoline @expr{1 + 1/(1 + 1/(1 + 1/( ...@: )))}.
5948We can compute an approximate value by carrying this however far
5949and then replacing the innermost
5950@texline @math{1/( \ldots )}
5951@infoline @expr{1/( ...@: )}
5952by 1. Approximate
5953@texline @math{\phi}
5954@infoline @expr{phi}
5955using a twenty-term continued fraction.
5956@xref{Programming Answer 5, 5}. (@bullet{})
5957
5958(@bullet{}) @strong{Exercise 6.} Linear recurrences like the one for
5959Fibonacci numbers can be expressed in terms of matrices. Given a
5960vector @w{@expr{[a, b]}} determine a matrix which, when multiplied by this
5961vector, produces the vector @expr{[b, c]}, where @expr{a}, @expr{b} and
5962@expr{c} are three successive Fibonacci numbers. Now write a program
5963that, given an integer @expr{n}, computes the @expr{n}th Fibonacci number
5964using matrix arithmetic. @xref{Programming Answer 6, 6}. (@bullet{})
5965
5966@cindex Harmonic numbers
5967A more sophisticated kind of loop is the @dfn{for} loop. Suppose
5968we wish to compute the 20th ``harmonic'' number, which is equal to
5969the sum of the reciprocals of the integers from 1 to 20.
5970
5971@smallexample
5972@group
59733: 0 1: 3.597739
59742: 1 .
59751: 20
5976 .
5977
59780 @key{RET} 1 @key{RET} 20 Z ( & + 1 Z )
5979@end group
5980@end smallexample
5981
5982@noindent
5983The ``for'' loop pops two numbers, the lower and upper limits, then
5984repeats the body of the loop as an internal counter increases from
5985the lower limit to the upper one. Just before executing the loop
5986body, it pushes the current loop counter. When the loop body
5987finishes, it pops the ``step,'' i.e., the amount by which to
5988increment the loop counter. As you can see, our loop always
5989uses a step of one.
5990
5991This harmonic number function uses the stack to hold the running
5992total as well as for the various loop housekeeping functions. If
5993you find this disorienting, you can sum in a variable instead:
5994
5995@smallexample
5996@group
59971: 0 2: 1 . 1: 3.597739
5998 . 1: 20 .
5999 .
6000
6001 0 t 7 1 @key{RET} 20 Z ( & s + 7 1 Z ) r 7
6002@end group
6003@end smallexample
6004
6005@noindent
6006The @kbd{s +} command adds the top-of-stack into the value in a
6007variable (and removes that value from the stack).
6008
6009It's worth noting that many jobs that call for a ``for'' loop can
6010also be done more easily by Calc's high-level operations. Two
6011other ways to compute harmonic numbers are to use vector mapping
6012and reduction (@kbd{v x 20}, then @w{@kbd{V M &}}, then @kbd{V R +}),
6013or to use the summation command @kbd{a +}. Both of these are
6014probably easier than using loops. However, there are some
6015situations where loops really are the way to go:
6016
6017(@bullet{}) @strong{Exercise 7.} Use a ``for'' loop to find the first
6018harmonic number which is greater than 4.0.
6019@xref{Programming Answer 7, 7}. (@bullet{})
6020
6021Of course, if we're going to be using variables in our programs,
6022we have to worry about the programs clobbering values that the
6023caller was keeping in those same variables. This is easy to
6024fix, though:
6025
6026@smallexample
6027@group
6028 . 1: 0.6667 1: 0.6667 3: 0.6667
6029 . . 2: 3.597739
6030 1: 0.6667
6031 .
6032
6033 Z ` p 4 @key{RET} 2 @key{RET} 3 / s 7 s s a @key{RET} Z ' r 7 s r a @key{RET}
6034@end group
6035@end smallexample
6036
6037@noindent
6038When we type @kbd{Z `} (that's a back-quote character), Calc saves
6039its mode settings and the contents of the ten ``quick variables''
6040for later reference. When we type @kbd{Z '} (that's an apostrophe
6041now), Calc restores those saved values. Thus the @kbd{p 4} and
6042@kbd{s 7} commands have no effect outside this sequence. Wrapping
6043this around the body of a keyboard macro ensures that it doesn't
6044interfere with what the user of the macro was doing. Notice that
6045the contents of the stack, and the values of named variables,
6046survive past the @kbd{Z '} command.
6047
6048@cindex Bernoulli numbers, approximate
6049The @dfn{Bernoulli numbers} are a sequence with the interesting
6050property that all of the odd Bernoulli numbers are zero, and the
6051even ones, while difficult to compute, can be roughly approximated
6052by the formula
6053@texline @math{\displaystyle{2 n! \over (2 \pi)^n}}.
6054@infoline @expr{2 n!@: / (2 pi)^n}.
6055Let's write a keyboard macro to compute (approximate) Bernoulli numbers.
6056(Calc has a command, @kbd{k b}, to compute exact Bernoulli numbers, but
6057this command is very slow for large @expr{n} since the higher Bernoulli
6058numbers are very large fractions.)
6059
6060@smallexample
6061@group
60621: 10 1: 0.0756823
6063 . .
6064
6065 10 C-x ( @key{RET} 2 % Z [ @key{DEL} 0 Z : ' 2 $! / (2 pi)^$ @key{RET} = Z ] C-x )
6066@end group
6067@end smallexample
6068
6069@noindent
6070You can read @kbd{Z [} as ``then,'' @kbd{Z :} as ``else,'' and
6071@kbd{Z ]} as ``end-if.'' There is no need for an explicit ``if''
6072command. For the purposes of @w{@kbd{Z [}}, the condition is ``true''
6073if the value it pops from the stack is a nonzero number, or ``false''
6074if it pops zero or something that is not a number (like a formula).
6075Here we take our integer argument modulo 2; this will be nonzero
6076if we're asking for an odd Bernoulli number.
6077
6078The actual tenth Bernoulli number is @expr{5/66}.
6079
6080@smallexample
6081@group
60823: 0.0756823 1: 0 1: 0.25305 1: 0 1: 1.16659
60832: 5:66 . . . .
60841: 0.0757575
6085 .
6086
608710 k b @key{RET} c f M-0 @key{DEL} 11 X @key{DEL} 12 X @key{DEL} 13 X @key{DEL} 14 X
6088@end group
6089@end smallexample
6090
6091Just to exercise loops a bit more, let's compute a table of even
6092Bernoulli numbers.
6093
6094@smallexample
6095@group
60963: [] 1: [0.10132, 0.03079, 0.02340, 0.033197, ...]
60972: 2 .
60981: 30
6099 .
6100
6101 [ ] 2 @key{RET} 30 Z ( X | 2 Z )
6102@end group
6103@end smallexample
6104
6105@noindent
6106The vertical-bar @kbd{|} is the vector-concatenation command. When
6107we execute it, the list we are building will be in stack level 2
6108(initially this is an empty list), and the next Bernoulli number
6109will be in level 1. The effect is to append the Bernoulli number
6110onto the end of the list. (To create a table of exact fractional
6111Bernoulli numbers, just replace @kbd{X} with @kbd{k b} in the above
6112sequence of keystrokes.)
6113
6114With loops and conditionals, you can program essentially anything
6115in Calc. One other command that makes looping easier is @kbd{Z /},
6116which takes a condition from the stack and breaks out of the enclosing
6117loop if the condition is true (non-zero). You can use this to make
6118``while'' and ``until'' style loops.
6119
6120If you make a mistake when entering a keyboard macro, you can edit
6121it using @kbd{Z E}. First, you must attach it to a key with @kbd{Z K}.
6122One technique is to enter a throwaway dummy definition for the macro,
6123then enter the real one in the edit command.
6124
6125@smallexample
6126@group
61271: 3 1: 3 Calc Macro Edit Mode.
6128 . . Original keys: 1 <return> 2 +
6129
6130 1 ;; calc digits
6131 RET ;; calc-enter
6132 2 ;; calc digits
6133 + ;; calc-plus
6134
6135C-x ( 1 @key{RET} 2 + C-x ) Z K h @key{RET} Z E h
6136@end group
6137@end smallexample
6138
6139@noindent
6140A keyboard macro is stored as a pure keystroke sequence. The
6141@file{edmacro} package (invoked by @kbd{Z E}) scans along the
6142macro and tries to decode it back into human-readable steps.
6143Descriptions of the keystrokes are given as comments, which begin with
6144@samp{;;}, and which are ignored when the edited macro is saved.
6145Spaces and line breaks are also ignored when the edited macro is saved.
6146To enter a space into the macro, type @code{SPC}. All the special
6147characters @code{RET}, @code{LFD}, @code{TAB}, @code{SPC}, @code{DEL},
6148and @code{NUL} must be written in all uppercase, as must the prefixes
6149@code{C-} and @code{M-}.
6150
6151Let's edit in a new definition, for computing harmonic numbers.
6152First, erase the four lines of the old definition. Then, type
6153in the new definition (or use Emacs @kbd{M-w} and @kbd{C-y} commands
6154to copy it from this page of the Info file; you can of course skip
6155typing the comments, which begin with @samp{;;}).
6156
6157@smallexample
6158Z` ;; calc-kbd-push (Save local values)
61590 ;; calc digits (Push a zero onto the stack)
6160st ;; calc-store-into (Store it in the following variable)
61611 ;; calc quick variable (Quick variable q1)
61621 ;; calc digits (Initial value for the loop)
6163TAB ;; calc-roll-down (Swap initial and final)
6164Z( ;; calc-kbd-for (Begin the "for" loop)
6165& ;; calc-inv (Take the reciprocal)
6166s+ ;; calc-store-plus (Add to the following variable)
61671 ;; calc quick variable (Quick variable q1)
61681 ;; calc digits (The loop step is 1)
6169Z) ;; calc-kbd-end-for (End the "for" loop)
6170sr ;; calc-recall (Recall the final accumulated value)
61711 ;; calc quick variable (Quick variable q1)
6172Z' ;; calc-kbd-pop (Restore values)
6173@end smallexample
6174
6175@noindent
6176Press @kbd{C-c C-c} to finish editing and return to the Calculator.
6177
6178@smallexample
6179@group
61801: 20 1: 3.597739
6181 . .
6182
6183 20 z h
6184@end group
6185@end smallexample
6186
6187The @file{edmacro} package defines a handy @code{read-kbd-macro} command
6188which reads the current region of the current buffer as a sequence of
6189keystroke names, and defines that sequence on the @kbd{X}
6190(and @kbd{C-x e}) key. Because this is so useful, Calc puts this
6191command on the @kbd{C-x * m} key. Try reading in this macro in the
6192following form: Press @kbd{C-@@} (or @kbd{C-@key{SPC}}) at
6193one end of the text below, then type @kbd{C-x * m} at the other.
6194
6195@example
6196@group
6197Z ` 0 t 1
6198 1 TAB
6199 Z ( & s + 1 1 Z )
6200 r 1
6201Z '
6202@end group
6203@end example
6204
6205(@bullet{}) @strong{Exercise 8.} A general algorithm for solving
6206equations numerically is @dfn{Newton's Method}. Given the equation
6207@expr{f(x) = 0} for any function @expr{f}, and an initial guess
6208@expr{x_0} which is reasonably close to the desired solution, apply
6209this formula over and over:
6210
6211@ifnottex
6212@example
6213new_x = x - f(x)/f'(x)
6214@end example
6215@end ifnottex
6216@tex
6217\beforedisplay
6218$$ x_{\rm new} = x - {f(x) \over f'(x)} $$
6219\afterdisplay
6220@end tex
6221
6222@noindent
6223where @expr{f'(x)} is the derivative of @expr{f}. The @expr{x}
6224values will quickly converge to a solution, i.e., eventually
6225@texline @math{x_{\rm new}}
6226@infoline @expr{new_x}
6227and @expr{x} will be equal to within the limits
6228of the current precision. Write a program which takes a formula
6229involving the variable @expr{x}, and an initial guess @expr{x_0},
6230on the stack, and produces a value of @expr{x} for which the formula
6231is zero. Use it to find a solution of
6232@texline @math{\sin(\cos x) = 0.5}
6233@infoline @expr{sin(cos(x)) = 0.5}
6234near @expr{x = 4.5}. (Use angles measured in radians.) Note that
6235the built-in @w{@kbd{a R}} (@code{calc-find-root}) command uses Newton's
6236method when it is able. @xref{Programming Answer 8, 8}. (@bullet{})
6237
6238@cindex Digamma function
6239@cindex Gamma constant, Euler's
6240@cindex Euler's gamma constant
6241(@bullet{}) @strong{Exercise 9.} The @dfn{digamma} function
6242@texline @math{\psi(z) (``psi'')}
6243@infoline @expr{psi(z)}
6244is defined as the derivative of
6245@texline @math{\ln \Gamma(z)}.
6246@infoline @expr{ln(gamma(z))}.
6247For large values of @expr{z}, it can be approximated by the infinite sum
6248
6249@ifnottex
6250@example
6251psi(z) ~= ln(z) - 1/2z - sum(bern(2 n) / 2 n z^(2 n), n, 1, inf)
6252@end example
6253@end ifnottex
6254@tex
6255\beforedisplay
6256$$ \psi(z) \approx \ln z - {1\over2z} -
6257 \sum_{n=1}^\infty {\code{bern}(2 n) \over 2 n z^{2n}}
6258$$
6259\afterdisplay
6260@end tex
6261
6262@noindent
6263where
6264@texline @math{\sum}
6265@infoline @expr{sum}
6266represents the sum over @expr{n} from 1 to infinity
6267(or to some limit high enough to give the desired accuracy), and
6268the @code{bern} function produces (exact) Bernoulli numbers.
6269While this sum is not guaranteed to converge, in practice it is safe.
6270An interesting mathematical constant is Euler's gamma, which is equal
6271to about 0.5772. One way to compute it is by the formula,
6272@texline @math{\gamma = -\psi(1)}.
6273@infoline @expr{gamma = -psi(1)}.
6274Unfortunately, 1 isn't a large enough argument
6275for the above formula to work (5 is a much safer value for @expr{z}).
6276Fortunately, we can compute
6277@texline @math{\psi(1)}
6278@infoline @expr{psi(1)}
6279from
6280@texline @math{\psi(5)}
6281@infoline @expr{psi(5)}
6282using the recurrence
6283@texline @math{\psi(z+1) = \psi(z) + {1 \over z}}.
6284@infoline @expr{psi(z+1) = psi(z) + 1/z}.
6285Your task: Develop a program to compute
6286@texline @math{\psi(z)};
6287@infoline @expr{psi(z)};
6288it should ``pump up'' @expr{z}
6289if necessary to be greater than 5, then use the above summation
6290formula. Use looping commands to compute the sum. Use your function
6291to compute
6292@texline @math{\gamma}
6293@infoline @expr{gamma}
6294to twelve decimal places. (Calc has a built-in command
6295for Euler's constant, @kbd{I P}, which you can use to check your answer.)
6296@xref{Programming Answer 9, 9}. (@bullet{})
6297
6298@cindex Polynomial, list of coefficients
6299(@bullet{}) @strong{Exercise 10.} Given a polynomial in @expr{x} and
6300a number @expr{m} on the stack, where the polynomial is of degree
6301@expr{m} or less (i.e., does not have any terms higher than @expr{x^m}),
6302write a program to convert the polynomial into a list-of-coefficients
6303notation. For example, @expr{5 x^4 + (x + 1)^2} with @expr{m = 6}
6304should produce the list @expr{[1, 2, 1, 0, 5, 0, 0]}. Also develop
6305a way to convert from this form back to the standard algebraic form.
6306@xref{Programming Answer 10, 10}. (@bullet{})
6307
6308@cindex Recursion
6309(@bullet{}) @strong{Exercise 11.} The @dfn{Stirling numbers of the
6310first kind} are defined by the recurrences,
6311
6312@ifnottex
6313@example
6314s(n,n) = 1 for n >= 0,
6315s(n,0) = 0 for n > 0,
6316s(n+1,m) = s(n,m-1) - n s(n,m) for n >= m >= 1.
6317@end example
6318@end ifnottex
6319@tex
6320\turnoffactive
6321\beforedisplay
6322$$ \eqalign{ s(n,n) &= 1 \qquad \hbox{for } n \ge 0, \cr
6323 s(n,0) &= 0 \qquad \hbox{for } n > 0, \cr
6324 s(n+1,m) &= s(n,m-1) - n \, s(n,m) \qquad
6325 \hbox{for } n \ge m \ge 1.}
6326$$
6327\afterdisplay
6328\vskip5pt
6329(These numbers are also sometimes written $\displaystyle{n \brack m}$.)
6330@end tex
6331
6332This can be implemented using a @dfn{recursive} program in Calc; the
6333program must invoke itself in order to calculate the two righthand
6334terms in the general formula. Since it always invokes itself with
6335``simpler'' arguments, it's easy to see that it must eventually finish
6336the computation. Recursion is a little difficult with Emacs keyboard
6337macros since the macro is executed before its definition is complete.
6338So here's the recommended strategy: Create a ``dummy macro'' and assign
6339it to a key with, e.g., @kbd{Z K s}. Now enter the true definition,
6340using the @kbd{z s} command to call itself recursively, then assign it
6341to the same key with @kbd{Z K s}. Now the @kbd{z s} command will run
6342the complete recursive program. (Another way is to use @w{@kbd{Z E}}
6343or @kbd{C-x * m} (@code{read-kbd-macro}) to read the whole macro at once,
6344thus avoiding the ``training'' phase.) The task: Write a program
6345that computes Stirling numbers of the first kind, given @expr{n} and
6346@expr{m} on the stack. Test it with @emph{small} inputs like
6347@expr{s(4,2)}. (There is a built-in command for Stirling numbers,
6348@kbd{k s}, which you can use to check your answers.)
6349@xref{Programming Answer 11, 11}. (@bullet{})
6350
6351The programming commands we've seen in this part of the tutorial
6352are low-level, general-purpose operations. Often you will find
6353that a higher-level function, such as vector mapping or rewrite
6354rules, will do the job much more easily than a detailed, step-by-step
6355program can:
6356
6357(@bullet{}) @strong{Exercise 12.} Write another program for
6358computing Stirling numbers of the first kind, this time using
6359rewrite rules. Once again, @expr{n} and @expr{m} should be taken
6360from the stack. @xref{Programming Answer 12, 12}. (@bullet{})
6361
6362@example
6363
6364@end example
6365This ends the tutorial section of the Calc manual. Now you know enough
6366about Calc to use it effectively for many kinds of calculations. But
6367Calc has many features that were not even touched upon in this tutorial.
6368@c [not-split]
6369The rest of this manual tells the whole story.
6370@c [when-split]
6371@c Volume II of this manual, the @dfn{Calc Reference}, tells the whole story.
6372
6373@page
6374@node Answers to Exercises, , Programming Tutorial, Tutorial
6375@section Answers to Exercises
6376
6377@noindent
6378This section includes answers to all the exercises in the Calc tutorial.
6379
6380@menu
6381* RPN Answer 1:: 1 @key{RET} 2 @key{RET} 3 @key{RET} 4 + * -
6382* RPN Answer 2:: 2*4 + 7*9.5 + 5/4
6383* RPN Answer 3:: Operating on levels 2 and 3
6384* RPN Answer 4:: Joe's complex problems
6385* Algebraic Answer 1:: Simulating Q command
6386* Algebraic Answer 2:: Joe's algebraic woes
6387* Algebraic Answer 3:: 1 / 0
6388* Modes Answer 1:: 3#0.1 = 3#0.0222222?
6389* Modes Answer 2:: 16#f.e8fe15
6390* Modes Answer 3:: Joe's rounding bug
6391* Modes Answer 4:: Why floating point?
6392* Arithmetic Answer 1:: Why the \ command?
6393* Arithmetic Answer 2:: Tripping up the B command
6394* Vector Answer 1:: Normalizing a vector
6395* Vector Answer 2:: Average position
6396* Matrix Answer 1:: Row and column sums
6397* Matrix Answer 2:: Symbolic system of equations
6398* Matrix Answer 3:: Over-determined system
6399* List Answer 1:: Powers of two
6400* List Answer 2:: Least-squares fit with matrices
6401* List Answer 3:: Geometric mean
6402* List Answer 4:: Divisor function
6403* List Answer 5:: Duplicate factors
6404* List Answer 6:: Triangular list
6405* List Answer 7:: Another triangular list
6406* List Answer 8:: Maximum of Bessel function
6407* List Answer 9:: Integers the hard way
6408* List Answer 10:: All elements equal
6409* List Answer 11:: Estimating pi with darts
6410* List Answer 12:: Estimating pi with matchsticks
6411* List Answer 13:: Hash codes
6412* List Answer 14:: Random walk
6413* Types Answer 1:: Square root of pi times rational
6414* Types Answer 2:: Infinities
6415* Types Answer 3:: What can "nan" be?
6416* Types Answer 4:: Abbey Road
6417* Types Answer 5:: Friday the 13th
6418* Types Answer 6:: Leap years
6419* Types Answer 7:: Erroneous donut
6420* Types Answer 8:: Dividing intervals
6421* Types Answer 9:: Squaring intervals
6422* Types Answer 10:: Fermat's primality test
6423* Types Answer 11:: pi * 10^7 seconds
6424* Types Answer 12:: Abbey Road on CD
6425* Types Answer 13:: Not quite pi * 10^7 seconds
6426* Types Answer 14:: Supercomputers and c
6427* Types Answer 15:: Sam the Slug
6428* Algebra Answer 1:: Squares and square roots
6429* Algebra Answer 2:: Building polynomial from roots
6430* Algebra Answer 3:: Integral of x sin(pi x)
6431* Algebra Answer 4:: Simpson's rule
6432* Rewrites Answer 1:: Multiplying by conjugate
6433* Rewrites Answer 2:: Alternative fib rule
6434* Rewrites Answer 3:: Rewriting opt(a) + opt(b) x
6435* Rewrites Answer 4:: Sequence of integers
6436* Rewrites Answer 5:: Number of terms in sum
6437* Rewrites Answer 6:: Truncated Taylor series
6438* Programming Answer 1:: Fresnel's C(x)
6439* Programming Answer 2:: Negate third stack element
6440* Programming Answer 3:: Compute sin(x) / x, etc.
6441* Programming Answer 4:: Average value of a list
6442* Programming Answer 5:: Continued fraction phi
6443* Programming Answer 6:: Matrix Fibonacci numbers
6444* Programming Answer 7:: Harmonic number greater than 4
6445* Programming Answer 8:: Newton's method
6446* Programming Answer 9:: Digamma function
6447* Programming Answer 10:: Unpacking a polynomial
6448* Programming Answer 11:: Recursive Stirling numbers
6449* Programming Answer 12:: Stirling numbers with rewrites
6450@end menu
6451
6452@c The following kludgery prevents the individual answers from
6453@c being entered on the table of contents.
6454@tex
6455\global\let\oldwrite=\write
6456\gdef\skipwrite#1#2{\let\write=\oldwrite}
6457\global\let\oldchapternofonts=\chapternofonts
6458\gdef\chapternofonts{\let\write=\skipwrite\oldchapternofonts}
6459@end tex
6460
6461@node RPN Answer 1, RPN Answer 2, Answers to Exercises, Answers to Exercises
6462@subsection RPN Tutorial Exercise 1
6463
6464@noindent
6465@kbd{1 @key{RET} 2 @key{RET} 3 @key{RET} 4 + * -}
6466
6467The result is
6468@texline @math{1 - (2 \times (3 + 4)) = -13}.
6469@infoline @expr{1 - (2 * (3 + 4)) = -13}.
6470
6471@node RPN Answer 2, RPN Answer 3, RPN Answer 1, Answers to Exercises
6472@subsection RPN Tutorial Exercise 2
6473
6474@noindent
6475@texline @math{2\times4 + 7\times9.5 + {5\over4} = 75.75}
6476@infoline @expr{2*4 + 7*9.5 + 5/4 = 75.75}
6477
6478After computing the intermediate term
6479@texline @math{2\times4 = 8},
6480@infoline @expr{2*4 = 8},
6481you can leave that result on the stack while you compute the second
6482term. With both of these results waiting on the stack you can then
6483compute the final term, then press @kbd{+ +} to add everything up.
6484
6485@smallexample
6486@group
64872: 2 1: 8 3: 8 2: 8
64881: 4 . 2: 7 1: 66.5
6489 . 1: 9.5 .
6490 .
6491
6492 2 @key{RET} 4 * 7 @key{RET} 9.5 *
6493
6494@end group
6495@end smallexample
6496@noindent
6497@smallexample
6498@group
64994: 8 3: 8 2: 8 1: 75.75
65003: 66.5 2: 66.5 1: 67.75 .
65012: 5 1: 1.25 .
65021: 4 .
6503 .
6504
6505 5 @key{RET} 4 / + +
6506@end group
6507@end smallexample
6508
6509Alternatively, you could add the first two terms before going on
6510with the third term.
6511
6512@smallexample
6513@group
65142: 8 1: 74.5 3: 74.5 2: 74.5 1: 75.75
65151: 66.5 . 2: 5 1: 1.25 .
6516 . 1: 4 .
6517 .
6518
6519 ... + 5 @key{RET} 4 / +
6520@end group
6521@end smallexample
6522
6523On an old-style RPN calculator this second method would have the
6524advantage of using only three stack levels. But since Calc's stack
6525can grow arbitrarily large this isn't really an issue. Which method
6526you choose is purely a matter of taste.
6527
6528@node RPN Answer 3, RPN Answer 4, RPN Answer 2, Answers to Exercises
6529@subsection RPN Tutorial Exercise 3
6530
6531@noindent
6532The @key{TAB} key provides a way to operate on the number in level 2.
6533
6534@smallexample
6535@group
65363: 10 3: 10 4: 10 3: 10 3: 10
65372: 20 2: 30 3: 30 2: 30 2: 21
65381: 30 1: 20 2: 20 1: 21 1: 30
6539 . . 1: 1 . .
6540 .
6541
6542 @key{TAB} 1 + @key{TAB}
6543@end group
6544@end smallexample
6545
6546Similarly, @kbd{M-@key{TAB}} gives you access to the number in level 3.
6547
6548@smallexample
6549@group
65503: 10 3: 21 3: 21 3: 30 3: 11
65512: 21 2: 30 2: 30 2: 11 2: 21
65521: 30 1: 10 1: 11 1: 21 1: 30
6553 . . . . .
6554
6555 M-@key{TAB} 1 + M-@key{TAB} M-@key{TAB}
6556@end group
6557@end smallexample
6558
6559@node RPN Answer 4, Algebraic Answer 1, RPN Answer 3, Answers to Exercises
6560@subsection RPN Tutorial Exercise 4
6561
6562@noindent
6563Either @kbd{( 2 , 3 )} or @kbd{( 2 @key{SPC} 3 )} would have worked,
6564but using both the comma and the space at once yields:
6565
6566@smallexample
6567@group
65681: ( ... 2: ( ... 1: (2, ... 2: (2, ... 2: (2, ...
6569 . 1: 2 . 1: (2, ... 1: (2, 3)
6570 . . .
6571
6572 ( 2 , @key{SPC} 3 )
6573@end group
6574@end smallexample
6575
6576Joe probably tried to type @kbd{@key{TAB} @key{DEL}} to swap the
6577extra incomplete object to the top of the stack and delete it.
6578But a feature of Calc is that @key{DEL} on an incomplete object
6579deletes just one component out of that object, so he had to press
6580@key{DEL} twice to finish the job.
6581
6582@smallexample
6583@group
65842: (2, ... 2: (2, 3) 2: (2, 3) 1: (2, 3)
65851: (2, 3) 1: (2, ... 1: ( ... .
6586 . . .
6587
6588 @key{TAB} @key{DEL} @key{DEL}
6589@end group
6590@end smallexample
6591
6592(As it turns out, deleting the second-to-top stack entry happens often
6593enough that Calc provides a special key, @kbd{M-@key{DEL}}, to do just that.
6594@kbd{M-@key{DEL}} is just like @kbd{@key{TAB} @key{DEL}}, except that it doesn't exhibit
6595the ``feature'' that tripped poor Joe.)
6596
6597@node Algebraic Answer 1, Algebraic Answer 2, RPN Answer 4, Answers to Exercises
6598@subsection Algebraic Entry Tutorial Exercise 1
6599
6600@noindent
6601Type @kbd{' sqrt($) @key{RET}}.
6602
6603If the @kbd{Q} key is broken, you could use @kbd{' $^0.5 @key{RET}}.
6604Or, RPN style, @kbd{0.5 ^}.
6605
6606(Actually, @samp{$^1:2}, using the fraction one-half as the power, is
6607a closer equivalent, since @samp{9^0.5} yields @expr{3.0} whereas
6608@samp{sqrt(9)} and @samp{9^1:2} yield the exact integer @expr{3}.)
6609
6610@node Algebraic Answer 2, Algebraic Answer 3, Algebraic Answer 1, Answers to Exercises
6611@subsection Algebraic Entry Tutorial Exercise 2
6612
6613@noindent
6614In the formula @samp{2 x (1+y)}, @samp{x} was interpreted as a function
6615name with @samp{1+y} as its argument. Assigning a value to a variable
6616has no relation to a function by the same name. Joe needed to use an
6617explicit @samp{*} symbol here: @samp{2 x*(1+y)}.
6618
6619@node Algebraic Answer 3, Modes Answer 1, Algebraic Answer 2, Answers to Exercises
6620@subsection Algebraic Entry Tutorial Exercise 3
6621
6622@noindent
6623The result from @kbd{1 @key{RET} 0 /} will be the formula @expr{1 / 0}.
6624The ``function'' @samp{/} cannot be evaluated when its second argument
6625is zero, so it is left in symbolic form. When you now type @kbd{0 *},
6626the result will be zero because Calc uses the general rule that ``zero
6627times anything is zero.''
6628
6629@c [fix-ref Infinities]
6630The @kbd{m i} command enables an @dfn{Infinite mode} in which @expr{1 / 0}
6631results in a special symbol that represents ``infinity.'' If you
6632multiply infinity by zero, Calc uses another special new symbol to
6633show that the answer is ``indeterminate.'' @xref{Infinities}, for
6634further discussion of infinite and indeterminate values.
6635
6636@node Modes Answer 1, Modes Answer 2, Algebraic Answer 3, Answers to Exercises
6637@subsection Modes Tutorial Exercise 1
6638
6639@noindent
6640Calc always stores its numbers in decimal, so even though one-third has
6641an exact base-3 representation (@samp{3#0.1}), it is still stored as
66420.3333333 (chopped off after 12 or however many decimal digits) inside
6643the calculator's memory. When this inexact number is converted back
6644to base 3 for display, it may still be slightly inexact. When we
6645multiply this number by 3, we get 0.999999, also an inexact value.
6646
6647When Calc displays a number in base 3, it has to decide how many digits
6648to show. If the current precision is 12 (decimal) digits, that corresponds
6649to @samp{12 / log10(3) = 25.15} base-3 digits. Because 25.15 is not an
6650exact integer, Calc shows only 25 digits, with the result that stored
6651numbers carry a little bit of extra information that may not show up on
6652the screen. When Joe entered @samp{3#0.2}, the stored number 0.666666
6653happened to round to a pleasing value when it lost that last 0.15 of a
6654digit, but it was still inexact in Calc's memory. When he divided by 2,
6655he still got the dreaded inexact value 0.333333. (Actually, he divided
66560.666667 by 2 to get 0.333334, which is why he got something a little
6657higher than @code{3#0.1} instead of a little lower.)
6658
6659If Joe didn't want to be bothered with all this, he could have typed
6660@kbd{M-24 d n} to display with one less digit than the default. (If
6661you give @kbd{d n} a negative argument, it uses default-minus-that,
6662so @kbd{M-- d n} would be an easier way to get the same effect.) Those
6663inexact results would still be lurking there, but they would now be
6664rounded to nice, natural-looking values for display purposes. (Remember,
6665@samp{0.022222} in base 3 is like @samp{0.099999} in base 10; rounding
6666off one digit will round the number up to @samp{0.1}.) Depending on the
6667nature of your work, this hiding of the inexactness may be a benefit or
6668a danger. With the @kbd{d n} command, Calc gives you the choice.
6669
6670Incidentally, another consequence of all this is that if you type
6671@kbd{M-30 d n} to display more digits than are ``really there,''
6672you'll see garbage digits at the end of the number. (In decimal
6673display mode, with decimally-stored numbers, these garbage digits are
6674always zero so they vanish and you don't notice them.) Because Calc
6675rounds off that 0.15 digit, there is the danger that two numbers could
6676be slightly different internally but still look the same. If you feel
6677uneasy about this, set the @kbd{d n} precision to be a little higher
6678than normal; you'll get ugly garbage digits, but you'll always be able
6679to tell two distinct numbers apart.
6680
6681An interesting side note is that most computers store their
6682floating-point numbers in binary, and convert to decimal for display.
6683Thus everyday programs have the same problem: Decimal 0.1 cannot be
6684represented exactly in binary (try it: @kbd{0.1 d 2}), so @samp{0.1 * 10}
6685comes out as an inexact approximation to 1 on some machines (though
6686they generally arrange to hide it from you by rounding off one digit as
6687we did above). Because Calc works in decimal instead of binary, you can
6688be sure that numbers that look exact @emph{are} exact as long as you stay
6689in decimal display mode.
6690
6691It's not hard to show that any number that can be represented exactly
6692in binary, octal, or hexadecimal is also exact in decimal, so the kinds
6693of problems we saw in this exercise are likely to be severe only when
6694you use a relatively unusual radix like 3.
6695
6696@node Modes Answer 2, Modes Answer 3, Modes Answer 1, Answers to Exercises
6697@subsection Modes Tutorial Exercise 2
6698
6699If the radix is 15 or higher, we can't use the letter @samp{e} to mark
6700the exponent because @samp{e} is interpreted as a digit. When Calc
6701needs to display scientific notation in a high radix, it writes
6702@samp{16#F.E8F*16.^15}. You can enter a number like this as an
6703algebraic entry. Also, pressing @kbd{e} without any digits before it
6704normally types @kbd{1e}, but in a high radix it types @kbd{16.^} and
6705puts you in algebraic entry: @kbd{16#f.e8f @key{RET} e 15 @key{RET} *} is another
6706way to enter this number.
6707
6708The reason Calc puts a decimal point in the @samp{16.^} is to prevent
6709huge integers from being generated if the exponent is large (consider
6710@samp{16#1.23*16^1000}, where we compute @samp{16^1000} as a giant
6711exact integer and then throw away most of the digits when we multiply
6712it by the floating-point @samp{16#1.23}). While this wouldn't normally
6713matter for display purposes, it could give you a nasty surprise if you
6714copied that number into a file and later moved it back into Calc.
6715
6716@node Modes Answer 3, Modes Answer 4, Modes Answer 2, Answers to Exercises
6717@subsection Modes Tutorial Exercise 3
6718
6719@noindent
6720The answer he got was @expr{0.5000000000006399}.
6721
6722The problem is not that the square operation is inexact, but that the
6723sine of 45 that was already on the stack was accurate to only 12 places.
6724Arbitrary-precision calculations still only give answers as good as
6725their inputs.
6726
6727The real problem is that there is no 12-digit number which, when
6728squared, comes out to 0.5 exactly. The @kbd{f [} and @kbd{f ]}
6729commands decrease or increase a number by one unit in the last
6730place (according to the current precision). They are useful for
6731determining facts like this.
6732
6733@smallexample
6734@group
67351: 0.707106781187 1: 0.500000000001
6736 . .
6737
6738 45 S 2 ^
6739
6740@end group
6741@end smallexample
6742@noindent
6743@smallexample
6744@group
67451: 0.707106781187 1: 0.707106781186 1: 0.499999999999
6746 . . .
6747
6748 U @key{DEL} f [ 2 ^
6749@end group
6750@end smallexample
6751
6752A high-precision calculation must be carried out in high precision
6753all the way. The only number in the original problem which was known
6754exactly was the quantity 45 degrees, so the precision must be raised
6755before anything is done after the number 45 has been entered in order
6756for the higher precision to be meaningful.
6757
6758@node Modes Answer 4, Arithmetic Answer 1, Modes Answer 3, Answers to Exercises
6759@subsection Modes Tutorial Exercise 4
6760
6761@noindent
6762Many calculations involve real-world quantities, like the width and
6763height of a piece of wood or the volume of a jar. Such quantities
6764can't be measured exactly anyway, and if the data that is input to
6765a calculation is inexact, doing exact arithmetic on it is a waste
6766of time.
6767
6768Fractions become unwieldy after too many calculations have been
6769done with them. For example, the sum of the reciprocals of the
6770integers from 1 to 10 is 7381:2520. The sum from 1 to 30 is
67719304682830147:2329089562800. After a point it will take a long
6772time to add even one more term to this sum, but a floating-point
6773calculation of the sum will not have this problem.
6774
6775Also, rational numbers cannot express the results of all calculations.
6776There is no fractional form for the square root of two, so if you type
6777@w{@kbd{2 Q}}, Calc has no choice but to give you a floating-point answer.
6778
6779@node Arithmetic Answer 1, Arithmetic Answer 2, Modes Answer 4, Answers to Exercises
6780@subsection Arithmetic Tutorial Exercise 1
6781
6782@noindent
6783Dividing two integers that are larger than the current precision may
6784give a floating-point result that is inaccurate even when rounded
6785down to an integer. Consider @expr{123456789 / 2} when the current
6786precision is 6 digits. The true answer is @expr{61728394.5}, but
6787with a precision of 6 this will be rounded to
6788@texline @math{12345700.0/2.0 = 61728500.0}.
6789@infoline @expr{12345700.@: / 2.@: = 61728500.}.
6790The result, when converted to an integer, will be off by 106.
6791
6792Here are two solutions: Raise the precision enough that the
6793floating-point round-off error is strictly to the right of the
6794decimal point. Or, convert to Fraction mode so that @expr{123456789 / 2}
6795produces the exact fraction @expr{123456789:2}, which can be rounded
6796down by the @kbd{F} command without ever switching to floating-point
6797format.
6798
6799@node Arithmetic Answer 2, Vector Answer 1, Arithmetic Answer 1, Answers to Exercises
6800@subsection Arithmetic Tutorial Exercise 2
6801
6802@noindent
6803@kbd{27 @key{RET} 9 B} could give the exact result @expr{3:2}, but it
6804does a floating-point calculation instead and produces @expr{1.5}.
6805
6806Calc will find an exact result for a logarithm if the result is an integer
6807or (when in Fraction mode) the reciprocal of an integer. But there is
6808no efficient way to search the space of all possible rational numbers
6809for an exact answer, so Calc doesn't try.
6810
6811@node Vector Answer 1, Vector Answer 2, Arithmetic Answer 2, Answers to Exercises
6812@subsection Vector Tutorial Exercise 1
6813
6814@noindent
6815Duplicate the vector, compute its length, then divide the vector
6816by its length: @kbd{@key{RET} A /}.
6817
6818@smallexample
6819@group
68201: [1, 2, 3] 2: [1, 2, 3] 1: [0.27, 0.53, 0.80] 1: 1.
6821 . 1: 3.74165738677 . .
6822 .
6823
6824 r 1 @key{RET} A / A
6825@end group
6826@end smallexample
6827
6828The final @kbd{A} command shows that the normalized vector does
6829indeed have unit length.
6830
6831@node Vector Answer 2, Matrix Answer 1, Vector Answer 1, Answers to Exercises
6832@subsection Vector Tutorial Exercise 2
6833
6834@noindent
6835The average position is equal to the sum of the products of the
6836positions times their corresponding probabilities. This is the
6837definition of the dot product operation. So all you need to do
6838is to put the two vectors on the stack and press @kbd{*}.
6839
6840@node Matrix Answer 1, Matrix Answer 2, Vector Answer 2, Answers to Exercises
6841@subsection Matrix Tutorial Exercise 1
6842
6843@noindent
6844The trick is to multiply by a vector of ones. Use @kbd{r 4 [1 1 1] *} to
6845get the row sum. Similarly, use @kbd{[1 1] r 4 *} to get the column sum.
6846
6847@node Matrix Answer 2, Matrix Answer 3, Matrix Answer 1, Answers to Exercises
6848@subsection Matrix Tutorial Exercise 2
6849
6850@ifnottex
6851@example
6852@group
6853 x + a y = 6
6854 x + b y = 10
6855@end group
6856@end example
6857@end ifnottex
6858@tex
6859\turnoffactive
6860\beforedisplay
6861$$ \eqalign{ x &+ a y = 6 \cr
6862 x &+ b y = 10}
6863$$
6864\afterdisplay
6865@end tex
6866
6867Just enter the righthand side vector, then divide by the lefthand side
6868matrix as usual.
6869
6870@smallexample
6871@group
68721: [6, 10] 2: [6, 10] 1: [6 - 4 a / (b - a), 4 / (b - a) ]
6873 . 1: [ [ 1, a ] .
6874 [ 1, b ] ]
6875 .
6876
6877' [6 10] @key{RET} ' [1 a; 1 b] @key{RET} /
6878@end group
6879@end smallexample
6880
6881This can be made more readable using @kbd{d B} to enable Big display
6882mode:
6883
6884@smallexample
6885@group
6886 4 a 4
68871: [6 - -----, -----]
6888 b - a b - a
6889@end group
6890@end smallexample
6891
6892Type @kbd{d N} to return to Normal display mode afterwards.
6893
6894@node Matrix Answer 3, List Answer 1, Matrix Answer 2, Answers to Exercises
6895@subsection Matrix Tutorial Exercise 3
6896
6897@noindent
6898To solve
6899@texline @math{A^T A \, X = A^T B},
6900@infoline @expr{trn(A) * A * X = trn(A) * B},
6901first we compute
6902@texline @math{A' = A^T A}
6903@infoline @expr{A2 = trn(A) * A}
6904and
6905@texline @math{B' = A^T B};
6906@infoline @expr{B2 = trn(A) * B};
6907now, we have a system
6908@texline @math{A' X = B'}
6909@infoline @expr{A2 * X = B2}
6910which we can solve using Calc's @samp{/} command.
6911
6912@ifnottex
6913@example
6914@group
6915 a + 2b + 3c = 6
6916 4a + 5b + 6c = 2
6917 7a + 6b = 3
6918 2a + 4b + 6c = 11
6919@end group
6920@end example
6921@end ifnottex
6922@tex
6923\turnoffactive
6924\beforedisplayh
6925$$ \openup1\jot \tabskip=0pt plus1fil
6926\halign to\displaywidth{\tabskip=0pt
6927 $\hfil#$&$\hfil{}#{}$&
6928 $\hfil#$&$\hfil{}#{}$&
6929 $\hfil#$&${}#\hfil$\tabskip=0pt plus1fil\cr
6930 a&+&2b&+&3c&=6 \cr
6931 4a&+&5b&+&6c&=2 \cr
6932 7a&+&6b& & &=3 \cr
6933 2a&+&4b&+&6c&=11 \cr}
6934$$
6935\afterdisplayh
6936@end tex
6937
6938The first step is to enter the coefficient matrix. We'll store it in
6939quick variable number 7 for later reference. Next, we compute the
6940@texline @math{B'}
6941@infoline @expr{B2}
6942vector.
6943
6944@smallexample
6945@group
69461: [ [ 1, 2, 3 ] 2: [ [ 1, 4, 7, 2 ] 1: [57, 84, 96]
6947 [ 4, 5, 6 ] [ 2, 5, 6, 4 ] .
6948 [ 7, 6, 0 ] [ 3, 6, 0, 6 ] ]
6949 [ 2, 4, 6 ] ] 1: [6, 2, 3, 11]
6950 . .
6951
6952' [1 2 3; 4 5 6; 7 6 0; 2 4 6] @key{RET} s 7 v t [6 2 3 11] *
6953@end group
6954@end smallexample
6955
6956@noindent
6957Now we compute the matrix
6958@texline @math{A'}
6959@infoline @expr{A2}
6960and divide.
6961
6962@smallexample
6963@group
69642: [57, 84, 96] 1: [-11.64, 14.08, -3.64]
69651: [ [ 70, 72, 39 ] .
6966 [ 72, 81, 60 ]
6967 [ 39, 60, 81 ] ]
6968 .
6969
6970 r 7 v t r 7 * /
6971@end group
6972@end smallexample
6973
6974@noindent
6975(The actual computed answer will be slightly inexact due to
6976round-off error.)
6977
6978Notice that the answers are similar to those for the
6979@texline @math{3\times3}
6980@infoline 3x3
6981system solved in the text. That's because the fourth equation that was
6982added to the system is almost identical to the first one multiplied
6983by two. (If it were identical, we would have gotten the exact same
6984answer since the
6985@texline @math{4\times3}
6986@infoline 4x3
6987system would be equivalent to the original
6988@texline @math{3\times3}
6989@infoline 3x3
6990system.)
6991
6992Since the first and fourth equations aren't quite equivalent, they
6993can't both be satisfied at once. Let's plug our answers back into
6994the original system of equations to see how well they match.
6995
6996@smallexample
6997@group
69982: [-11.64, 14.08, -3.64] 1: [5.6, 2., 3., 11.2]
69991: [ [ 1, 2, 3 ] .
7000 [ 4, 5, 6 ]
7001 [ 7, 6, 0 ]
7002 [ 2, 4, 6 ] ]
7003 .
7004
7005 r 7 @key{TAB} *
7006@end group
7007@end smallexample
7008
7009@noindent
7010This is reasonably close to our original @expr{B} vector,
7011@expr{[6, 2, 3, 11]}.
7012
7013@node List Answer 1, List Answer 2, Matrix Answer 3, Answers to Exercises
7014@subsection List Tutorial Exercise 1
7015
7016@noindent
7017We can use @kbd{v x} to build a vector of integers. This needs to be
7018adjusted to get the range of integers we desire. Mapping @samp{-}
7019across the vector will accomplish this, although it turns out the
7020plain @samp{-} key will work just as well.
7021
7022@smallexample
7023@group
70242: 2 2: 2
70251: [1, 2, 3, 4, 5, 6, 7, 8, 9] 1: [-4, -3, -2, -1, 0, 1, 2, 3, 4]
7026 . .
7027
7028 2 v x 9 @key{RET} 5 V M - or 5 -
7029@end group
7030@end smallexample
7031
7032@noindent
7033Now we use @kbd{V M ^} to map the exponentiation operator across the
7034vector.
7035
7036@smallexample
7037@group
70381: [0.0625, 0.125, 0.25, 0.5, 1, 2, 4, 8, 16]
7039 .
7040
7041 V M ^
7042@end group
7043@end smallexample
7044
7045@node List Answer 2, List Answer 3, List Answer 1, Answers to Exercises
7046@subsection List Tutorial Exercise 2
7047
7048@noindent
7049Given @expr{x} and @expr{y} vectors in quick variables 1 and 2 as before,
7050the first job is to form the matrix that describes the problem.
7051
7052@ifnottex
7053@example
7054 m*x + b*1 = y
7055@end example
7056@end ifnottex
7057@tex
7058\turnoffactive
7059\beforedisplay
7060$$ m \times x + b \times 1 = y $$
7061\afterdisplay
7062@end tex
7063
7064Thus we want a
7065@texline @math{19\times2}
7066@infoline 19x2
7067matrix with our @expr{x} vector as one column and
7068ones as the other column. So, first we build the column of ones, then
7069we combine the two columns to form our @expr{A} matrix.
7070
7071@smallexample
7072@group
70732: [1.34, 1.41, 1.49, ... ] 1: [ [ 1.34, 1 ]
70741: [1, 1, 1, ...] [ 1.41, 1 ]
7075 . [ 1.49, 1 ]
7076 @dots{}
7077
7078 r 1 1 v b 19 @key{RET} M-2 v p v t s 3
7079@end group
7080@end smallexample
7081
7082@noindent
7083Now we compute
7084@texline @math{A^T y}
7085@infoline @expr{trn(A) * y}
7086and
7087@texline @math{A^T A}
7088@infoline @expr{trn(A) * A}
7089and divide.
7090
7091@smallexample
7092@group
70931: [33.36554, 13.613] 2: [33.36554, 13.613]
7094 . 1: [ [ 98.0003, 41.63 ]
7095 [ 41.63, 19 ] ]
7096 .
7097
7098 v t r 2 * r 3 v t r 3 *
7099@end group
7100@end smallexample
7101
7102@noindent
7103(Hey, those numbers look familiar!)
7104
7105@smallexample
7106@group
71071: [0.52141679, -0.425978]
7108 .
7109
7110 /
7111@end group
7112@end smallexample
7113
7114Since we were solving equations of the form
7115@texline @math{m \times x + b \times 1 = y},
7116@infoline @expr{m*x + b*1 = y},
7117these numbers should be @expr{m} and @expr{b}, respectively. Sure
7118enough, they agree exactly with the result computed using @kbd{V M} and
7119@kbd{V R}!
7120
7121The moral of this story: @kbd{V M} and @kbd{V R} will probably solve
7122your problem, but there is often an easier way using the higher-level
7123arithmetic functions!
7124
7125@c [fix-ref Curve Fitting]
7126In fact, there is a built-in @kbd{a F} command that does least-squares
7127fits. @xref{Curve Fitting}.
7128
7129@node List Answer 3, List Answer 4, List Answer 2, Answers to Exercises
7130@subsection List Tutorial Exercise 3
7131
7132@noindent
7133Move to one end of the list and press @kbd{C-@@} (or @kbd{C-@key{SPC}} or
7134whatever) to set the mark, then move to the other end of the list
7135and type @w{@kbd{C-x * g}}.
7136
7137@smallexample
7138@group
71391: [2.3, 6, 22, 15.1, 7, 15, 14, 7.5, 2.5]
7140 .
7141@end group
7142@end smallexample
7143
7144To make things interesting, let's assume we don't know at a glance
7145how many numbers are in this list. Then we could type:
7146
7147@smallexample
7148@group
71492: [2.3, 6, 22, ... ] 2: [2.3, 6, 22, ... ]
71501: [2.3, 6, 22, ... ] 1: 126356422.5
7151 . .
7152
7153 @key{RET} V R *
7154
7155@end group
7156@end smallexample
7157@noindent
7158@smallexample
7159@group
71602: 126356422.5 2: 126356422.5 1: 7.94652913734
71611: [2.3, 6, 22, ... ] 1: 9 .
7162 . .
7163
7164 @key{TAB} v l I ^
7165@end group
7166@end smallexample
7167
7168@noindent
7169(The @kbd{I ^} command computes the @var{n}th root of a number.
7170You could also type @kbd{& ^} to take the reciprocal of 9 and
7171then raise the number to that power.)
7172
7173@node List Answer 4, List Answer 5, List Answer 3, Answers to Exercises
7174@subsection List Tutorial Exercise 4
7175
7176@noindent
7177A number @expr{j} is a divisor of @expr{n} if
7178@texline @math{n \mathbin{\hbox{\code{\%}}} j = 0}.
7179@infoline @samp{n % j = 0}.
7180The first step is to get a vector that identifies the divisors.
7181
7182@smallexample
7183@group
71842: 30 2: [0, 0, 0, 2, ...] 1: [1, 1, 1, 0, ...]
71851: [1, 2, 3, 4, ...] 1: 0 .
7186 . .
7187
7188 30 @key{RET} v x 30 @key{RET} s 1 V M % 0 V M a = s 2
7189@end group
7190@end smallexample
7191
7192@noindent
7193This vector has 1's marking divisors of 30 and 0's marking non-divisors.
7194
7195The zeroth divisor function is just the total number of divisors.
7196The first divisor function is the sum of the divisors.
7197
7198@smallexample
7199@group
72001: 8 3: 8 2: 8 2: 8
7201 2: [1, 2, 3, 4, ...] 1: [1, 2, 3, 0, ...] 1: 72
7202 1: [1, 1, 1, 0, ...] . .
7203 .
7204
7205 V R + r 1 r 2 V M * V R +
7206@end group
7207@end smallexample
7208
7209@noindent
7210Once again, the last two steps just compute a dot product for which
7211a simple @kbd{*} would have worked equally well.
7212
7213@node List Answer 5, List Answer 6, List Answer 4, Answers to Exercises
7214@subsection List Tutorial Exercise 5
7215
7216@noindent
7217The obvious first step is to obtain the list of factors with @kbd{k f}.
7218This list will always be in sorted order, so if there are duplicates
7219they will be right next to each other. A suitable method is to compare
7220the list with a copy of itself shifted over by one.
7221
7222@smallexample
7223@group
72241: [3, 7, 7, 7, 19] 2: [3, 7, 7, 7, 19] 2: [3, 7, 7, 7, 19, 0]
7225 . 1: [3, 7, 7, 7, 19, 0] 1: [0, 3, 7, 7, 7, 19]
7226 . .
7227
7228 19551 k f @key{RET} 0 | @key{TAB} 0 @key{TAB} |
7229
7230@end group
7231@end smallexample
7232@noindent
7233@smallexample
7234@group
72351: [0, 0, 1, 1, 0, 0] 1: 2 1: 0
7236 . . .
7237
7238 V M a = V R + 0 a =
7239@end group
7240@end smallexample
7241
7242@noindent
7243Note that we have to arrange for both vectors to have the same length
7244so that the mapping operation works; no prime factor will ever be
7245zero, so adding zeros on the left and right is safe. From then on
7246the job is pretty straightforward.
7247
7248Incidentally, Calc provides the
7249@texline @dfn{M@"obius} @math{\mu}
7250@infoline @dfn{Moebius mu}
7251function which is zero if and only if its argument is square-free. It
7252would be a much more convenient way to do the above test in practice.
7253
7254@node List Answer 6, List Answer 7, List Answer 5, Answers to Exercises
7255@subsection List Tutorial Exercise 6
7256
7257@noindent
7258First use @kbd{v x 6 @key{RET}} to get a list of integers, then @kbd{V M v x}
7259to get a list of lists of integers!
7260
7261@node List Answer 7, List Answer 8, List Answer 6, Answers to Exercises
7262@subsection List Tutorial Exercise 7
7263
7264@noindent
7265Here's one solution. First, compute the triangular list from the previous
7266exercise and type @kbd{1 -} to subtract one from all the elements.
7267
7268@smallexample
7269@group
72701: [ [0],
7271 [0, 1],
7272 [0, 1, 2],
7273 @dots{}
7274
7275 1 -
7276@end group
7277@end smallexample
7278
7279The numbers down the lefthand edge of the list we desire are called
7280the ``triangular numbers'' (now you know why!). The @expr{n}th
7281triangular number is the sum of the integers from 1 to @expr{n}, and
7282can be computed directly by the formula
7283@texline @math{n (n+1) \over 2}.
7284@infoline @expr{n * (n+1) / 2}.
7285
7286@smallexample
7287@group
72882: [ [0], [0, 1], ... ] 2: [ [0], [0, 1], ... ]
72891: [0, 1, 2, 3, 4, 5] 1: [0, 1, 3, 6, 10, 15]
7290 . .
7291
7292 v x 6 @key{RET} 1 - V M ' $ ($+1)/2 @key{RET}
7293@end group
7294@end smallexample
7295
7296@noindent
7297Adding this list to the above list of lists produces the desired
7298result:
7299
7300@smallexample
7301@group
73021: [ [0],
7303 [1, 2],
7304 [3, 4, 5],
7305 [6, 7, 8, 9],
7306 [10, 11, 12, 13, 14],
7307 [15, 16, 17, 18, 19, 20] ]
7308 .
7309
7310 V M +
7311@end group
7312@end smallexample
7313
7314If we did not know the formula for triangular numbers, we could have
7315computed them using a @kbd{V U +} command. We could also have
7316gotten them the hard way by mapping a reduction across the original
7317triangular list.
7318
7319@smallexample
7320@group
73212: [ [0], [0, 1], ... ] 2: [ [0], [0, 1], ... ]
73221: [ [0], [0, 1], ... ] 1: [0, 1, 3, 6, 10, 15]
7323 . .
7324
7325 @key{RET} V M V R +
7326@end group
7327@end smallexample
7328
7329@noindent
7330(This means ``map a @kbd{V R +} command across the vector,'' and
7331since each element of the main vector is itself a small vector,
7332@kbd{V R +} computes the sum of its elements.)
7333
7334@node List Answer 8, List Answer 9, List Answer 7, Answers to Exercises
7335@subsection List Tutorial Exercise 8
7336
7337@noindent
7338The first step is to build a list of values of @expr{x}.
7339
7340@smallexample
7341@group
73421: [1, 2, 3, ..., 21] 1: [0, 1, 2, ..., 20] 1: [0, 0.25, 0.5, ..., 5]
7343 . . .
7344
7345 v x 21 @key{RET} 1 - 4 / s 1
7346@end group
7347@end smallexample
7348
7349Next, we compute the Bessel function values.
7350
7351@smallexample
7352@group
73531: [0., 0.124, 0.242, ..., -0.328]
7354 .
7355
7356 V M ' besJ(1,$) @key{RET}
7357@end group
7358@end smallexample
7359
7360@noindent
7361(Another way to do this would be @kbd{1 @key{TAB} V M f j}.)
7362
7363A way to isolate the maximum value is to compute the maximum using
7364@kbd{V R X}, then compare all the Bessel values with that maximum.
7365
7366@smallexample
7367@group
73682: [0., 0.124, 0.242, ... ] 1: [0, 0, 0, ... ] 2: [0, 0, 0, ... ]
73691: 0.5801562 . 1: 1
7370 . .
7371
7372 @key{RET} V R X V M a = @key{RET} V R + @key{DEL}
7373@end group
7374@end smallexample
7375
7376@noindent
7377It's a good idea to verify, as in the last step above, that only
7378one value is equal to the maximum. (After all, a plot of
7379@texline @math{\sin x}
7380@infoline @expr{sin(x)}
7381might have many points all equal to the maximum value, 1.)
7382
7383The vector we have now has a single 1 in the position that indicates
7384the maximum value of @expr{x}. Now it is a simple matter to convert
7385this back into the corresponding value itself.
7386
7387@smallexample
7388@group
73892: [0, 0, 0, ... ] 1: [0, 0., 0., ... ] 1: 1.75
73901: [0, 0.25, 0.5, ... ] . .
7391 .
7392
7393 r 1 V M * V R +
7394@end group
7395@end smallexample
7396
7397If @kbd{a =} had produced more than one @expr{1} value, this method
7398would have given the sum of all maximum @expr{x} values; not very
7399useful! In this case we could have used @kbd{v m} (@code{calc-mask-vector})
7400instead. This command deletes all elements of a ``data'' vector that
7401correspond to zeros in a ``mask'' vector, leaving us with, in this
7402example, a vector of maximum @expr{x} values.
7403
7404The built-in @kbd{a X} command maximizes a function using more
7405efficient methods. Just for illustration, let's use @kbd{a X}
7406to maximize @samp{besJ(1,x)} over this same interval.
7407
7408@smallexample
7409@group
74102: besJ(1, x) 1: [1.84115, 0.581865]
74111: [0 .. 5] .
7412 .
7413
7414' besJ(1,x), [0..5] @key{RET} a X x @key{RET}
7415@end group
7416@end smallexample
7417
7418@noindent
7419The output from @kbd{a X} is a vector containing the value of @expr{x}
7420that maximizes the function, and the function's value at that maximum.
7421As you can see, our simple search got quite close to the right answer.
7422
7423@node List Answer 9, List Answer 10, List Answer 8, Answers to Exercises
7424@subsection List Tutorial Exercise 9
7425
7426@noindent
7427Step one is to convert our integer into vector notation.
7428
7429@smallexample
7430@group
74311: 25129925999 3: 25129925999
7432 . 2: 10
7433 1: [11, 10, 9, ..., 1, 0]
7434 .
7435
7436 25129925999 @key{RET} 10 @key{RET} 12 @key{RET} v x 12 @key{RET} -
7437
7438@end group
7439@end smallexample
7440@noindent
7441@smallexample
7442@group
74431: 25129925999 1: [0, 2, 25, 251, 2512, ... ]
74442: [100000000000, ... ] .
7445 .
7446
7447 V M ^ s 1 V M \
7448@end group
7449@end smallexample
7450
7451@noindent
7452(Recall, the @kbd{\} command computes an integer quotient.)
7453
7454@smallexample
7455@group
74561: [0, 2, 5, 1, 2, 9, 9, 2, 5, 9, 9, 9]
7457 .
7458
7459 10 V M % s 2
7460@end group
7461@end smallexample
7462
7463Next we must increment this number. This involves adding one to
7464the last digit, plus handling carries. There is a carry to the
7465left out of a digit if that digit is a nine and all the digits to
7466the right of it are nines.
7467
7468@smallexample
7469@group
74701: [0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1] 1: [1, 1, 1, 0, 0, 1, ... ]
7471 . .
7472
7473 9 V M a = v v
7474
7475@end group
7476@end smallexample
7477@noindent
7478@smallexample
7479@group
74801: [1, 1, 1, 0, 0, 0, ... ] 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
7481 . .
7482
7483 V U * v v 1 |
7484@end group
7485@end smallexample
7486
7487@noindent
7488Accumulating @kbd{*} across a vector of ones and zeros will preserve
7489only the initial run of ones. These are the carries into all digits
7490except the rightmost digit. Concatenating a one on the right takes
7491care of aligning the carries properly, and also adding one to the
7492rightmost digit.
7493
7494@smallexample
7495@group
74962: [0, 0, 0, 0, ... ] 1: [0, 0, 2, 5, 1, 2, 9, 9, 2, 6, 0, 0, 0]
74971: [0, 0, 2, 5, ... ] .
7498 .
7499
7500 0 r 2 | V M + 10 V M %
7501@end group
7502@end smallexample
7503
7504@noindent
7505Here we have concatenated 0 to the @emph{left} of the original number;
7506this takes care of shifting the carries by one with respect to the
7507digits that generated them.
7508
7509Finally, we must convert this list back into an integer.
7510
7511@smallexample
7512@group
75133: [0, 0, 2, 5, ... ] 2: [0, 0, 2, 5, ... ]
75142: 1000000000000 1: [1000000000000, 100000000000, ... ]
75151: [100000000000, ... ] .
7516 .
7517
7518 10 @key{RET} 12 ^ r 1 |
7519
7520@end group
7521@end smallexample
7522@noindent
7523@smallexample
7524@group
75251: [0, 0, 20000000000, 5000000000, ... ] 1: 25129926000
7526 . .
7527
7528 V M * V R +
7529@end group
7530@end smallexample
7531
7532@noindent
7533Another way to do this final step would be to reduce the formula
7534@w{@samp{10 $$ + $}} across the vector of digits.
7535
7536@smallexample
7537@group
75381: [0, 0, 2, 5, ... ] 1: 25129926000
7539 . .
7540
7541 V R ' 10 $$ + $ @key{RET}
7542@end group
7543@end smallexample
7544
7545@node List Answer 10, List Answer 11, List Answer 9, Answers to Exercises
7546@subsection List Tutorial Exercise 10
7547
7548@noindent
7549For the list @expr{[a, b, c, d]}, the result is @expr{((a = b) = c) = d},
7550which will compare @expr{a} and @expr{b} to produce a 1 or 0, which is
7551then compared with @expr{c} to produce another 1 or 0, which is then
7552compared with @expr{d}. This is not at all what Joe wanted.
7553
7554Here's a more correct method:
7555
7556@smallexample
7557@group
75581: [7, 7, 7, 8, 7] 2: [7, 7, 7, 8, 7]
7559 . 1: 7
7560 .
7561
7562 ' [7,7,7,8,7] @key{RET} @key{RET} v r 1 @key{RET}
7563
7564@end group
7565@end smallexample
7566@noindent
7567@smallexample
7568@group
75691: [1, 1, 1, 0, 1] 1: 0
7570 . .
7571
7572 V M a = V R *
7573@end group
7574@end smallexample
7575
7576@node List Answer 11, List Answer 12, List Answer 10, Answers to Exercises
7577@subsection List Tutorial Exercise 11
7578
7579@noindent
7580The circle of unit radius consists of those points @expr{(x,y)} for which
7581@expr{x^2 + y^2 < 1}. We start by generating a vector of @expr{x^2}
7582and a vector of @expr{y^2}.
7583
7584We can make this go a bit faster by using the @kbd{v .} and @kbd{t .}
7585commands.
7586
7587@smallexample
7588@group
75892: [2., 2., ..., 2.] 2: [2., 2., ..., 2.]
75901: [2., 2., ..., 2.] 1: [1.16, 1.98, ..., 0.81]
7591 . .
7592
7593 v . t . 2. v b 100 @key{RET} @key{RET} V M k r
7594
7595@end group
7596@end smallexample
7597@noindent
7598@smallexample
7599@group
76002: [2., 2., ..., 2.] 1: [0.026, 0.96, ..., 0.036]
76011: [0.026, 0.96, ..., 0.036] 2: [0.53, 0.81, ..., 0.094]
7602 . .
7603
7604 1 - 2 V M ^ @key{TAB} V M k r 1 - 2 V M ^
7605@end group
7606@end smallexample
7607
7608Now we sum the @expr{x^2} and @expr{y^2} values, compare with 1 to
7609get a vector of 1/0 truth values, then sum the truth values.
7610
7611@smallexample
7612@group
76131: [0.56, 1.78, ..., 0.13] 1: [1, 0, ..., 1] 1: 84
7614 . . .
7615
7616 + 1 V M a < V R +
7617@end group
7618@end smallexample
7619
7620@noindent
7621The ratio @expr{84/100} should approximate the ratio @cpiover{4}.
7622
7623@smallexample
7624@group
76251: 0.84 1: 3.36 2: 3.36 1: 1.0695
7626 . . 1: 3.14159 .
7627
7628 100 / 4 * P /
7629@end group
7630@end smallexample
7631
7632@noindent
7633Our estimate, 3.36, is off by about 7%. We could get a better estimate
7634by taking more points (say, 1000), but it's clear that this method is
7635not very efficient!
7636
7637(Naturally, since this example uses random numbers your own answer
7638will be slightly different from the one shown here!)
7639
7640If you typed @kbd{v .} and @kbd{t .} before, type them again to
7641return to full-sized display of vectors.
7642
7643@node List Answer 12, List Answer 13, List Answer 11, Answers to Exercises
7644@subsection List Tutorial Exercise 12
7645
7646@noindent
7647This problem can be made a lot easier by taking advantage of some
7648symmetries. First of all, after some thought it's clear that the
7649@expr{y} axis can be ignored altogether. Just pick a random @expr{x}
7650component for one end of the match, pick a random direction
7651@texline @math{\theta},
7652@infoline @expr{theta},
7653and see if @expr{x} and
7654@texline @math{x + \cos \theta}
7655@infoline @expr{x + cos(theta)}
7656(which is the @expr{x} coordinate of the other endpoint) cross a line.
7657The lines are at integer coordinates, so this happens when the two
7658numbers surround an integer.
7659
7660Since the two endpoints are equivalent, we may as well choose the leftmost
7661of the two endpoints as @expr{x}. Then @expr{theta} is an angle pointing
7662to the right, in the range -90 to 90 degrees. (We could use radians, but
7663it would feel like cheating to refer to @cpiover{2} radians while trying
7664to estimate @cpi{}!)
7665
7666In fact, since the field of lines is infinite we can choose the
7667coordinates 0 and 1 for the lines on either side of the leftmost
7668endpoint. The rightmost endpoint will be between 0 and 1 if the
7669match does not cross a line, or between 1 and 2 if it does. So:
7670Pick random @expr{x} and
7671@texline @math{\theta},
7672@infoline @expr{theta},
7673compute
7674@texline @math{x + \cos \theta},
7675@infoline @expr{x + cos(theta)},
7676and count how many of the results are greater than one. Simple!
7677
7678We can make this go a bit faster by using the @kbd{v .} and @kbd{t .}
7679commands.
7680
7681@smallexample
7682@group
76831: [0.52, 0.71, ..., 0.72] 2: [0.52, 0.71, ..., 0.72]
7684 . 1: [78.4, 64.5, ..., -42.9]
7685 .
7686
7687v . t . 1. v b 100 @key{RET} V M k r 180. v b 100 @key{RET} V M k r 90 -
7688@end group
7689@end smallexample
7690
7691@noindent
7692(The next step may be slow, depending on the speed of your computer.)
7693
7694@smallexample
7695@group
76962: [0.52, 0.71, ..., 0.72] 1: [0.72, 1.14, ..., 1.45]
76971: [0.20, 0.43, ..., 0.73] .
7698 .
7699
7700 m d V M C +
7701
7702@end group
7703@end smallexample
7704@noindent
7705@smallexample
7706@group
77071: [0, 1, ..., 1] 1: 0.64 1: 3.125
7708 . . .
7709
7710 1 V M a > V R + 100 / 2 @key{TAB} /
7711@end group
7712@end smallexample
7713
7714Let's try the third method, too. We'll use random integers up to
7715one million. The @kbd{k r} command with an integer argument picks
7716a random integer.
7717
7718@smallexample
7719@group
77202: [1000000, 1000000, ..., 1000000] 2: [78489, 527587, ..., 814975]
77211: [1000000, 1000000, ..., 1000000] 1: [324014, 358783, ..., 955450]
7722 . .
7723
7724 1000000 v b 100 @key{RET} @key{RET} V M k r @key{TAB} V M k r
7725
7726@end group
7727@end smallexample
7728@noindent
7729@smallexample
7730@group
77311: [1, 1, ..., 25] 1: [1, 1, ..., 0] 1: 0.56
7732 . . .
7733
7734 V M k g 1 V M a = V R + 100 /
7735
7736@end group
7737@end smallexample
7738@noindent
7739@smallexample
7740@group
77411: 10.714 1: 3.273
7742 . .
7743
7744 6 @key{TAB} / Q
7745@end group
7746@end smallexample
7747
7748For a proof of this property of the GCD function, see section 4.5.2,
7749exercise 10, of Knuth's @emph{Art of Computer Programming}, volume II.
7750
7751If you typed @kbd{v .} and @kbd{t .} before, type them again to
7752return to full-sized display of vectors.
7753
7754@node List Answer 13, List Answer 14, List Answer 12, Answers to Exercises
7755@subsection List Tutorial Exercise 13
7756
7757@noindent
7758First, we put the string on the stack as a vector of ASCII codes.
7759
7760@smallexample
7761@group
77621: [84, 101, 115, ..., 51]
7763 .
7764
7765 "Testing, 1, 2, 3 @key{RET}
7766@end group
7767@end smallexample
7768
7769@noindent
7770Note that the @kbd{"} key, like @kbd{$}, initiates algebraic entry so
7771there was no need to type an apostrophe. Also, Calc didn't mind that
7772we omitted the closing @kbd{"}. (The same goes for all closing delimiters
7773like @kbd{)} and @kbd{]} at the end of a formula.
7774
7775We'll show two different approaches here. In the first, we note that
7776if the input vector is @expr{[a, b, c, d]}, then the hash code is
7777@expr{3 (3 (3a + b) + c) + d = 27a + 9b + 3c + d}. In other words,
7778it's a sum of descending powers of three times the ASCII codes.
7779
7780@smallexample
7781@group
77822: [84, 101, 115, ..., 51] 2: [84, 101, 115, ..., 51]
77831: 16 1: [15, 14, 13, ..., 0]
7784 . .
7785
7786 @key{RET} v l v x 16 @key{RET} -
7787
7788@end group
7789@end smallexample
7790@noindent
7791@smallexample
7792@group
77932: [84, 101, 115, ..., 51] 1: 1960915098 1: 121
77941: [14348907, ..., 1] . .
7795 .
7796
7797 3 @key{TAB} V M ^ * 511 %
7798@end group
7799@end smallexample
7800
7801@noindent
7802Once again, @kbd{*} elegantly summarizes most of the computation.
7803But there's an even more elegant approach: Reduce the formula
7804@kbd{3 $$ + $} across the vector. Recall that this represents a
7805function of two arguments that computes its first argument times three
7806plus its second argument.
7807
7808@smallexample
7809@group
78101: [84, 101, 115, ..., 51] 1: 1960915098
7811 . .
7812
7813 "Testing, 1, 2, 3 @key{RET} V R ' 3$$+$ @key{RET}
7814@end group
7815@end smallexample
7816
7817@noindent
7818If you did the decimal arithmetic exercise, this will be familiar.
7819Basically, we're turning a base-3 vector of digits into an integer,
7820except that our ``digits'' are much larger than real digits.
7821
7822Instead of typing @kbd{511 %} again to reduce the result, we can be
7823cleverer still and notice that rather than computing a huge integer
7824and taking the modulo at the end, we can take the modulo at each step
7825without affecting the result. While this means there are more
7826arithmetic operations, the numbers we operate on remain small so
7827the operations are faster.
7828
7829@smallexample
7830@group
78311: [84, 101, 115, ..., 51] 1: 121
7832 . .
7833
7834 "Testing, 1, 2, 3 @key{RET} V R ' (3$$+$)%511 @key{RET}
7835@end group
7836@end smallexample
7837
7838Why does this work? Think about a two-step computation:
7839@w{@expr{3 (3a + b) + c}}. Taking a result modulo 511 basically means
7840subtracting off enough 511's to put the result in the desired range.
7841So the result when we take the modulo after every step is,
7842
7843@ifnottex
7844@example
78453 (3 a + b - 511 m) + c - 511 n
7846@end example
7847@end ifnottex
7848@tex
7849\turnoffactive
7850\beforedisplay
7851$$ 3 (3 a + b - 511 m) + c - 511 n $$
7852\afterdisplay
7853@end tex
7854
7855@noindent
7856for some suitable integers @expr{m} and @expr{n}. Expanding out by
7857the distributive law yields
7858
7859@ifnottex
7860@example
78619 a + 3 b + c - 511*3 m - 511 n
7862@end example
7863@end ifnottex
7864@tex
7865\turnoffactive
7866\beforedisplay
7867$$ 9 a + 3 b + c - 511\times3 m - 511 n $$
7868\afterdisplay
7869@end tex
7870
7871@noindent
7872The @expr{m} term in the latter formula is redundant because any
7873contribution it makes could just as easily be made by the @expr{n}
7874term. So we can take it out to get an equivalent formula with
7875@expr{n' = 3m + n},
7876
7877@ifnottex
7878@example
78799 a + 3 b + c - 511 n'
7880@end example
7881@end ifnottex
7882@tex
7883\turnoffactive
7884\beforedisplay
7885$$ 9 a + 3 b + c - 511 n' $$
7886\afterdisplay
7887@end tex
7888
7889@noindent
7890which is just the formula for taking the modulo only at the end of
7891the calculation. Therefore the two methods are essentially the same.
7892
7893Later in the tutorial we will encounter @dfn{modulo forms}, which
7894basically automate the idea of reducing every intermediate result
7895modulo some value @var{m}.
7896
7897@node List Answer 14, Types Answer 1, List Answer 13, Answers to Exercises
7898@subsection List Tutorial Exercise 14
7899
7900We want to use @kbd{H V U} to nest a function which adds a random
7901step to an @expr{(x,y)} coordinate. The function is a bit long, but
7902otherwise the problem is quite straightforward.
7903
7904@smallexample
7905@group
79062: [0, 0] 1: [ [ 0, 0 ]
79071: 50 [ 0.4288, -0.1695 ]
7908 . [ -0.4787, -0.9027 ]
7909 ...
7910
7911 [0,0] 50 H V U ' <# + [random(2.0)-1, random(2.0)-1]> @key{RET}
7912@end group
7913@end smallexample
7914
7915Just as the text recommended, we used @samp{< >} nameless function
7916notation to keep the two @code{random} calls from being evaluated
7917before nesting even begins.
7918
7919We now have a vector of @expr{[x, y]} sub-vectors, which by Calc's
7920rules acts like a matrix. We can transpose this matrix and unpack
7921to get a pair of vectors, @expr{x} and @expr{y}, suitable for graphing.
7922
7923@smallexample
7924@group
79252: [ 0, 0.4288, -0.4787, ... ]
79261: [ 0, -0.1696, -0.9027, ... ]
7927 .
7928
7929 v t v u g f
7930@end group
7931@end smallexample
7932
7933Incidentally, because the @expr{x} and @expr{y} are completely
7934independent in this case, we could have done two separate commands
7935to create our @expr{x} and @expr{y} vectors of numbers directly.
7936
7937To make a random walk of unit steps, we note that @code{sincos} of
7938a random direction exactly gives us an @expr{[x, y]} step of unit
7939length; in fact, the new nesting function is even briefer, though
7940we might want to lower the precision a bit for it.
7941
7942@smallexample
7943@group
79442: [0, 0] 1: [ [ 0, 0 ]
79451: 50 [ 0.1318, 0.9912 ]
7946 . [ -0.5965, 0.3061 ]
7947 ...
7948
7949 [0,0] 50 m d p 6 @key{RET} H V U ' <# + sincos(random(360.0))> @key{RET}
7950@end group
7951@end smallexample
7952
7953Another @kbd{v t v u g f} sequence will graph this new random walk.
7954
7955An interesting twist on these random walk functions would be to use
7956complex numbers instead of 2-vectors to represent points on the plane.
7957In the first example, we'd use something like @samp{random + random*(0,1)},
7958and in the second we could use polar complex numbers with random phase
7959angles. (This exercise was first suggested in this form by Randal
7960Schwartz.)
7961
7962@node Types Answer 1, Types Answer 2, List Answer 14, Answers to Exercises
7963@subsection Types Tutorial Exercise 1
7964
7965@noindent
7966If the number is the square root of @cpi{} times a rational number,
7967then its square, divided by @cpi{}, should be a rational number.
7968
7969@smallexample
7970@group
79711: 1.26508260337 1: 0.509433962268 1: 2486645810:4881193627
7972 . . .
7973
7974 2 ^ P / c F
7975@end group
7976@end smallexample
7977
7978@noindent
7979Technically speaking this is a rational number, but not one that is
7980likely to have arisen in the original problem. More likely, it just
7981happens to be the fraction which most closely represents some
7982irrational number to within 12 digits.
7983
7984But perhaps our result was not quite exact. Let's reduce the
7985precision slightly and try again:
7986
7987@smallexample
7988@group
79891: 0.509433962268 1: 27:53
7990 . .
7991
7992 U p 10 @key{RET} c F
7993@end group
7994@end smallexample
7995
7996@noindent
7997Aha! It's unlikely that an irrational number would equal a fraction
7998this simple to within ten digits, so our original number was probably
7999@texline @math{\sqrt{27 \pi / 53}}.
8000@infoline @expr{sqrt(27 pi / 53)}.
8001
8002Notice that we didn't need to re-round the number when we reduced the
8003precision. Remember, arithmetic operations always round their inputs
8004to the current precision before they begin.
8005
8006@node Types Answer 2, Types Answer 3, Types Answer 1, Answers to Exercises
8007@subsection Types Tutorial Exercise 2
8008
8009@noindent
8010@samp{inf / inf = nan}. Perhaps @samp{1} is the ``obvious'' answer.
8011But if @w{@samp{17 inf = inf}}, then @samp{17 inf / inf = inf / inf = 17}, too.
8012
8013@samp{exp(inf) = inf}. It's tempting to say that the exponential
8014of infinity must be ``bigger'' than ``regular'' infinity, but as
8015far as Calc is concerned all infinities are as just as big.
8016In other words, as @expr{x} goes to infinity, @expr{e^x} also goes
8017to infinity, but the fact the @expr{e^x} grows much faster than
8018@expr{x} is not relevant here.
8019
8020@samp{exp(-inf) = 0}. Here we have a finite answer even though
8021the input is infinite.
8022
8023@samp{sqrt(-inf) = (0, 1) inf}. Remember that @expr{(0, 1)}
8024represents the imaginary number @expr{i}. Here's a derivation:
8025@samp{sqrt(-inf) = @w{sqrt((-1) * inf)} = sqrt(-1) * sqrt(inf)}.
8026The first part is, by definition, @expr{i}; the second is @code{inf}
8027because, once again, all infinities are the same size.
8028
8029@samp{sqrt(uinf) = uinf}. In fact, we do know something about the
8030direction because @code{sqrt} is defined to return a value in the
8031right half of the complex plane. But Calc has no notation for this,
8032so it settles for the conservative answer @code{uinf}.
8033
8034@samp{abs(uinf) = inf}. No matter which direction @expr{x} points,
8035@samp{abs(x)} always points along the positive real axis.
8036
8037@samp{ln(0) = -inf}. Here we have an infinite answer to a finite
8038input. As in the @expr{1 / 0} case, Calc will only use infinities
8039here if you have turned on Infinite mode. Otherwise, it will
8040treat @samp{ln(0)} as an error.
8041
8042@node Types Answer 3, Types Answer 4, Types Answer 2, Answers to Exercises
8043@subsection Types Tutorial Exercise 3
8044
8045@noindent
8046We can make @samp{inf - inf} be any real number we like, say,
8047@expr{a}, just by claiming that we added @expr{a} to the first
8048infinity but not to the second. This is just as true for complex
8049values of @expr{a}, so @code{nan} can stand for a complex number.
8050(And, similarly, @code{uinf} can stand for an infinity that points
8051in any direction in the complex plane, such as @samp{(0, 1) inf}).
8052
8053In fact, we can multiply the first @code{inf} by two. Surely
8054@w{@samp{2 inf - inf = inf}}, but also @samp{2 inf - inf = inf - inf = nan}.
8055So @code{nan} can even stand for infinity. Obviously it's just
8056as easy to make it stand for minus infinity as for plus infinity.
8057
8058The moral of this story is that ``infinity'' is a slippery fish
8059indeed, and Calc tries to handle it by having a very simple model
8060for infinities (only the direction counts, not the ``size''); but
8061Calc is careful to write @code{nan} any time this simple model is
8062unable to tell what the true answer is.
8063
8064@node Types Answer 4, Types Answer 5, Types Answer 3, Answers to Exercises
8065@subsection Types Tutorial Exercise 4
8066
8067@smallexample
8068@group
80692: 0@@ 47' 26" 1: 0@@ 2' 47.411765"
80701: 17 .
8071 .
8072
8073 0@@ 47' 26" @key{RET} 17 /
8074@end group
8075@end smallexample
8076
8077@noindent
8078The average song length is two minutes and 47.4 seconds.
8079
8080@smallexample
8081@group
80822: 0@@ 2' 47.411765" 1: 0@@ 3' 7.411765" 1: 0@@ 53' 6.000005"
80831: 0@@ 0' 20" . .
8084 .
8085
8086 20" + 17 *
8087@end group
8088@end smallexample
8089
8090@noindent
8091The album would be 53 minutes and 6 seconds long.
8092
8093@node Types Answer 5, Types Answer 6, Types Answer 4, Answers to Exercises
8094@subsection Types Tutorial Exercise 5
8095
8096@noindent
8097Let's suppose it's January 14, 1991. The easiest thing to do is
8098to keep trying 13ths of months until Calc reports a Friday.
8099We can do this by manually entering dates, or by using @kbd{t I}:
8100
8101@smallexample
8102@group
81031: <Wed Feb 13, 1991> 1: <Wed Mar 13, 1991> 1: <Sat Apr 13, 1991>
8104 . . .
8105
8106 ' <2/13> @key{RET} @key{DEL} ' <3/13> @key{RET} t I
8107@end group
8108@end smallexample
8109
8110@noindent
8111(Calc assumes the current year if you don't say otherwise.)
8112
8113This is getting tedious---we can keep advancing the date by typing
8114@kbd{t I} over and over again, but let's automate the job by using
8115vector mapping. The @kbd{t I} command actually takes a second
8116``how-many-months'' argument, which defaults to one. This
8117argument is exactly what we want to map over:
8118
8119@smallexample
8120@group
81212: <Sat Apr 13, 1991> 1: [<Mon May 13, 1991>, <Thu Jun 13, 1991>,
81221: [1, 2, 3, 4, 5, 6] <Sat Jul 13, 1991>, <Tue Aug 13, 1991>,
8123 . <Fri Sep 13, 1991>, <Sun Oct 13, 1991>]
8124 .
8125
8126 v x 6 @key{RET} V M t I
8127@end group
8128@end smallexample
8129
8130@noindent
8131Et voil@`a, September 13, 1991 is a Friday.
8132
8133@smallexample
8134@group
81351: 242
8136 .
8137
8138' <sep 13> - <jan 14> @key{RET}
8139@end group
8140@end smallexample
8141
8142@noindent
8143And the answer to our original question: 242 days to go.
8144
8145@node Types Answer 6, Types Answer 7, Types Answer 5, Answers to Exercises
8146@subsection Types Tutorial Exercise 6
8147
8148@noindent
8149The full rule for leap years is that they occur in every year divisible
8150by four, except that they don't occur in years divisible by 100, except
8151that they @emph{do} in years divisible by 400. We could work out the
8152answer by carefully counting the years divisible by four and the
8153exceptions, but there is a much simpler way that works even if we
8154don't know the leap year rule.
8155
8156Let's assume the present year is 1991. Years have 365 days, except
8157that leap years (whenever they occur) have 366 days. So let's count
8158the number of days between now and then, and compare that to the
8159number of years times 365. The number of extra days we find must be
8160equal to the number of leap years there were.
8161
8162@smallexample
8163@group
81641: <Mon Jan 1, 10001> 2: <Mon Jan 1, 10001> 1: 2925593
8165 . 1: <Tue Jan 1, 1991> .
8166 .
8167
8168 ' <jan 1 10001> @key{RET} ' <jan 1 1991> @key{RET} -
8169
8170@end group
8171@end smallexample
8172@noindent
8173@smallexample
8174@group
81753: 2925593 2: 2925593 2: 2925593 1: 1943
81762: 10001 1: 8010 1: 2923650 .
81771: 1991 . .
8178 .
8179
8180 10001 @key{RET} 1991 - 365 * -
8181@end group
8182@end smallexample
8183
8184@c [fix-ref Date Forms]
8185@noindent
8186There will be 1943 leap years before the year 10001. (Assuming,
8187of course, that the algorithm for computing leap years remains
8188unchanged for that long. @xref{Date Forms}, for some interesting
8189background information in that regard.)
8190
8191@node Types Answer 7, Types Answer 8, Types Answer 6, Answers to Exercises
8192@subsection Types Tutorial Exercise 7
8193
8194@noindent
8195The relative errors must be converted to absolute errors so that
8196@samp{+/-} notation may be used.
8197
8198@smallexample
8199@group
82001: 1. 2: 1.
8201 . 1: 0.2
8202 .
8203
8204 20 @key{RET} .05 * 4 @key{RET} .05 *
8205@end group
8206@end smallexample
8207
8208Now we simply chug through the formula.
8209
8210@smallexample
8211@group
82121: 19.7392088022 1: 394.78 +/- 19.739 1: 6316.5 +/- 706.21
8213 . . .
8214
8215 2 P 2 ^ * 20 p 1 * 4 p .2 @key{RET} 2 ^ *
8216@end group
8217@end smallexample
8218
8219It turns out the @kbd{v u} command will unpack an error form as
8220well as a vector. This saves us some retyping of numbers.
8221
8222@smallexample
8223@group
82243: 6316.5 +/- 706.21 2: 6316.5 +/- 706.21
82252: 6316.5 1: 0.1118
82261: 706.21 .
8227 .
8228
8229 @key{RET} v u @key{TAB} /
8230@end group
8231@end smallexample
8232
8233@noindent
8234Thus the volume is 6316 cubic centimeters, within about 11 percent.
8235
8236@node Types Answer 8, Types Answer 9, Types Answer 7, Answers to Exercises
8237@subsection Types Tutorial Exercise 8
8238
8239@noindent
8240The first answer is pretty simple: @samp{1 / (0 .. 10) = (0.1 .. inf)}.
8241Since a number in the interval @samp{(0 .. 10)} can get arbitrarily
8242close to zero, its reciprocal can get arbitrarily large, so the answer
8243is an interval that effectively means, ``any number greater than 0.1''
8244but with no upper bound.
8245
8246The second answer, similarly, is @samp{1 / (-10 .. 0) = (-inf .. -0.1)}.
8247
8248Calc normally treats division by zero as an error, so that the formula
8249@w{@samp{1 / 0}} is left unsimplified. Our third problem,
8250@w{@samp{1 / [0 .. 10]}}, also (potentially) divides by zero because zero
8251is now a member of the interval. So Calc leaves this one unevaluated, too.
8252
8253If you turn on Infinite mode by pressing @kbd{m i}, you will
8254instead get the answer @samp{[0.1 .. inf]}, which includes infinity
8255as a possible value.
8256
8257The fourth calculation, @samp{1 / (-10 .. 10)}, has the same problem.
8258Zero is buried inside the interval, but it's still a possible value.
8259It's not hard to see that the actual result of @samp{1 / (-10 .. 10)}
8260will be either greater than @mathit{0.1}, or less than @mathit{-0.1}. Thus
8261the interval goes from minus infinity to plus infinity, with a ``hole''
8262in it from @mathit{-0.1} to @mathit{0.1}. Calc doesn't have any way to
8263represent this, so it just reports @samp{[-inf .. inf]} as the answer.
8264It may be disappointing to hear ``the answer lies somewhere between
8265minus infinity and plus infinity, inclusive,'' but that's the best
8266that interval arithmetic can do in this case.
8267
8268@node Types Answer 9, Types Answer 10, Types Answer 8, Answers to Exercises
8269@subsection Types Tutorial Exercise 9
8270
8271@smallexample
8272@group
82731: [-3 .. 3] 2: [-3 .. 3] 2: [0 .. 9]
8274 . 1: [0 .. 9] 1: [-9 .. 9]
8275 . .
8276
8277 [ 3 n .. 3 ] @key{RET} 2 ^ @key{TAB} @key{RET} *
8278@end group
8279@end smallexample
8280
8281@noindent
8282In the first case the result says, ``if a number is between @mathit{-3} and
82833, its square is between 0 and 9.'' The second case says, ``the product
8284of two numbers each between @mathit{-3} and 3 is between @mathit{-9} and 9.''
8285
8286An interval form is not a number; it is a symbol that can stand for
8287many different numbers. Two identical-looking interval forms can stand
8288for different numbers.
8289
8290The same issue arises when you try to square an error form.
8291
8292@node Types Answer 10, Types Answer 11, Types Answer 9, Answers to Exercises
8293@subsection Types Tutorial Exercise 10
8294
8295@noindent
8296Testing the first number, we might arbitrarily choose 17 for @expr{x}.
8297
8298@smallexample
8299@group
83001: 17 mod 811749613 2: 17 mod 811749613 1: 533694123 mod 811749613
8301 . 811749612 .
8302 .
8303
8304 17 M 811749613 @key{RET} 811749612 ^
8305@end group
8306@end smallexample
8307
8308@noindent
8309Since 533694123 is (considerably) different from 1, the number 811749613
8310must not be prime.
8311
8312It's awkward to type the number in twice as we did above. There are
8313various ways to avoid this, and algebraic entry is one. In fact, using
8314a vector mapping operation we can perform several tests at once. Let's
8315use this method to test the second number.
8316
8317@smallexample
8318@group
83192: [17, 42, 100000] 1: [1 mod 15485863, 1 mod ... ]
83201: 15485863 .
8321 .
8322
8323 [17 42 100000] 15485863 @key{RET} V M ' ($$ mod $)^($-1) @key{RET}
8324@end group
8325@end smallexample
8326
8327@noindent
8328The result is three ones (modulo @expr{n}), so it's very probable that
832915485863 is prime. (In fact, this number is the millionth prime.)
8330
8331Note that the functions @samp{($$^($-1)) mod $} or @samp{$$^($-1) % $}
8332would have been hopelessly inefficient, since they would have calculated
8333the power using full integer arithmetic.
8334
8335Calc has a @kbd{k p} command that does primality testing. For small
8336numbers it does an exact test; for large numbers it uses a variant
8337of the Fermat test we used here. You can use @kbd{k p} repeatedly
8338to prove that a large integer is prime with any desired probability.
8339
8340@node Types Answer 11, Types Answer 12, Types Answer 10, Answers to Exercises
8341@subsection Types Tutorial Exercise 11
8342
8343@noindent
8344There are several ways to insert a calculated number into an HMS form.
8345One way to convert a number of seconds to an HMS form is simply to
8346multiply the number by an HMS form representing one second:
8347
8348@smallexample
8349@group
83501: 31415926.5359 2: 31415926.5359 1: 8726@@ 38' 46.5359"
8351 . 1: 0@@ 0' 1" .
8352 .
8353
8354 P 1e7 * 0@@ 0' 1" *
8355
8356@end group
8357@end smallexample
8358@noindent
8359@smallexample
8360@group
83612: 8726@@ 38' 46.5359" 1: 6@@ 6' 2.5359" mod 24@@ 0' 0"
83621: 15@@ 27' 16" mod 24@@ 0' 0" .
8363 .
8364
8365 x time @key{RET} +
8366@end group
8367@end smallexample
8368
8369@noindent
8370It will be just after six in the morning.
8371
8372The algebraic @code{hms} function can also be used to build an
8373HMS form:
8374
8375@smallexample
8376@group
83771: hms(0, 0, 10000000. pi) 1: 8726@@ 38' 46.5359"
8378 . .
8379
8380 ' hms(0, 0, 1e7 pi) @key{RET} =
8381@end group
8382@end smallexample
8383
8384@noindent
8385The @kbd{=} key is necessary to evaluate the symbol @samp{pi} to
8386the actual number 3.14159...
8387
8388@node Types Answer 12, Types Answer 13, Types Answer 11, Answers to Exercises
8389@subsection Types Tutorial Exercise 12
8390
8391@noindent
8392As we recall, there are 17 songs of about 2 minutes and 47 seconds
8393each.
8394
8395@smallexample
8396@group
83972: 0@@ 2' 47" 1: [0@@ 3' 7" .. 0@@ 3' 47"]
83981: [0@@ 0' 20" .. 0@@ 1' 0"] .
8399 .
8400
8401 [ 0@@ 20" .. 0@@ 1' ] +
8402
8403@end group
8404@end smallexample
8405@noindent
8406@smallexample
8407@group
84081: [0@@ 52' 59." .. 1@@ 4' 19."]
8409 .
8410
8411 17 *
8412@end group
8413@end smallexample
8414
8415@noindent
8416No matter how long it is, the album will fit nicely on one CD.
8417
8418@node Types Answer 13, Types Answer 14, Types Answer 12, Answers to Exercises
8419@subsection Types Tutorial Exercise 13
8420
8421@noindent
8422Type @kbd{' 1 yr @key{RET} u c s @key{RET}}. The answer is 31557600 seconds.
8423
8424@node Types Answer 14, Types Answer 15, Types Answer 13, Answers to Exercises
8425@subsection Types Tutorial Exercise 14
8426
8427@noindent
8428How long will it take for a signal to get from one end of the computer
8429to the other?
8430
8431@smallexample
8432@group
84331: m / c 1: 3.3356 ns
8434 . .
8435
8436 ' 1 m / c @key{RET} u c ns @key{RET}
8437@end group
8438@end smallexample
8439
8440@noindent
8441(Recall, @samp{c} is a ``unit'' corresponding to the speed of light.)
8442
8443@smallexample
8444@group
84451: 3.3356 ns 1: 0.81356 ns / ns 1: 0.81356
84462: 4.1 ns . .
8447 .
8448
8449 ' 4.1 ns @key{RET} / u s
8450@end group
8451@end smallexample
8452
8453@noindent
8454Thus a signal could take up to 81 percent of a clock cycle just to
8455go from one place to another inside the computer, assuming the signal
8456could actually attain the full speed of light. Pretty tight!
8457
8458@node Types Answer 15, Algebra Answer 1, Types Answer 14, Answers to Exercises
8459@subsection Types Tutorial Exercise 15
8460
8461@noindent
8462The speed limit is 55 miles per hour on most highways. We want to
8463find the ratio of Sam's speed to the US speed limit.
8464
8465@smallexample
8466@group
84671: 55 mph 2: 55 mph 3: 11 hr mph / yd
8468 . 1: 5 yd / hr .
8469 .
8470
8471 ' 55 mph @key{RET} ' 5 yd/hr @key{RET} /
8472@end group
8473@end smallexample
8474
8475The @kbd{u s} command cancels out these units to get a plain
8476number. Now we take the logarithm base two to find the final
8477answer, assuming that each successive pill doubles his speed.
8478
8479@smallexample
8480@group
84811: 19360. 2: 19360. 1: 14.24
8482 . 1: 2 .
8483 .
8484
8485 u s 2 B
8486@end group
8487@end smallexample
8488
8489@noindent
8490Thus Sam can take up to 14 pills without a worry.
8491
8492@node Algebra Answer 1, Algebra Answer 2, Types Answer 15, Answers to Exercises
8493@subsection Algebra Tutorial Exercise 1
8494
8495@noindent
8496@c [fix-ref Declarations]
8497The result @samp{sqrt(x)^2} is simplified back to @expr{x} by the
8498Calculator, but @samp{sqrt(x^2)} is not. (Consider what happens
8499if @w{@expr{x = -4}}.) If @expr{x} is real, this formula could be
8500simplified to @samp{abs(x)}, but for general complex arguments even
8501that is not safe. (@xref{Declarations}, for a way to tell Calc
8502that @expr{x} is known to be real.)
8503
8504@node Algebra Answer 2, Algebra Answer 3, Algebra Answer 1, Answers to Exercises
8505@subsection Algebra Tutorial Exercise 2
8506
8507@noindent
8508Suppose our roots are @expr{[a, b, c]}. We want a polynomial which
8509is zero when @expr{x} is any of these values. The trivial polynomial
8510@expr{x-a} is zero when @expr{x=a}, so the product @expr{(x-a)(x-b)(x-c)}
8511will do the job. We can use @kbd{a c x} to write this in a more
8512familiar form.
8513
8514@smallexample
8515@group
85161: 34 x - 24 x^3 1: [1.19023, -1.19023, 0]
8517 . .
8518
8519 r 2 a P x @key{RET}
8520
8521@end group
8522@end smallexample
8523@noindent
8524@smallexample
8525@group
85261: [x - 1.19023, x + 1.19023, x] 1: (x - 1.19023) (x + 1.19023) x
8527 . .
8528
8529 V M ' x-$ @key{RET} V R *
8530
8531@end group
8532@end smallexample
8533@noindent
8534@smallexample
8535@group
85361: x^3 - 1.41666 x 1: 34 x - 24 x^3
8537 . .
8538
8539 a c x @key{RET} 24 n * a x
8540@end group
8541@end smallexample
8542
8543@noindent
8544Sure enough, our answer (multiplied by a suitable constant) is the
8545same as the original polynomial.
8546
8547@node Algebra Answer 3, Algebra Answer 4, Algebra Answer 2, Answers to Exercises
8548@subsection Algebra Tutorial Exercise 3
8549
8550@smallexample
8551@group
85521: x sin(pi x) 1: (sin(pi x) - pi x cos(pi x)) / pi^2
8553 . .
8554
8555 ' x sin(pi x) @key{RET} m r a i x @key{RET}
8556
8557@end group
8558@end smallexample
8559@noindent
8560@smallexample
8561@group
85621: [y, 1]
85632: (sin(pi x) - pi x cos(pi x)) / pi^2
8564 .
8565
8566 ' [y,1] @key{RET} @key{TAB}
8567
8568@end group
8569@end smallexample
8570@noindent
8571@smallexample
8572@group
85731: [(sin(pi y) - pi y cos(pi y)) / pi^2, (sin(pi) - pi cos(pi)) / pi^2]
8574 .
8575
8576 V M $ @key{RET}
8577
8578@end group
8579@end smallexample
8580@noindent
8581@smallexample
8582@group
85831: (sin(pi y) - pi y cos(pi y)) / pi^2 + (pi cos(pi) - sin(pi)) / pi^2
8584 .
8585
8586 V R -
8587
8588@end group
8589@end smallexample
8590@noindent
8591@smallexample
8592@group
85931: (sin(3.14159 y) - 3.14159 y cos(3.14159 y)) / 9.8696 - 0.3183
8594 .
8595
8596 =
8597
8598@end group
8599@end smallexample
8600@noindent
8601@smallexample
8602@group
86031: [0., -0.95493, 0.63662, -1.5915, 1.2732]
8604 .
8605
8606 v x 5 @key{RET} @key{TAB} V M $ @key{RET}
8607@end group
8608@end smallexample
8609
8610@node Algebra Answer 4, Rewrites Answer 1, Algebra Answer 3, Answers to Exercises
8611@subsection Algebra Tutorial Exercise 4
8612
8613@noindent
8614The hard part is that @kbd{V R +} is no longer sufficient to add up all
8615the contributions from the slices, since the slices have varying
8616coefficients. So first we must come up with a vector of these
8617coefficients. Here's one way:
8618
8619@smallexample
8620@group
86212: -1 2: 3 1: [4, 2, ..., 4]
86221: [1, 2, ..., 9] 1: [-1, 1, ..., -1] .
8623 . .
8624
8625 1 n v x 9 @key{RET} V M ^ 3 @key{TAB} -
8626
8627@end group
8628@end smallexample
8629@noindent
8630@smallexample
8631@group
86321: [4, 2, ..., 4, 1] 1: [1, 4, 2, ..., 4, 1]
8633 . .
8634
8635 1 | 1 @key{TAB} |
8636@end group
8637@end smallexample
8638
8639@noindent
8640Now we compute the function values. Note that for this method we need
8641eleven values, including both endpoints of the desired interval.
8642
8643@smallexample
8644@group
86452: [1, 4, 2, ..., 4, 1]
86461: [1, 1.1, 1.2, ... , 1.8, 1.9, 2.]
8647 .
8648
8649 11 @key{RET} 1 @key{RET} .1 @key{RET} C-u v x
8650
8651@end group
8652@end smallexample
8653@noindent
8654@smallexample
8655@group
86562: [1, 4, 2, ..., 4, 1]
86571: [0., 0.084941, 0.16993, ... ]
8658 .
8659
8660 ' sin(x) ln(x) @key{RET} m r p 5 @key{RET} V M $ @key{RET}
8661@end group
8662@end smallexample
8663
8664@noindent
8665Once again this calls for @kbd{V M * V R +}; a simple @kbd{*} does the
8666same thing.
8667
8668@smallexample
8669@group
86701: 11.22 1: 1.122 1: 0.374
8671 . . .
8672
8673 * .1 * 3 /
8674@end group
8675@end smallexample
8676
8677@noindent
8678Wow! That's even better than the result from the Taylor series method.
8679
8680@node Rewrites Answer 1, Rewrites Answer 2, Algebra Answer 4, Answers to Exercises
8681@subsection Rewrites Tutorial Exercise 1
8682
8683@noindent
8684We'll use Big mode to make the formulas more readable.
8685
8686@smallexample
8687@group
8688 ___
8689 2 + V 2
86901: (2 + sqrt(2)) / (1 + sqrt(2)) 1: --------
8691 . ___
8692 1 + V 2
8693
8694 .
8695
8696 ' (2+sqrt(2)) / (1+sqrt(2)) @key{RET} d B
8697@end group
8698@end smallexample
8699
8700@noindent
8701Multiplying by the conjugate helps because @expr{(a+b) (a-b) = a^2 - b^2}.
8702
8703@smallexample
8704@group
8705 ___ ___
87061: (2 + V 2 ) (V 2 - 1)
8707 .
8708
8709 a r a/(b+c) := a*(b-c) / (b^2-c^2) @key{RET}
8710
8711@end group
8712@end smallexample
8713@noindent
8714@smallexample
8715@group
8716 ___ ___
87171: 2 + V 2 - 2 1: V 2
8718 . .
8719
8720 a r a*(b+c) := a*b + a*c a s
8721@end group
8722@end smallexample
8723
8724@noindent
8725(We could have used @kbd{a x} instead of a rewrite rule for the
8726second step.)
8727
8728The multiply-by-conjugate rule turns out to be useful in many
8729different circumstances, such as when the denominator involves
8730sines and cosines or the imaginary constant @code{i}.
8731
8732@node Rewrites Answer 2, Rewrites Answer 3, Rewrites Answer 1, Answers to Exercises
8733@subsection Rewrites Tutorial Exercise 2
8734
8735@noindent
8736Here is the rule set:
8737
8738@smallexample
8739@group
8740[ fib(n) := fib(n, 1, 1) :: integer(n) :: n >= 1,
8741 fib(1, x, y) := x,
8742 fib(n, x, y) := fib(n-1, y, x+y) ]
8743@end group
8744@end smallexample
8745
8746@noindent
8747The first rule turns a one-argument @code{fib} that people like to write
8748into a three-argument @code{fib} that makes computation easier. The
8749second rule converts back from three-argument form once the computation
8750is done. The third rule does the computation itself. It basically
8751says that if @expr{x} and @expr{y} are two consecutive Fibonacci numbers,
8752then @expr{y} and @expr{x+y} are the next (overlapping) pair of Fibonacci
8753numbers.
8754
8755Notice that because the number @expr{n} was ``validated'' by the
8756conditions on the first rule, there is no need to put conditions on
8757the other rules because the rule set would never get that far unless
8758the input were valid. That further speeds computation, since no
8759extra conditions need to be checked at every step.
8760
8761Actually, a user with a nasty sense of humor could enter a bad
8762three-argument @code{fib} call directly, say, @samp{fib(0, 1, 1)},
8763which would get the rules into an infinite loop. One thing that would
8764help keep this from happening by accident would be to use something like
8765@samp{ZzFib} instead of @code{fib} as the name of the three-argument
8766function.
8767
8768@node Rewrites Answer 3, Rewrites Answer 4, Rewrites Answer 2, Answers to Exercises
8769@subsection Rewrites Tutorial Exercise 3
8770
8771@noindent
8772He got an infinite loop. First, Calc did as expected and rewrote
8773@w{@samp{2 + 3 x}} to @samp{f(2, 3, x)}. Then it looked for ways to
8774apply the rule again, and found that @samp{f(2, 3, x)} looks like
8775@samp{a + b x} with @w{@samp{a = 0}} and @samp{b = 1}, so it rewrote to
8776@samp{f(0, 1, f(2, 3, x))}. It then wrapped another @samp{f(0, 1, ...)}
8777around that, and so on, ad infinitum. Joe should have used @kbd{M-1 a r}
8778to make sure the rule applied only once.
8779
8780(Actually, even the first step didn't work as he expected. What Calc
8781really gives for @kbd{M-1 a r} in this situation is @samp{f(3 x, 1, 2)},
8782treating 2 as the ``variable,'' and @samp{3 x} as a constant being added
8783to it. While this may seem odd, it's just as valid a solution as the
8784``obvious'' one. One way to fix this would be to add the condition
8785@samp{:: variable(x)} to the rule, to make sure the thing that matches
8786@samp{x} is indeed a variable, or to change @samp{x} to @samp{quote(x)}
8787on the lefthand side, so that the rule matches the actual variable
8788@samp{x} rather than letting @samp{x} stand for something else.)
8789
8790@node Rewrites Answer 4, Rewrites Answer 5, Rewrites Answer 3, Answers to Exercises
8791@subsection Rewrites Tutorial Exercise 4
8792
8793@noindent
8794@ignore
8795@starindex
8796@end ignore
8797@tindex seq
8798Here is a suitable set of rules to solve the first part of the problem:
8799
8800@smallexample
8801@group
8802[ seq(n, c) := seq(n/2, c+1) :: n%2 = 0,
8803 seq(n, c) := seq(3n+1, c+1) :: n%2 = 1 :: n > 1 ]
8804@end group
8805@end smallexample
8806
8807Given the initial formula @samp{seq(6, 0)}, application of these
8808rules produces the following sequence of formulas:
8809
8810@example
8811seq( 3, 1)
8812seq(10, 2)
8813seq( 5, 3)
8814seq(16, 4)
8815seq( 8, 5)
8816seq( 4, 6)
8817seq( 2, 7)
8818seq( 1, 8)
8819@end example
8820
8821@noindent
8822whereupon neither of the rules match, and rewriting stops.
8823
8824We can pretty this up a bit with a couple more rules:
8825
8826@smallexample
8827@group
8828[ seq(n) := seq(n, 0),
8829 seq(1, c) := c,
8830 ... ]
8831@end group
8832@end smallexample
8833
8834@noindent
8835Now, given @samp{seq(6)} as the starting configuration, we get 8
8836as the result.
8837
8838The change to return a vector is quite simple:
8839
8840@smallexample
8841@group
8842[ seq(n) := seq(n, []) :: integer(n) :: n > 0,
8843 seq(1, v) := v | 1,
8844 seq(n, v) := seq(n/2, v | n) :: n%2 = 0,
8845 seq(n, v) := seq(3n+1, v | n) :: n%2 = 1 ]
8846@end group
8847@end smallexample
8848
8849@noindent
8850Given @samp{seq(6)}, the result is @samp{[6, 3, 10, 5, 16, 8, 4, 2, 1]}.
8851
8852Notice that the @expr{n > 1} guard is no longer necessary on the last
8853rule since the @expr{n = 1} case is now detected by another rule.
8854But a guard has been added to the initial rule to make sure the
8855initial value is suitable before the computation begins.
8856
8857While still a good idea, this guard is not as vitally important as it
8858was for the @code{fib} function, since calling, say, @samp{seq(x, [])}
8859will not get into an infinite loop. Calc will not be able to prove
8860the symbol @samp{x} is either even or odd, so none of the rules will
8861apply and the rewrites will stop right away.
8862
8863@node Rewrites Answer 5, Rewrites Answer 6, Rewrites Answer 4, Answers to Exercises
8864@subsection Rewrites Tutorial Exercise 5
8865
8866@noindent
8867@ignore
8868@starindex
8869@end ignore
8870@tindex nterms
8871If @expr{x} is the sum @expr{a + b}, then `@tfn{nterms(}@var{x}@tfn{)}' must
8872be `@tfn{nterms(}@var{a}@tfn{)}' plus `@tfn{nterms(}@var{b}@tfn{)}'. If @expr{x}
8873is not a sum, then `@tfn{nterms(}@var{x}@tfn{)}' = 1.
8874
8875@smallexample
8876@group
8877[ nterms(a + b) := nterms(a) + nterms(b),
8878 nterms(x) := 1 ]
8879@end group
8880@end smallexample
8881
8882@noindent
8883Here we have taken advantage of the fact that earlier rules always
8884match before later rules; @samp{nterms(x)} will only be tried if we
8885already know that @samp{x} is not a sum.
8886
8887@node Rewrites Answer 6, Programming Answer 1, Rewrites Answer 5, Answers to Exercises
8888@subsection Rewrites Tutorial Exercise 6
8889
8890@noindent
8891Here is a rule set that will do the job:
8892
8893@smallexample
8894@group
8895[ a*(b + c) := a*b + a*c,
8896 opt(a) O(x^n) + opt(b) O(x^m) := O(x^n) :: n <= m
8897 :: constant(a) :: constant(b),
8898 opt(a) O(x^n) + opt(b) x^m := O(x^n) :: n <= m
8899 :: constant(a) :: constant(b),
8900 a O(x^n) := O(x^n) :: constant(a),
8901 x^opt(m) O(x^n) := O(x^(n+m)),
8902 O(x^n) O(x^m) := O(x^(n+m)) ]
8903@end group
8904@end smallexample
8905
8906If we really want the @kbd{+} and @kbd{*} keys to operate naturally
8907on power series, we should put these rules in @code{EvalRules}. For
8908testing purposes, it is better to put them in a different variable,
8909say, @code{O}, first.
8910
8911The first rule just expands products of sums so that the rest of the
8912rules can assume they have an expanded-out polynomial to work with.
8913Note that this rule does not mention @samp{O} at all, so it will
8914apply to any product-of-sum it encounters---this rule may surprise
8915you if you put it into @code{EvalRules}!
8916
8917In the second rule, the sum of two O's is changed to the smaller O.
8918The optional constant coefficients are there mostly so that
8919@samp{O(x^2) - O(x^3)} and @samp{O(x^3) - O(x^2)} are handled
8920as well as @samp{O(x^2) + O(x^3)}.
8921
8922The third rule absorbs higher powers of @samp{x} into O's.
8923
8924The fourth rule says that a constant times a negligible quantity
8925is still negligible. (This rule will also match @samp{O(x^3) / 4},
8926with @samp{a = 1/4}.)
8927
8928The fifth rule rewrites, for example, @samp{x^2 O(x^3)} to @samp{O(x^5)}.
8929(It is easy to see that if one of these forms is negligible, the other
8930is, too.) Notice the @samp{x^opt(m)} to pick up terms like
8931@w{@samp{x O(x^3)}}. Optional powers will match @samp{x} as @samp{x^1}
8932but not 1 as @samp{x^0}. This turns out to be exactly what we want here.
8933
8934The sixth rule is the corresponding rule for products of two O's.
8935
8936Another way to solve this problem would be to create a new ``data type''
8937that represents truncated power series. We might represent these as
8938function calls @samp{series(@var{coefs}, @var{x})} where @var{coefs} is
8939a vector of coefficients for @expr{x^0}, @expr{x^1}, @expr{x^2}, and so
8940on. Rules would exist for sums and products of such @code{series}
8941objects, and as an optional convenience could also know how to combine a
8942@code{series} object with a normal polynomial. (With this, and with a
8943rule that rewrites @samp{O(x^n)} to the equivalent @code{series} form,
8944you could still enter power series in exactly the same notation as
8945before.) Operations on such objects would probably be more efficient,
8946although the objects would be a bit harder to read.
8947
8948@c [fix-ref Compositions]
8949Some other symbolic math programs provide a power series data type
8950similar to this. Mathematica, for example, has an object that looks
8951like @samp{PowerSeries[@var{x}, @var{x0}, @var{coefs}, @var{nmin},
8952@var{nmax}, @var{den}]}, where @var{x0} is the point about which the
8953power series is taken (we've been assuming this was always zero),
8954and @var{nmin}, @var{nmax}, and @var{den} allow pseudo-power-series
8955with fractional or negative powers. Also, the @code{PowerSeries}
8956objects have a special display format that makes them look like
8957@samp{2 x^2 + O(x^4)} when they are printed out. (@xref{Compositions},
8958for a way to do this in Calc, although for something as involved as
8959this it would probably be better to write the formatting routine
8960in Lisp.)
8961
8962@node Programming Answer 1, Programming Answer 2, Rewrites Answer 6, Answers to Exercises
8963@subsection Programming Tutorial Exercise 1
8964
8965@noindent
8966Just enter the formula @samp{ninteg(sin(t)/t, t, 0, x)}, type
8967@kbd{Z F}, and answer the questions. Since this formula contains two
8968variables, the default argument list will be @samp{(t x)}. We want to
8969change this to @samp{(x)} since @expr{t} is really a dummy variable
8970to be used within @code{ninteg}.
8971
8972The exact keystrokes are @kbd{Z F s Si @key{RET} @key{RET} C-b C-b @key{DEL} @key{DEL} @key{RET} y}.
8973(The @kbd{C-b C-b @key{DEL} @key{DEL}} are what fix the argument list.)
8974
8975@node Programming Answer 2, Programming Answer 3, Programming Answer 1, Answers to Exercises
8976@subsection Programming Tutorial Exercise 2
8977
8978@noindent
8979One way is to move the number to the top of the stack, operate on
8980it, then move it back: @kbd{C-x ( M-@key{TAB} n M-@key{TAB} M-@key{TAB} C-x )}.
8981
8982Another way is to negate the top three stack entries, then negate
8983again the top two stack entries: @kbd{C-x ( M-3 n M-2 n C-x )}.
8984
8985Finally, it turns out that a negative prefix argument causes a
8986command like @kbd{n} to operate on the specified stack entry only,
8987which is just what we want: @kbd{C-x ( M-- 3 n C-x )}.
8988
8989Just for kicks, let's also do it algebraically:
8990@w{@kbd{C-x ( ' -$$$, $$, $ @key{RET} C-x )}}.
8991
8992@node Programming Answer 3, Programming Answer 4, Programming Answer 2, Answers to Exercises
8993@subsection Programming Tutorial Exercise 3
8994
8995@noindent
8996Each of these functions can be computed using the stack, or using
8997algebraic entry, whichever way you prefer:
8998
8999@noindent
9000Computing
9001@texline @math{\displaystyle{\sin x \over x}}:
9002@infoline @expr{sin(x) / x}:
9003
9004Using the stack: @kbd{C-x ( @key{RET} S @key{TAB} / C-x )}.
9005
9006Using algebraic entry: @kbd{C-x ( ' sin($)/$ @key{RET} C-x )}.
9007
9008@noindent
9009Computing the logarithm:
9010
9011Using the stack: @kbd{C-x ( @key{TAB} B C-x )}
9012
9013Using algebraic entry: @kbd{C-x ( ' log($,$$) @key{RET} C-x )}.
9014
9015@noindent
9016Computing the vector of integers:
9017
9018Using the stack: @kbd{C-x ( 1 @key{RET} 1 C-u v x C-x )}. (Recall that
9019@kbd{C-u v x} takes the vector size, starting value, and increment
9020from the stack.)
9021
9022Alternatively: @kbd{C-x ( ~ v x C-x )}. (The @kbd{~} key pops a
9023number from the stack and uses it as the prefix argument for the
9024next command.)
9025
9026Using algebraic entry: @kbd{C-x ( ' index($) @key{RET} C-x )}.
9027
9028@node Programming Answer 4, Programming Answer 5, Programming Answer 3, Answers to Exercises
9029@subsection Programming Tutorial Exercise 4
9030
9031@noindent
9032Here's one way: @kbd{C-x ( @key{RET} V R + @key{TAB} v l / C-x )}.
9033
9034@node Programming Answer 5, Programming Answer 6, Programming Answer 4, Answers to Exercises
9035@subsection Programming Tutorial Exercise 5
9036
9037@smallexample
9038@group
90392: 1 1: 1.61803398502 2: 1.61803398502
90401: 20 . 1: 1.61803398875
9041 . .
9042
9043 1 @key{RET} 20 Z < & 1 + Z > I H P
9044@end group
9045@end smallexample
9046
9047@noindent
9048This answer is quite accurate.
9049
9050@node Programming Answer 6, Programming Answer 7, Programming Answer 5, Answers to Exercises
9051@subsection Programming Tutorial Exercise 6
9052
9053@noindent
9054Here is the matrix:
9055
9056@example
9057[ [ 0, 1 ] * [a, b] = [b, a + b]
9058 [ 1, 1 ] ]
9059@end example
9060
9061@noindent
9062Thus @samp{[0, 1; 1, 1]^n * [1, 1]} computes Fibonacci numbers @expr{n+1}
9063and @expr{n+2}. Here's one program that does the job:
9064
9065@example
9066C-x ( ' [0, 1; 1, 1] ^ ($-1) * [1, 1] @key{RET} v u @key{DEL} C-x )
9067@end example
9068
9069@noindent
9070This program is quite efficient because Calc knows how to raise a
9071matrix (or other value) to the power @expr{n} in only
9072@texline @math{\log_2 n}
9073@infoline @expr{log(n,2)}
9074steps. For example, this program can compute the 1000th Fibonacci
9075number (a 209-digit integer!) in about 10 steps; even though the
9076@kbd{Z < ... Z >} solution had much simpler steps, it would have
9077required so many steps that it would not have been practical.
9078
9079@node Programming Answer 7, Programming Answer 8, Programming Answer 6, Answers to Exercises
9080@subsection Programming Tutorial Exercise 7
9081
9082@noindent
9083The trick here is to compute the harmonic numbers differently, so that
9084the loop counter itself accumulates the sum of reciprocals. We use
9085a separate variable to hold the integer counter.
9086
9087@smallexample
9088@group
90891: 1 2: 1 1: .
9090 . 1: 4
9091 .
9092
9093 1 t 1 1 @key{RET} 4 Z ( t 2 r 1 1 + s 1 & Z )
9094@end group
9095@end smallexample
9096
9097@noindent
9098The body of the loop goes as follows: First save the harmonic sum
9099so far in variable 2. Then delete it from the stack; the for loop
9100itself will take care of remembering it for us. Next, recall the
9101count from variable 1, add one to it, and feed its reciprocal to
9102the for loop to use as the step value. The for loop will increase
9103the ``loop counter'' by that amount and keep going until the
9104loop counter exceeds 4.
9105
9106@smallexample
9107@group
91082: 31 3: 31
91091: 3.99498713092 2: 3.99498713092
9110 . 1: 4.02724519544
9111 .
9112
9113 r 1 r 2 @key{RET} 31 & +
9114@end group
9115@end smallexample
9116
9117Thus we find that the 30th harmonic number is 3.99, and the 31st
9118harmonic number is 4.02.
9119
9120@node Programming Answer 8, Programming Answer 9, Programming Answer 7, Answers to Exercises
9121@subsection Programming Tutorial Exercise 8
9122
9123@noindent
9124The first step is to compute the derivative @expr{f'(x)} and thus
9125the formula
9126@texline @math{\displaystyle{x - {f(x) \over f'(x)}}}.
9127@infoline @expr{x - f(x)/f'(x)}.
9128
9129(Because this definition is long, it will be repeated in concise form
9130below. You can use @w{@kbd{C-x * m}} to load it from there. While you are
9131entering a @kbd{Z ` Z '} body in a macro, Calc simply collects
9132keystrokes without executing them. In the following diagrams we'll
9133pretend Calc actually executed the keystrokes as you typed them,
9134just for purposes of illustration.)
9135
9136@smallexample
9137@group
91382: sin(cos(x)) - 0.5 3: 4.5
91391: 4.5 2: sin(cos(x)) - 0.5
9140 . 1: -(sin(x) cos(cos(x)))
9141 .
9142
9143' sin(cos(x))-0.5 @key{RET} 4.5 m r C-x ( Z ` @key{TAB} @key{RET} a d x @key{RET}
9144
9145@end group
9146@end smallexample
9147@noindent
9148@smallexample
9149@group
91502: 4.5
91511: x + (sin(cos(x)) - 0.5) / sin(x) cos(cos(x))
9152 .
9153
9154 / ' x @key{RET} @key{TAB} - t 1
9155@end group
9156@end smallexample
9157
9158Now, we enter the loop. We'll use a repeat loop with a 20-repetition
9159limit just in case the method fails to converge for some reason.
9160(Normally, the @w{@kbd{Z /}} command will stop the loop before all 20
9161repetitions are done.)
9162
9163@smallexample
9164@group
91651: 4.5 3: 4.5 2: 4.5
9166 . 2: x + (sin(cos(x)) ... 1: 5.24196456928
9167 1: 4.5 .
9168 .
9169
9170 20 Z < @key{RET} r 1 @key{TAB} s l x @key{RET}
9171@end group
9172@end smallexample
9173
9174This is the new guess for @expr{x}. Now we compare it with the
9175old one to see if we've converged.
9176
9177@smallexample
9178@group
91793: 5.24196 2: 5.24196 1: 5.24196 1: 5.26345856348
91802: 5.24196 1: 0 . .
91811: 4.5 .
9182 .
9183
9184 @key{RET} M-@key{TAB} a = Z / Z > Z ' C-x )
9185@end group
9186@end smallexample
9187
9188The loop converges in just a few steps to this value. To check
9189the result, we can simply substitute it back into the equation.
9190
9191@smallexample
9192@group
91932: 5.26345856348
91941: 0.499999999997
9195 .
9196
9197 @key{RET} ' sin(cos($)) @key{RET}
9198@end group
9199@end smallexample
9200
9201Let's test the new definition again:
9202
9203@smallexample
9204@group
92052: x^2 - 9 1: 3.
92061: 1 .
9207 .
9208
9209 ' x^2-9 @key{RET} 1 X
9210@end group
9211@end smallexample
9212
9213Once again, here's the full Newton's Method definition:
9214
9215@example
9216@group
9217C-x ( Z ` @key{TAB} @key{RET} a d x @key{RET} / ' x @key{RET} @key{TAB} - t 1
9218 20 Z < @key{RET} r 1 @key{TAB} s l x @key{RET}
9219 @key{RET} M-@key{TAB} a = Z /
9220 Z >
9221 Z '
9222C-x )
9223@end group
9224@end example
9225
9226@c [fix-ref Nesting and Fixed Points]
9227It turns out that Calc has a built-in command for applying a formula
9228repeatedly until it converges to a number. @xref{Nesting and Fixed Points},
9229to see how to use it.
9230
9231@c [fix-ref Root Finding]
9232Also, of course, @kbd{a R} is a built-in command that uses Newton's
9233method (among others) to look for numerical solutions to any equation.
9234@xref{Root Finding}.
9235
9236@node Programming Answer 9, Programming Answer 10, Programming Answer 8, Answers to Exercises
9237@subsection Programming Tutorial Exercise 9
9238
9239@noindent
9240The first step is to adjust @expr{z} to be greater than 5. A simple
9241``for'' loop will do the job here. If @expr{z} is less than 5, we
9242reduce the problem using
9243@texline @math{\psi(z) = \psi(z+1) - 1/z}.
9244@infoline @expr{psi(z) = psi(z+1) - 1/z}. We go
9245on to compute
9246@texline @math{\psi(z+1)},
9247@infoline @expr{psi(z+1)},
9248and remember to add back a factor of @expr{-1/z} when we're done. This
9249step is repeated until @expr{z > 5}.
9250
9251(Because this definition is long, it will be repeated in concise form
9252below. You can use @w{@kbd{C-x * m}} to load it from there. While you are
9253entering a @kbd{Z ` Z '} body in a macro, Calc simply collects
9254keystrokes without executing them. In the following diagrams we'll
9255pretend Calc actually executed the keystrokes as you typed them,
9256just for purposes of illustration.)
9257
9258@smallexample
9259@group
92601: 1. 1: 1.
9261 . .
9262
9263 1.0 @key{RET} C-x ( Z ` s 1 0 t 2
9264@end group
9265@end smallexample
9266
9267Here, variable 1 holds @expr{z} and variable 2 holds the adjustment
9268factor. If @expr{z < 5}, we use a loop to increase it.
9269
9270(By the way, we started with @samp{1.0} instead of the integer 1 because
9271otherwise the calculation below will try to do exact fractional arithmetic,
9272and will never converge because fractions compare equal only if they
9273are exactly equal, not just equal to within the current precision.)
9274
9275@smallexample
9276@group
92773: 1. 2: 1. 1: 6.
92782: 1. 1: 1 .
92791: 5 .
9280 .
9281
9282 @key{RET} 5 a < Z [ 5 Z ( & s + 2 1 s + 1 1 Z ) r 1 Z ]
9283@end group
9284@end smallexample
9285
9286Now we compute the initial part of the sum:
9287@texline @math{\ln z - {1 \over 2z}}
9288@infoline @expr{ln(z) - 1/2z}
9289minus the adjustment factor.
9290
9291@smallexample
9292@group
92932: 1.79175946923 2: 1.7084261359 1: -0.57490719743
92941: 0.0833333333333 1: 2.28333333333 .
9295 . .
9296
9297 L r 1 2 * & - r 2 -
9298@end group
9299@end smallexample
9300
9301Now we evaluate the series. We'll use another ``for'' loop counting
9302up the value of @expr{2 n}. (Calc does have a summation command,
9303@kbd{a +}, but we'll use loops just to get more practice with them.)
9304
9305@smallexample
9306@group
93073: -0.5749 3: -0.5749 4: -0.5749 2: -0.5749
93082: 2 2: 1:6 3: 1:6 1: 2.3148e-3
93091: 40 1: 2 2: 2 .
9310 . . 1: 36.
9311 .
9312
9313 2 @key{RET} 40 Z ( @key{RET} k b @key{TAB} @key{RET} r 1 @key{TAB} ^ * /
9314
9315@end group
9316@end smallexample
9317@noindent
9318@smallexample
9319@group
93203: -0.5749 3: -0.5772 2: -0.5772 1: -0.577215664892
93212: -0.5749 2: -0.5772 1: 0 .
93221: 2.3148e-3 1: -0.5749 .
9323 . .
9324
9325 @key{TAB} @key{RET} M-@key{TAB} - @key{RET} M-@key{TAB} a = Z / 2 Z ) Z ' C-x )
9326@end group
9327@end smallexample
9328
9329This is the value of
9330@texline @math{-\gamma},
9331@infoline @expr{- gamma},
9332with a slight bit of roundoff error. To get a full 12 digits, let's use
9333a higher precision:
9334
9335@smallexample
9336@group
93372: -0.577215664892 2: -0.577215664892
93381: 1. 1: -0.577215664901532
9339
9340 1. @key{RET} p 16 @key{RET} X
9341@end group
9342@end smallexample
9343
9344Here's the complete sequence of keystrokes:
9345
9346@example
9347@group
9348C-x ( Z ` s 1 0 t 2
9349 @key{RET} 5 a < Z [ 5 Z ( & s + 2 1 s + 1 1 Z ) r 1 Z ]
9350 L r 1 2 * & - r 2 -
9351 2 @key{RET} 40 Z ( @key{RET} k b @key{TAB} @key{RET} r 1 @key{TAB} ^ * /
9352 @key{TAB} @key{RET} M-@key{TAB} - @key{RET} M-@key{TAB} a = Z /
9353 2 Z )
9354 Z '
9355C-x )
9356@end group
9357@end example
9358
9359@node Programming Answer 10, Programming Answer 11, Programming Answer 9, Answers to Exercises
9360@subsection Programming Tutorial Exercise 10
9361
9362@noindent
9363Taking the derivative of a term of the form @expr{x^n} will produce
9364a term like
9365@texline @math{n x^{n-1}}.
9366@infoline @expr{n x^(n-1)}.
9367Taking the derivative of a constant
9368produces zero. From this it is easy to see that the @expr{n}th
9369derivative of a polynomial, evaluated at @expr{x = 0}, will equal the
9370coefficient on the @expr{x^n} term times @expr{n!}.
9371
9372(Because this definition is long, it will be repeated in concise form
9373below. You can use @w{@kbd{C-x * m}} to load it from there. While you are
9374entering a @kbd{Z ` Z '} body in a macro, Calc simply collects
9375keystrokes without executing them. In the following diagrams we'll
9376pretend Calc actually executed the keystrokes as you typed them,
9377just for purposes of illustration.)
9378
9379@smallexample
9380@group
93812: 5 x^4 + (x + 1)^2 3: 5 x^4 + (x + 1)^2
93821: 6 2: 0
9383 . 1: 6
9384 .
9385
9386 ' 5 x^4 + (x+1)^2 @key{RET} 6 C-x ( Z ` [ ] t 1 0 @key{TAB}
9387@end group
9388@end smallexample
9389
9390@noindent
9391Variable 1 will accumulate the vector of coefficients.
9392
9393@smallexample
9394@group
93952: 0 3: 0 2: 5 x^4 + ...
93961: 5 x^4 + ... 2: 5 x^4 + ... 1: 1
9397 . 1: 1 .
9398 .
9399
9400 Z ( @key{TAB} @key{RET} 0 s l x @key{RET} M-@key{TAB} ! / s | 1
9401@end group
9402@end smallexample
9403
9404@noindent
9405Note that @kbd{s | 1} appends the top-of-stack value to the vector
9406in a variable; it is completely analogous to @kbd{s + 1}. We could
9407have written instead, @kbd{r 1 @key{TAB} | t 1}.
9408
9409@smallexample
9410@group
94111: 20 x^3 + 2 x + 2 1: 0 1: [1, 2, 1, 0, 5, 0, 0]
9412 . . .
9413
9414 a d x @key{RET} 1 Z ) @key{DEL} r 1 Z ' C-x )
9415@end group
9416@end smallexample
9417
9418To convert back, a simple method is just to map the coefficients
9419against a table of powers of @expr{x}.
9420
9421@smallexample
9422@group
94232: [1, 2, 1, 0, 5, 0, 0] 2: [1, 2, 1, 0, 5, 0, 0]
94241: 6 1: [0, 1, 2, 3, 4, 5, 6]
9425 . .
9426
9427 6 @key{RET} 1 + 0 @key{RET} 1 C-u v x
9428
9429@end group
9430@end smallexample
9431@noindent
9432@smallexample
9433@group
94342: [1, 2, 1, 0, 5, 0, 0] 2: 1 + 2 x + x^2 + 5 x^4
94351: [1, x, x^2, x^3, ... ] .
9436 .
9437
9438 ' x @key{RET} @key{TAB} V M ^ *
9439@end group
9440@end smallexample
9441
9442Once again, here are the whole polynomial to/from vector programs:
9443
9444@example
9445@group
9446C-x ( Z ` [ ] t 1 0 @key{TAB}
9447 Z ( @key{TAB} @key{RET} 0 s l x @key{RET} M-@key{TAB} ! / s | 1
9448 a d x @key{RET}
9449 1 Z ) r 1
9450 Z '
9451C-x )
9452
9453C-x ( 1 + 0 @key{RET} 1 C-u v x ' x @key{RET} @key{TAB} V M ^ * C-x )
9454@end group
9455@end example
9456
9457@node Programming Answer 11, Programming Answer 12, Programming Answer 10, Answers to Exercises
9458@subsection Programming Tutorial Exercise 11
9459
9460@noindent
9461First we define a dummy program to go on the @kbd{z s} key. The true
9462@w{@kbd{z s}} key is supposed to take two numbers from the stack and
9463return one number, so @key{DEL} as a dummy definition will make
9464sure the stack comes out right.
9465
9466@smallexample
9467@group
94682: 4 1: 4 2: 4
94691: 2 . 1: 2
9470 . .
9471
9472 4 @key{RET} 2 C-x ( @key{DEL} C-x ) Z K s @key{RET} 2
9473@end group
9474@end smallexample
9475
9476The last step replaces the 2 that was eaten during the creation
9477of the dummy @kbd{z s} command. Now we move on to the real
9478definition. The recurrence needs to be rewritten slightly,
9479to the form @expr{s(n,m) = s(n-1,m-1) - (n-1) s(n-1,m)}.
9480
9481(Because this definition is long, it will be repeated in concise form
9482below. You can use @kbd{C-x * m} to load it from there.)
9483
9484@smallexample
9485@group
94862: 4 4: 4 3: 4 2: 4
94871: 2 3: 2 2: 2 1: 2
9488 . 2: 4 1: 0 .
9489 1: 2 .
9490 .
9491
9492 C-x ( M-2 @key{RET} a = Z [ @key{DEL} @key{DEL} 1 Z :
9493
9494@end group
9495@end smallexample
9496@noindent
9497@smallexample
9498@group
94994: 4 2: 4 2: 3 4: 3 4: 3 3: 3
95003: 2 1: 2 1: 2 3: 2 3: 2 2: 2
95012: 2 . . 2: 3 2: 3 1: 3
95021: 0 1: 2 1: 1 .
9503 . . .
9504
9505 @key{RET} 0 a = Z [ @key{DEL} @key{DEL} 0 Z : @key{TAB} 1 - @key{TAB} M-2 @key{RET} 1 - z s
9506@end group
9507@end smallexample
9508
9509@noindent
9510(Note that the value 3 that our dummy @kbd{z s} produces is not correct;
9511it is merely a placeholder that will do just as well for now.)
9512
9513@smallexample
9514@group
95153: 3 4: 3 3: 3 2: 3 1: -6
95162: 3 3: 3 2: 3 1: 9 .
95171: 2 2: 3 1: 3 .
9518 . 1: 2 .
9519 .
9520
9521 M-@key{TAB} M-@key{TAB} @key{TAB} @key{RET} M-@key{TAB} z s * -
9522
9523@end group
9524@end smallexample
9525@noindent
9526@smallexample
9527@group
95281: -6 2: 4 1: 11 2: 11
9529 . 1: 2 . 1: 11
9530 . .
9531
9532 Z ] Z ] C-x ) Z K s @key{RET} @key{DEL} 4 @key{RET} 2 z s M-@key{RET} k s
9533@end group
9534@end smallexample
9535
9536Even though the result that we got during the definition was highly
9537bogus, once the definition is complete the @kbd{z s} command gets
9538the right answers.
9539
9540Here's the full program once again:
9541
9542@example
9543@group
9544C-x ( M-2 @key{RET} a =
9545 Z [ @key{DEL} @key{DEL} 1
9546 Z : @key{RET} 0 a =
9547 Z [ @key{DEL} @key{DEL} 0
9548 Z : @key{TAB} 1 - @key{TAB} M-2 @key{RET} 1 - z s
9549 M-@key{TAB} M-@key{TAB} @key{TAB} @key{RET} M-@key{TAB} z s * -
9550 Z ]
9551 Z ]
9552C-x )
9553@end group
9554@end example
9555
9556You can read this definition using @kbd{C-x * m} (@code{read-kbd-macro})
9557followed by @kbd{Z K s}, without having to make a dummy definition
9558first, because @code{read-kbd-macro} doesn't need to execute the
9559definition as it reads it in. For this reason, @code{C-x * m} is often
9560the easiest way to create recursive programs in Calc.
9561
9562@node Programming Answer 12, , Programming Answer 11, Answers to Exercises
9563@subsection Programming Tutorial Exercise 12
9564
9565@noindent
9566This turns out to be a much easier way to solve the problem. Let's
9567denote Stirling numbers as calls of the function @samp{s}.
9568
9569First, we store the rewrite rules corresponding to the definition of
9570Stirling numbers in a convenient variable:
9571
9572@smallexample
9573s e StirlingRules @key{RET}
9574[ s(n,n) := 1 :: n >= 0,
9575 s(n,0) := 0 :: n > 0,
9576 s(n,m) := s(n-1,m-1) - (n-1) s(n-1,m) :: n >= m :: m >= 1 ]
9577C-c C-c
9578@end smallexample
9579
9580Now, it's just a matter of applying the rules:
9581
9582@smallexample
9583@group
95842: 4 1: s(4, 2) 1: 11
95851: 2 . .
9586 .
9587
9588 4 @key{RET} 2 C-x ( ' s($$,$) @key{RET} a r StirlingRules @key{RET} C-x )
9589@end group
9590@end smallexample
9591
9592As in the case of the @code{fib} rules, it would be useful to put these
9593rules in @code{EvalRules} and to add a @samp{:: remember} condition to
9594the last rule.
9595
9596@c This ends the table-of-contents kludge from above:
9597@tex
9598\global\let\chapternofonts=\oldchapternofonts
9599@end tex
9600
9601@c [reference]
9602
9603@node Introduction, Data Types, Tutorial, Top
9604@chapter Introduction
9605
9606@noindent
9607This chapter is the beginning of the Calc reference manual.
9608It covers basic concepts such as the stack, algebraic and
9609numeric entry, undo, numeric prefix arguments, etc.
9610
9611@c [when-split]
9612@c (Chapter 2, the Tutorial, has been printed in a separate volume.)
9613
9614@menu
9615* Basic Commands::
9616* Help Commands::
9617* Stack Basics::
9618* Numeric Entry::
9619* Algebraic Entry::
9620* Quick Calculator::
9621* Prefix Arguments::
9622* Undo::
9623* Error Messages::
9624* Multiple Calculators::
9625* Troubleshooting Commands::
9626@end menu
9627
9628@node Basic Commands, Help Commands, Introduction, Introduction
9629@section Basic Commands
9630
9631@noindent
9632@pindex calc
9633@pindex calc-mode
9634@cindex Starting the Calculator
9635@cindex Running the Calculator
9636To start the Calculator in its standard interface, type @kbd{M-x calc}.
9637By default this creates a pair of small windows, @samp{*Calculator*}
9638and @samp{*Calc Trail*}. The former displays the contents of the
9639Calculator stack and is manipulated exclusively through Calc commands.
9640It is possible (though not usually necessary) to create several Calc
9641mode buffers each of which has an independent stack, undo list, and
9642mode settings. There is exactly one Calc Trail buffer; it records a
9643list of the results of all calculations that have been done. The
9644Calc Trail buffer uses a variant of Calc mode, so Calculator commands
9645still work when the trail buffer's window is selected. It is possible
9646to turn the trail window off, but the @samp{*Calc Trail*} buffer itself
9647still exists and is updated silently. @xref{Trail Commands}.
9648
9649@kindex C-x * c
9650@kindex C-x * *
9651@ignore
9652@mindex @null
9653@end ignore
9654In most installations, the @kbd{C-x * c} key sequence is a more
9655convenient way to start the Calculator. Also, @kbd{C-x * *}
9656is a synonym for @kbd{C-x * c} unless you last used Calc
9657in its Keypad mode.
9658
9659@kindex x
9660@kindex M-x
9661@pindex calc-execute-extended-command
9662Most Calc commands use one or two keystrokes. Lower- and upper-case
9663letters are distinct. Commands may also be entered in full @kbd{M-x} form;
9664for some commands this is the only form. As a convenience, the @kbd{x}
9665key (@code{calc-execute-extended-command})
9666is like @kbd{M-x} except that it enters the initial string @samp{calc-}
9667for you. For example, the following key sequences are equivalent:
9668@kbd{S}, @kbd{M-x calc-sin @key{RET}}, @kbd{x sin @key{RET}}.
9669
9670@cindex Extensions module
9671@cindex @file{calc-ext} module
9672The Calculator exists in many parts. When you type @kbd{C-x * c}, the
9673Emacs ``auto-load'' mechanism will bring in only the first part, which
9674contains the basic arithmetic functions. The other parts will be
9675auto-loaded the first time you use the more advanced commands like trig
9676functions or matrix operations. This is done to improve the response time
9677of the Calculator in the common case when all you need to do is a
9678little arithmetic. If for some reason the Calculator fails to load an
9679extension module automatically, you can force it to load all the
9680extensions by using the @kbd{C-x * L} (@code{calc-load-everything})
9681command. @xref{Mode Settings}.
9682
9683If you type @kbd{M-x calc} or @kbd{C-x * c} with any numeric prefix argument,
9684the Calculator is loaded if necessary, but it is not actually started.
9685If the argument is positive, the @file{calc-ext} extensions are also
9686loaded if necessary. User-written Lisp code that wishes to make use
9687of Calc's arithmetic routines can use @samp{(calc 0)} or @samp{(calc 1)}
9688to auto-load the Calculator.
9689
9690@kindex C-x * b
9691@pindex full-calc
9692If you type @kbd{C-x * b}, then next time you use @kbd{C-x * c} you
9693will get a Calculator that uses the full height of the Emacs screen.
9694When full-screen mode is on, @kbd{C-x * c} runs the @code{full-calc}
9695command instead of @code{calc}. From the Unix shell you can type
9696@samp{emacs -f full-calc} to start a new Emacs specifically for use
9697as a calculator. When Calc is started from the Emacs command line
9698like this, Calc's normal ``quit'' commands actually quit Emacs itself.
9699
9700@kindex C-x * o
9701@pindex calc-other-window
9702The @kbd{C-x * o} command is like @kbd{C-x * c} except that the Calc
9703window is not actually selected. If you are already in the Calc
9704window, @kbd{C-x * o} switches you out of it. (The regular Emacs
9705@kbd{C-x o} command would also work for this, but it has a
9706tendency to drop you into the Calc Trail window instead, which
9707@kbd{C-x * o} takes care not to do.)
9708
9709@ignore
9710@mindex C-x * q
9711@end ignore
9712For one quick calculation, you can type @kbd{C-x * q} (@code{quick-calc})
9713which prompts you for a formula (like @samp{2+3/4}). The result is
9714displayed at the bottom of the Emacs screen without ever creating
9715any special Calculator windows. @xref{Quick Calculator}.
9716
9717@ignore
9718@mindex C-x * k
9719@end ignore
9720Finally, if you are using the X window system you may want to try
9721@kbd{C-x * k} (@code{calc-keypad}) which runs Calc with a
9722``calculator keypad'' picture as well as a stack display. Click on
9723the keys with the mouse to operate the calculator. @xref{Keypad Mode}.
9724
9725@kindex q
9726@pindex calc-quit
9727@cindex Quitting the Calculator
9728@cindex Exiting the Calculator
9729The @kbd{q} key (@code{calc-quit}) exits Calc mode and closes the
9730Calculator's window(s). It does not delete the Calculator buffers.
9731If you type @kbd{M-x calc} again, the Calculator will reappear with the
9732contents of the stack intact. Typing @kbd{C-x * c} or @kbd{C-x * *}
9733again from inside the Calculator buffer is equivalent to executing
9734@code{calc-quit}; you can think of @kbd{C-x * *} as toggling the
9735Calculator on and off.
9736
9737@kindex C-x * x
9738The @kbd{C-x * x} command also turns the Calculator off, no matter which
9739user interface (standard, Keypad, or Embedded) is currently active.
9740It also cancels @code{calc-edit} mode if used from there.
9741
9742@kindex d @key{SPC}
9743@pindex calc-refresh
9744@cindex Refreshing a garbled display
9745@cindex Garbled displays, refreshing
9746The @kbd{d @key{SPC}} key sequence (@code{calc-refresh}) redraws the contents
9747of the Calculator buffer from memory. Use this if the contents of the
9748buffer have been damaged somehow.
9749
9750@ignore
9751@mindex o
9752@end ignore
9753The @kbd{o} key (@code{calc-realign}) moves the cursor back to its
9754``home'' position at the bottom of the Calculator buffer.
9755
9756@kindex <
9757@kindex >
9758@pindex calc-scroll-left
9759@pindex calc-scroll-right
9760@cindex Horizontal scrolling
9761@cindex Scrolling
9762@cindex Wide text, scrolling
9763The @kbd{<} and @kbd{>} keys are bound to @code{calc-scroll-left} and
9764@code{calc-scroll-right}. These are just like the normal horizontal
9765scrolling commands except that they scroll one half-screen at a time by
9766default. (Calc formats its output to fit within the bounds of the
9767window whenever it can.)
9768
9769@kindex @{
9770@kindex @}
9771@pindex calc-scroll-down
9772@pindex calc-scroll-up
9773@cindex Vertical scrolling
9774The @kbd{@{} and @kbd{@}} keys are bound to @code{calc-scroll-down}
9775and @code{calc-scroll-up}. They scroll up or down by one-half the
9776height of the Calc window.
9777
9778@kindex C-x * 0
9779@pindex calc-reset
9780The @kbd{C-x * 0} command (@code{calc-reset}; that's @kbd{C-x *} followed
9781by a zero) resets the Calculator to its initial state. This clears
9782the stack, resets all the modes to their initial values (the values
9783that were saved with @kbd{m m} (@code{calc-save-modes})), clears the
9784caches (@pxref{Caches}), and so on. (It does @emph{not} erase the
9785values of any variables.) With an argument of 0, Calc will be reset to
9786its default state; namely, the modes will be given their default values.
9787With a positive prefix argument, @kbd{C-x * 0} preserves the contents of
9788the stack but resets everything else to its initial state; with a
9789negative prefix argument, @kbd{C-x * 0} preserves the contents of the
9790stack but resets everything else to its default state.
9791
9792@pindex calc-version
9793The @kbd{M-x calc-version} command displays the current version number
9794of Calc and the name of the person who installed it on your system.
9795(This information is also present in the @samp{*Calc Trail*} buffer,
9796and in the output of the @kbd{h h} command.)
9797
9798@node Help Commands, Stack Basics, Basic Commands, Introduction
9799@section Help Commands
9800
9801@noindent
9802@cindex Help commands
9803@kindex ?
9804@pindex calc-help
9805The @kbd{?} key (@code{calc-help}) displays a series of brief help messages.
9806Some keys (such as @kbd{b} and @kbd{d}) are prefix keys, like Emacs'
9807@key{ESC} and @kbd{C-x} prefixes. You can type
9808@kbd{?} after a prefix to see a list of commands beginning with that
9809prefix. (If the message includes @samp{[MORE]}, press @kbd{?} again
9810to see additional commands for that prefix.)
9811
9812@kindex h h
9813@pindex calc-full-help
9814The @kbd{h h} (@code{calc-full-help}) command displays all the @kbd{?}
9815responses at once. When printed, this makes a nice, compact (three pages)
9816summary of Calc keystrokes.
9817
9818In general, the @kbd{h} key prefix introduces various commands that
9819provide help within Calc. Many of the @kbd{h} key functions are
9820Calc-specific analogues to the @kbd{C-h} functions for Emacs help.
9821
9822@kindex h i
9823@kindex C-x * i
9824@kindex i
9825@pindex calc-info
9826The @kbd{h i} (@code{calc-info}) command runs the Emacs Info system
9827to read this manual on-line. This is basically the same as typing
9828@kbd{C-h i} (the regular way to run the Info system), then, if Info
9829is not already in the Calc manual, selecting the beginning of the
9830manual. The @kbd{C-x * i} command is another way to read the Calc
9831manual; it is different from @kbd{h i} in that it works any time,
9832not just inside Calc. The plain @kbd{i} key is also equivalent to
9833@kbd{h i}, though this key is obsolete and may be replaced with a
9834different command in a future version of Calc.
9835
9836@kindex h t
9837@kindex C-x * t
9838@pindex calc-tutorial
9839The @kbd{h t} (@code{calc-tutorial}) command runs the Info system on
9840the Tutorial section of the Calc manual. It is like @kbd{h i},
9841except that it selects the starting node of the tutorial rather
9842than the beginning of the whole manual. (It actually selects the
9843node ``Interactive Tutorial'' which tells a few things about
9844using the Info system before going on to the actual tutorial.)
9845The @kbd{C-x * t} key is equivalent to @kbd{h t} (but it works at
9846all times).
9847
9848@kindex h s
9849@kindex C-x * s
9850@pindex calc-info-summary
9851The @kbd{h s} (@code{calc-info-summary}) command runs the Info system
9852on the Summary node of the Calc manual. @xref{Summary}. The @kbd{C-x * s}
9853key is equivalent to @kbd{h s}.
9854
9855@kindex h k
9856@pindex calc-describe-key
9857The @kbd{h k} (@code{calc-describe-key}) command looks up a key
9858sequence in the Calc manual. For example, @kbd{h k H a S} looks
9859up the documentation on the @kbd{H a S} (@code{calc-solve-for})
9860command. This works by looking up the textual description of
9861the key(s) in the Key Index of the manual, then jumping to the
9862node indicated by the index.
9863
9864Most Calc commands do not have traditional Emacs documentation
9865strings, since the @kbd{h k} command is both more convenient and
9866more instructive. This means the regular Emacs @kbd{C-h k}
9867(@code{describe-key}) command will not be useful for Calc keystrokes.
9868
9869@kindex h c
9870@pindex calc-describe-key-briefly
9871The @kbd{h c} (@code{calc-describe-key-briefly}) command reads a
9872key sequence and displays a brief one-line description of it at
9873the bottom of the screen. It looks for the key sequence in the
9874Summary node of the Calc manual; if it doesn't find the sequence
9875there, it acts just like its regular Emacs counterpart @kbd{C-h c}
9876(@code{describe-key-briefly}). For example, @kbd{h c H a S}
9877gives the description:
9878
9879@smallexample
9880H a S runs calc-solve-for: a `H a S' v => fsolve(a,v) (?=notes)
9881@end smallexample
9882
9883@noindent
9884which means the command @kbd{H a S} or @kbd{H M-x calc-solve-for}
9885takes a value @expr{a} from the stack, prompts for a value @expr{v},
9886then applies the algebraic function @code{fsolve} to these values.
9887The @samp{?=notes} message means you can now type @kbd{?} to see
9888additional notes from the summary that apply to this command.
9889
9890@kindex h f
9891@pindex calc-describe-function
9892The @kbd{h f} (@code{calc-describe-function}) command looks up an
9893algebraic function or a command name in the Calc manual. Enter an
9894algebraic function name to look up that function in the Function
9895Index or enter a command name beginning with @samp{calc-} to look it
9896up in the Command Index. This command will also look up operator
9897symbols that can appear in algebraic formulas, like @samp{%} and
9898@samp{=>}.
9899
9900@kindex h v
9901@pindex calc-describe-variable
9902The @kbd{h v} (@code{calc-describe-variable}) command looks up a
9903variable in the Calc manual. Enter a variable name like @code{pi} or
9904@code{PlotRejects}.
9905
9906@kindex h b
9907@pindex describe-bindings
9908The @kbd{h b} (@code{calc-describe-bindings}) command is just like
9909@kbd{C-h b}, except that only local (Calc-related) key bindings are
9910listed.
9911
9912@kindex h n
9913The @kbd{h n} or @kbd{h C-n} (@code{calc-view-news}) command displays
9914the ``news'' or change history of Calc. This is kept in the file
9915@file{README}, which Calc looks for in the same directory as the Calc
9916source files.
9917
9918@kindex h C-c
9919@kindex h C-d
9920@kindex h C-w
9921The @kbd{h C-c}, @kbd{h C-d}, and @kbd{h C-w} keys display copying,
9922distribution, and warranty information about Calc. These work by
9923pulling up the appropriate parts of the ``Copying'' or ``Reporting
9924Bugs'' sections of the manual.
9925
9926@node Stack Basics, Numeric Entry, Help Commands, Introduction
9927@section Stack Basics
9928
9929@noindent
9930@cindex Stack basics
9931@c [fix-tut RPN Calculations and the Stack]
9932Calc uses RPN notation. If you are not familiar with RPN, @pxref{RPN
9933Tutorial}.
9934
9935To add the numbers 1 and 2 in Calc you would type the keys:
9936@kbd{1 @key{RET} 2 +}.
9937(@key{RET} corresponds to the @key{ENTER} key on most calculators.)
9938The first three keystrokes ``push'' the numbers 1 and 2 onto the stack. The
9939@kbd{+} key always ``pops'' the top two numbers from the stack, adds them,
9940and pushes the result (3) back onto the stack. This number is ready for
9941further calculations: @kbd{5 -} pushes 5 onto the stack, then pops the
99423 and 5, subtracts them, and pushes the result (@mathit{-2}).
9943
9944Note that the ``top'' of the stack actually appears at the @emph{bottom}
9945of the buffer. A line containing a single @samp{.} character signifies
9946the end of the buffer; Calculator commands operate on the number(s)
9947directly above this line. The @kbd{d t} (@code{calc-truncate-stack})
9948command allows you to move the @samp{.} marker up and down in the stack;
9949@pxref{Truncating the Stack}.
9950
9951@kindex d l
9952@pindex calc-line-numbering
9953Stack elements are numbered consecutively, with number 1 being the top of
9954the stack. These line numbers are ordinarily displayed on the lefthand side
9955of the window. The @kbd{d l} (@code{calc-line-numbering}) command controls
9956whether these numbers appear. (Line numbers may be turned off since they
9957slow the Calculator down a bit and also clutter the display.)
9958
9959@kindex o
9960@pindex calc-realign
9961The unshifted letter @kbd{o} (@code{calc-realign}) command repositions
9962the cursor to its top-of-stack ``home'' position. It also undoes any
9963horizontal scrolling in the window. If you give it a numeric prefix
9964argument, it instead moves the cursor to the specified stack element.
9965
9966The @key{RET} (or equivalent @key{SPC}) key is only required to separate
9967two consecutive numbers.
9968(After all, if you typed @kbd{1 2} by themselves the Calculator
9969would enter the number 12.) If you press @key{RET} or @key{SPC} @emph{not}
9970right after typing a number, the key duplicates the number on the top of
9971the stack. @kbd{@key{RET} *} is thus a handy way to square a number.
9972
9973The @key{DEL} key pops and throws away the top number on the stack.
9974The @key{TAB} key swaps the top two objects on the stack.
9975@xref{Stack and Trail}, for descriptions of these and other stack-related
9976commands.
9977
9978@node Numeric Entry, Algebraic Entry, Stack Basics, Introduction
9979@section Numeric Entry
9980
9981@noindent
9982@kindex 0-9
9983@kindex .
9984@kindex e
9985@cindex Numeric entry
9986@cindex Entering numbers
9987Pressing a digit or other numeric key begins numeric entry using the
9988minibuffer. The number is pushed on the stack when you press the @key{RET}
9989or @key{SPC} keys. If you press any other non-numeric key, the number is
9990pushed onto the stack and the appropriate operation is performed. If
9991you press a numeric key which is not valid, the key is ignored.
9992
9993@cindex Minus signs
9994@cindex Negative numbers, entering
9995@kindex _
9996There are three different concepts corresponding to the word ``minus,''
9997typified by @expr{a-b} (subtraction), @expr{-x}
9998(change-sign), and @expr{-5} (negative number). Calc uses three
9999different keys for these operations, respectively:
10000@kbd{-}, @kbd{n}, and @kbd{_} (the underscore). The @kbd{-} key subtracts
10001the two numbers on the top of the stack. The @kbd{n} key changes the sign
10002of the number on the top of the stack or the number currently being entered.
10003The @kbd{_} key begins entry of a negative number or changes the sign of
10004the number currently being entered. The following sequences all enter the
10005number @mathit{-5} onto the stack: @kbd{0 @key{RET} 5 -}, @kbd{5 n @key{RET}},
10006@kbd{5 @key{RET} n}, @kbd{_ 5 @key{RET}}, @kbd{5 _ @key{RET}}.
10007
10008Some other keys are active during numeric entry, such as @kbd{#} for
10009non-decimal numbers, @kbd{:} for fractions, and @kbd{@@} for HMS forms.
10010These notations are described later in this manual with the corresponding
10011data types. @xref{Data Types}.
10012
10013During numeric entry, the only editing key available is @key{DEL}.
10014
10015@node Algebraic Entry, Quick Calculator, Numeric Entry, Introduction
10016@section Algebraic Entry
10017
10018@noindent
10019@kindex '
10020@pindex calc-algebraic-entry
10021@cindex Algebraic notation
10022@cindex Formulas, entering
10023Calculations can also be entered in algebraic form. This is accomplished
10024by typing the apostrophe key, ', followed by the expression in
10025standard format:
10026
10027@example
10028' 2+3*4 @key{RET}.
10029@end example
10030
10031@noindent
10032This will compute
10033@texline @math{2+(3\times4) = 14}
10034@infoline @expr{2+(3*4) = 14}
10035and push it on the stack. If you wish you can
10036ignore the RPN aspect of Calc altogether and simply enter algebraic
10037expressions in this way. You may want to use @key{DEL} every so often to
10038clear previous results off the stack.
10039
10040You can press the apostrophe key during normal numeric entry to switch
10041the half-entered number into Algebraic entry mode. One reason to do this
10042would be to use the full Emacs cursor motion and editing keys, which are
10043available during algebraic entry but not during numeric entry.
10044
10045In the same vein, during either numeric or algebraic entry you can
10046press @kbd{`} (backquote) to switch to @code{calc-edit} mode, where
10047you complete your half-finished entry in a separate buffer.
10048@xref{Editing Stack Entries}.
10049
10050@kindex m a
10051@pindex calc-algebraic-mode
10052@cindex Algebraic Mode
10053If you prefer algebraic entry, you can use the command @kbd{m a}
10054(@code{calc-algebraic-mode}) to set Algebraic mode. In this mode,
10055digits and other keys that would normally start numeric entry instead
10056start full algebraic entry; as long as your formula begins with a digit
10057you can omit the apostrophe. Open parentheses and square brackets also
10058begin algebraic entry. You can still do RPN calculations in this mode,
10059but you will have to press @key{RET} to terminate every number:
10060@kbd{2 @key{RET} 3 @key{RET} * 4 @key{RET} +} would accomplish the same
10061thing as @kbd{2*3+4 @key{RET}}.
10062
10063@cindex Incomplete Algebraic Mode
10064If you give a numeric prefix argument like @kbd{C-u} to the @kbd{m a}
10065command, it enables Incomplete Algebraic mode; this is like regular
10066Algebraic mode except that it applies to the @kbd{(} and @kbd{[} keys
10067only. Numeric keys still begin a numeric entry in this mode.
10068
10069@kindex m t
10070@pindex calc-total-algebraic-mode
10071@cindex Total Algebraic Mode
10072The @kbd{m t} (@code{calc-total-algebraic-mode}) gives you an even
10073stronger algebraic-entry mode, in which @emph{all} regular letter and
10074punctuation keys begin algebraic entry. Use this if you prefer typing
10075@w{@kbd{sqrt( )}} instead of @kbd{Q}, @w{@kbd{factor( )}} instead of
10076@kbd{a f}, and so on. To type regular Calc commands when you are in
10077Total Algebraic mode, hold down the @key{META} key. Thus @kbd{M-q}
10078is the command to quit Calc, @kbd{M-p} sets the precision, and
10079@kbd{M-m t} (or @kbd{M-m M-t}, if you prefer) turns Total Algebraic
10080mode back off again. Meta keys also terminate algebraic entry, so
10081that @kbd{2+3 M-S} is equivalent to @kbd{2+3 @key{RET} M-S}. The symbol
10082@samp{Alg*} will appear in the mode line whenever you are in this mode.
10083
10084Pressing @kbd{'} (the apostrophe) a second time re-enters the previous
10085algebraic formula. You can then use the normal Emacs editing keys to
10086modify this formula to your liking before pressing @key{RET}.
10087
10088@kindex $
10089@cindex Formulas, referring to stack
10090Within a formula entered from the keyboard, the symbol @kbd{$}
10091represents the number on the top of the stack. If an entered formula
10092contains any @kbd{$} characters, the Calculator replaces the top of
10093stack with that formula rather than simply pushing the formula onto the
10094stack. Thus, @kbd{' 1+2 @key{RET}} pushes 3 on the stack, and @kbd{$*2
10095@key{RET}} replaces it with 6. Note that the @kbd{$} key always
10096initiates algebraic entry; the @kbd{'} is unnecessary if @kbd{$} is the
10097first character in the new formula.
10098
10099Higher stack elements can be accessed from an entered formula with the
10100symbols @kbd{$$}, @kbd{$$$}, and so on. The number of stack elements
10101removed (to be replaced by the entered values) equals the number of dollar
10102signs in the longest such symbol in the formula. For example, @samp{$$+$$$}
10103adds the second and third stack elements, replacing the top three elements
10104with the answer. (All information about the top stack element is thus lost
10105since no single @samp{$} appears in this formula.)
10106
10107A slightly different way to refer to stack elements is with a dollar
10108sign followed by a number: @samp{$1}, @samp{$2}, and so on are much
10109like @samp{$}, @samp{$$}, etc., except that stack entries referred
10110to numerically are not replaced by the algebraic entry. That is, while
10111@samp{$+1} replaces 5 on the stack with 6, @samp{$1+1} leaves the 5
10112on the stack and pushes an additional 6.
10113
10114If a sequence of formulas are entered separated by commas, each formula
10115is pushed onto the stack in turn. For example, @samp{1,2,3} pushes
10116those three numbers onto the stack (leaving the 3 at the top), and
10117@samp{$+1,$-1} replaces a 5 on the stack with 4 followed by 6. Also,
10118@samp{$,$$} exchanges the top two elements of the stack, just like the
10119@key{TAB} key.
10120
10121You can finish an algebraic entry with @kbd{M-=} or @kbd{M-@key{RET}} instead
10122of @key{RET}. This uses @kbd{=} to evaluate the variables in each
10123formula that goes onto the stack. (Thus @kbd{' pi @key{RET}} pushes
10124the variable @samp{pi}, but @kbd{' pi M-@key{RET}} pushes 3.1415.)
10125
10126If you finish your algebraic entry by pressing @key{LFD} (or @kbd{C-j})
10127instead of @key{RET}, Calc disables the default simplifications
10128(as if by @kbd{m O}; @pxref{Simplification Modes}) while the entry
10129is being pushed on the stack. Thus @kbd{' 1+2 @key{RET}} pushes 3
10130on the stack, but @kbd{' 1+2 @key{LFD}} pushes the formula @expr{1+2};
10131you might then press @kbd{=} when it is time to evaluate this formula.
10132
10133@node Quick Calculator, Prefix Arguments, Algebraic Entry, Introduction
10134@section ``Quick Calculator'' Mode
10135
10136@noindent
10137@kindex C-x * q
10138@pindex quick-calc
10139@cindex Quick Calculator
10140There is another way to invoke the Calculator if all you need to do
10141is make one or two quick calculations. Type @kbd{C-x * q} (or
10142@kbd{M-x quick-calc}), then type any formula as an algebraic entry.
10143The Calculator will compute the result and display it in the echo
10144area, without ever actually putting up a Calc window.
10145
10146You can use the @kbd{$} character in a Quick Calculator formula to
10147refer to the previous Quick Calculator result. Older results are
10148not retained; the Quick Calculator has no effect on the full
10149Calculator's stack or trail. If you compute a result and then
10150forget what it was, just run @code{C-x * q} again and enter
10151@samp{$} as the formula.
10152
10153If this is the first time you have used the Calculator in this Emacs
10154session, the @kbd{C-x * q} command will create the @code{*Calculator*}
10155buffer and perform all the usual initializations; it simply will
10156refrain from putting that buffer up in a new window. The Quick
10157Calculator refers to the @code{*Calculator*} buffer for all mode
10158settings. Thus, for example, to set the precision that the Quick
10159Calculator uses, simply run the full Calculator momentarily and use
10160the regular @kbd{p} command.
10161
10162If you use @code{C-x * q} from inside the Calculator buffer, the
10163effect is the same as pressing the apostrophe key (algebraic entry).
10164
10165The result of a Quick calculation is placed in the Emacs ``kill ring''
10166as well as being displayed. A subsequent @kbd{C-y} command will
10167yank the result into the editing buffer. You can also use this
10168to yank the result into the next @kbd{C-x * q} input line as a more
10169explicit alternative to @kbd{$} notation, or to yank the result
10170into the Calculator stack after typing @kbd{C-x * c}.
10171
10172If you finish your formula by typing @key{LFD} (or @kbd{C-j}) instead
10173of @key{RET}, the result is inserted immediately into the current
10174buffer rather than going into the kill ring.
10175
10176Quick Calculator results are actually evaluated as if by the @kbd{=}
10177key (which replaces variable names by their stored values, if any).
10178If the formula you enter is an assignment to a variable using the
10179@samp{:=} operator, say, @samp{foo := 2 + 3} or @samp{foo := foo + 1},
10180then the result of the evaluation is stored in that Calc variable.
10181@xref{Store and Recall}.
10182
10183If the result is an integer and the current display radix is decimal,
10184the number will also be displayed in hex, octal and binary formats. If
10185the integer is in the range from 1 to 126, it will also be displayed as
10186an ASCII character.
10187
10188For example, the quoted character @samp{"x"} produces the vector
10189result @samp{[120]} (because 120 is the ASCII code of the lower-case
10190`x'; @pxref{Strings}). Since this is a vector, not an integer, it
10191is displayed only according to the current mode settings. But
10192running Quick Calc again and entering @samp{120} will produce the
10193result @samp{120 (16#78, 8#170, x)} which shows the number in its
10194decimal, hexadecimal, octal, and ASCII forms.
10195
10196Please note that the Quick Calculator is not any faster at loading
10197or computing the answer than the full Calculator; the name ``quick''
10198merely refers to the fact that it's much less hassle to use for
10199small calculations.
10200
10201@node Prefix Arguments, Undo, Quick Calculator, Introduction
10202@section Numeric Prefix Arguments
10203
10204@noindent
10205Many Calculator commands use numeric prefix arguments. Some, such as
10206@kbd{d s} (@code{calc-sci-notation}), set a parameter to the value of
10207the prefix argument or use a default if you don't use a prefix.
10208Others (like @kbd{d f} (@code{calc-fix-notation})) require an argument
10209and prompt for a number if you don't give one as a prefix.
10210
10211As a rule, stack-manipulation commands accept a numeric prefix argument
10212which is interpreted as an index into the stack. A positive argument
10213operates on the top @var{n} stack entries; a negative argument operates
10214on the @var{n}th stack entry in isolation; and a zero argument operates
10215on the entire stack.
10216
10217Most commands that perform computations (such as the arithmetic and
10218scientific functions) accept a numeric prefix argument that allows the
10219operation to be applied across many stack elements. For unary operations
10220(that is, functions of one argument like absolute value or complex
10221conjugate), a positive prefix argument applies that function to the top
10222@var{n} stack entries simultaneously, and a negative argument applies it
10223to the @var{n}th stack entry only. For binary operations (functions of
10224two arguments like addition, GCD, and vector concatenation), a positive
10225prefix argument ``reduces'' the function across the top @var{n}
10226stack elements (for example, @kbd{C-u 5 +} sums the top 5 stack entries;
10227@pxref{Reducing and Mapping}), and a negative argument maps the next-to-top
10228@var{n} stack elements with the top stack element as a second argument
10229(for example, @kbd{7 c-u -5 +} adds 7 to the top 5 stack elements).
10230This feature is not available for operations which use the numeric prefix
10231argument for some other purpose.
10232
10233Numeric prefixes are specified the same way as always in Emacs: Press
10234a sequence of @key{META}-digits, or press @key{ESC} followed by digits,
10235or press @kbd{C-u} followed by digits. Some commands treat plain
10236@kbd{C-u} (without any actual digits) specially.
10237
10238@kindex ~
10239@pindex calc-num-prefix
10240You can type @kbd{~} (@code{calc-num-prefix}) to pop an integer from the
10241top of the stack and enter it as the numeric prefix for the next command.
10242For example, @kbd{C-u 16 p} sets the precision to 16 digits; an alternate
10243(silly) way to do this would be @kbd{2 @key{RET} 4 ^ ~ p}, i.e., compute 2
10244to the fourth power and set the precision to that value.
10245
10246Conversely, if you have typed a numeric prefix argument the @kbd{~} key
10247pushes it onto the stack in the form of an integer.
10248
10249@node Undo, Error Messages, Prefix Arguments, Introduction
10250@section Undoing Mistakes
10251
10252@noindent
10253@kindex U
10254@kindex C-_
10255@pindex calc-undo
10256@cindex Mistakes, undoing
10257@cindex Undoing mistakes
10258@cindex Errors, undoing
10259The shift-@kbd{U} key (@code{calc-undo}) undoes the most recent operation.
10260If that operation added or dropped objects from the stack, those objects
10261are removed or restored. If it was a ``store'' operation, you are
10262queried whether or not to restore the variable to its original value.
10263The @kbd{U} key may be pressed any number of times to undo successively
10264farther back in time; with a numeric prefix argument it undoes a
10265specified number of operations. The undo history is cleared only by the
10266@kbd{q} (@code{calc-quit}) command. (Recall that @kbd{C-x * c} is
10267synonymous with @code{calc-quit} while inside the Calculator; this
10268also clears the undo history.)
10269
10270Currently the mode-setting commands (like @code{calc-precision}) are not
10271undoable. You can undo past a point where you changed a mode, but you
10272will need to reset the mode yourself.
10273
10274@kindex D
10275@pindex calc-redo
10276@cindex Redoing after an Undo
10277The shift-@kbd{D} key (@code{calc-redo}) redoes an operation that was
10278mistakenly undone. Pressing @kbd{U} with a negative prefix argument is
10279equivalent to executing @code{calc-redo}. You can redo any number of
10280times, up to the number of recent consecutive undo commands. Redo
10281information is cleared whenever you give any command that adds new undo
10282information, i.e., if you undo, then enter a number on the stack or make
10283any other change, then it will be too late to redo.
10284
10285@kindex M-@key{RET}
10286@pindex calc-last-args
10287@cindex Last-arguments feature
10288@cindex Arguments, restoring
10289The @kbd{M-@key{RET}} key (@code{calc-last-args}) is like undo in that
10290it restores the arguments of the most recent command onto the stack;
10291however, it does not remove the result of that command. Given a numeric
10292prefix argument, this command applies to the @expr{n}th most recent
10293command which removed items from the stack; it pushes those items back
10294onto the stack.
10295
10296The @kbd{K} (@code{calc-keep-args}) command provides a related function
10297to @kbd{M-@key{RET}}. @xref{Stack and Trail}.
10298
10299It is also possible to recall previous results or inputs using the trail.
10300@xref{Trail Commands}.
10301
10302The standard Emacs @kbd{C-_} undo key is recognized as a synonym for @kbd{U}.
10303
10304@node Error Messages, Multiple Calculators, Undo, Introduction
10305@section Error Messages
10306
10307@noindent
10308@kindex w
10309@pindex calc-why
10310@cindex Errors, messages
10311@cindex Why did an error occur?
10312Many situations that would produce an error message in other calculators
10313simply create unsimplified formulas in the Emacs Calculator. For example,
10314@kbd{1 @key{RET} 0 /} pushes the formula @expr{1 / 0}; @w{@kbd{0 L}} pushes
10315the formula @samp{ln(0)}. Floating-point overflow and underflow are also
10316reasons for this to happen.
10317
10318When a function call must be left in symbolic form, Calc usually
10319produces a message explaining why. Messages that are probably
10320surprising or indicative of user errors are displayed automatically.
10321Other messages are simply kept in Calc's memory and are displayed only
10322if you type @kbd{w} (@code{calc-why}). You can also press @kbd{w} if
10323the same computation results in several messages. (The first message
10324will end with @samp{[w=more]} in this case.)
10325
10326@kindex d w
10327@pindex calc-auto-why
10328The @kbd{d w} (@code{calc-auto-why}) command controls when error messages
10329are displayed automatically. (Calc effectively presses @kbd{w} for you
10330after your computation finishes.) By default, this occurs only for
10331``important'' messages. The other possible modes are to report
10332@emph{all} messages automatically, or to report none automatically (so
10333that you must always press @kbd{w} yourself to see the messages).
10334
10335@node Multiple Calculators, Troubleshooting Commands, Error Messages, Introduction
10336@section Multiple Calculators
10337
10338@noindent
10339@pindex another-calc
10340It is possible to have any number of Calc mode buffers at once.
10341Usually this is done by executing @kbd{M-x another-calc}, which
10342is similar to @kbd{C-x * c} except that if a @samp{*Calculator*}
10343buffer already exists, a new, independent one with a name of the
10344form @samp{*Calculator*<@var{n}>} is created. You can also use the
10345command @code{calc-mode} to put any buffer into Calculator mode, but
10346this would ordinarily never be done.
10347
10348The @kbd{q} (@code{calc-quit}) command does not destroy a Calculator buffer;
10349it only closes its window. Use @kbd{M-x kill-buffer} to destroy a
10350Calculator buffer.
10351
10352Each Calculator buffer keeps its own stack, undo list, and mode settings
10353such as precision, angular mode, and display formats. In Emacs terms,
10354variables such as @code{calc-stack} are buffer-local variables. The
10355global default values of these variables are used only when a new
10356Calculator buffer is created. The @code{calc-quit} command saves
10357the stack and mode settings of the buffer being quit as the new defaults.
10358
10359There is only one trail buffer, @samp{*Calc Trail*}, used by all
10360Calculator buffers.
10361
10362@node Troubleshooting Commands, , Multiple Calculators, Introduction
10363@section Troubleshooting Commands
10364
10365@noindent
10366This section describes commands you can use in case a computation
10367incorrectly fails or gives the wrong answer.
10368
10369@xref{Reporting Bugs}, if you find a problem that appears to be due
10370to a bug or deficiency in Calc.
10371
10372@menu
10373* Autoloading Problems::
10374* Recursion Depth::
10375* Caches::
10376* Debugging Calc::
10377@end menu
10378
10379@node Autoloading Problems, Recursion Depth, Troubleshooting Commands, Troubleshooting Commands
10380@subsection Autoloading Problems
10381
10382@noindent
10383The Calc program is split into many component files; components are
10384loaded automatically as you use various commands that require them.
10385Occasionally Calc may lose track of when a certain component is
10386necessary; typically this means you will type a command and it won't
10387work because some function you've never heard of was undefined.
10388
10389@kindex C-x * L
10390@pindex calc-load-everything
10391If this happens, the easiest workaround is to type @kbd{C-x * L}
10392(@code{calc-load-everything}) to force all the parts of Calc to be
10393loaded right away. This will cause Emacs to take up a lot more
10394memory than it would otherwise, but it's guaranteed to fix the problem.
10395
10396@node Recursion Depth, Caches, Autoloading Problems, Troubleshooting Commands
10397@subsection Recursion Depth
10398
10399@noindent
10400@kindex M
10401@kindex I M
10402@pindex calc-more-recursion-depth
10403@pindex calc-less-recursion-depth
10404@cindex Recursion depth
10405@cindex ``Computation got stuck'' message
10406@cindex @code{max-lisp-eval-depth}
10407@cindex @code{max-specpdl-size}
10408Calc uses recursion in many of its calculations. Emacs Lisp keeps a
10409variable @code{max-lisp-eval-depth} which limits the amount of recursion
10410possible in an attempt to recover from program bugs. If a calculation
10411ever halts incorrectly with the message ``Computation got stuck or
10412ran too long,'' use the @kbd{M} command (@code{calc-more-recursion-depth})
10413to increase this limit. (Of course, this will not help if the
10414calculation really did get stuck due to some problem inside Calc.)
10415
10416The limit is always increased (multiplied) by a factor of two. There
10417is also an @kbd{I M} (@code{calc-less-recursion-depth}) command which
10418decreases this limit by a factor of two, down to a minimum value of 200.
10419The default value is 1000.
10420
10421These commands also double or halve @code{max-specpdl-size}, another
10422internal Lisp recursion limit. The minimum value for this limit is 600.
10423
10424@node Caches, Debugging Calc, Recursion Depth, Troubleshooting Commands
10425@subsection Caches
10426
10427@noindent
10428@cindex Caches
10429@cindex Flushing caches
10430Calc saves certain values after they have been computed once. For
10431example, the @kbd{P} (@code{calc-pi}) command initially ``knows'' the
10432constant @cpi{} to about 20 decimal places; if the current precision
10433is greater than this, it will recompute @cpi{} using a series
10434approximation. This value will not need to be recomputed ever again
10435unless you raise the precision still further. Many operations such as
10436logarithms and sines make use of similarly cached values such as
10437@cpiover{4} and
10438@texline @math{\ln 2}.
10439@infoline @expr{ln(2)}.
10440The visible effect of caching is that
10441high-precision computations may seem to do extra work the first time.
10442Other things cached include powers of two (for the binary arithmetic
10443functions), matrix inverses and determinants, symbolic integrals, and
10444data points computed by the graphing commands.
10445
10446@pindex calc-flush-caches
10447If you suspect a Calculator cache has become corrupt, you can use the
10448@code{calc-flush-caches} command to reset all caches to the empty state.
10449(This should only be necessary in the event of bugs in the Calculator.)
10450The @kbd{C-x * 0} (with the zero key) command also resets caches along
10451with all other aspects of the Calculator's state.
10452
10453@node Debugging Calc, , Caches, Troubleshooting Commands
10454@subsection Debugging Calc
10455
10456@noindent
10457A few commands exist to help in the debugging of Calc commands.
10458@xref{Programming}, to see the various ways that you can write
10459your own Calc commands.
10460
10461@kindex Z T
10462@pindex calc-timing
10463The @kbd{Z T} (@code{calc-timing}) command turns on and off a mode
10464in which the timing of slow commands is reported in the Trail.
10465Any Calc command that takes two seconds or longer writes a line
10466to the Trail showing how many seconds it took. This value is
10467accurate only to within one second.
10468
10469All steps of executing a command are included; in particular, time
10470taken to format the result for display in the stack and trail is
10471counted. Some prompts also count time taken waiting for them to
10472be answered, while others do not; this depends on the exact
10473implementation of the command. For best results, if you are timing
10474a sequence that includes prompts or multiple commands, define a
10475keyboard macro to run the whole sequence at once. Calc's @kbd{X}
10476command (@pxref{Keyboard Macros}) will then report the time taken
10477to execute the whole macro.
10478
10479Another advantage of the @kbd{X} command is that while it is
10480executing, the stack and trail are not updated from step to step.
10481So if you expect the output of your test sequence to leave a result
10482that may take a long time to format and you don't wish to count
10483this formatting time, end your sequence with a @key{DEL} keystroke
10484to clear the result from the stack. When you run the sequence with
10485@kbd{X}, Calc will never bother to format the large result.
10486
10487Another thing @kbd{Z T} does is to increase the Emacs variable
10488@code{gc-cons-threshold} to a much higher value (two million; the
10489usual default in Calc is 250,000) for the duration of each command.
10490This generally prevents garbage collection during the timing of
10491the command, though it may cause your Emacs process to grow
10492abnormally large. (Garbage collection time is a major unpredictable
10493factor in the timing of Emacs operations.)
10494
10495Another command that is useful when debugging your own Lisp
10496extensions to Calc is @kbd{M-x calc-pass-errors}, which disables
10497the error handler that changes the ``@code{max-lisp-eval-depth}
10498exceeded'' message to the much more friendly ``Computation got
10499stuck or ran too long.'' This handler interferes with the Emacs
10500Lisp debugger's @code{debug-on-error} mode. Errors are reported
10501in the handler itself rather than at the true location of the
10502error. After you have executed @code{calc-pass-errors}, Lisp
10503errors will be reported correctly but the user-friendly message
10504will be lost.
10505
10506@node Data Types, Stack and Trail, Introduction, Top
10507@chapter Data Types
10508
10509@noindent
10510This chapter discusses the various types of objects that can be placed
10511on the Calculator stack, how they are displayed, and how they are
10512entered. (@xref{Data Type Formats}, for information on how these data
10513types are represented as underlying Lisp objects.)
10514
10515Integers, fractions, and floats are various ways of describing real
10516numbers. HMS forms also for many purposes act as real numbers. These
10517types can be combined to form complex numbers, modulo forms, error forms,
10518or interval forms. (But these last four types cannot be combined
10519arbitrarily:@: error forms may not contain modulo forms, for example.)
10520Finally, all these types of numbers may be combined into vectors,
10521matrices, or algebraic formulas.
10522
10523@menu
10524* Integers:: The most basic data type.
10525* Fractions:: This and above are called @dfn{rationals}.
10526* Floats:: This and above are called @dfn{reals}.
10527* Complex Numbers:: This and above are called @dfn{numbers}.
10528* Infinities::
10529* Vectors and Matrices::
10530* Strings::
10531* HMS Forms::
10532* Date Forms::
10533* Modulo Forms::
10534* Error Forms::
10535* Interval Forms::
10536* Incomplete Objects::
10537* Variables::
10538* Formulas::
10539@end menu
10540
10541@node Integers, Fractions, Data Types, Data Types
10542@section Integers
10543
10544@noindent
10545@cindex Integers
10546The Calculator stores integers to arbitrary precision. Addition,
10547subtraction, and multiplication of integers always yields an exact
10548integer result. (If the result of a division or exponentiation of
10549integers is not an integer, it is expressed in fractional or
10550floating-point form according to the current Fraction mode.
10551@xref{Fraction Mode}.)
10552
10553A decimal integer is represented as an optional sign followed by a
10554sequence of digits. Grouping (@pxref{Grouping Digits}) can be used to
10555insert a comma at every third digit for display purposes, but you
10556must not type commas during the entry of numbers.
10557
10558@kindex #
10559A non-decimal integer is represented as an optional sign, a radix
10560between 2 and 36, a @samp{#} symbol, and one or more digits. For radix 11
10561and above, the letters A through Z (upper- or lower-case) count as
10562digits and do not terminate numeric entry mode. @xref{Radix Modes}, for how
10563to set the default radix for display of integers. Numbers of any radix
10564may be entered at any time. If you press @kbd{#} at the beginning of a
10565number, the current display radix is used.
10566
10567@node Fractions, Floats, Integers, Data Types
10568@section Fractions
10569
10570@noindent
10571@cindex Fractions
10572A @dfn{fraction} is a ratio of two integers. Fractions are traditionally
10573written ``2/3'' but Calc uses the notation @samp{2:3}. (The @kbd{/} key
10574performs RPN division; the following two sequences push the number
10575@samp{2:3} on the stack: @kbd{2 :@: 3 @key{RET}}, or @kbd{2 @key{RET} 3 /}
10576assuming Fraction mode has been enabled.)
10577When the Calculator produces a fractional result it always reduces it to
10578simplest form, which may in fact be an integer.
10579
10580Fractions may also be entered in a three-part form, where @samp{2:3:4}
10581represents two-and-three-quarters. @xref{Fraction Formats}, for fraction
10582display formats.
10583
10584Non-decimal fractions are entered and displayed as
10585@samp{@var{radix}#@var{num}:@var{denom}} (or in the analogous three-part
10586form). The numerator and denominator always use the same radix.
10587
10588@node Floats, Complex Numbers, Fractions, Data Types
10589@section Floats
10590
10591@noindent
10592@cindex Floating-point numbers
10593A floating-point number or @dfn{float} is a number stored in scientific
10594notation. The number of significant digits in the fractional part is
10595governed by the current floating precision (@pxref{Precision}). The
10596range of acceptable values is from
10597@texline @math{10^{-3999999}}
10598@infoline @expr{10^-3999999}
10599(inclusive) to
10600@texline @math{10^{4000000}}
10601@infoline @expr{10^4000000}
10602(exclusive), plus the corresponding negative values and zero.
10603
10604Calculations that would exceed the allowable range of values (such
10605as @samp{exp(exp(20))}) are left in symbolic form by Calc. The
10606messages ``floating-point overflow'' or ``floating-point underflow''
10607indicate that during the calculation a number would have been produced
10608that was too large or too close to zero, respectively, to be represented
10609by Calc. This does not necessarily mean the final result would have
10610overflowed, just that an overflow occurred while computing the result.
10611(In fact, it could report an underflow even though the final result
10612would have overflowed!)
10613
10614If a rational number and a float are mixed in a calculation, the result
10615will in general be expressed as a float. Commands that require an integer
10616value (such as @kbd{k g} [@code{gcd}]) will also accept integer-valued
10617floats, i.e., floating-point numbers with nothing after the decimal point.
10618
10619Floats are identified by the presence of a decimal point and/or an
10620exponent. In general a float consists of an optional sign, digits
10621including an optional decimal point, and an optional exponent consisting
10622of an @samp{e}, an optional sign, and up to seven exponent digits.
10623For example, @samp{23.5e-2} is 23.5 times ten to the minus-second power,
10624or 0.235.
10625
10626Floating-point numbers are normally displayed in decimal notation with
10627all significant figures shown. Exceedingly large or small numbers are
10628displayed in scientific notation. Various other display options are
10629available. @xref{Float Formats}.
10630
10631@cindex Accuracy of calculations
10632Floating-point numbers are stored in decimal, not binary. The result
10633of each operation is rounded to the nearest value representable in the
10634number of significant digits specified by the current precision,
10635rounding away from zero in the case of a tie. Thus (in the default
10636display mode) what you see is exactly what you get. Some operations such
10637as square roots and transcendental functions are performed with several
10638digits of extra precision and then rounded down, in an effort to make the
10639final result accurate to the full requested precision. However,
10640accuracy is not rigorously guaranteed. If you suspect the validity of a
10641result, try doing the same calculation in a higher precision. The
10642Calculator's arithmetic is not intended to be IEEE-conformant in any
10643way.
10644
10645While floats are always @emph{stored} in decimal, they can be entered
10646and displayed in any radix just like integers and fractions. Since a
10647float that is entered in a radix other that 10 will be converted to
10648decimal, the number that Calc stores may not be exactly the number that
10649was entered, it will be the closest decimal approximation given the
10650current precison. The notation @samp{@var{radix}#@var{ddd}.@var{ddd}}
10651is a floating-point number whose digits are in the specified radix.
10652Note that the @samp{.} is more aptly referred to as a ``radix point''
10653than as a decimal point in this case. The number @samp{8#123.4567} is
10654defined as @samp{8#1234567 * 8^-4}. If the radix is 14 or less, you can
10655use @samp{e} notation to write a non-decimal number in scientific
10656notation. The exponent is written in decimal, and is considered to be a
10657power of the radix: @samp{8#1234567e-4}. If the radix is 15 or above,
10658the letter @samp{e} is a digit, so scientific notation must be written
10659out, e.g., @samp{16#123.4567*16^2}. The first two exercises of the
10660Modes Tutorial explore some of the properties of non-decimal floats.
10661
10662@node Complex Numbers, Infinities, Floats, Data Types
10663@section Complex Numbers
10664
10665@noindent
10666@cindex Complex numbers
10667There are two supported formats for complex numbers: rectangular and
10668polar. The default format is rectangular, displayed in the form
10669@samp{(@var{real},@var{imag})} where @var{real} is the real part and
10670@var{imag} is the imaginary part, each of which may be any real number.
10671Rectangular complex numbers can also be displayed in @samp{@var{a}+@var{b}i}
10672notation; @pxref{Complex Formats}.
10673
10674Polar complex numbers are displayed in the form
10675@texline `@tfn{(}@var{r}@tfn{;}@math{\theta}@tfn{)}'
10676@infoline `@tfn{(}@var{r}@tfn{;}@var{theta}@tfn{)}'
10677where @var{r} is the nonnegative magnitude and
10678@texline @math{\theta}
10679@infoline @var{theta}
10680is the argument or phase angle. The range of
10681@texline @math{\theta}
10682@infoline @var{theta}
10683depends on the current angular mode (@pxref{Angular Modes}); it is
10684generally between @mathit{-180} and @mathit{+180} degrees or the equivalent range
10685in radians.
10686
10687Complex numbers are entered in stages using incomplete objects.
10688@xref{Incomplete Objects}.
10689
10690Operations on rectangular complex numbers yield rectangular complex
10691results, and similarly for polar complex numbers. Where the two types
10692are mixed, or where new complex numbers arise (as for the square root of
10693a negative real), the current @dfn{Polar mode} is used to determine the
10694type. @xref{Polar Mode}.
10695
10696A complex result in which the imaginary part is zero (or the phase angle
10697is 0 or 180 degrees or @cpi{} radians) is automatically converted to a real
10698number.
10699
10700@node Infinities, Vectors and Matrices, Complex Numbers, Data Types
10701@section Infinities
10702
10703@noindent
10704@cindex Infinity
10705@cindex @code{inf} variable
10706@cindex @code{uinf} variable
10707@cindex @code{nan} variable
10708@vindex inf
10709@vindex uinf
10710@vindex nan
10711The word @code{inf} represents the mathematical concept of @dfn{infinity}.
10712Calc actually has three slightly different infinity-like values:
10713@code{inf}, @code{uinf}, and @code{nan}. These are just regular
10714variable names (@pxref{Variables}); you should avoid using these
10715names for your own variables because Calc gives them special
10716treatment. Infinities, like all variable names, are normally
10717entered using algebraic entry.
10718
10719Mathematically speaking, it is not rigorously correct to treat
10720``infinity'' as if it were a number, but mathematicians often do
10721so informally. When they say that @samp{1 / inf = 0}, what they
10722really mean is that @expr{1 / x}, as @expr{x} becomes larger and
10723larger, becomes arbitrarily close to zero. So you can imagine
10724that if @expr{x} got ``all the way to infinity,'' then @expr{1 / x}
10725would go all the way to zero. Similarly, when they say that
10726@samp{exp(inf) = inf}, they mean that
10727@texline @math{e^x}
10728@infoline @expr{exp(x)}
10729grows without bound as @expr{x} grows. The symbol @samp{-inf} likewise
10730stands for an infinitely negative real value; for example, we say that
10731@samp{exp(-inf) = 0}. You can have an infinity pointing in any
10732direction on the complex plane: @samp{sqrt(-inf) = i inf}.
10733
10734The same concept of limits can be used to define @expr{1 / 0}. We
10735really want the value that @expr{1 / x} approaches as @expr{x}
10736approaches zero. But if all we have is @expr{1 / 0}, we can't
10737tell which direction @expr{x} was coming from. If @expr{x} was
10738positive and decreasing toward zero, then we should say that
10739@samp{1 / 0 = inf}. But if @expr{x} was negative and increasing
10740toward zero, the answer is @samp{1 / 0 = -inf}. In fact, @expr{x}
10741could be an imaginary number, giving the answer @samp{i inf} or
10742@samp{-i inf}. Calc uses the special symbol @samp{uinf} to mean
10743@dfn{undirected infinity}, i.e., a value which is infinitely
10744large but with an unknown sign (or direction on the complex plane).
10745
10746Calc actually has three modes that say how infinities are handled.
10747Normally, infinities never arise from calculations that didn't
10748already have them. Thus, @expr{1 / 0} is treated simply as an
10749error and left unevaluated. The @kbd{m i} (@code{calc-infinite-mode})
10750command (@pxref{Infinite Mode}) enables a mode in which
10751@expr{1 / 0} evaluates to @code{uinf} instead. There is also
10752an alternative type of infinite mode which says to treat zeros
10753as if they were positive, so that @samp{1 / 0 = inf}. While this
10754is less mathematically correct, it may be the answer you want in
10755some cases.
10756
10757Since all infinities are ``as large'' as all others, Calc simplifies,
10758e.g., @samp{5 inf} to @samp{inf}. Another example is
10759@samp{5 - inf = -inf}, where the @samp{-inf} is so large that
10760adding a finite number like five to it does not affect it.
10761Note that @samp{a - inf} also results in @samp{-inf}; Calc assumes
10762that variables like @code{a} always stand for finite quantities.
10763Just to show that infinities really are all the same size,
10764note that @samp{sqrt(inf) = inf^2 = exp(inf) = inf} in Calc's
10765notation.
10766
10767It's not so easy to define certain formulas like @samp{0 * inf} and
10768@samp{inf / inf}. Depending on where these zeros and infinities
10769came from, the answer could be literally anything. The latter
10770formula could be the limit of @expr{x / x} (giving a result of one),
10771or @expr{2 x / x} (giving two), or @expr{x^2 / x} (giving @code{inf}),
10772or @expr{x / x^2} (giving zero). Calc uses the symbol @code{nan}
10773to represent such an @dfn{indeterminate} value. (The name ``nan''
10774comes from analogy with the ``NAN'' concept of IEEE standard
10775arithmetic; it stands for ``Not A Number.'' This is somewhat of a
10776misnomer, since @code{nan} @emph{does} stand for some number or
10777infinity, it's just that @emph{which} number it stands for
10778cannot be determined.) In Calc's notation, @samp{0 * inf = nan}
10779and @samp{inf / inf = nan}. A few other common indeterminate
10780expressions are @samp{inf - inf} and @samp{inf ^ 0}. Also,
10781@samp{0 / 0 = nan} if you have turned on Infinite mode
10782(as described above).
10783
10784Infinities are especially useful as parts of @dfn{intervals}.
10785@xref{Interval Forms}.
10786
10787@node Vectors and Matrices, Strings, Infinities, Data Types
10788@section Vectors and Matrices
10789
10790@noindent
10791@cindex Vectors
10792@cindex Plain vectors
10793@cindex Matrices
10794The @dfn{vector} data type is flexible and general. A vector is simply a
10795list of zero or more data objects. When these objects are numbers, the
10796whole is a vector in the mathematical sense. When these objects are
10797themselves vectors of equal (nonzero) length, the whole is a @dfn{matrix}.
10798A vector which is not a matrix is referred to here as a @dfn{plain vector}.
10799
10800A vector is displayed as a list of values separated by commas and enclosed
10801in square brackets: @samp{[1, 2, 3]}. Thus the following is a 2 row by
108023 column matrix: @samp{[[1, 2, 3], [4, 5, 6]]}. Vectors, like complex
10803numbers, are entered as incomplete objects. @xref{Incomplete Objects}.
10804During algebraic entry, vectors are entered all at once in the usual
10805brackets-and-commas form. Matrices may be entered algebraically as nested
10806vectors, or using the shortcut notation @w{@samp{[1, 2, 3; 4, 5, 6]}},
10807with rows separated by semicolons. The commas may usually be omitted
10808when entering vectors: @samp{[1 2 3]}. Curly braces may be used in
10809place of brackets: @samp{@{1, 2, 3@}}, but the commas are required in
10810this case.
10811
10812Traditional vector and matrix arithmetic is also supported;
10813@pxref{Basic Arithmetic} and @pxref{Matrix Functions}.
10814Many other operations are applied to vectors element-wise. For example,
10815the complex conjugate of a vector is a vector of the complex conjugates
10816of its elements.
10817
10818@ignore
10819@starindex
10820@end ignore
10821@tindex vec
10822Algebraic functions for building vectors include @samp{vec(a, b, c)}
10823to build @samp{[a, b, c]}, @samp{cvec(a, n, m)} to build an
10824@texline @math{n\times m}
10825@infoline @var{n}x@var{m}
10826matrix of @samp{a}s, and @samp{index(n)} to build a vector of integers
10827from 1 to @samp{n}.
10828
10829@node Strings, HMS Forms, Vectors and Matrices, Data Types
10830@section Strings
10831
10832@noindent
10833@kindex "
10834@cindex Strings
10835@cindex Character strings
10836Character strings are not a special data type in the Calculator.
10837Rather, a string is represented simply as a vector all of whose
10838elements are integers in the range 0 to 255 (ASCII codes). You can
10839enter a string at any time by pressing the @kbd{"} key. Quotation
10840marks and backslashes are written @samp{\"} and @samp{\\}, respectively,
10841inside strings. Other notations introduced by backslashes are:
10842
10843@example
10844@group
10845\a 7 \^@@ 0
10846\b 8 \^a-z 1-26
10847\e 27 \^[ 27
10848\f 12 \^\\ 28
10849\n 10 \^] 29
10850\r 13 \^^ 30
10851\t 9 \^_ 31
10852 \^? 127
10853@end group
10854@end example
10855
10856@noindent
10857Finally, a backslash followed by three octal digits produces any
10858character from its ASCII code.
10859
10860@kindex d "
10861@pindex calc-display-strings
10862Strings are normally displayed in vector-of-integers form. The
10863@w{@kbd{d "}} (@code{calc-display-strings}) command toggles a mode in
10864which any vectors of small integers are displayed as quoted strings
10865instead.
10866
10867The backslash notations shown above are also used for displaying
10868strings. Characters 128 and above are not translated by Calc; unless
10869you have an Emacs modified for 8-bit fonts, these will show up in
10870backslash-octal-digits notation. For characters below 32, and
10871for character 127, Calc uses the backslash-letter combination if
10872there is one, or otherwise uses a @samp{\^} sequence.
10873
10874The only Calc feature that uses strings is @dfn{compositions};
10875@pxref{Compositions}. Strings also provide a convenient
10876way to do conversions between ASCII characters and integers.
10877
10878@ignore
10879@starindex
10880@end ignore
10881@tindex string
10882There is a @code{string} function which provides a different display
10883format for strings. Basically, @samp{string(@var{s})}, where @var{s}
10884is a vector of integers in the proper range, is displayed as the
10885corresponding string of characters with no surrounding quotation
10886marks or other modifications. Thus @samp{string("ABC")} (or
10887@samp{string([65 66 67])}) will look like @samp{ABC} on the stack.
10888This happens regardless of whether @w{@kbd{d "}} has been used. The
10889only way to turn it off is to use @kbd{d U} (unformatted language
10890mode) which will display @samp{string("ABC")} instead.
10891
10892Control characters are displayed somewhat differently by @code{string}.
10893Characters below 32, and character 127, are shown using @samp{^} notation
10894(same as shown above, but without the backslash). The quote and
10895backslash characters are left alone, as are characters 128 and above.
10896
10897@ignore
10898@starindex
10899@end ignore
10900@tindex bstring
10901The @code{bstring} function is just like @code{string} except that
10902the resulting string is breakable across multiple lines if it doesn't
10903fit all on one line. Potential break points occur at every space
10904character in the string.
10905
10906@node HMS Forms, Date Forms, Strings, Data Types
10907@section HMS Forms
10908
10909@noindent
10910@cindex Hours-minutes-seconds forms
10911@cindex Degrees-minutes-seconds forms
10912@dfn{HMS} stands for Hours-Minutes-Seconds; when used as an angular
10913argument, the interpretation is Degrees-Minutes-Seconds. All functions
10914that operate on angles accept HMS forms. These are interpreted as
10915degrees regardless of the current angular mode. It is also possible to
10916use HMS as the angular mode so that calculated angles are expressed in
10917degrees, minutes, and seconds.
10918
10919@kindex @@
10920@ignore
10921@mindex @null
10922@end ignore
10923@kindex ' (HMS forms)
10924@ignore
10925@mindex @null
10926@end ignore
10927@kindex " (HMS forms)
10928@ignore
10929@mindex @null
10930@end ignore
10931@kindex h (HMS forms)
10932@ignore
10933@mindex @null
10934@end ignore
10935@kindex o (HMS forms)
10936@ignore
10937@mindex @null
10938@end ignore
10939@kindex m (HMS forms)
10940@ignore
10941@mindex @null
10942@end ignore
10943@kindex s (HMS forms)
10944The default format for HMS values is
10945@samp{@var{hours}@@ @var{mins}' @var{secs}"}. During entry, the letters
10946@samp{h} (for ``hours'') or
10947@samp{o} (approximating the ``degrees'' symbol) are accepted as well as
10948@samp{@@}, @samp{m} is accepted in place of @samp{'}, and @samp{s} is
10949accepted in place of @samp{"}.
10950The @var{hours} value is an integer (or integer-valued float).
10951The @var{mins} value is an integer or integer-valued float between 0 and 59.
10952The @var{secs} value is a real number between 0 (inclusive) and 60
10953(exclusive). A positive HMS form is interpreted as @var{hours} +
10954@var{mins}/60 + @var{secs}/3600. A negative HMS form is interpreted
10955as @mathit{- @var{hours}} @mathit{-} @var{mins}/60 @mathit{-} @var{secs}/3600.
10956Display format for HMS forms is quite flexible. @xref{HMS Formats}.
10957
10958HMS forms can be added and subtracted. When they are added to numbers,
10959the numbers are interpreted according to the current angular mode. HMS
10960forms can also be multiplied and divided by real numbers. Dividing
10961two HMS forms produces a real-valued ratio of the two angles.
10962
10963@pindex calc-time
10964@cindex Time of day
10965Just for kicks, @kbd{M-x calc-time} pushes the current time of day on
10966the stack as an HMS form.
10967
10968@node Date Forms, Modulo Forms, HMS Forms, Data Types
10969@section Date Forms
10970
10971@noindent
10972@cindex Date forms
10973A @dfn{date form} represents a date and possibly an associated time.
10974Simple date arithmetic is supported: Adding a number to a date
10975produces a new date shifted by that many days; adding an HMS form to
10976a date shifts it by that many hours. Subtracting two date forms
10977computes the number of days between them (represented as a simple
10978number). Many other operations, such as multiplying two date forms,
10979are nonsensical and are not allowed by Calc.
10980
10981Date forms are entered and displayed enclosed in @samp{< >} brackets.
10982The default format is, e.g., @samp{<Wed Jan 9, 1991>} for dates,
10983or @samp{<3:32:20pm Wed Jan 9, 1991>} for dates with times.
10984Input is flexible; date forms can be entered in any of the usual
10985notations for dates and times. @xref{Date Formats}.
10986
10987Date forms are stored internally as numbers, specifically the number
10988of days since midnight on the morning of January 1 of the year 1 AD.
10989If the internal number is an integer, the form represents a date only;
10990if the internal number is a fraction or float, the form represents
10991a date and time. For example, @samp{<6:00am Wed Jan 9, 1991>}
10992is represented by the number 726842.25. The standard precision of
1099312 decimal digits is enough to ensure that a (reasonable) date and
10994time can be stored without roundoff error.
10995
10996If the current precision is greater than 12, date forms will keep
10997additional digits in the seconds position. For example, if the
10998precision is 15, the seconds will keep three digits after the
10999decimal point. Decreasing the precision below 12 may cause the
11000time part of a date form to become inaccurate. This can also happen
11001if astronomically high years are used, though this will not be an
11002issue in everyday (or even everymillennium) use. Note that date
11003forms without times are stored as exact integers, so roundoff is
11004never an issue for them.
11005
11006You can use the @kbd{v p} (@code{calc-pack}) and @kbd{v u}
11007(@code{calc-unpack}) commands to get at the numerical representation
11008of a date form. @xref{Packing and Unpacking}.
11009
11010Date forms can go arbitrarily far into the future or past. Negative
11011year numbers represent years BC. Calc uses a combination of the
11012Gregorian and Julian calendars, following the history of Great
11013Britain and the British colonies. This is the same calendar that
11014is used by the @code{cal} program in most Unix implementations.
11015
11016@cindex Julian calendar
11017@cindex Gregorian calendar
11018Some historical background: The Julian calendar was created by
11019Julius Caesar in the year 46 BC as an attempt to fix the gradual
11020drift caused by the lack of leap years in the calendar used
11021until that time. The Julian calendar introduced an extra day in
11022all years divisible by four. After some initial confusion, the
11023calendar was adopted around the year we call 8 AD. Some centuries
11024later it became apparent that the Julian year of 365.25 days was
11025itself not quite right. In 1582 Pope Gregory XIII introduced the
11026Gregorian calendar, which added the new rule that years divisible
11027by 100, but not by 400, were not to be considered leap years
11028despite being divisible by four. Many countries delayed adoption
11029of the Gregorian calendar because of religious differences;
11030in Britain it was put off until the year 1752, by which time
11031the Julian calendar had fallen eleven days behind the true
11032seasons. So the switch to the Gregorian calendar in early
11033September 1752 introduced a discontinuity: The day after
11034Sep 2, 1752 is Sep 14, 1752. Calc follows this convention.
11035To take another example, Russia waited until 1918 before
11036adopting the new calendar, and thus needed to remove thirteen
11037days (between Feb 1, 1918 and Feb 14, 1918). This means that
11038Calc's reckoning will be inconsistent with Russian history between
110391752 and 1918, and similarly for various other countries.
11040
11041Today's timekeepers introduce an occasional ``leap second'' as
11042well, but Calc does not take these minor effects into account.
11043(If it did, it would have to report a non-integer number of days
11044between, say, @samp{<12:00am Mon Jan 1, 1900>} and
11045@samp{<12:00am Sat Jan 1, 2000>}.)
11046
11047Calc uses the Julian calendar for all dates before the year 1752,
11048including dates BC when the Julian calendar technically had not
11049yet been invented. Thus the claim that day number @mathit{-10000} is
11050called ``August 16, 28 BC'' should be taken with a grain of salt.
11051
11052Please note that there is no ``year 0''; the day before
11053@samp{<Sat Jan 1, +1>} is @samp{<Fri Dec 31, -1>}. These are
11054days 0 and @mathit{-1} respectively in Calc's internal numbering scheme.
11055
11056@cindex Julian day counting
7c1a0036
GM
11057Another day counting system in common use is, confusingly, also called
11058``Julian.'' The Julian day number is the numbers of days since
1105912:00 noon (GMT) on Jan 1, 4713 BC, which in Calc's scheme (in GMT)
db78a8cb 11060is @mathit{-1721423.5} (recall that Calc starts at midnight instead
7c1a0036
GM
11061of noon). Thus to convert a Calc date code obtained by unpacking a
11062date form into a Julian day number, simply add 1721423.5 after
11063compensating for the time zone difference. The built-in @kbd{t J}
11064command performs this conversion for you.
11065
11066The Julian day number is based on the Julian cycle, which was invented
11067in 1583 by Joseph Justus Scaliger. Scaliger named it the Julian cycle
11068since it is involves the Julian calendar, but some have suggested that
11069Scaliger named it in honor of his father, Julius Caesar Scaliger. The
11070Julian cycle is based it on three other cycles: the indiction cycle,
11071the Metonic cycle, and the solar cycle. The indiction cycle is a 15
11072year cycle originally used by the Romans for tax purposes but later
11073used to date medieval documents. The Metonic cycle is a 19 year
11074cycle; 19 years is close to being a common multiple of a solar year
11075and a lunar month, and so every 19 years the phases of the moon will
11076occur on the same days of the year. The solar cycle is a 28 year
11077cycle; the Julian calendar repeats itself every 28 years. The
11078smallest time period which contains multiples of all three cycles is
11079the least common multiple of 15 years, 19 years and 28 years, which
11080(since they're pairwise relatively prime) is
11081@texline @math{15\times 19\times 28 = 7980} years.
11082@infoline 15*19*28 = 7980 years.
11083This is the length of a Julian cycle. Working backwards, the previous
11084year in which all three cycles began was 4713 BC, and so Scalinger
11085chose that year as the beginning of a Julian cycle. Since at the time
11086there were no historical records from before 4713 BC, using this year
11087as a starting point had the advantage of avoiding negative year
11088numbers. In 1849, the astronomer John Herschel (son of William
11089Herschel) suggested using the number of days since the beginning of
11090the Julian cycle as an astronomical dating system; this idea was taken
11091up by other astronomers. (At the time, noon was the start of the
11092astronomical day. Herschel originally suggested counting the days
11093since Jan 1, 4713 BC at noon Alexandria time; this was later amended to
11094noon GMT.) Julian day numbering is largely used in astronomy.
4009494e
GM
11095
11096@cindex Unix time format
11097The Unix operating system measures time as an integer number of
11098seconds since midnight, Jan 1, 1970. To convert a Calc date
11099value into a Unix time stamp, first subtract 719164 (the code
11100for @samp{<Jan 1, 1970>}), then multiply by 86400 (the number of
11101seconds in a day) and press @kbd{R} to round to the nearest
11102integer. If you have a date form, you can simply subtract the
11103day @samp{<Jan 1, 1970>} instead of unpacking and subtracting
11104719164. Likewise, divide by 86400 and add @samp{<Jan 1, 1970>}
11105to convert from Unix time to a Calc date form. (Note that
11106Unix normally maintains the time in the GMT time zone; you may
11107need to subtract five hours to get New York time, or eight hours
11108for California time. The same is usually true of Julian day
11109counts.) The built-in @kbd{t U} command performs these
11110conversions.
11111
11112@node Modulo Forms, Error Forms, Date Forms, Data Types
11113@section Modulo Forms
11114
11115@noindent
11116@cindex Modulo forms
11117A @dfn{modulo form} is a real number which is taken modulo (i.e., within
11118an integer multiple of) some value @var{M}. Arithmetic modulo @var{M}
11119often arises in number theory. Modulo forms are written
11120`@var{a} @tfn{mod} @var{M}',
11121where @var{a} and @var{M} are real numbers or HMS forms, and
11122@texline @math{0 \le a < M}.
11123@infoline @expr{0 <= a < @var{M}}.
11124In many applications @expr{a} and @expr{M} will be
11125integers but this is not required.
11126
11127@ignore
11128@mindex M
11129@end ignore
11130@kindex M (modulo forms)
11131@ignore
11132@mindex mod
11133@end ignore
11134@tindex mod (operator)
11135To create a modulo form during numeric entry, press the shift-@kbd{M}
11136key to enter the word @samp{mod}. As a special convenience, pressing
11137shift-@kbd{M} a second time automatically enters the value of @expr{M}
11138that was most recently used before. During algebraic entry, either
11139type @samp{mod} by hand or press @kbd{M-m} (that's @kbd{@key{META}-m}).
11140Once again, pressing this a second time enters the current modulo.
11141
11142Modulo forms are not to be confused with the modulo operator @samp{%}.
11143The expression @samp{27 % 10} means to compute 27 modulo 10 to produce
11144the result 7. Further computations treat this 7 as just a regular integer.
11145The expression @samp{27 mod 10} produces the result @samp{7 mod 10};
11146further computations with this value are again reduced modulo 10 so that
11147the result always lies in the desired range.
11148
11149When two modulo forms with identical @expr{M}'s are added or multiplied,
11150the Calculator simply adds or multiplies the values, then reduces modulo
11151@expr{M}. If one argument is a modulo form and the other a plain number,
11152the plain number is treated like a compatible modulo form. It is also
11153possible to raise modulo forms to powers; the result is the value raised
11154to the power, then reduced modulo @expr{M}. (When all values involved
11155are integers, this calculation is done much more efficiently than
11156actually computing the power and then reducing.)
11157
11158@cindex Modulo division
11159Two modulo forms `@var{a} @tfn{mod} @var{M}' and `@var{b} @tfn{mod} @var{M}'
11160can be divided if @expr{a}, @expr{b}, and @expr{M} are all
11161integers. The result is the modulo form which, when multiplied by
11162`@var{b} @tfn{mod} @var{M}', produces `@var{a} @tfn{mod} @var{M}'. If
11163there is no solution to this equation (which can happen only when
11164@expr{M} is non-prime), or if any of the arguments are non-integers, the
11165division is left in symbolic form. Other operations, such as square
11166roots, are not yet supported for modulo forms. (Note that, although
11167@w{`@tfn{(}@var{a} @tfn{mod} @var{M}@tfn{)^.5}'} will compute a ``modulo square root''
11168in the sense of reducing
11169@texline @math{\sqrt a}
11170@infoline @expr{sqrt(a)}
11171modulo @expr{M}, this is not a useful definition from the
11172number-theoretical point of view.)
11173
11174It is possible to mix HMS forms and modulo forms. For example, an
11175HMS form modulo 24 could be used to manipulate clock times; an HMS
11176form modulo 360 would be suitable for angles. Making the modulo @expr{M}
11177also be an HMS form eliminates troubles that would arise if the angular
11178mode were inadvertently set to Radians, in which case
11179@w{@samp{2@@ 0' 0" mod 24}} would be interpreted as two degrees modulo
1118024 radians!
11181
11182Modulo forms cannot have variables or formulas for components. If you
11183enter the formula @samp{(x + 2) mod 5}, Calc propagates the modulus
11184to each of the coefficients: @samp{(1 mod 5) x + (2 mod 5)}.
11185
11186You can use @kbd{v p} and @kbd{%} to modify modulo forms.
11187@xref{Packing and Unpacking}. @xref{Basic Arithmetic}.
11188
11189@ignore
11190@starindex
11191@end ignore
11192@tindex makemod
11193The algebraic function @samp{makemod(a, m)} builds the modulo form
11194@w{@samp{a mod m}}.
11195
11196@node Error Forms, Interval Forms, Modulo Forms, Data Types
11197@section Error Forms
11198
11199@noindent
11200@cindex Error forms
11201@cindex Standard deviations
11202An @dfn{error form} is a number with an associated standard
11203deviation, as in @samp{2.3 +/- 0.12}. The notation
11204@texline `@var{x} @tfn{+/-} @math{\sigma}'
11205@infoline `@var{x} @tfn{+/-} sigma'
11206stands for an uncertain value which follows
11207a normal or Gaussian distribution of mean @expr{x} and standard
11208deviation or ``error''
11209@texline @math{\sigma}.
11210@infoline @expr{sigma}.
11211Both the mean and the error can be either numbers or
11212formulas. Generally these are real numbers but the mean may also be
11213complex. If the error is negative or complex, it is changed to its
11214absolute value. An error form with zero error is converted to a
11215regular number by the Calculator.
11216
11217All arithmetic and transcendental functions accept error forms as input.
11218Operations on the mean-value part work just like operations on regular
11219numbers. The error part for any function @expr{f(x)} (such as
11220@texline @math{\sin x}
11221@infoline @expr{sin(x)})
11222is defined by the error of @expr{x} times the derivative of @expr{f}
11223evaluated at the mean value of @expr{x}. For a two-argument function
11224@expr{f(x,y)} (such as addition) the error is the square root of the sum
11225of the squares of the errors due to @expr{x} and @expr{y}.
11226@tex
11227$$ \eqalign{
11228 f(x \hbox{\code{ +/- }} \sigma)
11229 &= f(x) \hbox{\code{ +/- }} \sigma \left| {df(x) \over dx} \right| \cr
11230 f(x \hbox{\code{ +/- }} \sigma_x, y \hbox{\code{ +/- }} \sigma_y)
11231 &= f(x,y) \hbox{\code{ +/- }}
11232 \sqrt{\left(\sigma_x \left| {\partial f(x,y) \over \partial x}
11233 \right| \right)^2
11234 +\left(\sigma_y \left| {\partial f(x,y) \over \partial y}
11235 \right| \right)^2 } \cr
11236} $$
11237@end tex
11238Note that this
11239definition assumes the errors in @expr{x} and @expr{y} are uncorrelated.
11240A side effect of this definition is that @samp{(2 +/- 1) * (2 +/- 1)}
11241is not the same as @samp{(2 +/- 1)^2}; the former represents the product
11242of two independent values which happen to have the same probability
11243distributions, and the latter is the product of one random value with itself.
11244The former will produce an answer with less error, since on the average
11245the two independent errors can be expected to cancel out.
11246
11247Consult a good text on error analysis for a discussion of the proper use
11248of standard deviations. Actual errors often are neither Gaussian-distributed
11249nor uncorrelated, and the above formulas are valid only when errors
11250are small. As an example, the error arising from
11251@texline `@tfn{sin(}@var{x} @tfn{+/-} @math{\sigma}@tfn{)}'
11252@infoline `@tfn{sin(}@var{x} @tfn{+/-} @var{sigma}@tfn{)}'
11253is
11254@texline `@math{\sigma} @tfn{abs(cos(}@var{x}@tfn{))}'.
11255@infoline `@var{sigma} @tfn{abs(cos(}@var{x}@tfn{))}'.
11256When @expr{x} is close to zero,
11257@texline @math{\cos x}
11258@infoline @expr{cos(x)}
11259is close to one so the error in the sine is close to
11260@texline @math{\sigma};
11261@infoline @expr{sigma};
11262this makes sense, since
11263@texline @math{\sin x}
11264@infoline @expr{sin(x)}
11265is approximately @expr{x} near zero, so a given error in @expr{x} will
11266produce about the same error in the sine. Likewise, near 90 degrees
11267@texline @math{\cos x}
11268@infoline @expr{cos(x)}
11269is nearly zero and so the computed error is
11270small: The sine curve is nearly flat in that region, so an error in @expr{x}
11271has relatively little effect on the value of
11272@texline @math{\sin x}.
11273@infoline @expr{sin(x)}.
11274However, consider @samp{sin(90 +/- 1000)}. The cosine of 90 is zero, so
11275Calc will report zero error! We get an obviously wrong result because
11276we have violated the small-error approximation underlying the error
11277analysis. If the error in @expr{x} had been small, the error in
11278@texline @math{\sin x}
11279@infoline @expr{sin(x)}
11280would indeed have been negligible.
11281
11282@ignore
11283@mindex p
11284@end ignore
11285@kindex p (error forms)
11286@tindex +/-
11287To enter an error form during regular numeric entry, use the @kbd{p}
11288(``plus-or-minus'') key to type the @samp{+/-} symbol. (If you try actually
11289typing @samp{+/-} the @kbd{+} key will be interpreted as the Calculator's
11290@kbd{+} command!) Within an algebraic formula, you can press @kbd{M-+} to
11291type the @samp{+/-} symbol, or type it out by hand.
11292
11293Error forms and complex numbers can be mixed; the formulas shown above
11294are used for complex numbers, too; note that if the error part evaluates
11295to a complex number its absolute value (or the square root of the sum of
11296the squares of the absolute values of the two error contributions) is
11297used. Mathematically, this corresponds to a radially symmetric Gaussian
11298distribution of numbers on the complex plane. However, note that Calc
11299considers an error form with real components to represent a real number,
11300not a complex distribution around a real mean.
11301
11302Error forms may also be composed of HMS forms. For best results, both
11303the mean and the error should be HMS forms if either one is.
11304
11305@ignore
11306@starindex
11307@end ignore
11308@tindex sdev
11309The algebraic function @samp{sdev(a, b)} builds the error form @samp{a +/- b}.
11310
11311@node Interval Forms, Incomplete Objects, Error Forms, Data Types
11312@section Interval Forms
11313
11314@noindent
11315@cindex Interval forms
11316An @dfn{interval} is a subset of consecutive real numbers. For example,
11317the interval @samp{[2 ..@: 4]} represents all the numbers from 2 to 4,
11318inclusive. If you multiply it by the interval @samp{[0.5 ..@: 2]} you
11319obtain @samp{[1 ..@: 8]}. This calculation represents the fact that if
11320you multiply some number in the range @samp{[2 ..@: 4]} by some other
11321number in the range @samp{[0.5 ..@: 2]}, your result will lie in the range
11322from 1 to 8. Interval arithmetic is used to get a worst-case estimate
11323of the possible range of values a computation will produce, given the
11324set of possible values of the input.
11325
11326@ifnottex
11327Calc supports several varieties of intervals, including @dfn{closed}
11328intervals of the type shown above, @dfn{open} intervals such as
11329@samp{(2 ..@: 4)}, which represents the range of numbers from 2 to 4
11330@emph{exclusive}, and @dfn{semi-open} intervals in which one end
11331uses a round parenthesis and the other a square bracket. In mathematical
11332terms,
11333@samp{[2 ..@: 4]} means @expr{2 <= x <= 4}, whereas
11334@samp{[2 ..@: 4)} represents @expr{2 <= x < 4},
11335@samp{(2 ..@: 4]} represents @expr{2 < x <= 4}, and
11336@samp{(2 ..@: 4)} represents @expr{2 < x < 4}.
11337@end ifnottex
11338@tex
11339Calc supports several varieties of intervals, including \dfn{closed}
11340intervals of the type shown above, \dfn{open} intervals such as
11341\samp{(2 ..\: 4)}, which represents the range of numbers from 2 to 4
11342\emph{exclusive}, and \dfn{semi-open} intervals in which one end
11343uses a round parenthesis and the other a square bracket. In mathematical
11344terms,
11345$$ \eqalign{
11346 [2 \hbox{\cite{..}} 4] &\quad\hbox{means}\quad 2 \le x \le 4 \cr
11347 [2 \hbox{\cite{..}} 4) &\quad\hbox{means}\quad 2 \le x < 4 \cr
11348 (2 \hbox{\cite{..}} 4] &\quad\hbox{means}\quad 2 < x \le 4 \cr
11349 (2 \hbox{\cite{..}} 4) &\quad\hbox{means}\quad 2 < x < 4 \cr
11350} $$
11351@end tex
11352
11353The lower and upper limits of an interval must be either real numbers
11354(or HMS or date forms), or symbolic expressions which are assumed to be
11355real-valued, or @samp{-inf} and @samp{inf}. In general the lower limit
11356must be less than the upper limit. A closed interval containing only
11357one value, @samp{[3 ..@: 3]}, is converted to a plain number (3)
11358automatically. An interval containing no values at all (such as
11359@samp{[3 ..@: 2]} or @samp{[2 ..@: 2)}) can be represented but is not
11360guaranteed to behave well when used in arithmetic. Note that the
11361interval @samp{[3 .. inf)} represents all real numbers greater than
11362or equal to 3, and @samp{(-inf .. inf)} represents all real numbers.
11363In fact, @samp{[-inf .. inf]} represents all real numbers including
11364the real infinities.
11365
11366Intervals are entered in the notation shown here, either as algebraic
11367formulas, or using incomplete forms. (@xref{Incomplete Objects}.)
11368In algebraic formulas, multiple periods in a row are collected from
11369left to right, so that @samp{1...1e2} is interpreted as @samp{1.0 ..@: 1e2}
11370rather than @samp{1 ..@: 0.1e2}. Add spaces or zeros if you want to
11371get the other interpretation. If you omit the lower or upper limit,
11372a default of @samp{-inf} or @samp{inf} (respectively) is furnished.
11373
11374Infinite mode also affects operations on intervals
11375(@pxref{Infinities}). Calc will always introduce an open infinity,
11376as in @samp{1 / (0 .. 2] = [0.5 .. inf)}. But closed infinities,
11377@w{@samp{1 / [0 .. 2] = [0.5 .. inf]}}, arise only in Infinite mode;
11378otherwise they are left unevaluated. Note that the ``direction'' of
11379a zero is not an issue in this case since the zero is always assumed
11380to be continuous with the rest of the interval. For intervals that
11381contain zero inside them Calc is forced to give the result,
11382@samp{1 / (-2 .. 2) = [-inf .. inf]}.
11383
11384While it may seem that intervals and error forms are similar, they are
11385based on entirely different concepts of inexact quantities. An error
11386form
11387@texline `@var{x} @tfn{+/-} @math{\sigma}'
11388@infoline `@var{x} @tfn{+/-} @var{sigma}'
11389means a variable is random, and its value could
11390be anything but is ``probably'' within one
11391@texline @math{\sigma}
11392@infoline @var{sigma}
11393of the mean value @expr{x}. An interval
11394`@tfn{[}@var{a} @tfn{..@:} @var{b}@tfn{]}' means a
11395variable's value is unknown, but guaranteed to lie in the specified
11396range. Error forms are statistical or ``average case'' approximations;
11397interval arithmetic tends to produce ``worst case'' bounds on an
11398answer.
11399
11400Intervals may not contain complex numbers, but they may contain
11401HMS forms or date forms.
11402
11403@xref{Set Operations}, for commands that interpret interval forms
11404as subsets of the set of real numbers.
11405
11406@ignore
11407@starindex
11408@end ignore
11409@tindex intv
11410The algebraic function @samp{intv(n, a, b)} builds an interval form
11411from @samp{a} to @samp{b}; @samp{n} is an integer code which must
11412be 0 for @samp{(..)}, 1 for @samp{(..]}, 2 for @samp{[..)}, or
114133 for @samp{[..]}.
11414
11415Please note that in fully rigorous interval arithmetic, care would be
11416taken to make sure that the computation of the lower bound rounds toward
11417minus infinity, while upper bound computations round toward plus
11418infinity. Calc's arithmetic always uses a round-to-nearest mode,
11419which means that roundoff errors could creep into an interval
11420calculation to produce intervals slightly smaller than they ought to
11421be. For example, entering @samp{[1..2]} and pressing @kbd{Q 2 ^}
11422should yield the interval @samp{[1..2]} again, but in fact it yields the
11423(slightly too small) interval @samp{[1..1.9999999]} due to roundoff
11424error.
11425
11426@node Incomplete Objects, Variables, Interval Forms, Data Types
11427@section Incomplete Objects
11428
11429@noindent
11430@ignore
11431@mindex [ ]
11432@end ignore
11433@kindex [
11434@ignore
11435@mindex ( )
11436@end ignore
11437@kindex (
11438@kindex ,
11439@ignore
11440@mindex @null
11441@end ignore
11442@kindex ]
11443@ignore
11444@mindex @null
11445@end ignore
11446@kindex )
11447@cindex Incomplete vectors
11448@cindex Incomplete complex numbers
11449@cindex Incomplete interval forms
11450When @kbd{(} or @kbd{[} is typed to begin entering a complex number or
11451vector, respectively, the effect is to push an @dfn{incomplete} complex
11452number or vector onto the stack. The @kbd{,} key adds the value(s) at
11453the top of the stack onto the current incomplete object. The @kbd{)}
11454and @kbd{]} keys ``close'' the incomplete object after adding any values
11455on the top of the stack in front of the incomplete object.
11456
11457As a result, the sequence of keystrokes @kbd{[ 2 , 3 @key{RET} 2 * , 9 ]}
11458pushes the vector @samp{[2, 6, 9]} onto the stack. Likewise, @kbd{( 1 , 2 Q )}
11459pushes the complex number @samp{(1, 1.414)} (approximately).
11460
11461If several values lie on the stack in front of the incomplete object,
11462all are collected and appended to the object. Thus the @kbd{,} key
11463is redundant: @kbd{[ 2 @key{RET} 3 @key{RET} 2 * 9 ]}. Some people
11464prefer the equivalent @key{SPC} key to @key{RET}.
11465
11466As a special case, typing @kbd{,} immediately after @kbd{(}, @kbd{[}, or
11467@kbd{,} adds a zero or duplicates the preceding value in the list being
11468formed. Typing @key{DEL} during incomplete entry removes the last item
11469from the list.
11470
11471@kindex ;
11472The @kbd{;} key is used in the same way as @kbd{,} to create polar complex
11473numbers: @kbd{( 1 ; 2 )}. When entering a vector, @kbd{;} is useful for
11474creating a matrix. In particular, @kbd{[ [ 1 , 2 ; 3 , 4 ; 5 , 6 ] ]} is
11475equivalent to @kbd{[ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ]}.
11476
11477@kindex ..
11478@pindex calc-dots
11479Incomplete entry is also used to enter intervals. For example,
11480@kbd{[ 2 ..@: 4 )} enters a semi-open interval. Note that when you type
11481the first period, it will be interpreted as a decimal point, but when
11482you type a second period immediately afterward, it is re-interpreted as
11483part of the interval symbol. Typing @kbd{..} corresponds to executing
11484the @code{calc-dots} command.
11485
11486If you find incomplete entry distracting, you may wish to enter vectors
11487and complex numbers as algebraic formulas by pressing the apostrophe key.
11488
11489@node Variables, Formulas, Incomplete Objects, Data Types
11490@section Variables
11491
11492@noindent
11493@cindex Variables, in formulas
11494A @dfn{variable} is somewhere between a storage register on a conventional
11495calculator, and a variable in a programming language. (In fact, a Calc
11496variable is really just an Emacs Lisp variable that contains a Calc number
11497or formula.) A variable's name is normally composed of letters and digits.
11498Calc also allows apostrophes and @code{#} signs in variable names.
11499(The Calc variable @code{foo} corresponds to the Emacs Lisp variable
11500@code{var-foo}, but unless you access the variable from within Emacs
11501Lisp, you don't need to worry about it. Variable names in algebraic
11502formulas implicitly have @samp{var-} prefixed to their names. The
11503@samp{#} character in variable names used in algebraic formulas
11504corresponds to a dash @samp{-} in the Lisp variable name. If the name
11505contains any dashes, the prefix @samp{var-} is @emph{not} automatically
11506added. Thus the two formulas @samp{foo + 1} and @samp{var#foo + 1} both
11507refer to the same variable.)
11508
11509In a command that takes a variable name, you can either type the full
11510name of a variable, or type a single digit to use one of the special
11511convenience variables @code{q0} through @code{q9}. For example,
11512@kbd{3 s s 2} stores the number 3 in variable @code{q2}, and
11513@w{@kbd{3 s s foo @key{RET}}} stores that number in variable
11514@code{foo}.
11515
11516To push a variable itself (as opposed to the variable's value) on the
11517stack, enter its name as an algebraic expression using the apostrophe
11518(@key{'}) key.
11519
11520@kindex =
11521@pindex calc-evaluate
11522@cindex Evaluation of variables in a formula
11523@cindex Variables, evaluation
11524@cindex Formulas, evaluation
11525The @kbd{=} (@code{calc-evaluate}) key ``evaluates'' a formula by
11526replacing all variables in the formula which have been given values by a
11527@code{calc-store} or @code{calc-let} command by their stored values.
11528Other variables are left alone. Thus a variable that has not been
11529stored acts like an abstract variable in algebra; a variable that has
11530been stored acts more like a register in a traditional calculator.
11531With a positive numeric prefix argument, @kbd{=} evaluates the top
11532@var{n} stack entries; with a negative argument, @kbd{=} evaluates
11533the @var{n}th stack entry.
11534
11535@cindex @code{e} variable
11536@cindex @code{pi} variable
11537@cindex @code{i} variable
11538@cindex @code{phi} variable
11539@cindex @code{gamma} variable
11540@vindex e
11541@vindex pi
11542@vindex i
11543@vindex phi
11544@vindex gamma
11545A few variables are called @dfn{special constants}. Their names are
11546@samp{e}, @samp{pi}, @samp{i}, @samp{phi}, and @samp{gamma}.
11547(@xref{Scientific Functions}.) When they are evaluated with @kbd{=},
11548their values are calculated if necessary according to the current precision
11549or complex polar mode. If you wish to use these symbols for other purposes,
11550simply undefine or redefine them using @code{calc-store}.
11551
11552The variables @samp{inf}, @samp{uinf}, and @samp{nan} stand for
11553infinite or indeterminate values. It's best not to use them as
11554regular variables, since Calc uses special algebraic rules when
11555it manipulates them. Calc displays a warning message if you store
11556a value into any of these special variables.
11557
11558@xref{Store and Recall}, for a discussion of commands dealing with variables.
11559
11560@node Formulas, , Variables, Data Types
11561@section Formulas
11562
11563@noindent
11564@cindex Formulas
11565@cindex Expressions
11566@cindex Operators in formulas
11567@cindex Precedence of operators
11568When you press the apostrophe key you may enter any expression or formula
11569in algebraic form. (Calc uses the terms ``expression'' and ``formula''
11570interchangeably.) An expression is built up of numbers, variable names,
11571and function calls, combined with various arithmetic operators.
11572Parentheses may
11573be used to indicate grouping. Spaces are ignored within formulas, except
11574that spaces are not permitted within variable names or numbers.
11575Arithmetic operators, in order from highest to lowest precedence, and
11576with their equivalent function names, are:
11577
11578@samp{_} [@code{subscr}] (subscripts);
11579
11580postfix @samp{%} [@code{percent}] (as in @samp{25% = 0.25});
11581
0edd2970 11582prefix @samp{!} [@code{lnot}] (logical ``not,'' as in @samp{!x});
4009494e
GM
11583
11584@samp{+/-} [@code{sdev}] (the standard deviation symbol) and
11585@samp{mod} [@code{makemod}] (the symbol for modulo forms);
11586
11587postfix @samp{!} [@code{fact}] (factorial, as in @samp{n!})
11588and postfix @samp{!!} [@code{dfact}] (double factorial);
11589
11590@samp{^} [@code{pow}] (raised-to-the-power-of);
11591
0edd2970
JB
11592prefix @samp{+} and @samp{-} [@code{neg}] (as in @samp{-x});
11593
4009494e
GM
11594@samp{*} [@code{mul}];
11595
11596@samp{/} [@code{div}], @samp{%} [@code{mod}] (modulo), and
11597@samp{\} [@code{idiv}] (integer division);
11598
11599infix @samp{+} [@code{add}] and @samp{-} [@code{sub}] (as in @samp{x-y});
11600
11601@samp{|} [@code{vconcat}] (vector concatenation);
11602
11603relations @samp{=} [@code{eq}], @samp{!=} [@code{neq}], @samp{<} [@code{lt}],
11604@samp{>} [@code{gt}], @samp{<=} [@code{leq}], and @samp{>=} [@code{geq}];
11605
11606@samp{&&} [@code{land}] (logical ``and'');
11607
11608@samp{||} [@code{lor}] (logical ``or'');
11609
11610the C-style ``if'' operator @samp{a?b:c} [@code{if}];
11611
11612@samp{!!!} [@code{pnot}] (rewrite pattern ``not'');
11613
11614@samp{&&&} [@code{pand}] (rewrite pattern ``and'');
11615
11616@samp{|||} [@code{por}] (rewrite pattern ``or'');
11617
11618@samp{:=} [@code{assign}] (for assignments and rewrite rules);
11619
11620@samp{::} [@code{condition}] (rewrite pattern condition);
11621
11622@samp{=>} [@code{evalto}].
11623
11624Note that, unlike in usual computer notation, multiplication binds more
11625strongly than division: @samp{a*b/c*d} is equivalent to
11626@texline @math{a b \over c d}.
11627@infoline @expr{(a*b)/(c*d)}.
11628
11629@cindex Multiplication, implicit
11630@cindex Implicit multiplication
11631The multiplication sign @samp{*} may be omitted in many cases. In particular,
11632if the righthand side is a number, variable name, or parenthesized
11633expression, the @samp{*} may be omitted. Implicit multiplication has the
11634same precedence as the explicit @samp{*} operator. The one exception to
11635the rule is that a variable name followed by a parenthesized expression,
11636as in @samp{f(x)},
11637is interpreted as a function call, not an implicit @samp{*}. In many
11638cases you must use a space if you omit the @samp{*}: @samp{2a} is the
11639same as @samp{2*a}, and @samp{a b} is the same as @samp{a*b}, but @samp{ab}
11640is a variable called @code{ab}, @emph{not} the product of @samp{a} and
11641@samp{b}! Also note that @samp{f (x)} is still a function call.
11642
11643@cindex Implicit comma in vectors
11644The rules are slightly different for vectors written with square brackets.
11645In vectors, the space character is interpreted (like the comma) as a
11646separator of elements of the vector. Thus @w{@samp{[ 2a b+c d ]}} is
11647equivalent to @samp{[2*a, b+c, d]}, whereas @samp{2a b+c d} is equivalent
11648to @samp{2*a*b + c*d}.
11649Note that spaces around the brackets, and around explicit commas, are
11650ignored. To force spaces to be interpreted as multiplication you can
11651enclose a formula in parentheses as in @samp{[(a b) 2(c d)]}, which is
11652interpreted as @samp{[a*b, 2*c*d]}. An implicit comma is also inserted
11653between @samp{][}, as in the matrix @samp{[[1 2][3 4]]}.
11654
11655Vectors that contain commas (not embedded within nested parentheses or
11656brackets) do not treat spaces specially: @samp{[a b, 2 c d]} is a vector
11657of two elements. Also, if it would be an error to treat spaces as
11658separators, but not otherwise, then Calc will ignore spaces:
11659@w{@samp{[a - b]}} is a vector of one element, but @w{@samp{[a -b]}} is
11660a vector of two elements. Finally, vectors entered with curly braces
11661instead of square brackets do not give spaces any special treatment.
11662When Calc displays a vector that does not contain any commas, it will
11663insert parentheses if necessary to make the meaning clear:
11664@w{@samp{[(a b)]}}.
11665
11666The expression @samp{5%-2} is ambiguous; is this five-percent minus two,
11667or five modulo minus-two? Calc always interprets the leftmost symbol as
11668an infix operator preferentially (modulo, in this case), so you would
11669need to write @samp{(5%)-2} to get the former interpretation.
11670
11671@cindex Function call notation
11672A function call is, e.g., @samp{sin(1+x)}. (The Calc algebraic function
11673@code{foo} corresponds to the Emacs Lisp function @code{calcFunc-foo},
11674but unless you access the function from within Emacs Lisp, you don't
11675need to worry about it.) Most mathematical Calculator commands like
11676@code{calc-sin} have function equivalents like @code{sin}.
11677If no Lisp function is defined for a function called by a formula, the
11678call is left as it is during algebraic manipulation: @samp{f(x+y)} is
11679left alone. Beware that many innocent-looking short names like @code{in}
11680and @code{re} have predefined meanings which could surprise you; however,
11681single letters or single letters followed by digits are always safe to
11682use for your own function names. @xref{Function Index}.
11683
11684In the documentation for particular commands, the notation @kbd{H S}
11685(@code{calc-sinh}) [@code{sinh}] means that the key sequence @kbd{H S}, the
11686command @kbd{M-x calc-sinh}, and the algebraic function @code{sinh(x)} all
11687represent the same operation.
11688
11689Commands that interpret (``parse'') text as algebraic formulas include
11690algebraic entry (@kbd{'}), editing commands like @kbd{`} which parse
11691the contents of the editing buffer when you finish, the @kbd{C-x * g}
11692and @w{@kbd{C-x * r}} commands, the @kbd{C-y} command, the X window system
11693``paste'' mouse operation, and Embedded mode. All of these operations
11694use the same rules for parsing formulas; in particular, language modes
11695(@pxref{Language Modes}) affect them all in the same way.
11696
11697When you read a large amount of text into the Calculator (say a vector
11698which represents a big set of rewrite rules; @pxref{Rewrite Rules}),
11699you may wish to include comments in the text. Calc's formula parser
11700ignores the symbol @samp{%%} and anything following it on a line:
11701
11702@example
11703[ a + b, %% the sum of "a" and "b"
11704 c + d,
11705 %% last line is coming up:
11706 e + f ]
11707@end example
11708
11709@noindent
11710This is parsed exactly the same as @samp{[ a + b, c + d, e + f ]}.
11711
11712@xref{Syntax Tables}, for a way to create your own operators and other
11713input notations. @xref{Compositions}, for a way to create new display
11714formats.
11715
11716@xref{Algebra}, for commands for manipulating formulas symbolically.
11717
11718@node Stack and Trail, Mode Settings, Data Types, Top
11719@chapter Stack and Trail Commands
11720
11721@noindent
11722This chapter describes the Calc commands for manipulating objects on the
11723stack and in the trail buffer. (These commands operate on objects of any
11724type, such as numbers, vectors, formulas, and incomplete objects.)
11725
11726@menu
11727* Stack Manipulation::
11728* Editing Stack Entries::
11729* Trail Commands::
11730* Keep Arguments::
11731@end menu
11732
11733@node Stack Manipulation, Editing Stack Entries, Stack and Trail, Stack and Trail
11734@section Stack Manipulation Commands
11735
11736@noindent
11737@kindex @key{RET}
11738@kindex @key{SPC}
11739@pindex calc-enter
11740@cindex Duplicating stack entries
11741To duplicate the top object on the stack, press @key{RET} or @key{SPC}
11742(two equivalent keys for the @code{calc-enter} command).
11743Given a positive numeric prefix argument, these commands duplicate
11744several elements at the top of the stack.
11745Given a negative argument,
11746these commands duplicate the specified element of the stack.
11747Given an argument of zero, they duplicate the entire stack.
11748For example, with @samp{10 20 30} on the stack,
11749@key{RET} creates @samp{10 20 30 30},
11750@kbd{C-u 2 @key{RET}} creates @samp{10 20 30 20 30},
11751@kbd{C-u - 2 @key{RET}} creates @samp{10 20 30 20}, and
11752@kbd{C-u 0 @key{RET}} creates @samp{10 20 30 10 20 30}.
11753
11754@kindex @key{LFD}
11755@pindex calc-over
11756The @key{LFD} (@code{calc-over}) command (on a key marked Line-Feed if you
11757have it, else on @kbd{C-j}) is like @code{calc-enter}
11758except that the sign of the numeric prefix argument is interpreted
11759oppositely. Also, with no prefix argument the default argument is 2.
11760Thus with @samp{10 20 30} on the stack, @key{LFD} and @kbd{C-u 2 @key{LFD}}
11761are both equivalent to @kbd{C-u - 2 @key{RET}}, producing
11762@samp{10 20 30 20}.
11763
11764@kindex @key{DEL}
11765@kindex C-d
11766@pindex calc-pop
11767@cindex Removing stack entries
11768@cindex Deleting stack entries
11769To remove the top element from the stack, press @key{DEL} (@code{calc-pop}).
11770The @kbd{C-d} key is a synonym for @key{DEL}.
11771(If the top element is an incomplete object with at least one element, the
11772last element is removed from it.) Given a positive numeric prefix argument,
11773several elements are removed. Given a negative argument, the specified
11774element of the stack is deleted. Given an argument of zero, the entire
11775stack is emptied.
11776For example, with @samp{10 20 30} on the stack,
11777@key{DEL} leaves @samp{10 20},
11778@kbd{C-u 2 @key{DEL}} leaves @samp{10},
11779@kbd{C-u - 2 @key{DEL}} leaves @samp{10 30}, and
11780@kbd{C-u 0 @key{DEL}} leaves an empty stack.
11781
11782@kindex M-@key{DEL}
11783@pindex calc-pop-above
11784The @kbd{M-@key{DEL}} (@code{calc-pop-above}) command is to @key{DEL} what
11785@key{LFD} is to @key{RET}: It interprets the sign of the numeric
11786prefix argument in the opposite way, and the default argument is 2.
11787Thus @kbd{M-@key{DEL}} by itself removes the second-from-top stack element,
11788leaving the first, third, fourth, and so on; @kbd{M-3 M-@key{DEL}} deletes
11789the third stack element.
11790
11791@kindex @key{TAB}
11792@pindex calc-roll-down
11793To exchange the top two elements of the stack, press @key{TAB}
11794(@code{calc-roll-down}). Given a positive numeric prefix argument, the
11795specified number of elements at the top of the stack are rotated downward.
11796Given a negative argument, the entire stack is rotated downward the specified
11797number of times. Given an argument of zero, the entire stack is reversed
11798top-for-bottom.
11799For example, with @samp{10 20 30 40 50} on the stack,
11800@key{TAB} creates @samp{10 20 30 50 40},
11801@kbd{C-u 3 @key{TAB}} creates @samp{10 20 50 30 40},
11802@kbd{C-u - 2 @key{TAB}} creates @samp{40 50 10 20 30}, and
11803@kbd{C-u 0 @key{TAB}} creates @samp{50 40 30 20 10}.
11804
11805@kindex M-@key{TAB}
11806@pindex calc-roll-up
11807The command @kbd{M-@key{TAB}} (@code{calc-roll-up}) is analogous to @key{TAB}
11808except that it rotates upward instead of downward. Also, the default
11809with no prefix argument is to rotate the top 3 elements.
11810For example, with @samp{10 20 30 40 50} on the stack,
11811@kbd{M-@key{TAB}} creates @samp{10 20 40 50 30},
11812@kbd{C-u 4 M-@key{TAB}} creates @samp{10 30 40 50 20},
11813@kbd{C-u - 2 M-@key{TAB}} creates @samp{30 40 50 10 20}, and
11814@kbd{C-u 0 M-@key{TAB}} creates @samp{50 40 30 20 10}.
11815
11816A good way to view the operation of @key{TAB} and @kbd{M-@key{TAB}} is in
11817terms of moving a particular element to a new position in the stack.
11818With a positive argument @var{n}, @key{TAB} moves the top stack
11819element down to level @var{n}, making room for it by pulling all the
11820intervening stack elements toward the top. @kbd{M-@key{TAB}} moves the
11821element at level @var{n} up to the top. (Compare with @key{LFD},
11822which copies instead of moving the element in level @var{n}.)
11823
11824With a negative argument @mathit{-@var{n}}, @key{TAB} rotates the stack
11825to move the object in level @var{n} to the deepest place in the
11826stack, and the object in level @mathit{@var{n}+1} to the top. @kbd{M-@key{TAB}}
11827rotates the deepest stack element to be in level @mathit{n}, also
11828putting the top stack element in level @mathit{@var{n}+1}.
11829
11830@xref{Selecting Subformulas}, for a way to apply these commands to
11831any portion of a vector or formula on the stack.
11832
11833@node Editing Stack Entries, Trail Commands, Stack Manipulation, Stack and Trail
11834@section Editing Stack Entries
11835
11836@noindent
11837@kindex `
11838@pindex calc-edit
11839@pindex calc-edit-finish
11840@cindex Editing the stack with Emacs
11841The backquote, @kbd{`} (@code{calc-edit}) command creates a temporary
11842buffer (@samp{*Calc Edit*}) for editing the top-of-stack value using
11843regular Emacs commands. With a numeric prefix argument, it edits the
11844specified number of stack entries at once. (An argument of zero edits
11845the entire stack; a negative argument edits one specific stack entry.)
11846
11847When you are done editing, press @kbd{C-c C-c} to finish and return
11848to Calc. The @key{RET} and @key{LFD} keys also work to finish most
11849sorts of editing, though in some cases Calc leaves @key{RET} with its
11850usual meaning (``insert a newline'') if it's a situation where you
11851might want to insert new lines into the editing buffer.
11852
11853When you finish editing, the Calculator parses the lines of text in
11854the @samp{*Calc Edit*} buffer as numbers or formulas, replaces the
11855original stack elements in the original buffer with these new values,
11856then kills the @samp{*Calc Edit*} buffer. The original Calculator buffer
11857continues to exist during editing, but for best results you should be
11858careful not to change it until you have finished the edit. You can
11859also cancel the edit by killing the buffer with @kbd{C-x k}.
11860
11861The formula is normally reevaluated as it is put onto the stack.
11862For example, editing @samp{a + 2} to @samp{3 + 2} and pressing
11863@kbd{C-c C-c} will push 5 on the stack. If you use @key{LFD} to
11864finish, Calc will put the result on the stack without evaluating it.
11865
11866If you give a prefix argument to @kbd{C-c C-c},
11867Calc will not kill the @samp{*Calc Edit*} buffer. You can switch
11868back to that buffer and continue editing if you wish. However, you
11869should understand that if you initiated the edit with @kbd{`}, the
11870@kbd{C-c C-c} operation will be programmed to replace the top of the
11871stack with the new edited value, and it will do this even if you have
11872rearranged the stack in the meanwhile. This is not so much of a problem
11873with other editing commands, though, such as @kbd{s e}
11874(@code{calc-edit-variable}; @pxref{Operations on Variables}).
11875
11876If the @code{calc-edit} command involves more than one stack entry,
11877each line of the @samp{*Calc Edit*} buffer is interpreted as a
11878separate formula. Otherwise, the entire buffer is interpreted as
11879one formula, with line breaks ignored. (You can use @kbd{C-o} or
11880@kbd{C-q C-j} to insert a newline in the buffer without pressing @key{RET}.)
11881
11882The @kbd{`} key also works during numeric or algebraic entry. The
11883text entered so far is moved to the @code{*Calc Edit*} buffer for
11884more extensive editing than is convenient in the minibuffer.
11885
11886@node Trail Commands, Keep Arguments, Editing Stack Entries, Stack and Trail
11887@section Trail Commands
11888
11889@noindent
11890@cindex Trail buffer
11891The commands for manipulating the Calc Trail buffer are two-key sequences
11892beginning with the @kbd{t} prefix.
11893
11894@kindex t d
11895@pindex calc-trail-display
11896The @kbd{t d} (@code{calc-trail-display}) command turns display of the
11897trail on and off. Normally the trail display is toggled on if it was off,
11898off if it was on. With a numeric prefix of zero, this command always
11899turns the trail off; with a prefix of one, it always turns the trail on.
11900The other trail-manipulation commands described here automatically turn
11901the trail on. Note that when the trail is off values are still recorded
11902there; they are simply not displayed. To set Emacs to turn the trail
11903off by default, type @kbd{t d} and then save the mode settings with
11904@kbd{m m} (@code{calc-save-modes}).
11905
11906@kindex t i
11907@pindex calc-trail-in
11908@kindex t o
11909@pindex calc-trail-out
11910The @kbd{t i} (@code{calc-trail-in}) and @kbd{t o}
11911(@code{calc-trail-out}) commands switch the cursor into and out of the
11912Calc Trail window. In practice they are rarely used, since the commands
11913shown below are a more convenient way to move around in the
11914trail, and they work ``by remote control'' when the cursor is still
11915in the Calculator window.
11916
11917@cindex Trail pointer
11918There is a @dfn{trail pointer} which selects some entry of the trail at
11919any given time. The trail pointer looks like a @samp{>} symbol right
11920before the selected number. The following commands operate on the
11921trail pointer in various ways.
11922
11923@kindex t y
11924@pindex calc-trail-yank
11925@cindex Retrieving previous results
11926The @kbd{t y} (@code{calc-trail-yank}) command reads the selected value in
11927the trail and pushes it onto the Calculator stack. It allows you to
11928re-use any previously computed value without retyping. With a numeric
11929prefix argument @var{n}, it yanks the value @var{n} lines above the current
11930trail pointer.
11931
11932@kindex t <
11933@pindex calc-trail-scroll-left
11934@kindex t >
11935@pindex calc-trail-scroll-right
11936The @kbd{t <} (@code{calc-trail-scroll-left}) and @kbd{t >}
11937(@code{calc-trail-scroll-right}) commands horizontally scroll the trail
11938window left or right by one half of its width.
11939
11940@kindex t n
11941@pindex calc-trail-next
11942@kindex t p
11943@pindex calc-trail-previous
11944@kindex t f
11945@pindex calc-trail-forward
11946@kindex t b
11947@pindex calc-trail-backward
11948The @kbd{t n} (@code{calc-trail-next}) and @kbd{t p}
11949(@code{calc-trail-previous)} commands move the trail pointer down or up
11950one line. The @kbd{t f} (@code{calc-trail-forward}) and @kbd{t b}
11951(@code{calc-trail-backward}) commands move the trail pointer down or up
11952one screenful at a time. All of these commands accept numeric prefix
11953arguments to move several lines or screenfuls at a time.
11954
11955@kindex t [
11956@pindex calc-trail-first
11957@kindex t ]
11958@pindex calc-trail-last
11959@kindex t h
11960@pindex calc-trail-here
11961The @kbd{t [} (@code{calc-trail-first}) and @kbd{t ]}
11962(@code{calc-trail-last}) commands move the trail pointer to the first or
11963last line of the trail. The @kbd{t h} (@code{calc-trail-here}) command
11964moves the trail pointer to the cursor position; unlike the other trail
11965commands, @kbd{t h} works only when Calc Trail is the selected window.
11966
11967@kindex t s
11968@pindex calc-trail-isearch-forward
11969@kindex t r
11970@pindex calc-trail-isearch-backward
11971@ifnottex
11972The @kbd{t s} (@code{calc-trail-isearch-forward}) and @kbd{t r}
11973(@code{calc-trail-isearch-backward}) commands perform an incremental
11974search forward or backward through the trail. You can press @key{RET}
11975to terminate the search; the trail pointer moves to the current line.
11976If you cancel the search with @kbd{C-g}, the trail pointer stays where
11977it was when the search began.
11978@end ifnottex
11979@tex
11980The @kbd{t s} (@code{calc-trail-isearch-forward}) and @kbd{t r}
11981(@code{calc-trail-isearch-backward}) com\-mands perform an incremental
11982search forward or backward through the trail. You can press @key{RET}
11983to terminate the search; the trail pointer moves to the current line.
11984If you cancel the search with @kbd{C-g}, the trail pointer stays where
11985it was when the search began.
11986@end tex
11987
11988@kindex t m
11989@pindex calc-trail-marker
11990The @kbd{t m} (@code{calc-trail-marker}) command allows you to enter a
11991line of text of your own choosing into the trail. The text is inserted
11992after the line containing the trail pointer; this usually means it is
11993added to the end of the trail. Trail markers are useful mainly as the
11994targets for later incremental searches in the trail.
11995
11996@kindex t k
11997@pindex calc-trail-kill
11998The @kbd{t k} (@code{calc-trail-kill}) command removes the selected line
11999from the trail. The line is saved in the Emacs kill ring suitable for
12000yanking into another buffer, but it is not easy to yank the text back
12001into the trail buffer. With a numeric prefix argument, this command
12002kills the @var{n} lines below or above the selected one.
12003
12004The @kbd{t .} (@code{calc-full-trail-vectors}) command is described
12005elsewhere; @pxref{Vector and Matrix Formats}.
12006
12007@node Keep Arguments, , Trail Commands, Stack and Trail
12008@section Keep Arguments
12009
12010@noindent
12011@kindex K
12012@pindex calc-keep-args
12013The @kbd{K} (@code{calc-keep-args}) command acts like a prefix for
12014the following command. It prevents that command from removing its
12015arguments from the stack. For example, after @kbd{2 @key{RET} 3 +},
12016the stack contains the sole number 5, but after @kbd{2 @key{RET} 3 K +},
12017the stack contains the arguments and the result: @samp{2 3 5}.
12018
12019With the exception of keyboard macros, this works for all commands that
12020take arguments off the stack. (To avoid potentially unpleasant behavior,
12021a @kbd{K} prefix before a keyboard macro will be ignored. A @kbd{K}
12022prefix called @emph{within} the keyboard macro will still take effect.)
12023As another example, @kbd{K a s} simplifies a formula, pushing the
12024simplified version of the formula onto the stack after the original
12025formula (rather than replacing the original formula). Note that you
12026could get the same effect by typing @kbd{@key{RET} a s}, copying the
12027formula and then simplifying the copy. One difference is that for a very
12028large formula the time taken to format the intermediate copy in
12029@kbd{@key{RET} a s} could be noticeable; @kbd{K a s} would avoid this
12030extra work.
12031
12032Even stack manipulation commands are affected. @key{TAB} works by
12033popping two values and pushing them back in the opposite order,
12034so @kbd{2 @key{RET} 3 K @key{TAB}} produces @samp{2 3 3 2}.
12035
12036A few Calc commands provide other ways of doing the same thing.
12037For example, @kbd{' sin($)} replaces the number on the stack with
12038its sine using algebraic entry; to push the sine and keep the
12039original argument you could use either @kbd{' sin($1)} or
12040@kbd{K ' sin($)}. @xref{Algebraic Entry}. Also, the @kbd{s s}
12041command is effectively the same as @kbd{K s t}. @xref{Storing Variables}.
12042
12043If you execute a command and then decide you really wanted to keep
12044the argument, you can press @kbd{M-@key{RET}} (@code{calc-last-args}).
12045This command pushes the last arguments that were popped by any command
12046onto the stack. Note that the order of things on the stack will be
12047different than with @kbd{K}: @kbd{2 @key{RET} 3 + M-@key{RET}} leaves
12048@samp{5 2 3} on the stack instead of @samp{2 3 5}. @xref{Undo}.
12049
12050@node Mode Settings, Arithmetic, Stack and Trail, Top
12051@chapter Mode Settings
12052
12053@noindent
12054This chapter describes commands that set modes in the Calculator.
12055They do not affect the contents of the stack, although they may change
12056the @emph{appearance} or @emph{interpretation} of the stack's contents.
12057
12058@menu
12059* General Mode Commands::
12060* Precision::
12061* Inverse and Hyperbolic::
12062* Calculation Modes::
12063* Simplification Modes::
12064* Declarations::
12065* Display Modes::
12066* Language Modes::
12067* Modes Variable::
12068* Calc Mode Line::
12069@end menu
12070
12071@node General Mode Commands, Precision, Mode Settings, Mode Settings
12072@section General Mode Commands
12073
12074@noindent
12075@kindex m m
12076@pindex calc-save-modes
12077@cindex Continuous memory
12078@cindex Saving mode settings
12079@cindex Permanent mode settings
12080@cindex Calc init file, mode settings
12081You can save all of the current mode settings in your Calc init file
12082(the file given by the variable @code{calc-settings-file}, typically
12083@file{~/.calc.el}) with the @kbd{m m} (@code{calc-save-modes}) command.
12084This will cause Emacs to reestablish these modes each time it starts up.
12085The modes saved in the file include everything controlled by the @kbd{m}
12086and @kbd{d} prefix keys, the current precision and binary word size,
12087whether or not the trail is displayed, the current height of the Calc
12088window, and more. The current interface (used when you type @kbd{C-x * *})
12089is also saved. If there were already saved mode settings in the
12090file, they are replaced. Otherwise, the new mode information is
12091appended to the end of the file.
12092
12093@kindex m R
12094@pindex calc-mode-record-mode
12095The @kbd{m R} (@code{calc-mode-record-mode}) command tells Calc to
12096record all the mode settings (as if by pressing @kbd{m m}) every
12097time a mode setting changes. If the modes are saved this way, then this
12098``automatic mode recording'' mode is also saved.
12099Type @kbd{m R} again to disable this method of recording the mode
12100settings. To turn it off permanently, the @kbd{m m} command will also be
12101necessary. (If Embedded mode is enabled, other options for recording
12102the modes are available; @pxref{Mode Settings in Embedded Mode}.)
12103
12104@kindex m F
12105@pindex calc-settings-file-name
12106The @kbd{m F} (@code{calc-settings-file-name}) command allows you to
12107choose a different file than the current value of @code{calc-settings-file}
12108for @kbd{m m}, @kbd{Z P}, and similar commands to save permanent information.
12109You are prompted for a file name. All Calc modes are then reset to
12110their default values, then settings from the file you named are loaded
12111if this file exists, and this file becomes the one that Calc will
12112use in the future for commands like @kbd{m m}. The default settings
12113file name is @file{~/.calc.el}. You can see the current file name by
12114giving a blank response to the @kbd{m F} prompt. See also the
12115discussion of the @code{calc-settings-file} variable; @pxref{Customizing Calc}.
12116
12117If the file name you give is your user init file (typically
12118@file{~/.emacs}), @kbd{m F} will not automatically load the new file. This
12119is because your user init file may contain other things you don't want
12120to reread. You can give
12121a numeric prefix argument of 1 to @kbd{m F} to force it to read the
12122file no matter what. Conversely, an argument of @mathit{-1} tells
12123@kbd{m F} @emph{not} to read the new file. An argument of 2 or @mathit{-2}
12124tells @kbd{m F} not to reset the modes to their defaults beforehand,
12125which is useful if you intend your new file to have a variant of the
12126modes present in the file you were using before.
12127
12128@kindex m x
12129@pindex calc-always-load-extensions
12130The @kbd{m x} (@code{calc-always-load-extensions}) command enables a mode
12131in which the first use of Calc loads the entire program, including all
12132extensions modules. Otherwise, the extensions modules will not be loaded
12133until the various advanced Calc features are used. Since this mode only
12134has effect when Calc is first loaded, @kbd{m x} is usually followed by
12135@kbd{m m} to make the mode-setting permanent. To load all of Calc just
12136once, rather than always in the future, you can press @kbd{C-x * L}.
12137
12138@kindex m S
12139@pindex calc-shift-prefix
12140The @kbd{m S} (@code{calc-shift-prefix}) command enables a mode in which
12141all of Calc's letter prefix keys may be typed shifted as well as unshifted.
12142If you are typing, say, @kbd{a S} (@code{calc-solve-for}) quite often
12143you might find it easier to turn this mode on so that you can type
12144@kbd{A S} instead. When this mode is enabled, the commands that used to
12145be on those single shifted letters (e.g., @kbd{A} (@code{calc-abs})) can
12146now be invoked by pressing the shifted letter twice: @kbd{A A}. Note
12147that the @kbd{v} prefix key always works both shifted and unshifted, and
12148the @kbd{z} and @kbd{Z} prefix keys are always distinct. Also, the @kbd{h}
12149prefix is not affected by this mode. Press @kbd{m S} again to disable
12150shifted-prefix mode.
12151
12152@node Precision, Inverse and Hyperbolic, General Mode Commands, Mode Settings
12153@section Precision
12154
12155@noindent
12156@kindex p
12157@pindex calc-precision
12158@cindex Precision of calculations
12159The @kbd{p} (@code{calc-precision}) command controls the precision to
12160which floating-point calculations are carried. The precision must be
12161at least 3 digits and may be arbitrarily high, within the limits of
12162memory and time. This affects only floats: Integer and rational
12163calculations are always carried out with as many digits as necessary.
12164
12165The @kbd{p} key prompts for the current precision. If you wish you
12166can instead give the precision as a numeric prefix argument.
12167
12168Many internal calculations are carried to one or two digits higher
12169precision than normal. Results are rounded down afterward to the
12170current precision. Unless a special display mode has been selected,
12171floats are always displayed with their full stored precision, i.e.,
12172what you see is what you get. Reducing the current precision does not
12173round values already on the stack, but those values will be rounded
12174down before being used in any calculation. The @kbd{c 0} through
12175@kbd{c 9} commands (@pxref{Conversions}) can be used to round an
12176existing value to a new precision.
12177
12178@cindex Accuracy of calculations
12179It is important to distinguish the concepts of @dfn{precision} and
12180@dfn{accuracy}. In the normal usage of these words, the number
12181123.4567 has a precision of 7 digits but an accuracy of 4 digits.
12182The precision is the total number of digits not counting leading
12183or trailing zeros (regardless of the position of the decimal point).
12184The accuracy is simply the number of digits after the decimal point
12185(again not counting trailing zeros). In Calc you control the precision,
12186not the accuracy of computations. If you were to set the accuracy
12187instead, then calculations like @samp{exp(100)} would generate many
12188more digits than you would typically need, while @samp{exp(-100)} would
12189probably round to zero! In Calc, both these computations give you
12190exactly 12 (or the requested number of) significant digits.
12191
12192The only Calc features that deal with accuracy instead of precision
12193are fixed-point display mode for floats (@kbd{d f}; @pxref{Float Formats}),
12194and the rounding functions like @code{floor} and @code{round}
12195(@pxref{Integer Truncation}). Also, @kbd{c 0} through @kbd{c 9}
12196deal with both precision and accuracy depending on the magnitudes
12197of the numbers involved.
12198
12199If you need to work with a particular fixed accuracy (say, dollars and
12200cents with two digits after the decimal point), one solution is to work
12201with integers and an ``implied'' decimal point. For example, $8.99
12202divided by 6 would be entered @kbd{899 @key{RET} 6 /}, yielding 149.833
12203(actually $1.49833 with our implied decimal point); pressing @kbd{R}
12204would round this to 150 cents, i.e., $1.50.
12205
12206@xref{Floats}, for still more on floating-point precision and related
12207issues.
12208
12209@node Inverse and Hyperbolic, Calculation Modes, Precision, Mode Settings
12210@section Inverse and Hyperbolic Flags
12211
12212@noindent
12213@kindex I
12214@pindex calc-inverse
12215There is no single-key equivalent to the @code{calc-arcsin} function.
12216Instead, you must first press @kbd{I} (@code{calc-inverse}) to set
12217the @dfn{Inverse Flag}, then press @kbd{S} (@code{calc-sin}).
12218The @kbd{I} key actually toggles the Inverse Flag. When this flag
12219is set, the word @samp{Inv} appears in the mode line.
12220
12221@kindex H
12222@pindex calc-hyperbolic
12223Likewise, the @kbd{H} key (@code{calc-hyperbolic}) sets or clears the
12224Hyperbolic Flag, which transforms @code{calc-sin} into @code{calc-sinh}.
12225If both of these flags are set at once, the effect will be
12226@code{calc-arcsinh}. (The Hyperbolic flag is also used by some
12227non-trigonometric commands; for example @kbd{H L} computes a base-10,
12228instead of base-@mathit{e}, logarithm.)
12229
12230Command names like @code{calc-arcsin} are provided for completeness, and
12231may be executed with @kbd{x} or @kbd{M-x}. Their effect is simply to
12232toggle the Inverse and/or Hyperbolic flags and then execute the
12233corresponding base command (@code{calc-sin} in this case).
12234
12235The Inverse and Hyperbolic flags apply only to the next Calculator
12236command, after which they are automatically cleared. (They are also
12237cleared if the next keystroke is not a Calc command.) Digits you
12238type after @kbd{I} or @kbd{H} (or @kbd{K}) are treated as prefix
12239arguments for the next command, not as numeric entries. The same
12240is true of @kbd{C-u}, but not of the minus sign (@kbd{K -} means to
12241subtract and keep arguments).
12242
12243The third Calc prefix flag, @kbd{K} (keep-arguments), is discussed
12244elsewhere. @xref{Keep Arguments}.
12245
12246@node Calculation Modes, Simplification Modes, Inverse and Hyperbolic, Mode Settings
12247@section Calculation Modes
12248
12249@noindent
12250The commands in this section are two-key sequences beginning with
12251the @kbd{m} prefix. (That's the letter @kbd{m}, not the @key{META} key.)
12252The @samp{m a} (@code{calc-algebraic-mode}) command is described elsewhere
12253(@pxref{Algebraic Entry}).
12254
12255@menu
12256* Angular Modes::
12257* Polar Mode::
12258* Fraction Mode::
12259* Infinite Mode::
12260* Symbolic Mode::
12261* Matrix Mode::
12262* Automatic Recomputation::
12263* Working Message::
12264@end menu
12265
12266@node Angular Modes, Polar Mode, Calculation Modes, Calculation Modes
12267@subsection Angular Modes
12268
12269@noindent
12270@cindex Angular mode
12271The Calculator supports three notations for angles: radians, degrees,
12272and degrees-minutes-seconds. When a number is presented to a function
12273like @code{sin} that requires an angle, the current angular mode is
12274used to interpret the number as either radians or degrees. If an HMS
12275form is presented to @code{sin}, it is always interpreted as
12276degrees-minutes-seconds.
12277
12278Functions that compute angles produce a number in radians, a number in
12279degrees, or an HMS form depending on the current angular mode. If the
12280result is a complex number and the current mode is HMS, the number is
12281instead expressed in degrees. (Complex-number calculations would
12282normally be done in Radians mode, though. Complex numbers are converted
12283to degrees by calculating the complex result in radians and then
12284multiplying by 180 over @cpi{}.)
12285
12286@kindex m r
12287@pindex calc-radians-mode
12288@kindex m d
12289@pindex calc-degrees-mode
12290@kindex m h
12291@pindex calc-hms-mode
12292The @kbd{m r} (@code{calc-radians-mode}), @kbd{m d} (@code{calc-degrees-mode}),
12293and @kbd{m h} (@code{calc-hms-mode}) commands control the angular mode.
12294The current angular mode is displayed on the Emacs mode line.
12295The default angular mode is Degrees.
12296
12297@node Polar Mode, Fraction Mode, Angular Modes, Calculation Modes
12298@subsection Polar Mode
12299
12300@noindent
12301@cindex Polar mode
12302The Calculator normally ``prefers'' rectangular complex numbers in the
12303sense that rectangular form is used when the proper form can not be
12304decided from the input. This might happen by multiplying a rectangular
12305number by a polar one, by taking the square root of a negative real
12306number, or by entering @kbd{( 2 @key{SPC} 3 )}.
12307
12308@kindex m p
12309@pindex calc-polar-mode
12310The @kbd{m p} (@code{calc-polar-mode}) command toggles complex-number
12311preference between rectangular and polar forms. In Polar mode, all
12312of the above example situations would produce polar complex numbers.
12313
12314@node Fraction Mode, Infinite Mode, Polar Mode, Calculation Modes
12315@subsection Fraction Mode
12316
12317@noindent
12318@cindex Fraction mode
12319@cindex Division of integers
12320Division of two integers normally yields a floating-point number if the
12321result cannot be expressed as an integer. In some cases you would
12322rather get an exact fractional answer. One way to accomplish this is
12323to use the @kbd{:} (@code{calc-fdiv}) [@code{fdiv}] command, which
12324divides the two integers on the top of the stack to produce a fraction:
12325@kbd{6 @key{RET} 4 :} produces @expr{3:2} even though
12326@kbd{6 @key{RET} 4 /} produces @expr{1.5}.
12327
12328@kindex m f
12329@pindex calc-frac-mode
12330To set the Calculator to produce fractional results for normal integer
12331divisions, use the @kbd{m f} (@code{calc-frac-mode}) command.
12332For example, @expr{8/4} produces @expr{2} in either mode,
12333but @expr{6/4} produces @expr{3:2} in Fraction mode, @expr{1.5} in
12334Float mode.
12335
12336At any time you can use @kbd{c f} (@code{calc-float}) to convert a
12337fraction to a float, or @kbd{c F} (@code{calc-fraction}) to convert a
12338float to a fraction. @xref{Conversions}.
12339
12340@node Infinite Mode, Symbolic Mode, Fraction Mode, Calculation Modes
12341@subsection Infinite Mode
12342
12343@noindent
12344@cindex Infinite mode
12345The Calculator normally treats results like @expr{1 / 0} as errors;
12346formulas like this are left in unsimplified form. But Calc can be
12347put into a mode where such calculations instead produce ``infinite''
12348results.
12349
12350@kindex m i
12351@pindex calc-infinite-mode
12352The @kbd{m i} (@code{calc-infinite-mode}) command turns this mode
12353on and off. When the mode is off, infinities do not arise except
12354in calculations that already had infinities as inputs. (One exception
12355is that infinite open intervals like @samp{[0 .. inf)} can be
12356generated; however, intervals closed at infinity (@samp{[0 .. inf]})
12357will not be generated when Infinite mode is off.)
12358
12359With Infinite mode turned on, @samp{1 / 0} will generate @code{uinf},
12360an undirected infinity. @xref{Infinities}, for a discussion of the
12361difference between @code{inf} and @code{uinf}. Also, @expr{0 / 0}
12362evaluates to @code{nan}, the ``indeterminate'' symbol. Various other
12363functions can also return infinities in this mode; for example,
12364@samp{ln(0) = -inf}, and @samp{gamma(-7) = uinf}. Once again,
12365note that @samp{exp(inf) = inf} regardless of Infinite mode because
12366this calculation has infinity as an input.
12367
12368@cindex Positive Infinite mode
12369The @kbd{m i} command with a numeric prefix argument of zero,
12370i.e., @kbd{C-u 0 m i}, turns on a Positive Infinite mode in
12371which zero is treated as positive instead of being directionless.
12372Thus, @samp{1 / 0 = inf} and @samp{-1 / 0 = -inf} in this mode.
12373Note that zero never actually has a sign in Calc; there are no
12374separate representations for @mathit{+0} and @mathit{-0}. Positive
12375Infinite mode merely changes the interpretation given to the
12376single symbol, @samp{0}. One consequence of this is that, while
12377you might expect @samp{1 / -0 = -inf}, actually @samp{1 / -0}
12378is equivalent to @samp{1 / 0}, which is equal to positive @code{inf}.
12379
12380@node Symbolic Mode, Matrix Mode, Infinite Mode, Calculation Modes
12381@subsection Symbolic Mode
12382
12383@noindent
12384@cindex Symbolic mode
12385@cindex Inexact results
12386Calculations are normally performed numerically wherever possible.
12387For example, the @code{calc-sqrt} command, or @code{sqrt} function in an
12388algebraic expression, produces a numeric answer if the argument is a
12389number or a symbolic expression if the argument is an expression:
12390@kbd{2 Q} pushes 1.4142 but @kbd{@key{'} x+1 @key{RET} Q} pushes @samp{sqrt(x+1)}.
12391
12392@kindex m s
12393@pindex calc-symbolic-mode
12394In @dfn{Symbolic mode}, controlled by the @kbd{m s} (@code{calc-symbolic-mode})
12395command, functions which would produce inexact, irrational results are
12396left in symbolic form. Thus @kbd{16 Q} pushes 4, but @kbd{2 Q} pushes
12397@samp{sqrt(2)}.
12398
12399@kindex N
12400@pindex calc-eval-num
12401The shift-@kbd{N} (@code{calc-eval-num}) command evaluates numerically
12402the expression at the top of the stack, by temporarily disabling
12403@code{calc-symbolic-mode} and executing @kbd{=} (@code{calc-evaluate}).
12404Given a numeric prefix argument, it also
12405sets the floating-point precision to the specified value for the duration
12406of the command.
12407
12408To evaluate a formula numerically without expanding the variables it
12409contains, you can use the key sequence @kbd{m s a v m s} (this uses
12410@code{calc-alg-evaluate}, which resimplifies but doesn't evaluate
12411variables.)
12412
12413@node Matrix Mode, Automatic Recomputation, Symbolic Mode, Calculation Modes
12414@subsection Matrix and Scalar Modes
12415
12416@noindent
12417@cindex Matrix mode
12418@cindex Scalar mode
12419Calc sometimes makes assumptions during algebraic manipulation that
12420are awkward or incorrect when vectors and matrices are involved.
12421Calc has two modes, @dfn{Matrix mode} and @dfn{Scalar mode}, which
12422modify its behavior around vectors in useful ways.
12423
12424@kindex m v
12425@pindex calc-matrix-mode
12426Press @kbd{m v} (@code{calc-matrix-mode}) once to enter Matrix mode.
12427In this mode, all objects are assumed to be matrices unless provably
12428otherwise. One major effect is that Calc will no longer consider
12429multiplication to be commutative. (Recall that in matrix arithmetic,
12430@samp{A*B} is not the same as @samp{B*A}.) This assumption affects
12431rewrite rules and algebraic simplification. Another effect of this
12432mode is that calculations that would normally produce constants like
124330 and 1 (e.g., @expr{a - a} and @expr{a / a}, respectively) will now
12434produce function calls that represent ``generic'' zero or identity
12435matrices: @samp{idn(0)}, @samp{idn(1)}. The @code{idn} function
12436@samp{idn(@var{a},@var{n})} returns @var{a} times an @var{n}x@var{n}
12437identity matrix; if @var{n} is omitted, it doesn't know what
12438dimension to use and so the @code{idn} call remains in symbolic
12439form. However, if this generic identity matrix is later combined
12440with a matrix whose size is known, it will be converted into
12441a true identity matrix of the appropriate size. On the other hand,
12442if it is combined with a scalar (as in @samp{idn(1) + 2}), Calc
12443will assume it really was a scalar after all and produce, e.g., 3.
12444
12445Press @kbd{m v} a second time to get Scalar mode. Here, objects are
12446assumed @emph{not} to be vectors or matrices unless provably so.
12447For example, normally adding a variable to a vector, as in
12448@samp{[x, y, z] + a}, will leave the sum in symbolic form because
12449as far as Calc knows, @samp{a} could represent either a number or
12450another 3-vector. In Scalar mode, @samp{a} is assumed to be a
12451non-vector, and the addition is evaluated to @samp{[x+a, y+a, z+a]}.
12452
12453Press @kbd{m v} a third time to return to the normal mode of operation.
12454
12455If you press @kbd{m v} with a numeric prefix argument @var{n}, you
12456get a special ``dimensioned'' Matrix mode in which matrices of
12457unknown size are assumed to be @var{n}x@var{n} square matrices.
12458Then, the function call @samp{idn(1)} will expand into an actual
12459matrix rather than representing a ``generic'' matrix. Simply typing
12460@kbd{C-u m v} will get you a square Matrix mode, in which matrices of
12461unknown size are assumed to be square matrices of unspecified size.
12462
12463@cindex Declaring scalar variables
12464Of course these modes are approximations to the true state of
12465affairs, which is probably that some quantities will be matrices
12466and others will be scalars. One solution is to ``declare''
12467certain variables or functions to be scalar-valued.
12468@xref{Declarations}, to see how to make declarations in Calc.
12469
12470There is nothing stopping you from declaring a variable to be
12471scalar and then storing a matrix in it; however, if you do, the
12472results you get from Calc may not be valid. Suppose you let Calc
12473get the result @samp{[x+a, y+a, z+a]} shown above, and then stored
12474@samp{[1, 2, 3]} in @samp{a}. The result would not be the same as
12475for @samp{[x, y, z] + [1, 2, 3]}, but that's because you have broken
12476your earlier promise to Calc that @samp{a} would be scalar.
12477
12478Another way to mix scalars and matrices is to use selections
12479(@pxref{Selecting Subformulas}). Use Matrix mode when operating on
12480your formula normally; then, to apply Scalar mode to a certain part
12481of the formula without affecting the rest just select that part,
12482change into Scalar mode and press @kbd{=} to resimplify the part
12483under this mode, then change back to Matrix mode before deselecting.
12484
12485@node Automatic Recomputation, Working Message, Matrix Mode, Calculation Modes
12486@subsection Automatic Recomputation
12487
12488@noindent
12489The @dfn{evaluates-to} operator, @samp{=>}, has the special
12490property that any @samp{=>} formulas on the stack are recomputed
12491whenever variable values or mode settings that might affect them
12492are changed. @xref{Evaluates-To Operator}.
12493
12494@kindex m C
12495@pindex calc-auto-recompute
12496The @kbd{m C} (@code{calc-auto-recompute}) command turns this
12497automatic recomputation on and off. If you turn it off, Calc will
12498not update @samp{=>} operators on the stack (nor those in the
12499attached Embedded mode buffer, if there is one). They will not
12500be updated unless you explicitly do so by pressing @kbd{=} or until
12501you press @kbd{m C} to turn recomputation back on. (While automatic
12502recomputation is off, you can think of @kbd{m C m C} as a command
12503to update all @samp{=>} operators while leaving recomputation off.)
12504
12505To update @samp{=>} operators in an Embedded buffer while
12506automatic recomputation is off, use @w{@kbd{C-x * u}}.
12507@xref{Embedded Mode}.
12508
12509@node Working Message, , Automatic Recomputation, Calculation Modes
12510@subsection Working Messages
12511
12512@noindent
12513@cindex Performance
12514@cindex Working messages
12515Since the Calculator is written entirely in Emacs Lisp, which is not
12516designed for heavy numerical work, many operations are quite slow.
12517The Calculator normally displays the message @samp{Working...} in the
12518echo area during any command that may be slow. In addition, iterative
12519operations such as square roots and trigonometric functions display the
12520intermediate result at each step. Both of these types of messages can
12521be disabled if you find them distracting.
12522
12523@kindex m w
12524@pindex calc-working
12525Type @kbd{m w} (@code{calc-working}) with a numeric prefix of 0 to
12526disable all ``working'' messages. Use a numeric prefix of 1 to enable
12527only the plain @samp{Working...} message. Use a numeric prefix of 2 to
12528see intermediate results as well. With no numeric prefix this displays
12529the current mode.
12530
12531While it may seem that the ``working'' messages will slow Calc down
12532considerably, experiments have shown that their impact is actually
12533quite small. But if your terminal is slow you may find that it helps
12534to turn the messages off.
12535
12536@node Simplification Modes, Declarations, Calculation Modes, Mode Settings
12537@section Simplification Modes
12538
12539@noindent
12540The current @dfn{simplification mode} controls how numbers and formulas
12541are ``normalized'' when being taken from or pushed onto the stack.
12542Some normalizations are unavoidable, such as rounding floating-point
12543results to the current precision, and reducing fractions to simplest
12544form. Others, such as simplifying a formula like @expr{a+a} (or @expr{2+3}),
12545are done by default but can be turned off when necessary.
12546
12547When you press a key like @kbd{+} when @expr{2} and @expr{3} are on the
12548stack, Calc pops these numbers, normalizes them, creates the formula
12549@expr{2+3}, normalizes it, and pushes the result. Of course the standard
12550rules for normalizing @expr{2+3} will produce the result @expr{5}.
12551
12552Simplification mode commands consist of the lower-case @kbd{m} prefix key
12553followed by a shifted letter.
12554
12555@kindex m O
12556@pindex calc-no-simplify-mode
12557The @kbd{m O} (@code{calc-no-simplify-mode}) command turns off all optional
12558simplifications. These would leave a formula like @expr{2+3} alone. In
12559fact, nothing except simple numbers are ever affected by normalization
12560in this mode.
12561
12562@kindex m N
12563@pindex calc-num-simplify-mode
12564The @kbd{m N} (@code{calc-num-simplify-mode}) command turns off simplification
12565of any formulas except those for which all arguments are constants. For
12566example, @expr{1+2} is simplified to @expr{3}, and @expr{a+(2-2)} is
12567simplified to @expr{a+0} but no further, since one argument of the sum
12568is not a constant. Unfortunately, @expr{(a+2)-2} is @emph{not} simplified
12569because the top-level @samp{-} operator's arguments are not both
12570constant numbers (one of them is the formula @expr{a+2}).
12571A constant is a number or other numeric object (such as a constant
12572error form or modulo form), or a vector all of whose
12573elements are constant.
12574
12575@kindex m D
12576@pindex calc-default-simplify-mode
12577The @kbd{m D} (@code{calc-default-simplify-mode}) command restores the
12578default simplifications for all formulas. This includes many easy and
12579fast algebraic simplifications such as @expr{a+0} to @expr{a}, and
12580@expr{a + 2 a} to @expr{3 a}, as well as evaluating functions like
12581@expr{@tfn{deriv}(x^2, x)} to @expr{2 x}.
12582
12583@kindex m B
12584@pindex calc-bin-simplify-mode
12585The @kbd{m B} (@code{calc-bin-simplify-mode}) mode applies the default
12586simplifications to a result and then, if the result is an integer,
12587uses the @kbd{b c} (@code{calc-clip}) command to clip the integer according
12588to the current binary word size. @xref{Binary Functions}. Real numbers
12589are rounded to the nearest integer and then clipped; other kinds of
12590results (after the default simplifications) are left alone.
12591
12592@kindex m A
12593@pindex calc-alg-simplify-mode
12594The @kbd{m A} (@code{calc-alg-simplify-mode}) mode does algebraic
12595simplification; it applies all the default simplifications, and also
12596the more powerful (and slower) simplifications made by @kbd{a s}
12597(@code{calc-simplify}). @xref{Algebraic Simplifications}.
12598
12599@kindex m E
12600@pindex calc-ext-simplify-mode
12601The @kbd{m E} (@code{calc-ext-simplify-mode}) mode does ``extended''
12602algebraic simplification, as by the @kbd{a e} (@code{calc-simplify-extended})
12603command. @xref{Unsafe Simplifications}.
12604
12605@kindex m U
12606@pindex calc-units-simplify-mode
12607The @kbd{m U} (@code{calc-units-simplify-mode}) mode does units
12608simplification; it applies the command @kbd{u s}
12609(@code{calc-simplify-units}), which in turn
12610is a superset of @kbd{a s}. In this mode, variable names which
12611are identifiable as unit names (like @samp{mm} for ``millimeters'')
12612are simplified with their unit definitions in mind.
12613
12614A common technique is to set the simplification mode down to the lowest
12615amount of simplification you will allow to be applied automatically, then
12616use manual commands like @kbd{a s} and @kbd{c c} (@code{calc-clean}) to
12617perform higher types of simplifications on demand. @xref{Algebraic
12618Definitions}, for another sample use of No-Simplification mode.
12619
12620@node Declarations, Display Modes, Simplification Modes, Mode Settings
12621@section Declarations
12622
12623@noindent
12624A @dfn{declaration} is a statement you make that promises you will
12625use a certain variable or function in a restricted way. This may
12626give Calc the freedom to do things that it couldn't do if it had to
12627take the fully general situation into account.
12628
12629@menu
12630* Declaration Basics::
12631* Kinds of Declarations::
12632* Functions for Declarations::
12633@end menu
12634
12635@node Declaration Basics, Kinds of Declarations, Declarations, Declarations
12636@subsection Declaration Basics
12637
12638@noindent
12639@kindex s d
12640@pindex calc-declare-variable
12641The @kbd{s d} (@code{calc-declare-variable}) command is the easiest
12642way to make a declaration for a variable. This command prompts for
12643the variable name, then prompts for the declaration. The default
12644at the declaration prompt is the previous declaration, if any.
12645You can edit this declaration, or press @kbd{C-k} to erase it and
12646type a new declaration. (Or, erase it and press @key{RET} to clear
12647the declaration, effectively ``undeclaring'' the variable.)
12648
12649A declaration is in general a vector of @dfn{type symbols} and
12650@dfn{range} values. If there is only one type symbol or range value,
12651you can write it directly rather than enclosing it in a vector.
12652For example, @kbd{s d foo @key{RET} real @key{RET}} declares @code{foo} to
12653be a real number, and @kbd{s d bar @key{RET} [int, const, [1..6]] @key{RET}}
12654declares @code{bar} to be a constant integer between 1 and 6.
12655(Actually, you can omit the outermost brackets and Calc will
12656provide them for you: @kbd{s d bar @key{RET} int, const, [1..6] @key{RET}}.)
12657
12658@cindex @code{Decls} variable
12659@vindex Decls
12660Declarations in Calc are kept in a special variable called @code{Decls}.
12661This variable encodes the set of all outstanding declarations in
12662the form of a matrix. Each row has two elements: A variable or
12663vector of variables declared by that row, and the declaration
12664specifier as described above. You can use the @kbd{s D} command to
12665edit this variable if you wish to see all the declarations at once.
12666@xref{Operations on Variables}, for a description of this command
12667and the @kbd{s p} command that allows you to save your declarations
12668permanently if you wish.
12669
12670Items being declared can also be function calls. The arguments in
12671the call are ignored; the effect is to say that this function returns
12672values of the declared type for any valid arguments. The @kbd{s d}
12673command declares only variables, so if you wish to make a function
12674declaration you will have to edit the @code{Decls} matrix yourself.
12675
12676For example, the declaration matrix
12677
12678@smallexample
12679@group
12680[ [ foo, real ]
12681 [ [j, k, n], int ]
12682 [ f(1,2,3), [0 .. inf) ] ]
12683@end group
12684@end smallexample
12685
12686@noindent
12687declares that @code{foo} represents a real number, @code{j}, @code{k}
12688and @code{n} represent integers, and the function @code{f} always
12689returns a real number in the interval shown.
12690
12691@vindex All
12692If there is a declaration for the variable @code{All}, then that
12693declaration applies to all variables that are not otherwise declared.
12694It does not apply to function names. For example, using the row
12695@samp{[All, real]} says that all your variables are real unless they
12696are explicitly declared without @code{real} in some other row.
12697The @kbd{s d} command declares @code{All} if you give a blank
12698response to the variable-name prompt.
12699
12700@node Kinds of Declarations, Functions for Declarations, Declaration Basics, Declarations
12701@subsection Kinds of Declarations
12702
12703@noindent
12704The type-specifier part of a declaration (that is, the second prompt
12705in the @kbd{s d} command) can be a type symbol, an interval, or a
12706vector consisting of zero or more type symbols followed by zero or
12707more intervals or numbers that represent the set of possible values
12708for the variable.
12709
12710@smallexample
12711@group
12712[ [ a, [1, 2, 3, 4, 5] ]
12713 [ b, [1 .. 5] ]
12714 [ c, [int, 1 .. 5] ] ]
12715@end group
12716@end smallexample
12717
12718Here @code{a} is declared to contain one of the five integers shown;
12719@code{b} is any number in the interval from 1 to 5 (any real number
12720since we haven't specified), and @code{c} is any integer in that
12721interval. Thus the declarations for @code{a} and @code{c} are
12722nearly equivalent (see below).
12723
12724The type-specifier can be the empty vector @samp{[]} to say that
12725nothing is known about a given variable's value. This is the same
12726as not declaring the variable at all except that it overrides any
12727@code{All} declaration which would otherwise apply.
12728
12729The initial value of @code{Decls} is the empty vector @samp{[]}.
12730If @code{Decls} has no stored value or if the value stored in it
12731is not valid, it is ignored and there are no declarations as far
12732as Calc is concerned. (The @kbd{s d} command will replace such a
12733malformed value with a fresh empty matrix, @samp{[]}, before recording
12734the new declaration.) Unrecognized type symbols are ignored.
12735
12736The following type symbols describe what sorts of numbers will be
12737stored in a variable:
12738
12739@table @code
12740@item int
12741Integers.
12742@item numint
12743Numerical integers. (Integers or integer-valued floats.)
12744@item frac
12745Fractions. (Rational numbers which are not integers.)
12746@item rat
12747Rational numbers. (Either integers or fractions.)
12748@item float
12749Floating-point numbers.
12750@item real
12751Real numbers. (Integers, fractions, or floats. Actually,
12752intervals and error forms with real components also count as
12753reals here.)
12754@item pos
12755Positive real numbers. (Strictly greater than zero.)
12756@item nonneg
12757Nonnegative real numbers. (Greater than or equal to zero.)
12758@item number
12759Numbers. (Real or complex.)
12760@end table
12761
12762Calc uses this information to determine when certain simplifications
12763of formulas are safe. For example, @samp{(x^y)^z} cannot be
12764simplified to @samp{x^(y z)} in general; for example,
12765@samp{((-3)^2)^1:2} is 3, but @samp{(-3)^(2*1:2) = (-3)^1} is @mathit{-3}.
12766However, this simplification @emph{is} safe if @code{z} is known
12767to be an integer, or if @code{x} is known to be a nonnegative
12768real number. If you have given declarations that allow Calc to
12769deduce either of these facts, Calc will perform this simplification
12770of the formula.
12771
12772Calc can apply a certain amount of logic when using declarations.
12773For example, @samp{(x^y)^(2n+1)} will be simplified if @code{n}
12774has been declared @code{int}; Calc knows that an integer times an
12775integer, plus an integer, must always be an integer. (In fact,
12776Calc would simplify @samp{(-x)^(2n+1)} to @samp{-(x^(2n+1))} since
12777it is able to determine that @samp{2n+1} must be an odd integer.)
12778
12779Similarly, @samp{(abs(x)^y)^z} will be simplified to @samp{abs(x)^(y z)}
12780because Calc knows that the @code{abs} function always returns a
12781nonnegative real. If you had a @code{myabs} function that also had
12782this property, you could get Calc to recognize it by adding the row
12783@samp{[myabs(), nonneg]} to the @code{Decls} matrix.
12784
12785One instance of this simplification is @samp{sqrt(x^2)} (since the
12786@code{sqrt} function is effectively a one-half power). Normally
12787Calc leaves this formula alone. After the command
12788@kbd{s d x @key{RET} real @key{RET}}, however, it can simplify the formula to
12789@samp{abs(x)}. And after @kbd{s d x @key{RET} nonneg @key{RET}}, Calc can
12790simplify this formula all the way to @samp{x}.
12791
12792If there are any intervals or real numbers in the type specifier,
12793they comprise the set of possible values that the variable or
12794function being declared can have. In particular, the type symbol
12795@code{real} is effectively the same as the range @samp{[-inf .. inf]}
12796(note that infinity is included in the range of possible values);
12797@code{pos} is the same as @samp{(0 .. inf]}, and @code{nonneg} is
12798the same as @samp{[0 .. inf]}. Saying @samp{[real, [-5 .. 5]]} is
12799redundant because the fact that the variable is real can be
12800deduced just from the interval, but @samp{[int, [-5 .. 5]]} and
12801@samp{[rat, [-5 .. 5]]} are useful combinations.
12802
12803Note that the vector of intervals or numbers is in the same format
12804used by Calc's set-manipulation commands. @xref{Set Operations}.
12805
12806The type specifier @samp{[1, 2, 3]} is equivalent to
12807@samp{[numint, 1, 2, 3]}, @emph{not} to @samp{[int, 1, 2, 3]}.
12808In other words, the range of possible values means only that
12809the variable's value must be numerically equal to a number in
12810that range, but not that it must be equal in type as well.
12811Calc's set operations act the same way; @samp{in(2, [1., 2., 3.])}
12812and @samp{in(1.5, [1:2, 3:2, 5:2])} both report ``true.''
12813
12814If you use a conflicting combination of type specifiers, the
12815results are unpredictable. An example is @samp{[pos, [0 .. 5]]},
12816where the interval does not lie in the range described by the
12817type symbol.
12818
12819``Real'' declarations mostly affect simplifications involving powers
12820like the one described above. Another case where they are used
12821is in the @kbd{a P} command which returns a list of all roots of a
12822polynomial; if the variable has been declared real, only the real
12823roots (if any) will be included in the list.
12824
12825``Integer'' declarations are used for simplifications which are valid
12826only when certain values are integers (such as @samp{(x^y)^z}
12827shown above).
12828
12829Another command that makes use of declarations is @kbd{a s}, when
12830simplifying equations and inequalities. It will cancel @code{x}
12831from both sides of @samp{a x = b x} only if it is sure @code{x}
12832is non-zero, say, because it has a @code{pos} declaration.
12833To declare specifically that @code{x} is real and non-zero,
12834use @samp{[[-inf .. 0), (0 .. inf]]}. (There is no way in the
12835current notation to say that @code{x} is nonzero but not necessarily
12836real.) The @kbd{a e} command does ``unsafe'' simplifications,
12837including cancelling @samp{x} from the equation when @samp{x} is
12838not known to be nonzero.
12839
12840Another set of type symbols distinguish between scalars and vectors.
12841
12842@table @code
12843@item scalar
12844The value is not a vector.
12845@item vector
12846The value is a vector.
12847@item matrix
12848The value is a matrix (a rectangular vector of vectors).
12849@item sqmatrix
12850The value is a square matrix.
12851@end table
12852
12853These type symbols can be combined with the other type symbols
12854described above; @samp{[int, matrix]} describes an object which
12855is a matrix of integers.
12856
12857Scalar/vector declarations are used to determine whether certain
12858algebraic operations are safe. For example, @samp{[a, b, c] + x}
12859is normally not simplified to @samp{[a + x, b + x, c + x]}, but
12860it will be if @code{x} has been declared @code{scalar}. On the
12861other hand, multiplication is usually assumed to be commutative,
12862but the terms in @samp{x y} will never be exchanged if both @code{x}
12863and @code{y} are known to be vectors or matrices. (Calc currently
12864never distinguishes between @code{vector} and @code{matrix}
12865declarations.)
12866
12867@xref{Matrix Mode}, for a discussion of Matrix mode and
12868Scalar mode, which are similar to declaring @samp{[All, matrix]}
12869or @samp{[All, scalar]} but much more convenient.
12870
12871One more type symbol that is recognized is used with the @kbd{H a d}
12872command for taking total derivatives of a formula. @xref{Calculus}.
12873
12874@table @code
12875@item const
12876The value is a constant with respect to other variables.
12877@end table
12878
12879Calc does not check the declarations for a variable when you store
12880a value in it. However, storing @mathit{-3.5} in a variable that has
12881been declared @code{pos}, @code{int}, or @code{matrix} may have
12882unexpected effects; Calc may evaluate @samp{sqrt(x^2)} to @expr{3.5}
12883if it substitutes the value first, or to @expr{-3.5} if @code{x}
12884was declared @code{pos} and the formula @samp{sqrt(x^2)} is
12885simplified to @samp{x} before the value is substituted. Before
12886using a variable for a new purpose, it is best to use @kbd{s d}
12887or @kbd{s D} to check to make sure you don't still have an old
12888declaration for the variable that will conflict with its new meaning.
12889
12890@node Functions for Declarations, , Kinds of Declarations, Declarations
12891@subsection Functions for Declarations
12892
12893@noindent
12894Calc has a set of functions for accessing the current declarations
12895in a convenient manner. These functions return 1 if the argument
12896can be shown to have the specified property, or 0 if the argument
12897can be shown @emph{not} to have that property; otherwise they are
12898left unevaluated. These functions are suitable for use with rewrite
12899rules (@pxref{Conditional Rewrite Rules}) or programming constructs
12900(@pxref{Conditionals in Macros}). They can be entered only using
12901algebraic notation. @xref{Logical Operations}, for functions
12902that perform other tests not related to declarations.
12903
12904For example, @samp{dint(17)} returns 1 because 17 is an integer, as
12905do @samp{dint(n)} and @samp{dint(2 n - 3)} if @code{n} has been declared
12906@code{int}, but @samp{dint(2.5)} and @samp{dint(n + 0.5)} return 0.
12907Calc consults knowledge of its own built-in functions as well as your
12908own declarations: @samp{dint(floor(x))} returns 1.
12909
12910@ignore
12911@starindex
12912@end ignore
12913@tindex dint
12914@ignore
12915@starindex
12916@end ignore
12917@tindex dnumint
12918@ignore
12919@starindex
12920@end ignore
12921@tindex dnatnum
12922The @code{dint} function checks if its argument is an integer.
12923The @code{dnatnum} function checks if its argument is a natural
12924number, i.e., a nonnegative integer. The @code{dnumint} function
12925checks if its argument is numerically an integer, i.e., either an
12926integer or an integer-valued float. Note that these and the other
12927data type functions also accept vectors or matrices composed of
12928suitable elements, and that real infinities @samp{inf} and @samp{-inf}
12929are considered to be integers for the purposes of these functions.
12930
12931@ignore
12932@starindex
12933@end ignore
12934@tindex drat
12935The @code{drat} function checks if its argument is rational, i.e.,
12936an integer or fraction. Infinities count as rational, but intervals
12937and error forms do not.
12938
12939@ignore
12940@starindex
12941@end ignore
12942@tindex dreal
12943The @code{dreal} function checks if its argument is real. This
12944includes integers, fractions, floats, real error forms, and intervals.
12945
12946@ignore
12947@starindex
12948@end ignore
12949@tindex dimag
12950The @code{dimag} function checks if its argument is imaginary,
12951i.e., is mathematically equal to a real number times @expr{i}.
12952
12953@ignore
12954@starindex
12955@end ignore
12956@tindex dpos
12957@ignore
12958@starindex
12959@end ignore
12960@tindex dneg
12961@ignore
12962@starindex
12963@end ignore
12964@tindex dnonneg
12965The @code{dpos} function checks for positive (but nonzero) reals.
12966The @code{dneg} function checks for negative reals. The @code{dnonneg}
12967function checks for nonnegative reals, i.e., reals greater than or
12968equal to zero. Note that the @kbd{a s} command can simplify an
12969expression like @expr{x > 0} to 1 or 0 using @code{dpos}, and that
12970@kbd{a s} is effectively applied to all conditions in rewrite rules,
12971so the actual functions @code{dpos}, @code{dneg}, and @code{dnonneg}
12972are rarely necessary.
12973
12974@ignore
12975@starindex
12976@end ignore
12977@tindex dnonzero
12978The @code{dnonzero} function checks that its argument is nonzero.
12979This includes all nonzero real or complex numbers, all intervals that
12980do not include zero, all nonzero modulo forms, vectors all of whose
12981elements are nonzero, and variables or formulas whose values can be
12982deduced to be nonzero. It does not include error forms, since they
12983represent values which could be anything including zero. (This is
12984also the set of objects considered ``true'' in conditional contexts.)
12985
12986@ignore
12987@starindex
12988@end ignore
12989@tindex deven
12990@ignore
12991@starindex
12992@end ignore
12993@tindex dodd
12994The @code{deven} function returns 1 if its argument is known to be
12995an even integer (or integer-valued float); it returns 0 if its argument
12996is known not to be even (because it is known to be odd or a non-integer).
12997The @kbd{a s} command uses this to simplify a test of the form
12998@samp{x % 2 = 0}. There is also an analogous @code{dodd} function.
12999
13000@ignore
13001@starindex
13002@end ignore
13003@tindex drange
13004The @code{drange} function returns a set (an interval or a vector
13005of intervals and/or numbers; @pxref{Set Operations}) that describes
13006the set of possible values of its argument. If the argument is
13007a variable or a function with a declaration, the range is copied
13008from the declaration. Otherwise, the possible signs of the
13009expression are determined using a method similar to @code{dpos},
13010etc., and a suitable set like @samp{[0 .. inf]} is returned. If
13011the expression is not provably real, the @code{drange} function
13012remains unevaluated.
13013
13014@ignore
13015@starindex
13016@end ignore
13017@tindex dscalar
13018The @code{dscalar} function returns 1 if its argument is provably
13019scalar, or 0 if its argument is provably non-scalar. It is left
13020unevaluated if this cannot be determined. (If Matrix mode or Scalar
13021mode is in effect, this function returns 1 or 0, respectively,
13022if it has no other information.) When Calc interprets a condition
13023(say, in a rewrite rule) it considers an unevaluated formula to be
13024``false.'' Thus, @samp{dscalar(a)} is ``true'' only if @code{a} is
13025provably scalar, and @samp{!dscalar(a)} is ``true'' only if @code{a}
13026is provably non-scalar; both are ``false'' if there is insufficient
13027information to tell.
13028
13029@node Display Modes, Language Modes, Declarations, Mode Settings
13030@section Display Modes
13031
13032@noindent
13033The commands in this section are two-key sequences beginning with the
13034@kbd{d} prefix. The @kbd{d l} (@code{calc-line-numbering}) and @kbd{d b}
13035(@code{calc-line-breaking}) commands are described elsewhere;
13036@pxref{Stack Basics} and @pxref{Normal Language Modes}, respectively.
13037Display formats for vectors and matrices are also covered elsewhere;
13038@pxref{Vector and Matrix Formats}.
13039
13040One thing all display modes have in common is their treatment of the
13041@kbd{H} prefix. This prefix causes any mode command that would normally
13042refresh the stack to leave the stack display alone. The word ``Dirty''
13043will appear in the mode line when Calc thinks the stack display may not
13044reflect the latest mode settings.
13045
13046@kindex d @key{RET}
13047@pindex calc-refresh-top
13048The @kbd{d @key{RET}} (@code{calc-refresh-top}) command reformats the
13049top stack entry according to all the current modes. Positive prefix
13050arguments reformat the top @var{n} entries; negative prefix arguments
13051reformat the specified entry, and a prefix of zero is equivalent to
13052@kbd{d @key{SPC}} (@code{calc-refresh}), which reformats the entire stack.
13053For example, @kbd{H d s M-2 d @key{RET}} changes to scientific notation
13054but reformats only the top two stack entries in the new mode.
13055
13056The @kbd{I} prefix has another effect on the display modes. The mode
13057is set only temporarily; the top stack entry is reformatted according
13058to that mode, then the original mode setting is restored. In other
13059words, @kbd{I d s} is equivalent to @kbd{H d s d @key{RET} H d (@var{old mode})}.
13060
13061@menu
13062* Radix Modes::
13063* Grouping Digits::
13064* Float Formats::
13065* Complex Formats::
13066* Fraction Formats::
13067* HMS Formats::
13068* Date Formats::
13069* Truncating the Stack::
13070* Justification::
13071* Labels::
13072@end menu
13073
13074@node Radix Modes, Grouping Digits, Display Modes, Display Modes
13075@subsection Radix Modes
13076
13077@noindent
13078@cindex Radix display
13079@cindex Non-decimal numbers
13080@cindex Decimal and non-decimal numbers
13081Calc normally displays numbers in decimal (@dfn{base-10} or @dfn{radix-10})
13082notation. Calc can actually display in any radix from two (binary) to 36.
13083When the radix is above 10, the letters @code{A} to @code{Z} are used as
13084digits. When entering such a number, letter keys are interpreted as
13085potential digits rather than terminating numeric entry mode.
13086
13087@kindex d 2
13088@kindex d 8
13089@kindex d 6
13090@kindex d 0
13091@cindex Hexadecimal integers
13092@cindex Octal integers
13093The key sequences @kbd{d 2}, @kbd{d 8}, @kbd{d 6}, and @kbd{d 0} select
13094binary, octal, hexadecimal, and decimal as the current display radix,
13095respectively. Numbers can always be entered in any radix, though the
13096current radix is used as a default if you press @kbd{#} without any initial
13097digits. A number entered without a @kbd{#} is @emph{always} interpreted
13098as decimal.
13099
13100@kindex d r
13101@pindex calc-radix
13102To set the radix generally, use @kbd{d r} (@code{calc-radix}) and enter
13103an integer from 2 to 36. You can specify the radix as a numeric prefix
13104argument; otherwise you will be prompted for it.
13105
13106@kindex d z
13107@pindex calc-leading-zeros
13108@cindex Leading zeros
13109Integers normally are displayed with however many digits are necessary to
13110represent the integer and no more. The @kbd{d z} (@code{calc-leading-zeros})
13111command causes integers to be padded out with leading zeros according to the
13112current binary word size. (@xref{Binary Functions}, for a discussion of
13113word size.) If the absolute value of the word size is @expr{w}, all integers
13114are displayed with at least enough digits to represent
13115@texline @math{2^w-1}
13116@infoline @expr{(2^w)-1}
13117in the current radix. (Larger integers will still be displayed in their
13118entirety.)
13119
13120@node Grouping Digits, Float Formats, Radix Modes, Display Modes
13121@subsection Grouping Digits
13122
13123@noindent
13124@kindex d g
13125@pindex calc-group-digits
13126@cindex Grouping digits
13127@cindex Digit grouping
13128Long numbers can be hard to read if they have too many digits. For
13129example, the factorial of 30 is 33 digits long! Press @kbd{d g}
13130(@code{calc-group-digits}) to enable @dfn{Grouping} mode, in which digits
13131are displayed in clumps of 3 or 4 (depending on the current radix)
13132separated by commas.
13133
13134The @kbd{d g} command toggles grouping on and off.
13135With a numeric prefix of 0, this command displays the current state of
13136the grouping flag; with an argument of minus one it disables grouping;
13137with a positive argument @expr{N} it enables grouping on every @expr{N}
13138digits. For floating-point numbers, grouping normally occurs only
13139before the decimal point. A negative prefix argument @expr{-N} enables
13140grouping every @expr{N} digits both before and after the decimal point.
13141
13142@kindex d ,
13143@pindex calc-group-char
13144The @kbd{d ,} (@code{calc-group-char}) command allows you to choose any
13145character as the grouping separator. The default is the comma character.
13146If you find it difficult to read vectors of large integers grouped with
13147commas, you may wish to use spaces or some other character instead.
13148This command takes the next character you type, whatever it is, and
13149uses it as the digit separator. As a special case, @kbd{d , \} selects
13150@samp{\,} (@TeX{}'s thin-space symbol) as the digit separator.
13151
13152Please note that grouped numbers will not generally be parsed correctly
13153if re-read in textual form, say by the use of @kbd{C-x * y} and @kbd{C-x * g}.
13154(@xref{Kill and Yank}, for details on these commands.) One exception is
13155the @samp{\,} separator, which doesn't interfere with parsing because it
13156is ignored by @TeX{} language mode.
13157
13158@node Float Formats, Complex Formats, Grouping Digits, Display Modes
13159@subsection Float Formats
13160
13161@noindent
13162Floating-point quantities are normally displayed in standard decimal
13163form, with scientific notation used if the exponent is especially high
13164or low. All significant digits are normally displayed. The commands
13165in this section allow you to choose among several alternative display
13166formats for floats.
13167
13168@kindex d n
13169@pindex calc-normal-notation
13170The @kbd{d n} (@code{calc-normal-notation}) command selects the normal
13171display format. All significant figures in a number are displayed.
13172With a positive numeric prefix, numbers are rounded if necessary to
13173that number of significant digits. With a negative numerix prefix,
13174the specified number of significant digits less than the current
13175precision is used. (Thus @kbd{C-u -2 d n} displays 10 digits if the
13176current precision is 12.)
13177
13178@kindex d f
13179@pindex calc-fix-notation
13180The @kbd{d f} (@code{calc-fix-notation}) command selects fixed-point
13181notation. The numeric argument is the number of digits after the
13182decimal point, zero or more. This format will relax into scientific
13183notation if a nonzero number would otherwise have been rounded all the
13184way to zero. Specifying a negative number of digits is the same as
13185for a positive number, except that small nonzero numbers will be rounded
13186to zero rather than switching to scientific notation.
13187
13188@kindex d s
13189@pindex calc-sci-notation
13190@cindex Scientific notation, display of
13191The @kbd{d s} (@code{calc-sci-notation}) command selects scientific
13192notation. A positive argument sets the number of significant figures
13193displayed, of which one will be before and the rest after the decimal
13194point. A negative argument works the same as for @kbd{d n} format.
13195The default is to display all significant digits.
13196
13197@kindex d e
13198@pindex calc-eng-notation
13199@cindex Engineering notation, display of
13200The @kbd{d e} (@code{calc-eng-notation}) command selects engineering
13201notation. This is similar to scientific notation except that the
13202exponent is rounded down to a multiple of three, with from one to three
13203digits before the decimal point. An optional numeric prefix sets the
13204number of significant digits to display, as for @kbd{d s}.
13205
13206It is important to distinguish between the current @emph{precision} and
13207the current @emph{display format}. After the commands @kbd{C-u 10 p}
13208and @kbd{C-u 6 d n} the Calculator computes all results to ten
13209significant figures but displays only six. (In fact, intermediate
13210calculations are often carried to one or two more significant figures,
13211but values placed on the stack will be rounded down to ten figures.)
13212Numbers are never actually rounded to the display precision for storage,
13213except by commands like @kbd{C-k} and @kbd{C-x * y} which operate on the
13214actual displayed text in the Calculator buffer.
13215
13216@kindex d .
13217@pindex calc-point-char
13218The @kbd{d .} (@code{calc-point-char}) command selects the character used
13219as a decimal point. Normally this is a period; users in some countries
13220may wish to change this to a comma. Note that this is only a display
13221style; on entry, periods must always be used to denote floating-point
13222numbers, and commas to separate elements in a list.
13223
13224@node Complex Formats, Fraction Formats, Float Formats, Display Modes
13225@subsection Complex Formats
13226
13227@noindent
13228@kindex d c
13229@pindex calc-complex-notation
13230There are three supported notations for complex numbers in rectangular
13231form. The default is as a pair of real numbers enclosed in parentheses
13232and separated by a comma: @samp{(a,b)}. The @kbd{d c}
13233(@code{calc-complex-notation}) command selects this style.
13234
13235@kindex d i
13236@pindex calc-i-notation
13237@kindex d j
13238@pindex calc-j-notation
13239The other notations are @kbd{d i} (@code{calc-i-notation}), in which
13240numbers are displayed in @samp{a+bi} form, and @kbd{d j}
13241(@code{calc-j-notation}) which displays the form @samp{a+bj} preferred
13242in some disciplines.
13243
13244@cindex @code{i} variable
13245@vindex i
13246Complex numbers are normally entered in @samp{(a,b)} format.
13247If you enter @samp{2+3i} as an algebraic formula, it will be stored as
13248the formula @samp{2 + 3 * i}. However, if you use @kbd{=} to evaluate
13249this formula and you have not changed the variable @samp{i}, the @samp{i}
13250will be interpreted as @samp{(0,1)} and the formula will be simplified
13251to @samp{(2,3)}. Other commands (like @code{calc-sin}) will @emph{not}
13252interpret the formula @samp{2 + 3 * i} as a complex number.
13253@xref{Variables}, under ``special constants.''
13254
13255@node Fraction Formats, HMS Formats, Complex Formats, Display Modes
13256@subsection Fraction Formats
13257
13258@noindent
13259@kindex d o
13260@pindex calc-over-notation
13261Display of fractional numbers is controlled by the @kbd{d o}
13262(@code{calc-over-notation}) command. By default, a number like
13263eight thirds is displayed in the form @samp{8:3}. The @kbd{d o} command
13264prompts for a one- or two-character format. If you give one character,
13265that character is used as the fraction separator. Common separators are
13266@samp{:} and @samp{/}. (During input of numbers, the @kbd{:} key must be
13267used regardless of the display format; in particular, the @kbd{/} is used
13268for RPN-style division, @emph{not} for entering fractions.)
13269
13270If you give two characters, fractions use ``integer-plus-fractional-part''
13271notation. For example, the format @samp{+/} would display eight thirds
13272as @samp{2+2/3}. If two colons are present in a number being entered,
13273the number is interpreted in this form (so that the entries @kbd{2:2:3}
13274and @kbd{8:3} are equivalent).
13275
13276It is also possible to follow the one- or two-character format with
13277a number. For example: @samp{:10} or @samp{+/3}. In this case,
13278Calc adjusts all fractions that are displayed to have the specified
13279denominator, if possible. Otherwise it adjusts the denominator to
13280be a multiple of the specified value. For example, in @samp{:6} mode
13281the fraction @expr{1:6} will be unaffected, but @expr{2:3} will be
13282displayed as @expr{4:6}, @expr{1:2} will be displayed as @expr{3:6},
13283and @expr{1:8} will be displayed as @expr{3:24}. Integers are also
13284affected by this mode: 3 is displayed as @expr{18:6}. Note that the
13285format @samp{:1} writes fractions the same as @samp{:}, but it writes
13286integers as @expr{n:1}.
13287
13288The fraction format does not affect the way fractions or integers are
13289stored, only the way they appear on the screen. The fraction format
13290never affects floats.
13291
13292@node HMS Formats, Date Formats, Fraction Formats, Display Modes
13293@subsection HMS Formats
13294
13295@noindent
13296@kindex d h
13297@pindex calc-hms-notation
13298The @kbd{d h} (@code{calc-hms-notation}) command controls the display of
13299HMS (hours-minutes-seconds) forms. It prompts for a string which
13300consists basically of an ``hours'' marker, optional punctuation, a
13301``minutes'' marker, more optional punctuation, and a ``seconds'' marker.
13302Punctuation is zero or more spaces, commas, or semicolons. The hours
13303marker is one or more non-punctuation characters. The minutes and
13304seconds markers must be single non-punctuation characters.
13305
13306The default HMS format is @samp{@@ ' "}, producing HMS values of the form
13307@samp{23@@ 30' 15.75"}. The format @samp{deg, ms} would display this same
13308value as @samp{23deg, 30m15.75s}. During numeric entry, the @kbd{h} or @kbd{o}
13309keys are recognized as synonyms for @kbd{@@} regardless of display format.
13310The @kbd{m} and @kbd{s} keys are recognized as synonyms for @kbd{'} and
13311@kbd{"}, respectively, but only if an @kbd{@@} (or @kbd{h} or @kbd{o}) has
13312already been typed; otherwise, they have their usual meanings
13313(@kbd{m-} prefix and @kbd{s-} prefix). Thus, @kbd{5 "}, @kbd{0 @@ 5 "}, and
13314@kbd{0 h 5 s} are some of the ways to enter the quantity ``five seconds.''
13315The @kbd{'} key is recognized as ``minutes'' only if @kbd{@@} (or @kbd{h} or
13316@kbd{o}) has already been pressed; otherwise it means to switch to algebraic
13317entry.
13318
13319@node Date Formats, Truncating the Stack, HMS Formats, Display Modes
13320@subsection Date Formats
13321
13322@noindent
13323@kindex d d
13324@pindex calc-date-notation
13325The @kbd{d d} (@code{calc-date-notation}) command controls the display
13326of date forms (@pxref{Date Forms}). It prompts for a string which
13327contains letters that represent the various parts of a date and time.
13328To show which parts should be omitted when the form represents a pure
13329date with no time, parts of the string can be enclosed in @samp{< >}
13330marks. If you don't include @samp{< >} markers in the format, Calc
13331guesses at which parts, if any, should be omitted when formatting
13332pure dates.
13333
13334The default format is: @samp{<H:mm:SSpp >Www Mmm D, YYYY}.
13335An example string in this format is @samp{3:32pm Wed Jan 9, 1991}.
13336If you enter a blank format string, this default format is
13337reestablished.
13338
13339Calc uses @samp{< >} notation for nameless functions as well as for
13340dates. @xref{Specifying Operators}. To avoid confusion with nameless
13341functions, your date formats should avoid using the @samp{#} character.
13342
13343@menu
13344* Date Formatting Codes::
13345* Free-Form Dates::
13346* Standard Date Formats::
13347@end menu
13348
13349@node Date Formatting Codes, Free-Form Dates, Date Formats, Date Formats
13350@subsubsection Date Formatting Codes
13351
13352@noindent
13353When displaying a date, the current date format is used. All
13354characters except for letters and @samp{<} and @samp{>} are
13355copied literally when dates are formatted. The portion between
13356@samp{< >} markers is omitted for pure dates, or included for
13357date/time forms. Letters are interpreted according to the table
13358below.
13359
13360When dates are read in during algebraic entry, Calc first tries to
13361match the input string to the current format either with or without
13362the time part. The punctuation characters (including spaces) must
13363match exactly; letter fields must correspond to suitable text in
13364the input. If this doesn't work, Calc checks if the input is a
13365simple number; if so, the number is interpreted as a number of days
13366since Jan 1, 1 AD. Otherwise, Calc tries a much more relaxed and
13367flexible algorithm which is described in the next section.
13368
13369Weekday names are ignored during reading.
13370
13371Two-digit year numbers are interpreted as lying in the range
13372from 1941 to 2039. Years outside that range are always
13373entered and displayed in full. Year numbers with a leading
13374@samp{+} sign are always interpreted exactly, allowing the
13375entry and display of the years 1 through 99 AD.
13376
13377Here is a complete list of the formatting codes for dates:
13378
13379@table @asis
13380@item Y
13381Year: ``91'' for 1991, ``7'' for 2007, ``+23'' for 23 AD.
13382@item YY
13383Year: ``91'' for 1991, ``07'' for 2007, ``+23'' for 23 AD.
13384@item BY
13385Year: ``91'' for 1991, `` 7'' for 2007, ``+23'' for 23 AD.
13386@item YYY
13387Year: ``1991'' for 1991, ``23'' for 23 AD.
13388@item YYYY
13389Year: ``1991'' for 1991, ``+23'' for 23 AD.
13390@item aa
13391Year: ``ad'' or blank.
13392@item AA
13393Year: ``AD'' or blank.
13394@item aaa
13395Year: ``ad '' or blank. (Note trailing space.)
13396@item AAA
13397Year: ``AD '' or blank.
13398@item aaaa
13399Year: ``a.d.'' or blank.
13400@item AAAA
13401Year: ``A.D.'' or blank.
13402@item bb
13403Year: ``bc'' or blank.
13404@item BB
13405Year: ``BC'' or blank.
13406@item bbb
13407Year: `` bc'' or blank. (Note leading space.)
13408@item BBB
13409Year: `` BC'' or blank.
13410@item bbbb
13411Year: ``b.c.'' or blank.
13412@item BBBB
13413Year: ``B.C.'' or blank.
13414@item M
13415Month: ``8'' for August.
13416@item MM
13417Month: ``08'' for August.
13418@item BM
13419Month: `` 8'' for August.
13420@item MMM
13421Month: ``AUG'' for August.
13422@item Mmm
13423Month: ``Aug'' for August.
13424@item mmm
13425Month: ``aug'' for August.
13426@item MMMM
13427Month: ``AUGUST'' for August.
13428@item Mmmm
13429Month: ``August'' for August.
13430@item D
13431Day: ``7'' for 7th day of month.
13432@item DD
13433Day: ``07'' for 7th day of month.
13434@item BD
13435Day: `` 7'' for 7th day of month.
13436@item W
13437Weekday: ``0'' for Sunday, ``6'' for Saturday.
13438@item WWW
13439Weekday: ``SUN'' for Sunday.
13440@item Www
13441Weekday: ``Sun'' for Sunday.
13442@item www
13443Weekday: ``sun'' for Sunday.
13444@item WWWW
13445Weekday: ``SUNDAY'' for Sunday.
13446@item Wwww
13447Weekday: ``Sunday'' for Sunday.
13448@item d
13449Day of year: ``34'' for Feb. 3.
13450@item ddd
13451Day of year: ``034'' for Feb. 3.
13452@item bdd
13453Day of year: `` 34'' for Feb. 3.
13454@item h
13455Hour: ``5'' for 5 AM; ``17'' for 5 PM.
13456@item hh
13457Hour: ``05'' for 5 AM; ``17'' for 5 PM.
13458@item bh
13459Hour: `` 5'' for 5 AM; ``17'' for 5 PM.
13460@item H
13461Hour: ``5'' for 5 AM and 5 PM.
13462@item HH
13463Hour: ``05'' for 5 AM and 5 PM.
13464@item BH
13465Hour: `` 5'' for 5 AM and 5 PM.
13466@item p
13467AM/PM: ``a'' or ``p''.
13468@item P
13469AM/PM: ``A'' or ``P''.
13470@item pp
13471AM/PM: ``am'' or ``pm''.
13472@item PP
13473AM/PM: ``AM'' or ``PM''.
13474@item pppp
13475AM/PM: ``a.m.'' or ``p.m.''.
13476@item PPPP
13477AM/PM: ``A.M.'' or ``P.M.''.
13478@item m
13479Minutes: ``7'' for 7.
13480@item mm
13481Minutes: ``07'' for 7.
13482@item bm
13483Minutes: `` 7'' for 7.
13484@item s
13485Seconds: ``7'' for 7; ``7.23'' for 7.23.
13486@item ss
13487Seconds: ``07'' for 7; ``07.23'' for 7.23.
13488@item bs
13489Seconds: `` 7'' for 7; `` 7.23'' for 7.23.
13490@item SS
13491Optional seconds: ``07'' for 7; blank for 0.
13492@item BS
13493Optional seconds: `` 7'' for 7; blank for 0.
13494@item N
13495Numeric date/time: ``726842.25'' for 6:00am Wed Jan 9, 1991.
13496@item n
13497Numeric date: ``726842'' for any time on Wed Jan 9, 1991.
13498@item J
13499Julian date/time: ``2448265.75'' for 6:00am Wed Jan 9, 1991.
13500@item j
13501Julian date: ``2448266'' for any time on Wed Jan 9, 1991.
13502@item U
13503Unix time: ``663400800'' for 6:00am Wed Jan 9, 1991.
13504@item X
13505Brackets suppression. An ``X'' at the front of the format
13506causes the surrounding @w{@samp{< >}} delimiters to be omitted
13507when formatting dates. Note that the brackets are still
13508required for algebraic entry.
13509@end table
13510
13511If ``SS'' or ``BS'' (optional seconds) is preceded by a colon, the
13512colon is also omitted if the seconds part is zero.
13513
13514If ``bb,'' ``bbb'' or ``bbbb'' or their upper-case equivalents
13515appear in the format, then negative year numbers are displayed
13516without a minus sign. Note that ``aa'' and ``bb'' are mutually
13517exclusive. Some typical usages would be @samp{YYYY AABB};
13518@samp{AAAYYYYBBB}; @samp{YYYYBBB}.
13519
13520The formats ``YY,'' ``YYYY,'' ``MM,'' ``DD,'' ``ddd,'' ``hh,'' ``HH,''
13521``mm,'' ``ss,'' and ``SS'' actually match any number of digits during
13522reading unless several of these codes are strung together with no
13523punctuation in between, in which case the input must have exactly as
13524many digits as there are letters in the format.
13525
13526The ``j,'' ``J,'' and ``U'' formats do not make any time zone
13527adjustment. They effectively use @samp{julian(x,0)} and
13528@samp{unixtime(x,0)} to make the conversion; @pxref{Date Arithmetic}.
13529
13530@node Free-Form Dates, Standard Date Formats, Date Formatting Codes, Date Formats
13531@subsubsection Free-Form Dates
13532
13533@noindent
13534When reading a date form during algebraic entry, Calc falls back
13535on the algorithm described here if the input does not exactly
13536match the current date format. This algorithm generally
13537``does the right thing'' and you don't have to worry about it,
13538but it is described here in full detail for the curious.
13539
13540Calc does not distinguish between upper- and lower-case letters
13541while interpreting dates.
13542
13543First, the time portion, if present, is located somewhere in the
13544text and then removed. The remaining text is then interpreted as
13545the date.
13546
13547A time is of the form @samp{hh:mm:ss}, possibly with the seconds
13548part omitted and possibly with an AM/PM indicator added to indicate
1354912-hour time. If the AM/PM is present, the minutes may also be
13550omitted. The AM/PM part may be any of the words @samp{am},
13551@samp{pm}, @samp{noon}, or @samp{midnight}; each of these may be
13552abbreviated to one letter, and the alternate forms @samp{a.m.},
13553@samp{p.m.}, and @samp{mid} are also understood. Obviously
13554@samp{noon} and @samp{midnight} are allowed only on 12:00:00.
13555The words @samp{noon}, @samp{mid}, and @samp{midnight} are also
13556recognized with no number attached.
13557
13558If there is no AM/PM indicator, the time is interpreted in 24-hour
13559format.
13560
13561To read the date portion, all words and numbers are isolated
13562from the string; other characters are ignored. All words must
13563be either month names or day-of-week names (the latter of which
13564are ignored). Names can be written in full or as three-letter
13565abbreviations.
13566
13567Large numbers, or numbers with @samp{+} or @samp{-} signs,
13568are interpreted as years. If one of the other numbers is
13569greater than 12, then that must be the day and the remaining
13570number in the input is therefore the month. Otherwise, Calc
13571assumes the month, day and year are in the same order that they
13572appear in the current date format. If the year is omitted, the
13573current year is taken from the system clock.
13574
13575If there are too many or too few numbers, or any unrecognizable
13576words, then the input is rejected.
13577
13578If there are any large numbers (of five digits or more) other than
13579the year, they are ignored on the assumption that they are something
13580like Julian dates that were included along with the traditional
13581date components when the date was formatted.
13582
13583One of the words @samp{ad}, @samp{a.d.}, @samp{bc}, or @samp{b.c.}
13584may optionally be used; the latter two are equivalent to a
13585minus sign on the year value.
13586
13587If you always enter a four-digit year, and use a name instead
13588of a number for the month, there is no danger of ambiguity.
13589
13590@node Standard Date Formats, , Free-Form Dates, Date Formats
13591@subsubsection Standard Date Formats
13592
13593@noindent
13594There are actually ten standard date formats, numbered 0 through 9.
13595Entering a blank line at the @kbd{d d} command's prompt gives
13596you format number 1, Calc's usual format. You can enter any digit
13597to select the other formats.
13598
13599To create your own standard date formats, give a numeric prefix
13600argument from 0 to 9 to the @w{@kbd{d d}} command. The format you
13601enter will be recorded as the new standard format of that
13602number, as well as becoming the new current date format.
13603You can save your formats permanently with the @w{@kbd{m m}}
13604command (@pxref{Mode Settings}).
13605
13606@table @asis
13607@item 0
13608@samp{N} (Numerical format)
13609@item 1
13610@samp{<H:mm:SSpp >Www Mmm D, YYYY} (American format)
13611@item 2
13612@samp{D Mmm YYYY<, h:mm:SS>} (European format)
13613@item 3
13614@samp{Www Mmm BD< hh:mm:ss> YYYY} (Unix written date format)
13615@item 4
13616@samp{M/D/Y< H:mm:SSpp>} (American slashed format)
13617@item 5
13618@samp{D.M.Y< h:mm:SS>} (European dotted format)
13619@item 6
13620@samp{M-D-Y< H:mm:SSpp>} (American dashed format)
13621@item 7
13622@samp{D-M-Y< h:mm:SS>} (European dashed format)
13623@item 8
13624@samp{j<, h:mm:ss>} (Julian day plus time)
13625@item 9
13626@samp{YYddd< hh:mm:ss>} (Year-day format)
13627@end table
13628
13629@node Truncating the Stack, Justification, Date Formats, Display Modes
13630@subsection Truncating the Stack
13631
13632@noindent
13633@kindex d t
13634@pindex calc-truncate-stack
13635@cindex Truncating the stack
13636@cindex Narrowing the stack
13637The @kbd{d t} (@code{calc-truncate-stack}) command moves the @samp{.}@:
13638line that marks the top-of-stack up or down in the Calculator buffer.
13639The number right above that line is considered to the be at the top of
13640the stack. Any numbers below that line are ``hidden'' from all stack
13641operations (although still visible to the user). This is similar to the
13642Emacs ``narrowing'' feature, except that the values below the @samp{.}
13643are @emph{visible}, just temporarily frozen. This feature allows you to
13644keep several independent calculations running at once in different parts
13645of the stack, or to apply a certain command to an element buried deep in
13646the stack.
13647
13648Pressing @kbd{d t} by itself moves the @samp{.} to the line the cursor
13649is on. Thus, this line and all those below it become hidden. To un-hide
13650these lines, move down to the end of the buffer and press @w{@kbd{d t}}.
13651With a positive numeric prefix argument @expr{n}, @kbd{d t} hides the
13652bottom @expr{n} values in the buffer. With a negative argument, it hides
13653all but the top @expr{n} values. With an argument of zero, it hides zero
13654values, i.e., moves the @samp{.} all the way down to the bottom.
13655
13656@kindex d [
13657@pindex calc-truncate-up
13658@kindex d ]
13659@pindex calc-truncate-down
13660The @kbd{d [} (@code{calc-truncate-up}) and @kbd{d ]}
13661(@code{calc-truncate-down}) commands move the @samp{.} up or down one
13662line at a time (or several lines with a prefix argument).
13663
13664@node Justification, Labels, Truncating the Stack, Display Modes
13665@subsection Justification
13666
13667@noindent
13668@kindex d <
13669@pindex calc-left-justify
13670@kindex d =
13671@pindex calc-center-justify
13672@kindex d >
13673@pindex calc-right-justify
13674Values on the stack are normally left-justified in the window. You can
13675control this arrangement by typing @kbd{d <} (@code{calc-left-justify}),
13676@kbd{d >} (@code{calc-right-justify}), or @kbd{d =}
13677(@code{calc-center-justify}). For example, in Right-Justification mode,
13678stack entries are displayed flush-right against the right edge of the
13679window.
13680
13681If you change the width of the Calculator window you may have to type
13682@kbd{d @key{SPC}} (@code{calc-refresh}) to re-align right-justified or centered
13683text.
13684
13685Right-justification is especially useful together with fixed-point
13686notation (see @code{d f}; @code{calc-fix-notation}). With these modes
13687together, the decimal points on numbers will always line up.
13688
13689With a numeric prefix argument, the justification commands give you
13690a little extra control over the display. The argument specifies the
13691horizontal ``origin'' of a display line. It is also possible to
13692specify a maximum line width using the @kbd{d b} command (@pxref{Normal
13693Language Modes}). For reference, the precise rules for formatting and
13694breaking lines are given below. Notice that the interaction between
13695origin and line width is slightly different in each justification
13696mode.
13697
13698In Left-Justified mode, the line is indented by a number of spaces
13699given by the origin (default zero). If the result is longer than the
13700maximum line width, if given, or too wide to fit in the Calc window
13701otherwise, then it is broken into lines which will fit; each broken
13702line is indented to the origin.
13703
13704In Right-Justified mode, lines are shifted right so that the rightmost
13705character is just before the origin, or just before the current
13706window width if no origin was specified. If the line is too long
13707for this, then it is broken; the current line width is used, if
13708specified, or else the origin is used as a width if that is
13709specified, or else the line is broken to fit in the window.
13710
13711In Centering mode, the origin is the column number of the center of
13712each stack entry. If a line width is specified, lines will not be
13713allowed to go past that width; Calc will either indent less or
13714break the lines if necessary. If no origin is specified, half the
13715line width or Calc window width is used.
13716
13717Note that, in each case, if line numbering is enabled the display
13718is indented an additional four spaces to make room for the line
13719number. The width of the line number is taken into account when
13720positioning according to the current Calc window width, but not
13721when positioning by explicit origins and widths. In the latter
13722case, the display is formatted as specified, and then uniformly
13723shifted over four spaces to fit the line numbers.
13724
13725@node Labels, , Justification, Display Modes
13726@subsection Labels
13727
13728@noindent
13729@kindex d @{
13730@pindex calc-left-label
13731The @kbd{d @{} (@code{calc-left-label}) command prompts for a string,
13732then displays that string to the left of every stack entry. If the
13733entries are left-justified (@pxref{Justification}), then they will
13734appear immediately after the label (unless you specified an origin
13735greater than the length of the label). If the entries are centered
13736or right-justified, the label appears on the far left and does not
13737affect the horizontal position of the stack entry.
13738
13739Give a blank string (with @kbd{d @{ @key{RET}}) to turn the label off.
13740
13741@kindex d @}
13742@pindex calc-right-label
13743The @kbd{d @}} (@code{calc-right-label}) command similarly adds a
13744label on the righthand side. It does not affect positioning of
13745the stack entries unless they are right-justified. Also, if both
13746a line width and an origin are given in Right-Justified mode, the
13747stack entry is justified to the origin and the righthand label is
13748justified to the line width.
13749
13750One application of labels would be to add equation numbers to
13751formulas you are manipulating in Calc and then copying into a
13752document (possibly using Embedded mode). The equations would
13753typically be centered, and the equation numbers would be on the
13754left or right as you prefer.
13755
13756@node Language Modes, Modes Variable, Display Modes, Mode Settings
13757@section Language Modes
13758
13759@noindent
13760The commands in this section change Calc to use a different notation for
13761entry and display of formulas, corresponding to the conventions of some
13762other common language such as Pascal or La@TeX{}. Objects displayed on the
13763stack or yanked from the Calculator to an editing buffer will be formatted
13764in the current language; objects entered in algebraic entry or yanked from
13765another buffer will be interpreted according to the current language.
13766
13767The current language has no effect on things written to or read from the
13768trail buffer, nor does it affect numeric entry. Only algebraic entry is
13769affected. You can make even algebraic entry ignore the current language
13770and use the standard notation by giving a numeric prefix, e.g., @kbd{C-u '}.
13771
13772For example, suppose the formula @samp{2*a[1] + atan(a[2])} occurs in a C
13773program; elsewhere in the program you need the derivatives of this formula
13774with respect to @samp{a[1]} and @samp{a[2]}. First, type @kbd{d C}
13775to switch to C notation. Now use @code{C-u C-x * g} to grab the formula
13776into the Calculator, @kbd{a d a[1] @key{RET}} to differentiate with respect
13777to the first variable, and @kbd{C-x * y} to yank the formula for the derivative
13778back into your C program. Press @kbd{U} to undo the differentiation and
13779repeat with @kbd{a d a[2] @key{RET}} for the other derivative.
13780
13781Without being switched into C mode first, Calc would have misinterpreted
13782the brackets in @samp{a[1]} and @samp{a[2]}, would not have known that
13783@code{atan} was equivalent to Calc's built-in @code{arctan} function,
13784and would have written the formula back with notations (like implicit
13785multiplication) which would not have been valid for a C program.
13786
13787As another example, suppose you are maintaining a C program and a La@TeX{}
13788document, each of which needs a copy of the same formula. You can grab the
13789formula from the program in C mode, switch to La@TeX{} mode, and yank the
13790formula into the document in La@TeX{} math-mode format.
13791
13792Language modes are selected by typing the letter @kbd{d} followed by a
13793shifted letter key.
13794
13795@menu
13796* Normal Language Modes::
13797* C FORTRAN Pascal::
13798* TeX and LaTeX Language Modes::
13799* Eqn Language Mode::
13800* Mathematica Language Mode::
13801* Maple Language Mode::
13802* Compositions::
13803* Syntax Tables::
13804@end menu
13805
13806@node Normal Language Modes, C FORTRAN Pascal, Language Modes, Language Modes
13807@subsection Normal Language Modes
13808
13809@noindent
13810@kindex d N
13811@pindex calc-normal-language
13812The @kbd{d N} (@code{calc-normal-language}) command selects the usual
13813notation for Calc formulas, as described in the rest of this manual.
13814Matrices are displayed in a multi-line tabular format, but all other
13815objects are written in linear form, as they would be typed from the
13816keyboard.
13817
13818@kindex d O
13819@pindex calc-flat-language
13820@cindex Matrix display
13821The @kbd{d O} (@code{calc-flat-language}) command selects a language
13822identical with the normal one, except that matrices are written in
13823one-line form along with everything else. In some applications this
13824form may be more suitable for yanking data into other buffers.
13825
13826@kindex d b
13827@pindex calc-line-breaking
13828@cindex Line breaking
13829@cindex Breaking up long lines
13830Even in one-line mode, long formulas or vectors will still be split
13831across multiple lines if they exceed the width of the Calculator window.
13832The @kbd{d b} (@code{calc-line-breaking}) command turns this line-breaking
13833feature on and off. (It works independently of the current language.)
13834If you give a numeric prefix argument of five or greater to the @kbd{d b}
13835command, that argument will specify the line width used when breaking
13836long lines.
13837
13838@kindex d B
13839@pindex calc-big-language
13840The @kbd{d B} (@code{calc-big-language}) command selects a language
13841which uses textual approximations to various mathematical notations,
13842such as powers, quotients, and square roots:
13843
13844@example
13845 ____________
13846 | a + 1 2
13847 | ----- + c
13848\| b
13849@end example
13850
13851@noindent
13852in place of @samp{sqrt((a+1)/b + c^2)}.
13853
13854Subscripts like @samp{a_i} are displayed as actual subscripts in Big
13855mode. Double subscripts, @samp{a_i_j} (@samp{subscr(subscr(a, i), j)})
13856are displayed as @samp{a} with subscripts separated by commas:
13857@samp{i, j}. They must still be entered in the usual underscore
13858notation.
13859
13860One slight ambiguity of Big notation is that
13861
13862@example
13863 3
13864- -
13865 4
13866@end example
13867
13868@noindent
13869can represent either the negative rational number @expr{-3:4}, or the
13870actual expression @samp{-(3/4)}; but the latter formula would normally
13871never be displayed because it would immediately be evaluated to
13872@expr{-3:4} or @expr{-0.75}, so this ambiguity is not a problem in
13873typical use.
13874
13875Non-decimal numbers are displayed with subscripts. Thus there is no
13876way to tell the difference between @samp{16#C2} and @samp{C2_16},
13877though generally you will know which interpretation is correct.
13878Logarithms @samp{log(x,b)} and @samp{log10(x)} also use subscripts
13879in Big mode.
13880
13881In Big mode, stack entries often take up several lines. To aid
13882readability, stack entries are separated by a blank line in this mode.
13883You may find it useful to expand the Calc window's height using
13884@kbd{C-x ^} (@code{enlarge-window}) or to make the Calc window the only
13885one on the screen with @kbd{C-x 1} (@code{delete-other-windows}).
13886
13887Long lines are currently not rearranged to fit the window width in
13888Big mode, so you may need to use the @kbd{<} and @kbd{>} keys
13889to scroll across a wide formula. For really big formulas, you may
13890even need to use @kbd{@{} and @kbd{@}} to scroll up and down.
13891
13892@kindex d U
13893@pindex calc-unformatted-language
13894The @kbd{d U} (@code{calc-unformatted-language}) command altogether disables
13895the use of operator notation in formulas. In this mode, the formula
13896shown above would be displayed:
13897
13898@example
13899sqrt(add(div(add(a, 1), b), pow(c, 2)))
13900@end example
13901
13902These four modes differ only in display format, not in the format
13903expected for algebraic entry. The standard Calc operators work in
13904all four modes, and unformatted notation works in any language mode
13905(except that Mathematica mode expects square brackets instead of
13906parentheses).
13907
13908@node C FORTRAN Pascal, TeX and LaTeX Language Modes, Normal Language Modes, Language Modes
13909@subsection C, FORTRAN, and Pascal Modes
13910
13911@noindent
13912@kindex d C
13913@pindex calc-c-language
13914@cindex C language
13915The @kbd{d C} (@code{calc-c-language}) command selects the conventions
13916of the C language for display and entry of formulas. This differs from
13917the normal language mode in a variety of (mostly minor) ways. In
13918particular, C language operators and operator precedences are used in
13919place of Calc's usual ones. For example, @samp{a^b} means @samp{xor(a,b)}
13920in C mode; a value raised to a power is written as a function call,
13921@samp{pow(a,b)}.
13922
13923In C mode, vectors and matrices use curly braces instead of brackets.
13924Octal and hexadecimal values are written with leading @samp{0} or @samp{0x}
13925rather than using the @samp{#} symbol. Array subscripting is
13926translated into @code{subscr} calls, so that @samp{a[i]} in C
13927mode is the same as @samp{a_i} in Normal mode. Assignments
13928turn into the @code{assign} function, which Calc normally displays
13929using the @samp{:=} symbol.
13930
13931The variables @code{pi} and @code{e} would be displayed @samp{pi}
13932and @samp{e} in Normal mode, but in C mode they are displayed as
13933@samp{M_PI} and @samp{M_E}, corresponding to the names of constants
13934typically provided in the @file{<math.h>} header. Functions whose
13935names are different in C are translated automatically for entry and
13936display purposes. For example, entering @samp{asin(x)} will push the
13937formula @samp{arcsin(x)} onto the stack; this formula will be displayed
13938as @samp{asin(x)} as long as C mode is in effect.
13939
13940@kindex d P
13941@pindex calc-pascal-language
13942@cindex Pascal language
13943The @kbd{d P} (@code{calc-pascal-language}) command selects Pascal
13944conventions. Like C mode, Pascal mode interprets array brackets and uses
13945a different table of operators. Hexadecimal numbers are entered and
13946displayed with a preceding dollar sign. (Thus the regular meaning of
13947@kbd{$2} during algebraic entry does not work in Pascal mode, though
13948@kbd{$} (and @kbd{$$}, etc.) not followed by digits works the same as
13949always.) No special provisions are made for other non-decimal numbers,
13950vectors, and so on, since there is no universally accepted standard way
13951of handling these in Pascal.
13952
13953@kindex d F
13954@pindex calc-fortran-language
13955@cindex FORTRAN language
13956The @kbd{d F} (@code{calc-fortran-language}) command selects FORTRAN
13957conventions. Various function names are transformed into FORTRAN
13958equivalents. Vectors are written as @samp{/1, 2, 3/}, and may be
13959entered this way or using square brackets. Since FORTRAN uses round
13960parentheses for both function calls and array subscripts, Calc displays
13961both in the same way; @samp{a(i)} is interpreted as a function call
13962upon reading, and subscripts must be entered as @samp{subscr(a, i)}.
13963Also, if the variable @code{a} has been declared to have type
13964@code{vector} or @code{matrix} then @samp{a(i)} will be parsed as a
13965subscript. (@xref{Declarations}.) Usually it doesn't matter, though;
13966if you enter the subscript expression @samp{a(i)} and Calc interprets
13967it as a function call, you'll never know the difference unless you
13968switch to another language mode or replace @code{a} with an actual
13969vector (or unless @code{a} happens to be the name of a built-in
13970function!).
13971
13972Underscores are allowed in variable and function names in all of these
13973language modes. The underscore here is equivalent to the @samp{#} in
13974Normal mode, or to hyphens in the underlying Emacs Lisp variable names.
13975
13976FORTRAN and Pascal modes normally do not adjust the case of letters in
13977formulas. Most built-in Calc names use lower-case letters. If you use a
13978positive numeric prefix argument with @kbd{d P} or @kbd{d F}, these
13979modes will use upper-case letters exclusively for display, and will
13980convert to lower-case on input. With a negative prefix, these modes
13981convert to lower-case for display and input.
13982
13983@node TeX and LaTeX Language Modes, Eqn Language Mode, C FORTRAN Pascal, Language Modes
13984@subsection @TeX{} and La@TeX{} Language Modes
13985
13986@noindent
13987@kindex d T
13988@pindex calc-tex-language
13989@cindex TeX language
13990@kindex d L
13991@pindex calc-latex-language
13992@cindex LaTeX language
13993The @kbd{d T} (@code{calc-tex-language}) command selects the conventions
13994of ``math mode'' in Donald Knuth's @TeX{} typesetting language,
13995and the @kbd{d L} (@code{calc-latex-language}) command selects the
13996conventions of ``math mode'' in La@TeX{}, a typesetting language that
13997uses @TeX{} as its formatting engine. Calc's La@TeX{} language mode can
13998read any formula that the @TeX{} language mode can, although La@TeX{}
13999mode may display it differently.
14000
14001Formulas are entered and displayed in the appropriate notation;
14002@texline @math{\sin(a/b)}
14003@infoline @expr{sin(a/b)}
14004will appear as @samp{\sin\left( a \over b \right)} in @TeX{} mode and
14005@samp{\sin\left(\frac@{a@}@{b@}\right)} in La@TeX{} mode.
14006Math formulas are often enclosed by @samp{$ $} signs in @TeX{} and
14007La@TeX{}; these should be omitted when interfacing with Calc. To Calc,
14008the @samp{$} sign has the same meaning it always does in algebraic
14009formulas (a reference to an existing entry on the stack).
14010
14011Complex numbers are displayed as in @samp{3 + 4i}. Fractions and
14012quotients are written using @code{\over} in @TeX{} mode (as in
14013@code{@{a \over b@}}) and @code{\frac} in La@TeX{} mode (as in
14014@code{\frac@{a@}@{b@}}); binomial coefficients are written with
14015@code{\choose} in @TeX{} mode (as in @code{@{a \choose b@}}) and
14016@code{\binom} in La@TeX{} mode (as in @code{\binom@{a@}@{b@}}).
14017Interval forms are written with @code{\ldots}, and error forms are
14018written with @code{\pm}. Absolute values are written as in
14019@samp{|x + 1|}, and the floor and ceiling functions are written with
14020@code{\lfloor}, @code{\rfloor}, etc. The words @code{\left} and
14021@code{\right} are ignored when reading formulas in @TeX{} and La@TeX{}
14022modes. Both @code{inf} and @code{uinf} are written as @code{\infty};
14023when read, @code{\infty} always translates to @code{inf}.
14024
14025Function calls are written the usual way, with the function name followed
14026by the arguments in parentheses. However, functions for which @TeX{}
14027and La@TeX{} have special names (like @code{\sin}) will use curly braces
14028instead of parentheses for very simple arguments. During input, curly
14029braces and parentheses work equally well for grouping, but when the
14030document is formatted the curly braces will be invisible. Thus the
14031printed result is
14032@texline @math{\sin{2 x}}
14033@infoline @expr{sin 2x}
14034but
14035@texline @math{\sin(2 + x)}.
14036@infoline @expr{sin(2 + x)}.
14037
14038Function and variable names not treated specially by @TeX{} and La@TeX{}
14039are simply written out as-is, which will cause them to come out in
14040italic letters in the printed document. If you invoke @kbd{d T} or
14041@kbd{d L} with a positive numeric prefix argument, names of more than
14042one character will instead be enclosed in a protective commands that
14043will prevent them from being typeset in the math italics; they will be
14044written @samp{\hbox@{@var{name}@}} in @TeX{} mode and
14045@samp{\text@{@var{name}@}} in La@TeX{} mode. The
14046@samp{\hbox@{ @}} and @samp{\text@{ @}} notations are ignored during
14047reading. If you use a negative prefix argument, such function names are
14048written @samp{\@var{name}}, and function names that begin with @code{\} during
14049reading have the @code{\} removed. (Note that in this mode, long
14050variable names are still written with @code{\hbox} or @code{\text}.
14051However, you can always make an actual variable name like @code{\bar} in
14052any @TeX{} mode.)
14053
14054During reading, text of the form @samp{\matrix@{ ...@: @}} is replaced
14055by @samp{[ ...@: ]}. The same also applies to @code{\pmatrix} and
14056@code{\bmatrix}. In La@TeX{} mode this also applies to
14057@samp{\begin@{matrix@} ... \end@{matrix@}},
14058@samp{\begin@{bmatrix@} ... \end@{bmatrix@}},
14059@samp{\begin@{pmatrix@} ... \end@{pmatrix@}}, as well as
14060@samp{\begin@{smallmatrix@} ... \end@{smallmatrix@}}.
14061The symbol @samp{&} is interpreted as a comma,
14062and the symbols @samp{\cr} and @samp{\\} are interpreted as semicolons.
14063During output, matrices are displayed in @samp{\matrix@{ a & b \\ c & d@}}
14064format in @TeX{} mode and in
14065@samp{\begin@{pmatrix@} a & b \\ c & d \end@{pmatrix@}} format in
14066La@TeX{} mode; you may need to edit this afterwards to change to your
14067preferred matrix form. If you invoke @kbd{d T} or @kbd{d L} with an
14068argument of 2 or -2, then matrices will be displayed in two-dimensional
14069form, such as
14070
14071@example
14072\begin@{pmatrix@}
14073a & b \\
14074c & d
14075\end@{pmatrix@}
14076@end example
14077
14078@noindent
14079This may be convenient for isolated matrices, but could lead to
14080expressions being displayed like
14081
14082@example
14083\begin@{pmatrix@} \times x
14084a & b \\
14085c & d
14086\end@{pmatrix@}
14087@end example
14088
14089@noindent
14090While this wouldn't bother Calc, it is incorrect La@TeX{}.
14091(Similarly for @TeX{}.)
14092
14093Accents like @code{\tilde} and @code{\bar} translate into function
14094calls internally (@samp{tilde(x)}, @samp{bar(x)}). The @code{\underline}
14095sequence is treated as an accent. The @code{\vec} accent corresponds
14096to the function name @code{Vec}, because @code{vec} is the name of
14097a built-in Calc function. The following table shows the accents
14098in Calc, @TeX{}, La@TeX{} and @dfn{eqn} (described in the next section):
14099
14100@iftex
14101@begingroup
14102@let@calcindexershow=@calcindexernoshow @c Suppress marginal notes
14103@let@calcindexersh=@calcindexernoshow
14104@end iftex
14105@ignore
14106@starindex
14107@end ignore
14108@tindex acute
14109@ignore
14110@starindex
14111@end ignore
14112@tindex Acute
14113@ignore
14114@starindex
14115@end ignore
14116@tindex bar
14117@ignore
14118@starindex
14119@end ignore
14120@tindex Bar
14121@ignore
14122@starindex
14123@end ignore
14124@tindex breve
14125@ignore
14126@starindex
14127@end ignore
14128@tindex Breve
14129@ignore
14130@starindex
14131@end ignore
14132@tindex check
14133@ignore
14134@starindex
14135@end ignore
14136@tindex Check
14137@ignore
14138@starindex
14139@end ignore
14140@tindex dddot
14141@ignore
14142@starindex
14143@end ignore
14144@tindex ddddot
14145@ignore
14146@starindex
14147@end ignore
14148@tindex dot
14149@ignore
14150@starindex
14151@end ignore
14152@tindex Dot
14153@ignore
14154@starindex
14155@end ignore
14156@tindex dotdot
14157@ignore
14158@starindex
14159@end ignore
14160@tindex DotDot
14161@ignore
14162@starindex
14163@end ignore
14164@tindex dyad
14165@ignore
14166@starindex
14167@end ignore
14168@tindex grave
14169@ignore
14170@starindex
14171@end ignore
14172@tindex Grave
14173@ignore
14174@starindex
14175@end ignore
14176@tindex hat
14177@ignore
14178@starindex
14179@end ignore
14180@tindex Hat
14181@ignore
14182@starindex
14183@end ignore
14184@tindex Prime
14185@ignore
14186@starindex
14187@end ignore
14188@tindex tilde
14189@ignore
14190@starindex
14191@end ignore
14192@tindex Tilde
14193@ignore
14194@starindex
14195@end ignore
14196@tindex under
14197@ignore
14198@starindex
14199@end ignore
14200@tindex Vec
14201@ignore
14202@starindex
14203@end ignore
14204@tindex VEC
14205@iftex
14206@endgroup
14207@end iftex
14208@example
14209Calc TeX LaTeX eqn
14210---- --- ----- ---
14211acute \acute \acute
14212Acute \Acute
14213bar \bar \bar bar
14214Bar \Bar
14215breve \breve \breve
14216Breve \Breve
14217check \check \check
14218Check \Check
14219dddot \dddot
14220ddddot \ddddot
14221dot \dot \dot dot
14222Dot \Dot
14223dotdot \ddot \ddot dotdot
14224DotDot \Ddot
14225dyad dyad
14226grave \grave \grave
14227Grave \Grave
14228hat \hat \hat hat
14229Hat \Hat
14230Prime prime
14231tilde \tilde \tilde tilde
14232Tilde \Tilde
14233under \underline \underline under
14234Vec \vec \vec vec
14235VEC \Vec
14236@end example
14237
14238The @samp{=>} (evaluates-to) operator appears as a @code{\to} symbol:
14239@samp{@{@var{a} \to @var{b}@}}. @TeX{} defines @code{\to} as an
14240alias for @code{\rightarrow}. However, if the @samp{=>} is the
14241top-level expression being formatted, a slightly different notation
14242is used: @samp{\evalto @var{a} \to @var{b}}. The @code{\evalto}
14243word is ignored by Calc's input routines, and is undefined in @TeX{}.
14244You will typically want to include one of the following definitions
14245at the top of a @TeX{} file that uses @code{\evalto}:
14246
14247@example
14248\def\evalto@{@}
14249\def\evalto#1\to@{@}
14250@end example
14251
14252The first definition formats evaluates-to operators in the usual
14253way. The second causes only the @var{b} part to appear in the
14254printed document; the @var{a} part and the arrow are hidden.
14255Another definition you may wish to use is @samp{\let\to=\Rightarrow}
14256which causes @code{\to} to appear more like Calc's @samp{=>} symbol.
14257@xref{Evaluates-To Operator}, for a discussion of @code{evalto}.
14258
14259The complete set of @TeX{} control sequences that are ignored during
14260reading is:
14261
14262@example
14263\hbox \mbox \text \left \right
14264\, \> \: \; \! \quad \qquad \hfil \hfill
14265\displaystyle \textstyle \dsize \tsize
14266\scriptstyle \scriptscriptstyle \ssize \ssize
14267\rm \bf \it \sl \roman \bold \italic \slanted
14268\cal \mit \Cal \Bbb \frak \goth
14269\evalto
14270@end example
14271
14272Note that, because these symbols are ignored, reading a @TeX{} or
14273La@TeX{} formula into Calc and writing it back out may lose spacing and
14274font information.
14275
14276Also, the ``discretionary multiplication sign'' @samp{\*} is read
14277the same as @samp{*}.
14278
14279@ifnottex
14280The @TeX{} version of this manual includes some printed examples at the
14281end of this section.
14282@end ifnottex
14283@iftex
14284Here are some examples of how various Calc formulas are formatted in @TeX{}:
14285
14286@example
14287@group
14288sin(a^2 / b_i)
14289\sin\left( {a^2 \over b_i} \right)
14290@end group
14291@end example
14292@tex
14293$$ \sin\left( a^2 \over b_i \right) $$
14294@end tex
14295@sp 1
14296
14297@example
14298@group
14299[(3, 4), 3:4, 3 +/- 4, [3 .. inf)]
14300[3 + 4i, @{3 \over 4@}, 3 \pm 4, [3 \ldots \infty)]
14301@end group
14302@end example
14303@tex
14304\turnoffactive
14305$$ [3 + 4i, {3 \over 4}, 3 \pm 4, [ 3 \ldots \infty)] $$
14306@end tex
14307@sp 1
14308
14309@example
14310@group
14311[abs(a), abs(a / b), floor(a), ceil(a / b)]
14312[|a|, \left| a \over b \right|,
14313 \lfloor a \rfloor, \left\lceil a \over b \right\rceil]
14314@end group
14315@end example
14316@tex
14317$$ [|a|, \left| a \over b \right|,
14318 \lfloor a \rfloor, \left\lceil a \over b \right\rceil] $$
14319@end tex
14320@sp 1
14321
14322@example
14323@group
14324[sin(a), sin(2 a), sin(2 + a), sin(a / b)]
14325[\sin@{a@}, \sin@{2 a@}, \sin(2 + a),
14326 \sin\left( @{a \over b@} \right)]
14327@end group
14328@end example
14329@tex
14330\turnoffactive
14331$$ [\sin{a}, \sin{2 a}, \sin(2 + a), \sin\left( {a \over b} \right)] $$
14332@end tex
14333@sp 2
14334
14335First with plain @kbd{d T}, then with @kbd{C-u d T}, then finally with
14336@kbd{C-u - d T} (using the example definition
14337@samp{\def\foo#1@{\tilde F(#1)@}}:
14338
14339@example
14340@group
14341[f(a), foo(bar), sin(pi)]
14342[f(a), foo(bar), \sin{\pi}]
14343[f(a), \hbox@{foo@}(\hbox@{bar@}), \sin@{\pi@}]
14344[f(a), \foo@{\hbox@{bar@}@}, \sin@{\pi@}]
14345@end group
14346@end example
14347@tex
14348$$ [f(a), foo(bar), \sin{\pi}] $$
14349$$ [f(a), \hbox{foo}(\hbox{bar}), \sin{\pi}] $$
14350$$ [f(a), \tilde F(\hbox{bar}), \sin{\pi}] $$
14351@end tex
14352@sp 2
14353
14354First with @samp{\def\evalto@{@}}, then with @samp{\def\evalto#1\to@{@}}:
14355
14356@example
14357@group
143582 + 3 => 5
14359\evalto 2 + 3 \to 5
14360@end group
14361@end example
14362@tex
14363\turnoffactive
14364$$ 2 + 3 \to 5 $$
14365$$ 5 $$
14366@end tex
14367@sp 2
14368
14369First with standard @code{\to}, then with @samp{\let\to\Rightarrow}:
14370
14371@example
14372@group
14373[2 + 3 => 5, a / 2 => (b + c) / 2]
14374[@{2 + 3 \to 5@}, @{@{a \over 2@} \to @{b + c \over 2@}@}]
14375@end group
14376@end example
14377@tex
14378\turnoffactive
14379$$ [{2 + 3 \to 5}, {{a \over 2} \to {b + c \over 2}}] $$
14380{\let\to\Rightarrow
14381$$ [{2 + 3 \to 5}, {{a \over 2} \to {b + c \over 2}}] $$}
14382@end tex
14383@sp 2
14384
14385Matrices normally, then changing @code{\matrix} to @code{\pmatrix}:
14386
14387@example
14388@group
14389[ [ a / b, 0 ], [ 0, 2^(x + 1) ] ]
14390\matrix@{ @{a \over b@} & 0 \\ 0 & 2^@{(x + 1)@} @}
14391\pmatrix@{ @{a \over b@} & 0 \\ 0 & 2^@{(x + 1)@} @}
14392@end group
14393@end example
14394@tex
14395\turnoffactive
14396$$ \matrix{ {a \over b} & 0 \cr 0 & 2^{(x + 1)} } $$
14397$$ \pmatrix{ {a \over b} & 0 \cr 0 & 2^{(x + 1)} } $$
14398@end tex
14399@sp 2
14400@end iftex
14401
14402@node Eqn Language Mode, Mathematica Language Mode, TeX and LaTeX Language Modes, Language Modes
14403@subsection Eqn Language Mode
14404
14405@noindent
14406@kindex d E
14407@pindex calc-eqn-language
14408@dfn{Eqn} is another popular formatter for math formulas. It is
14409designed for use with the TROFF text formatter, and comes standard
14410with many versions of Unix. The @kbd{d E} (@code{calc-eqn-language})
14411command selects @dfn{eqn} notation.
14412
14413The @dfn{eqn} language's main idiosyncrasy is that whitespace plays
14414a significant part in the parsing of the language. For example,
14415@samp{sqrt x+1 + y} treats @samp{x+1} as the argument of the
14416@code{sqrt} operator. @dfn{Eqn} also understands more conventional
14417grouping using curly braces: @samp{sqrt@{x+1@} + y}. Braces are
14418required only when the argument contains spaces.
14419
14420In Calc's @dfn{eqn} mode, however, curly braces are required to
14421delimit arguments of operators like @code{sqrt}. The first of the
14422above examples would treat only the @samp{x} as the argument of
14423@code{sqrt}, and in fact @samp{sin x+1} would be interpreted as
14424@samp{sin * x + 1}, because @code{sin} is not a special operator
14425in the @dfn{eqn} language. If you always surround the argument
14426with curly braces, Calc will never misunderstand.
14427
14428Calc also understands parentheses as grouping characters. Another
14429peculiarity of @dfn{eqn}'s syntax makes it advisable to separate
14430words with spaces from any surrounding characters that aren't curly
14431braces, so Calc writes @samp{sin ( x + y )} in @dfn{eqn} mode.
14432(The spaces around @code{sin} are important to make @dfn{eqn}
14433recognize that @code{sin} should be typeset in a roman font, and
14434the spaces around @code{x} and @code{y} are a good idea just in
14435case the @dfn{eqn} document has defined special meanings for these
14436names, too.)
14437
14438Powers and subscripts are written with the @code{sub} and @code{sup}
14439operators, respectively. Note that the caret symbol @samp{^} is
14440treated the same as a space in @dfn{eqn} mode, as is the @samp{~}
14441symbol (these are used to introduce spaces of various widths into
14442the typeset output of @dfn{eqn}).
14443
14444As in La@TeX{} mode, Calc's formatter omits parentheses around the
14445arguments of functions like @code{ln} and @code{sin} if they are
14446``simple-looking''; in this case Calc surrounds the argument with
14447braces, separated by a @samp{~} from the function name: @samp{sin~@{x@}}.
14448
14449Font change codes (like @samp{roman @var{x}}) and positioning codes
14450(like @samp{~} and @samp{down @var{n} @var{x}}) are ignored by the
14451@dfn{eqn} reader. Also ignored are the words @code{left}, @code{right},
14452@code{mark}, and @code{lineup}. Quotation marks in @dfn{eqn} mode input
14453are treated the same as curly braces: @samp{sqrt "1+x"} is equivalent to
14454@samp{sqrt @{1+x@}}; this is only an approximation to the true meaning
14455of quotes in @dfn{eqn}, but it is good enough for most uses.
14456
14457Accent codes (@samp{@var{x} dot}) are handled by treating them as
14458function calls (@samp{dot(@var{x})}) internally.
14459@xref{TeX and LaTeX Language Modes}, for a table of these accent
14460functions. The @code{prime} accent is treated specially if it occurs on
14461a variable or function name: @samp{f prime prime @w{( x prime )}} is
14462stored internally as @samp{f'@w{'}(x')}. For example, taking the
14463derivative of @samp{f(2 x)} with @kbd{a d x} will produce @samp{2 f'(2
14464x)}, which @dfn{eqn} mode will display as @samp{2 f prime ( 2 x )}.
14465
14466Assignments are written with the @samp{<-} (left-arrow) symbol,
14467and @code{evalto} operators are written with @samp{->} or
14468@samp{evalto ... ->} (@pxref{TeX and LaTeX Language Modes}, for a discussion
14469of this). The regular Calc symbols @samp{:=} and @samp{=>} are also
14470recognized for these operators during reading.
14471
14472Vectors in @dfn{eqn} mode use regular Calc square brackets, but
14473matrices are formatted as @samp{matrix @{ ccol @{ a above b @} ... @}}.
14474The words @code{lcol} and @code{rcol} are recognized as synonyms
14475for @code{ccol} during input, and are generated instead of @code{ccol}
14476if the matrix justification mode so specifies.
14477
14478@node Mathematica Language Mode, Maple Language Mode, Eqn Language Mode, Language Modes
14479@subsection Mathematica Language Mode
14480
14481@noindent
14482@kindex d M
14483@pindex calc-mathematica-language
14484@cindex Mathematica language
14485The @kbd{d M} (@code{calc-mathematica-language}) command selects the
14486conventions of Mathematica. Notable differences in Mathematica mode
14487are that the names of built-in functions are capitalized, and function
14488calls use square brackets instead of parentheses. Thus the Calc
14489formula @samp{sin(2 x)} is entered and displayed @w{@samp{Sin[2 x]}} in
14490Mathematica mode.
14491
14492Vectors and matrices use curly braces in Mathematica. Complex numbers
14493are written @samp{3 + 4 I}. The standard special constants in Calc are
14494written @code{Pi}, @code{E}, @code{I}, @code{GoldenRatio}, @code{EulerGamma},
14495@code{Infinity}, @code{ComplexInfinity}, and @code{Indeterminate} in
14496Mathematica mode.
14497Non-decimal numbers are written, e.g., @samp{16^^7fff}. Floating-point
14498numbers in scientific notation are written @samp{1.23*10.^3}.
14499Subscripts use double square brackets: @samp{a[[i]]}.
14500
14501@node Maple Language Mode, Compositions, Mathematica Language Mode, Language Modes
14502@subsection Maple Language Mode
14503
14504@noindent
14505@kindex d W
14506@pindex calc-maple-language
14507@cindex Maple language
14508The @kbd{d W} (@code{calc-maple-language}) command selects the
14509conventions of Maple.
14510
14511Maple's language is much like C. Underscores are allowed in symbol
14512names; square brackets are used for subscripts; explicit @samp{*}s for
14513multiplications are required. Use either @samp{^} or @samp{**} to
14514denote powers.
14515
14516Maple uses square brackets for lists and curly braces for sets. Calc
14517interprets both notations as vectors, and displays vectors with square
14518brackets. This means Maple sets will be converted to lists when they
14519pass through Calc. As a special case, matrices are written as calls
14520to the function @code{matrix}, given a list of lists as the argument,
14521and can be read in this form or with all-capitals @code{MATRIX}.
14522
14523The Maple interval notation @samp{2 .. 3} has no surrounding brackets;
14524Calc reads @samp{2 .. 3} as the closed interval @samp{[2 .. 3]}, and
14525writes any kind of interval as @samp{2 .. 3}. This means you cannot
14526see the difference between an open and a closed interval while in
14527Maple display mode.
14528
14529Maple writes complex numbers as @samp{3 + 4*I}. Its special constants
14530are @code{Pi}, @code{E}, @code{I}, and @code{infinity} (all three of
14531@code{inf}, @code{uinf}, and @code{nan} display as @code{infinity}).
14532Floating-point numbers are written @samp{1.23*10.^3}.
14533
14534Among things not currently handled by Calc's Maple mode are the
14535various quote symbols, procedures and functional operators, and
14536inert (@samp{&}) operators.
14537
14538@node Compositions, Syntax Tables, Maple Language Mode, Language Modes
14539@subsection Compositions
14540
14541@noindent
14542@cindex Compositions
14543There are several @dfn{composition functions} which allow you to get
14544displays in a variety of formats similar to those in Big language
14545mode. Most of these functions do not evaluate to anything; they are
14546placeholders which are left in symbolic form by Calc's evaluator but
14547are recognized by Calc's display formatting routines.
14548
14549Two of these, @code{string} and @code{bstring}, are described elsewhere.
14550@xref{Strings}. For example, @samp{string("ABC")} is displayed as
14551@samp{ABC}. When viewed on the stack it will be indistinguishable from
14552the variable @code{ABC}, but internally it will be stored as
14553@samp{string([65, 66, 67])} and can still be manipulated this way; for
14554example, the selection and vector commands @kbd{j 1 v v j u} would
14555select the vector portion of this object and reverse the elements, then
14556deselect to reveal a string whose characters had been reversed.
14557
14558The composition functions do the same thing in all language modes
14559(although their components will of course be formatted in the current
14560language mode). The one exception is Unformatted mode (@kbd{d U}),
14561which does not give the composition functions any special treatment.
14562The functions are discussed here because of their relationship to
14563the language modes.
14564
14565@menu
14566* Composition Basics::
14567* Horizontal Compositions::
14568* Vertical Compositions::
14569* Other Compositions::
14570* Information about Compositions::
14571* User-Defined Compositions::
14572@end menu
14573
14574@node Composition Basics, Horizontal Compositions, Compositions, Compositions
14575@subsubsection Composition Basics
14576
14577@noindent
14578Compositions are generally formed by stacking formulas together
14579horizontally or vertically in various ways. Those formulas are
14580themselves compositions. @TeX{} users will find this analogous
14581to @TeX{}'s ``boxes.'' Each multi-line composition has a
14582@dfn{baseline}; horizontal compositions use the baselines to
14583decide how formulas should be positioned relative to one another.
14584For example, in the Big mode formula
14585
14586@example
14587@group
14588 2
14589 a + b
1459017 + ------
14591 c
14592@end group
14593@end example
14594
14595@noindent
14596the second term of the sum is four lines tall and has line three as
14597its baseline. Thus when the term is combined with 17, line three
14598is placed on the same level as the baseline of 17.
14599
14600@tex
14601\bigskip
14602@end tex
14603
14604Another important composition concept is @dfn{precedence}. This is
14605an integer that represents the binding strength of various operators.
14606For example, @samp{*} has higher precedence (195) than @samp{+} (180),
14607which means that @samp{(a * b) + c} will be formatted without the
14608parentheses, but @samp{a * (b + c)} will keep the parentheses.
14609
14610The operator table used by normal and Big language modes has the
14611following precedences:
14612
14613@example
0edd2970
JB
14614_ 1200 @r{(subscripts)}
14615% 1100 @r{(as in n}%@r{)}
14616! 1000 @r{(as in }!@r{n)}
4009494e
GM
14617mod 400
14618+/- 300
14619!! 210 @r{(as in n}!!@r{)}
14620! 210 @r{(as in n}!@r{)}
14621^ 200
0edd2970 14622- 197 @r{(as in }-@r{n)}
4009494e
GM
14623* 195 @r{(or implicit multiplication)}
14624/ % \ 190
14625+ - 180 @r{(as in a}+@r{b)}
14626| 170
14627< = 160 @r{(and other relations)}
14628&& 110
14629|| 100
14630? : 90
14631!!! 85
14632&&& 80
14633||| 75
14634:= 50
14635:: 45
14636=> 40
14637@end example
14638
14639The general rule is that if an operator with precedence @expr{n}
14640occurs as an argument to an operator with precedence @expr{m}, then
14641the argument is enclosed in parentheses if @expr{n < m}. Top-level
14642expressions and expressions which are function arguments, vector
14643components, etc., are formatted with precedence zero (so that they
14644normally never get additional parentheses).
14645
14646For binary left-associative operators like @samp{+}, the righthand
14647argument is actually formatted with one-higher precedence than shown
14648in the table. This makes sure @samp{(a + b) + c} omits the parentheses,
14649but the unnatural form @samp{a + (b + c)} keeps its parentheses.
14650Right-associative operators like @samp{^} format the lefthand argument
14651with one-higher precedence.
14652
14653@ignore
14654@starindex
14655@end ignore
14656@tindex cprec
14657The @code{cprec} function formats an expression with an arbitrary
14658precedence. For example, @samp{cprec(abc, 185)} will combine into
14659sums and products as follows: @samp{7 + abc}, @samp{7 (abc)} (because
14660this @code{cprec} form has higher precedence than addition, but lower
14661precedence than multiplication).
14662
14663@tex
14664\bigskip
14665@end tex
14666
14667A final composition issue is @dfn{line breaking}. Calc uses two
14668different strategies for ``flat'' and ``non-flat'' compositions.
14669A non-flat composition is anything that appears on multiple lines
14670(not counting line breaking). Examples would be matrices and Big
14671mode powers and quotients. Non-flat compositions are displayed
14672exactly as specified. If they come out wider than the current
14673window, you must use horizontal scrolling (@kbd{<} and @kbd{>}) to
14674view them.
14675
14676Flat compositions, on the other hand, will be broken across several
14677lines if they are too wide to fit the window. Certain points in a
14678composition are noted internally as @dfn{break points}. Calc's
14679general strategy is to fill each line as much as possible, then to
14680move down to the next line starting at the first break point that
14681didn't fit. However, the line breaker understands the hierarchical
14682structure of formulas. It will not break an ``inner'' formula if
14683it can use an earlier break point from an ``outer'' formula instead.
14684For example, a vector of sums might be formatted as:
14685
14686@example
14687@group
14688[ a + b + c, d + e + f,
14689 g + h + i, j + k + l, m ]
14690@end group
14691@end example
14692
14693@noindent
14694If the @samp{m} can fit, then so, it seems, could the @samp{g}.
14695But Calc prefers to break at the comma since the comma is part
14696of a ``more outer'' formula. Calc would break at a plus sign
14697only if it had to, say, if the very first sum in the vector had
14698itself been too large to fit.
14699
14700Of the composition functions described below, only @code{choriz}
14701generates break points. The @code{bstring} function (@pxref{Strings})
14702also generates breakable items: A break point is added after every
14703space (or group of spaces) except for spaces at the very beginning or
14704end of the string.
14705
14706Composition functions themselves count as levels in the formula
14707hierarchy, so a @code{choriz} that is a component of a larger
14708@code{choriz} will be less likely to be broken. As a special case,
14709if a @code{bstring} occurs as a component of a @code{choriz} or
14710@code{choriz}-like object (such as a vector or a list of arguments
14711in a function call), then the break points in that @code{bstring}
14712will be on the same level as the break points of the surrounding
14713object.
14714
14715@node Horizontal Compositions, Vertical Compositions, Composition Basics, Compositions
14716@subsubsection Horizontal Compositions
14717
14718@noindent
14719@ignore
14720@starindex
14721@end ignore
14722@tindex choriz
14723The @code{choriz} function takes a vector of objects and composes
14724them horizontally. For example, @samp{choriz([17, a b/c, d])} formats
14725as @w{@samp{17a b / cd}} in Normal language mode, or as
14726
14727@example
14728@group
14729 a b
1473017---d
14731 c
14732@end group
14733@end example
14734
14735@noindent
14736in Big language mode. This is actually one case of the general
14737function @samp{choriz(@var{vec}, @var{sep}, @var{prec})}, where
14738either or both of @var{sep} and @var{prec} may be omitted.
14739@var{Prec} gives the @dfn{precedence} to use when formatting
14740each of the components of @var{vec}. The default precedence is
14741the precedence from the surrounding environment.
14742
14743@var{Sep} is a string (i.e., a vector of character codes as might
14744be entered with @code{" "} notation) which should separate components
14745of the composition. Also, if @var{sep} is given, the line breaker
14746will allow lines to be broken after each occurrence of @var{sep}.
14747If @var{sep} is omitted, the composition will not be breakable
14748(unless any of its component compositions are breakable).
14749
14750For example, @samp{2 choriz([a, b c, d = e], " + ", 180)} is
14751formatted as @samp{2 a + b c + (d = e)}. To get the @code{choriz}
14752to have precedence 180 ``outwards'' as well as ``inwards,''
14753enclose it in a @code{cprec} form: @samp{2 cprec(choriz(...), 180)}
14754formats as @samp{2 (a + b c + (d = e))}.
14755
14756The baseline of a horizontal composition is the same as the
14757baselines of the component compositions, which are all aligned.
14758
14759@node Vertical Compositions, Other Compositions, Horizontal Compositions, Compositions
14760@subsubsection Vertical Compositions
14761
14762@noindent
14763@ignore
14764@starindex
14765@end ignore
14766@tindex cvert
14767The @code{cvert} function makes a vertical composition. Each
14768component of the vector is centered in a column. The baseline of
14769the result is by default the top line of the resulting composition.
14770For example, @samp{f(cvert([a, bb, ccc]), cvert([a^2 + 1, b^2]))}
14771formats in Big mode as
14772
14773@example
14774@group
14775f( a , 2 )
14776 bb a + 1
14777 ccc 2
14778 b
14779@end group
14780@end example
14781
14782@ignore
14783@starindex
14784@end ignore
14785@tindex cbase
14786There are several special composition functions that work only as
14787components of a vertical composition. The @code{cbase} function
14788controls the baseline of the vertical composition; the baseline
14789will be the same as the baseline of whatever component is enclosed
14790in @code{cbase}. Thus @samp{f(cvert([a, cbase(bb), ccc]),
14791cvert([a^2 + 1, cbase(b^2)]))} displays as
14792
14793@example
14794@group
14795 2
14796 a + 1
14797 a 2
14798f(bb , b )
14799 ccc
14800@end group
14801@end example
14802
14803@ignore
14804@starindex
14805@end ignore
14806@tindex ctbase
14807@ignore
14808@starindex
14809@end ignore
14810@tindex cbbase
14811There are also @code{ctbase} and @code{cbbase} functions which
14812make the baseline of the vertical composition equal to the top
14813or bottom line (rather than the baseline) of that component.
14814Thus @samp{cvert([cbase(a / b)]) + cvert([ctbase(a / b)]) +
14815cvert([cbbase(a / b)])} gives
14816
14817@example
14818@group
14819 a
14820a -
14821- + a + b
14822b -
14823 b
14824@end group
14825@end example
14826
14827There should be only one @code{cbase}, @code{ctbase}, or @code{cbbase}
14828function in a given vertical composition. These functions can also
14829be written with no arguments: @samp{ctbase()} is a zero-height object
14830which means the baseline is the top line of the following item, and
14831@samp{cbbase()} means the baseline is the bottom line of the preceding
14832item.
14833
14834@ignore
14835@starindex
14836@end ignore
14837@tindex crule
14838The @code{crule} function builds a ``rule,'' or horizontal line,
14839across a vertical composition. By itself @samp{crule()} uses @samp{-}
14840characters to build the rule. You can specify any other character,
14841e.g., @samp{crule("=")}. The argument must be a character code or
14842vector of exactly one character code. It is repeated to match the
14843width of the widest item in the stack. For example, a quotient
14844with a thick line is @samp{cvert([a + 1, cbase(crule("=")), b^2])}:
14845
14846@example
14847@group
14848a + 1
14849=====
14850 2
14851 b
14852@end group
14853@end example
14854
14855@ignore
14856@starindex
14857@end ignore
14858@tindex clvert
14859@ignore
14860@starindex
14861@end ignore
14862@tindex crvert
14863Finally, the functions @code{clvert} and @code{crvert} act exactly
14864like @code{cvert} except that the items are left- or right-justified
14865in the stack. Thus @samp{clvert([a, bb, ccc]) + crvert([a, bb, ccc])}
14866gives:
14867
14868@example
14869@group
14870a + a
14871bb bb
14872ccc ccc
14873@end group
14874@end example
14875
14876Like @code{choriz}, the vertical compositions accept a second argument
14877which gives the precedence to use when formatting the components.
14878Vertical compositions do not support separator strings.
14879
14880@node Other Compositions, Information about Compositions, Vertical Compositions, Compositions
14881@subsubsection Other Compositions
14882
14883@noindent
14884@ignore
14885@starindex
14886@end ignore
14887@tindex csup
14888The @code{csup} function builds a superscripted expression. For
14889example, @samp{csup(a, b)} looks the same as @samp{a^b} does in Big
14890language mode. This is essentially a horizontal composition of
14891@samp{a} and @samp{b}, where @samp{b} is shifted up so that its
14892bottom line is one above the baseline.
14893
14894@ignore
14895@starindex
14896@end ignore
14897@tindex csub
14898Likewise, the @code{csub} function builds a subscripted expression.
14899This shifts @samp{b} down so that its top line is one below the
14900bottom line of @samp{a} (note that this is not quite analogous to
14901@code{csup}). Other arrangements can be obtained by using
14902@code{choriz} and @code{cvert} directly.
14903
14904@ignore
14905@starindex
14906@end ignore
14907@tindex cflat
14908The @code{cflat} function formats its argument in ``flat'' mode,
14909as obtained by @samp{d O}, if the current language mode is normal
14910or Big. It has no effect in other language modes. For example,
14911@samp{a^(b/c)} is formatted by Big mode like @samp{csup(a, cflat(b/c))}
14912to improve its readability.
14913
14914@ignore
14915@starindex
14916@end ignore
14917@tindex cspace
14918The @code{cspace} function creates horizontal space. For example,
14919@samp{cspace(4)} is effectively the same as @samp{string(" ")}.
14920A second string (i.e., vector of characters) argument is repeated
14921instead of the space character. For example, @samp{cspace(4, "ab")}
14922looks like @samp{abababab}. If the second argument is not a string,
14923it is formatted in the normal way and then several copies of that
14924are composed together: @samp{cspace(4, a^2)} yields
14925
14926@example
14927@group
14928 2 2 2 2
14929a a a a
14930@end group
14931@end example
14932
14933@noindent
14934If the number argument is zero, this is a zero-width object.
14935
14936@ignore
14937@starindex
14938@end ignore
14939@tindex cvspace
14940The @code{cvspace} function creates vertical space, or a vertical
14941stack of copies of a certain string or formatted object. The
14942baseline is the center line of the resulting stack. A numerical
14943argument of zero will produce an object which contributes zero
14944height if used in a vertical composition.
14945
14946@ignore
14947@starindex
14948@end ignore
14949@tindex ctspace
14950@ignore
14951@starindex
14952@end ignore
14953@tindex cbspace
14954There are also @code{ctspace} and @code{cbspace} functions which
14955create vertical space with the baseline the same as the baseline
14956of the top or bottom copy, respectively, of the second argument.
14957Thus @samp{cvspace(2, a/b) + ctspace(2, a/b) + cbspace(2, a/b)}
14958displays as:
14959
14960@example
14961@group
14962 a
14963 -
14964a b
14965- a a
14966b + - + -
14967a b b
14968- a
14969b -
14970 b
14971@end group
14972@end example
14973
14974@node Information about Compositions, User-Defined Compositions, Other Compositions, Compositions
14975@subsubsection Information about Compositions
14976
14977@noindent
14978The functions in this section are actual functions; they compose their
14979arguments according to the current language and other display modes,
14980then return a certain measurement of the composition as an integer.
14981
14982@ignore
14983@starindex
14984@end ignore
14985@tindex cwidth
14986The @code{cwidth} function measures the width, in characters, of a
14987composition. For example, @samp{cwidth(a + b)} is 5, and
14988@samp{cwidth(a / b)} is 5 in Normal mode, 1 in Big mode, and 11 in
14989@TeX{} mode (for @samp{@{a \over b@}}). The argument may involve
14990the composition functions described in this section.
14991
14992@ignore
14993@starindex
14994@end ignore
14995@tindex cheight
14996The @code{cheight} function measures the height of a composition.
14997This is the total number of lines in the argument's printed form.
14998
14999@ignore
15000@starindex
15001@end ignore
15002@tindex cascent
15003@ignore
15004@starindex
15005@end ignore
15006@tindex cdescent
15007The functions @code{cascent} and @code{cdescent} measure the amount
15008of the height that is above (and including) the baseline, or below
15009the baseline, respectively. Thus @samp{cascent(@var{x}) + cdescent(@var{x})}
15010always equals @samp{cheight(@var{x})}. For a one-line formula like
15011@samp{a + b}, @code{cascent} returns 1 and @code{cdescent} returns 0.
15012For @samp{a / b} in Big mode, @code{cascent} returns 2 and @code{cdescent}
15013returns 1. The only formula for which @code{cascent} will return zero
15014is @samp{cvspace(0)} or equivalents.
15015
15016@node User-Defined Compositions, , Information about Compositions, Compositions
15017@subsubsection User-Defined Compositions
15018
15019@noindent
15020@kindex Z C
15021@pindex calc-user-define-composition
15022The @kbd{Z C} (@code{calc-user-define-composition}) command lets you
15023define the display format for any algebraic function. You provide a
15024formula containing a certain number of argument variables on the stack.
15025Any time Calc formats a call to the specified function in the current
15026language mode and with that number of arguments, Calc effectively
15027replaces the function call with that formula with the arguments
15028replaced.
15029
15030Calc builds the default argument list by sorting all the variable names
15031that appear in the formula into alphabetical order. You can edit this
15032argument list before pressing @key{RET} if you wish. Any variables in
15033the formula that do not appear in the argument list will be displayed
15034literally; any arguments that do not appear in the formula will not
15035affect the display at all.
15036
15037You can define formats for built-in functions, for functions you have
15038defined with @kbd{Z F} (@pxref{Algebraic Definitions}), or for functions
15039which have no definitions but are being used as purely syntactic objects.
15040You can define different formats for each language mode, and for each
15041number of arguments, using a succession of @kbd{Z C} commands. When
15042Calc formats a function call, it first searches for a format defined
15043for the current language mode (and number of arguments); if there is
15044none, it uses the format defined for the Normal language mode. If
15045neither format exists, Calc uses its built-in standard format for that
15046function (usually just @samp{@var{func}(@var{args})}).
15047
15048If you execute @kbd{Z C} with the number 0 on the stack instead of a
15049formula, any defined formats for the function in the current language
15050mode will be removed. The function will revert to its standard format.
15051
15052For example, the default format for the binomial coefficient function
15053@samp{choose(n, m)} in the Big language mode is
15054
15055@example
15056@group
15057 n
15058( )
15059 m
15060@end group
15061@end example
15062
15063@noindent
15064You might prefer the notation,
15065
15066@example
15067@group
15068 C
15069n m
15070@end group
15071@end example
15072
15073@noindent
15074To define this notation, first make sure you are in Big mode,
15075then put the formula
15076
15077@smallexample
15078choriz([cvert([cvspace(1), n]), C, cvert([cvspace(1), m])])
15079@end smallexample
15080
15081@noindent
15082on the stack and type @kbd{Z C}. Answer the first prompt with
15083@code{choose}. The second prompt will be the default argument list
15084of @samp{(C m n)}. Edit this list to be @samp{(n m)} and press
15085@key{RET}. Now, try it out: For example, turn simplification
15086off with @kbd{m O} and enter @samp{choose(a,b) + choose(7,3)}
15087as an algebraic entry.
15088
15089@example
15090@group
15091 C + C
15092a b 7 3
15093@end group
15094@end example
15095
15096As another example, let's define the usual notation for Stirling
15097numbers of the first kind, @samp{stir1(n, m)}. This is just like
15098the regular format for binomial coefficients but with square brackets
15099instead of parentheses.
15100
15101@smallexample
15102choriz([string("["), cvert([n, cbase(cvspace(1)), m]), string("]")])
15103@end smallexample
15104
15105Now type @kbd{Z C stir1 @key{RET}}, edit the argument list to
15106@samp{(n m)}, and type @key{RET}.
15107
15108The formula provided to @kbd{Z C} usually will involve composition
15109functions, but it doesn't have to. Putting the formula @samp{a + b + c}
15110onto the stack and typing @kbd{Z C foo @key{RET} @key{RET}} would define
15111the function @samp{foo(x,y,z)} to display like @samp{x + y + z}.
15112This ``sum'' will act exactly like a real sum for all formatting
15113purposes (it will be parenthesized the same, and so on). However
15114it will be computationally unrelated to a sum. For example, the
15115formula @samp{2 * foo(1, 2, 3)} will display as @samp{2 (1 + 2 + 3)}.
15116Operator precedences have caused the ``sum'' to be written in
15117parentheses, but the arguments have not actually been summed.
15118(Generally a display format like this would be undesirable, since
15119it can easily be confused with a real sum.)
15120
15121The special function @code{eval} can be used inside a @kbd{Z C}
15122composition formula to cause all or part of the formula to be
15123evaluated at display time. For example, if the formula is
15124@samp{a + eval(b + c)}, then @samp{foo(1, 2, 3)} will be displayed
15125as @samp{1 + 5}. Evaluation will use the default simplifications,
15126regardless of the current simplification mode. There are also
15127@code{evalsimp} and @code{evalextsimp} which simplify as if by
15128@kbd{a s} and @kbd{a e} (respectively). Note that these ``functions''
15129operate only in the context of composition formulas (and also in
15130rewrite rules, where they serve a similar purpose; @pxref{Rewrite
15131Rules}). On the stack, a call to @code{eval} will be left in
15132symbolic form.
15133
15134It is not a good idea to use @code{eval} except as a last resort.
15135It can cause the display of formulas to be extremely slow. For
15136example, while @samp{eval(a + b)} might seem quite fast and simple,
15137there are several situations where it could be slow. For example,
15138@samp{a} and/or @samp{b} could be polar complex numbers, in which
15139case doing the sum requires trigonometry. Or, @samp{a} could be
15140the factorial @samp{fact(100)} which is unevaluated because you
15141have typed @kbd{m O}; @code{eval} will evaluate it anyway to
15142produce a large, unwieldy integer.
15143
15144You can save your display formats permanently using the @kbd{Z P}
15145command (@pxref{Creating User Keys}).
15146
15147@node Syntax Tables, , Compositions, Language Modes
15148@subsection Syntax Tables
15149
15150@noindent
15151@cindex Syntax tables
15152@cindex Parsing formulas, customized
15153Syntax tables do for input what compositions do for output: They
15154allow you to teach custom notations to Calc's formula parser.
15155Calc keeps a separate syntax table for each language mode.
15156
15157(Note that the Calc ``syntax tables'' discussed here are completely
15158unrelated to the syntax tables described in the Emacs manual.)
15159
15160@kindex Z S
15161@pindex calc-edit-user-syntax
15162The @kbd{Z S} (@code{calc-edit-user-syntax}) command edits the
15163syntax table for the current language mode. If you want your
15164syntax to work in any language, define it in the Normal language
15165mode. Type @kbd{C-c C-c} to finish editing the syntax table, or
15166@kbd{C-x k} to cancel the edit. The @kbd{m m} command saves all
15167the syntax tables along with the other mode settings;
15168@pxref{General Mode Commands}.
15169
15170@menu
15171* Syntax Table Basics::
15172* Precedence in Syntax Tables::
15173* Advanced Syntax Patterns::
15174* Conditional Syntax Rules::
15175@end menu
15176
15177@node Syntax Table Basics, Precedence in Syntax Tables, Syntax Tables, Syntax Tables
15178@subsubsection Syntax Table Basics
15179
15180@noindent
15181@dfn{Parsing} is the process of converting a raw string of characters,
15182such as you would type in during algebraic entry, into a Calc formula.
15183Calc's parser works in two stages. First, the input is broken down
15184into @dfn{tokens}, such as words, numbers, and punctuation symbols
15185like @samp{+}, @samp{:=}, and @samp{+/-}. Space between tokens is
15186ignored (except when it serves to separate adjacent words). Next,
15187the parser matches this string of tokens against various built-in
15188syntactic patterns, such as ``an expression followed by @samp{+}
15189followed by another expression'' or ``a name followed by @samp{(},
15190zero or more expressions separated by commas, and @samp{)}.''
15191
15192A @dfn{syntax table} is a list of user-defined @dfn{syntax rules},
15193which allow you to specify new patterns to define your own
15194favorite input notations. Calc's parser always checks the syntax
15195table for the current language mode, then the table for the Normal
15196language mode, before it uses its built-in rules to parse an
15197algebraic formula you have entered. Each syntax rule should go on
15198its own line; it consists of a @dfn{pattern}, a @samp{:=} symbol,
15199and a Calc formula with an optional @dfn{condition}. (Syntax rules
15200resemble algebraic rewrite rules, but the notation for patterns is
15201completely different.)
15202
15203A syntax pattern is a list of tokens, separated by spaces.
15204Except for a few special symbols, tokens in syntax patterns are
15205matched literally, from left to right. For example, the rule,
15206
15207@example
15208foo ( ) := 2+3
15209@end example
15210
15211@noindent
15212would cause Calc to parse the formula @samp{4+foo()*5} as if it
15213were @samp{4+(2+3)*5}. Notice that the parentheses were written
15214as two separate tokens in the rule. As a result, the rule works
15215for both @samp{foo()} and @w{@samp{foo ( )}}. If we had written
15216the rule as @samp{foo () := 2+3}, then Calc would treat @samp{()}
15217as a single, indivisible token, so that @w{@samp{foo( )}} would
15218not be recognized by the rule. (It would be parsed as a regular
15219zero-argument function call instead.) In fact, this rule would
15220also make trouble for the rest of Calc's parser: An unrelated
15221formula like @samp{bar()} would now be tokenized into @samp{bar ()}
15222instead of @samp{bar ( )}, so that the standard parser for function
15223calls would no longer recognize it!
15224
15225While it is possible to make a token with a mixture of letters
15226and punctuation symbols, this is not recommended. It is better to
15227break it into several tokens, as we did with @samp{foo()} above.
15228
15229The symbol @samp{#} in a syntax pattern matches any Calc expression.
15230On the righthand side, the things that matched the @samp{#}s can
15231be referred to as @samp{#1}, @samp{#2}, and so on (where @samp{#1}
15232matches the leftmost @samp{#} in the pattern). For example, these
15233rules match a user-defined function, prefix operator, infix operator,
15234and postfix operator, respectively:
15235
15236@example
15237foo ( # ) := myfunc(#1)
15238foo # := myprefix(#1)
15239# foo # := myinfix(#1,#2)
15240# foo := mypostfix(#1)
15241@end example
15242
15243Thus @samp{foo(3)} will parse as @samp{myfunc(3)}, and @samp{2+3 foo}
15244will parse as @samp{mypostfix(2+3)}.
15245
15246It is important to write the first two rules in the order shown,
15247because Calc tries rules in order from first to last. If the
15248pattern @samp{foo #} came first, it would match anything that could
15249match the @samp{foo ( # )} rule, since an expression in parentheses
15250is itself a valid expression. Thus the @w{@samp{foo ( # )}} rule would
15251never get to match anything. Likewise, the last two rules must be
15252written in the order shown or else @samp{3 foo 4} will be parsed as
15253@samp{mypostfix(3) * 4}. (Of course, the best way to avoid these
15254ambiguities is not to use the same symbol in more than one way at
15255the same time! In case you're not convinced, try the following
15256exercise: How will the above rules parse the input @samp{foo(3,4)},
15257if at all? Work it out for yourself, then try it in Calc and see.)
15258
15259Calc is quite flexible about what sorts of patterns are allowed.
15260The only rule is that every pattern must begin with a literal
15261token (like @samp{foo} in the first two patterns above), or with
15262a @samp{#} followed by a literal token (as in the last two
15263patterns). After that, any mixture is allowed, although putting
15264two @samp{#}s in a row will not be very useful since two
15265expressions with nothing between them will be parsed as one
15266expression that uses implicit multiplication.
15267
15268As a more practical example, Maple uses the notation
15269@samp{sum(a(i), i=1..10)} for sums, which Calc's Maple mode doesn't
15270recognize at present. To handle this syntax, we simply add the
15271rule,
15272
15273@example
15274sum ( # , # = # .. # ) := sum(#1,#2,#3,#4)
15275@end example
15276
15277@noindent
15278to the Maple mode syntax table. As another example, C mode can't
15279read assignment operators like @samp{++} and @samp{*=}. We can
15280define these operators quite easily:
15281
15282@example
15283# *= # := muleq(#1,#2)
15284# ++ := postinc(#1)
15285++ # := preinc(#1)
15286@end example
15287
15288@noindent
15289To complete the job, we would use corresponding composition functions
15290and @kbd{Z C} to cause these functions to display in their respective
15291Maple and C notations. (Note that the C example ignores issues of
15292operator precedence, which are discussed in the next section.)
15293
15294You can enclose any token in quotes to prevent its usual
15295interpretation in syntax patterns:
15296
15297@example
15298# ":=" # := becomes(#1,#2)
15299@end example
15300
15301Quotes also allow you to include spaces in a token, although once
15302again it is generally better to use two tokens than one token with
15303an embedded space. To include an actual quotation mark in a quoted
15304token, precede it with a backslash. (This also works to include
15305backslashes in tokens.)
15306
15307@example
15308# "bad token" # "/\"\\" # := silly(#1,#2,#3)
15309@end example
15310
15311@noindent
15312This will parse @samp{3 bad token 4 /"\ 5} to @samp{silly(3,4,5)}.
15313
15314The token @kbd{#} has a predefined meaning in Calc's formula parser;
15315it is not valid to use @samp{"#"} in a syntax rule. However, longer
15316tokens that include the @samp{#} character are allowed. Also, while
15317@samp{"$"} and @samp{"\""} are allowed as tokens, their presence in
15318the syntax table will prevent those characters from working in their
15319usual ways (referring to stack entries and quoting strings,
15320respectively).
15321
15322Finally, the notation @samp{%%} anywhere in a syntax table causes
15323the rest of the line to be ignored as a comment.
15324
15325@node Precedence in Syntax Tables, Advanced Syntax Patterns, Syntax Table Basics, Syntax Tables
15326@subsubsection Precedence
15327
15328@noindent
15329Different operators are generally assigned different @dfn{precedences}.
15330By default, an operator defined by a rule like
15331
15332@example
15333# foo # := foo(#1,#2)
15334@end example
15335
15336@noindent
15337will have an extremely low precedence, so that @samp{2*3+4 foo 5 == 6}
15338will be parsed as @samp{(2*3+4) foo (5 == 6)}. To change the
15339precedence of an operator, use the notation @samp{#/@var{p}} in
15340place of @samp{#}, where @var{p} is an integer precedence level.
15341For example, 185 lies between the precedences for @samp{+} and
15342@samp{*}, so if we change this rule to
15343
15344@example
15345#/185 foo #/186 := foo(#1,#2)
15346@end example
15347
15348@noindent
15349then @samp{2+3 foo 4*5} will be parsed as @samp{2+(3 foo (4*5))}.
15350Also, because we've given the righthand expression slightly higher
15351precedence, our new operator will be left-associative:
15352@samp{1 foo 2 foo 3} will be parsed as @samp{(1 foo 2) foo 3}.
15353By raising the precedence of the lefthand expression instead, we
15354can create a right-associative operator.
15355
15356@xref{Composition Basics}, for a table of precedences of the
15357standard Calc operators. For the precedences of operators in other
15358language modes, look in the Calc source file @file{calc-lang.el}.
15359
15360@node Advanced Syntax Patterns, Conditional Syntax Rules, Precedence in Syntax Tables, Syntax Tables
15361@subsubsection Advanced Syntax Patterns
15362
15363@noindent
15364To match a function with a variable number of arguments, you could
15365write
15366
15367@example
15368foo ( # ) := myfunc(#1)
15369foo ( # , # ) := myfunc(#1,#2)
15370foo ( # , # , # ) := myfunc(#1,#2,#3)
15371@end example
15372
15373@noindent
15374but this isn't very elegant. To match variable numbers of items,
15375Calc uses some notations inspired regular expressions and the
15376``extended BNF'' style used by some language designers.
15377
15378@example
15379foo ( @{ # @}*, ) := apply(myfunc,#1)
15380@end example
15381
15382The token @samp{@{} introduces a repeated or optional portion.
15383One of the three tokens @samp{@}*}, @samp{@}+}, or @samp{@}?}
15384ends the portion. These will match zero or more, one or more,
15385or zero or one copies of the enclosed pattern, respectively.
15386In addition, @samp{@}*} and @samp{@}+} can be followed by a
15387separator token (with no space in between, as shown above).
15388Thus @samp{@{ # @}*,} matches nothing, or one expression, or
15389several expressions separated by commas.
15390
15391A complete @samp{@{ ... @}} item matches as a vector of the
15392items that matched inside it. For example, the above rule will
15393match @samp{foo(1,2,3)} to get @samp{apply(myfunc,[1,2,3])}.
15394The Calc @code{apply} function takes a function name and a vector
15395of arguments and builds a call to the function with those
15396arguments, so the net result is the formula @samp{myfunc(1,2,3)}.
15397
15398If the body of a @samp{@{ ... @}} contains several @samp{#}s
15399(or nested @samp{@{ ... @}} constructs), then the items will be
15400strung together into the resulting vector. If the body
15401does not contain anything but literal tokens, the result will
15402always be an empty vector.
15403
15404@example
15405foo ( @{ # , # @}+, ) := bar(#1)
15406foo ( @{ @{ # @}*, @}*; ) := matrix(#1)
15407@end example
15408
15409@noindent
15410will parse @samp{foo(1, 2, 3, 4)} as @samp{bar([1, 2, 3, 4])}, and
15411@samp{foo(1, 2; 3, 4)} as @samp{matrix([[1, 2], [3, 4]])}. Also, after
15412some thought it's easy to see how this pair of rules will parse
15413@samp{foo(1, 2, 3)} as @samp{matrix([[1, 2, 3]])}, since the first
15414rule will only match an even number of arguments. The rule
15415
15416@example
15417foo ( # @{ , # , # @}? ) := bar(#1,#2)
15418@end example
15419
15420@noindent
15421will parse @samp{foo(2,3,4)} as @samp{bar(2,[3,4])}, and
15422@samp{foo(2)} as @samp{bar(2,[])}.
15423
15424The notation @samp{@{ ... @}?.} (note the trailing period) works
15425just the same as regular @samp{@{ ... @}?}, except that it does not
15426count as an argument; the following two rules are equivalent:
15427
15428@example
15429foo ( # , @{ also @}? # ) := bar(#1,#3)
15430foo ( # , @{ also @}?. # ) := bar(#1,#2)
15431@end example
15432
15433@noindent
15434Note that in the first case the optional text counts as @samp{#2},
15435which will always be an empty vector, but in the second case no
15436empty vector is produced.
15437
15438Another variant is @samp{@{ ... @}?$}, which means the body is
15439optional only at the end of the input formula. All built-in syntax
15440rules in Calc use this for closing delimiters, so that during
15441algebraic entry you can type @kbd{[sqrt(2), sqrt(3 @key{RET}}, omitting
15442the closing parenthesis and bracket. Calc does this automatically
15443for trailing @samp{)}, @samp{]}, and @samp{>} tokens in syntax
15444rules, but you can use @samp{@{ ... @}?$} explicitly to get
15445this effect with any token (such as @samp{"@}"} or @samp{end}).
15446Like @samp{@{ ... @}?.}, this notation does not count as an
15447argument. Conversely, you can use quotes, as in @samp{")"}, to
15448prevent a closing-delimiter token from being automatically treated
15449as optional.
15450
15451Calc's parser does not have full backtracking, which means some
15452patterns will not work as you might expect:
15453
15454@example
15455foo ( @{ # , @}? # , # ) := bar(#1,#2,#3)
15456@end example
15457
15458@noindent
15459Here we are trying to make the first argument optional, so that
15460@samp{foo(2,3)} parses as @samp{bar([],2,3)}. Unfortunately, Calc
15461first tries to match @samp{2,} against the optional part of the
15462pattern, finds a match, and so goes ahead to match the rest of the
15463pattern. Later on it will fail to match the second comma, but it
15464doesn't know how to go back and try the other alternative at that
15465point. One way to get around this would be to use two rules:
15466
15467@example
15468foo ( # , # , # ) := bar([#1],#2,#3)
15469foo ( # , # ) := bar([],#1,#2)
15470@end example
15471
15472More precisely, when Calc wants to match an optional or repeated
15473part of a pattern, it scans forward attempting to match that part.
15474If it reaches the end of the optional part without failing, it
15475``finalizes'' its choice and proceeds. If it fails, though, it
15476backs up and tries the other alternative. Thus Calc has ``partial''
15477backtracking. A fully backtracking parser would go on to make sure
15478the rest of the pattern matched before finalizing the choice.
15479
15480@node Conditional Syntax Rules, , Advanced Syntax Patterns, Syntax Tables
15481@subsubsection Conditional Syntax Rules
15482
15483@noindent
15484It is possible to attach a @dfn{condition} to a syntax rule. For
15485example, the rules
15486
15487@example
15488foo ( # ) := ifoo(#1) :: integer(#1)
15489foo ( # ) := gfoo(#1)
15490@end example
15491
15492@noindent
15493will parse @samp{foo(3)} as @samp{ifoo(3)}, but will parse
15494@samp{foo(3.5)} and @samp{foo(x)} as calls to @code{gfoo}. Any
15495number of conditions may be attached; all must be true for the
15496rule to succeed. A condition is ``true'' if it evaluates to a
15497nonzero number. @xref{Logical Operations}, for a list of Calc
15498functions like @code{integer} that perform logical tests.
15499
15500The exact sequence of events is as follows: When Calc tries a
15501rule, it first matches the pattern as usual. It then substitutes
15502@samp{#1}, @samp{#2}, etc., in the conditions, if any. Next, the
15503conditions are simplified and evaluated in order from left to right,
15504as if by the @w{@kbd{a s}} algebra command (@pxref{Simplifying Formulas}).
15505Each result is true if it is a nonzero number, or an expression
15506that can be proven to be nonzero (@pxref{Declarations}). If the
15507results of all conditions are true, the expression (such as
15508@samp{ifoo(#1)}) has its @samp{#}s substituted, and that is the
15509result of the parse. If the result of any condition is false, Calc
15510goes on to try the next rule in the syntax table.
15511
15512Syntax rules also support @code{let} conditions, which operate in
15513exactly the same way as they do in algebraic rewrite rules.
15514@xref{Other Features of Rewrite Rules}, for details. A @code{let}
15515condition is always true, but as a side effect it defines a
15516variable which can be used in later conditions, and also in the
15517expression after the @samp{:=} sign:
15518
15519@example
15520foo ( # ) := hifoo(x) :: let(x := #1 + 0.5) :: dnumint(x)
15521@end example
15522
15523@noindent
15524The @code{dnumint} function tests if a value is numerically an
15525integer, i.e., either a true integer or an integer-valued float.
15526This rule will parse @code{foo} with a half-integer argument,
15527like @samp{foo(3.5)}, to a call like @samp{hifoo(4.)}.
15528
15529The lefthand side of a syntax rule @code{let} must be a simple
15530variable, not the arbitrary pattern that is allowed in rewrite
15531rules.
15532
15533The @code{matches} function is also treated specially in syntax
15534rule conditions (again, in the same way as in rewrite rules).
15535@xref{Matching Commands}. If the matching pattern contains
15536meta-variables, then those meta-variables may be used in later
15537conditions and in the result expression. The arguments to
15538@code{matches} are not evaluated in this situation.
15539
15540@example
15541sum ( # , # ) := sum(#1,a,b,c) :: matches(#2, a=[b..c])
15542@end example
15543
15544@noindent
15545This is another way to implement the Maple mode @code{sum} notation.
15546In this approach, we allow @samp{#2} to equal the whole expression
15547@samp{i=1..10}. Then, we use @code{matches} to break it apart into
15548its components. If the expression turns out not to match the pattern,
15549the syntax rule will fail. Note that @kbd{Z S} always uses Calc's
15550Normal language mode for editing expressions in syntax rules, so we
15551must use regular Calc notation for the interval @samp{[b..c]} that
15552will correspond to the Maple mode interval @samp{1..10}.
15553
15554@node Modes Variable, Calc Mode Line, Language Modes, Mode Settings
15555@section The @code{Modes} Variable
15556
15557@noindent
15558@kindex m g
15559@pindex calc-get-modes
15560The @kbd{m g} (@code{calc-get-modes}) command pushes onto the stack
15561a vector of numbers that describes the various mode settings that
15562are in effect. With a numeric prefix argument, it pushes only the
15563@var{n}th mode, i.e., the @var{n}th element of this vector. Keyboard
15564macros can use the @kbd{m g} command to modify their behavior based
15565on the current mode settings.
15566
15567@cindex @code{Modes} variable
15568@vindex Modes
15569The modes vector is also available in the special variable
15570@code{Modes}. In other words, @kbd{m g} is like @kbd{s r Modes @key{RET}}.
15571It will not work to store into this variable; in fact, if you do,
15572@code{Modes} will cease to track the current modes. (The @kbd{m g}
15573command will continue to work, however.)
15574
15575In general, each number in this vector is suitable as a numeric
15576prefix argument to the associated mode-setting command. (Recall
15577that the @kbd{~} key takes a number from the stack and gives it as
15578a numeric prefix to the next command.)
15579
15580The elements of the modes vector are as follows:
15581
15582@enumerate
15583@item
15584Current precision. Default is 12; associated command is @kbd{p}.
15585
15586@item
15587Binary word size. Default is 32; associated command is @kbd{b w}.
15588
15589@item
15590Stack size (not counting the value about to be pushed by @kbd{m g}).
15591This is zero if @kbd{m g} is executed with an empty stack.
15592
15593@item
15594Number radix. Default is 10; command is @kbd{d r}.
15595
15596@item
15597Floating-point format. This is the number of digits, plus the
15598constant 0 for normal notation, 10000 for scientific notation,
1559920000 for engineering notation, or 30000 for fixed-point notation.
15600These codes are acceptable as prefix arguments to the @kbd{d n}
15601command, but note that this may lose information: For example,
15602@kbd{d s} and @kbd{C-u 12 d s} have similar (but not quite
15603identical) effects if the current precision is 12, but they both
15604produce a code of 10012, which will be treated by @kbd{d n} as
15605@kbd{C-u 12 d s}. If the precision then changes, the float format
15606will still be frozen at 12 significant figures.
15607
15608@item
15609Angular mode. Default is 1 (degrees). Other values are 2 (radians)
15610and 3 (HMS). The @kbd{m d} command accepts these prefixes.
15611
15612@item
15613Symbolic mode. Value is 0 or 1; default is 0. Command is @kbd{m s}.
15614
15615@item
15616Fraction mode. Value is 0 or 1; default is 0. Command is @kbd{m f}.
15617
15618@item
15619Polar mode. Value is 0 (rectangular) or 1 (polar); default is 0.
15620Command is @kbd{m p}.
15621
15622@item
15623Matrix/Scalar mode. Default value is @mathit{-1}. Value is 0 for Scalar
15624mode, @mathit{-2} for Matrix mode, @mathit{-3} for square Matrix mode,
15625or @var{N} for
15626@texline @math{N\times N}
15627@infoline @var{N}x@var{N}
15628Matrix mode. Command is @kbd{m v}.
15629
15630@item
15631Simplification mode. Default is 1. Value is @mathit{-1} for off (@kbd{m O}),
156320 for @kbd{m N}, 2 for @kbd{m B}, 3 for @kbd{m A}, 4 for @kbd{m E},
15633or 5 for @w{@kbd{m U}}. The @kbd{m D} command accepts these prefixes.
15634
15635@item
15636Infinite mode. Default is @mathit{-1} (off). Value is 1 if the mode is on,
15637or 0 if the mode is on with positive zeros. Command is @kbd{m i}.
15638@end enumerate
15639
15640For example, the sequence @kbd{M-1 m g @key{RET} 2 + ~ p} increases the
15641precision by two, leaving a copy of the old precision on the stack.
15642Later, @kbd{~ p} will restore the original precision using that
15643stack value. (This sequence might be especially useful inside a
15644keyboard macro.)
15645
15646As another example, @kbd{M-3 m g 1 - ~ @key{DEL}} deletes all but the
15647oldest (bottommost) stack entry.
15648
15649Yet another example: The HP-48 ``round'' command rounds a number
15650to the current displayed precision. You could roughly emulate this
15651in Calc with the sequence @kbd{M-5 m g 10000 % ~ c c}. (This
15652would not work for fixed-point mode, but it wouldn't be hard to
15653do a full emulation with the help of the @kbd{Z [} and @kbd{Z ]}
15654programming commands. @xref{Conditionals in Macros}.)
15655
15656@node Calc Mode Line, , Modes Variable, Mode Settings
15657@section The Calc Mode Line
15658
15659@noindent
15660@cindex Mode line indicators
15661This section is a summary of all symbols that can appear on the
15662Calc mode line, the highlighted bar that appears under the Calc
15663stack window (or under an editing window in Embedded mode).
15664
15665The basic mode line format is:
15666
15667@example
15668--%%-Calc: 12 Deg @var{other modes} (Calculator)
15669@end example
15670
15671The @samp{%%} is the Emacs symbol for ``read-only''; it shows that
15672regular Emacs commands are not allowed to edit the stack buffer
15673as if it were text.
15674
15675The word @samp{Calc:} changes to @samp{CalcEmbed:} if Embedded mode
15676is enabled. The words after this describe the various Calc modes
15677that are in effect.
15678
15679The first mode is always the current precision, an integer.
15680The second mode is always the angular mode, either @code{Deg},
15681@code{Rad}, or @code{Hms}.
15682
15683Here is a complete list of the remaining symbols that can appear
15684on the mode line:
15685
15686@table @code
15687@item Alg
15688Algebraic mode (@kbd{m a}; @pxref{Algebraic Entry}).
15689
15690@item Alg[(
15691Incomplete algebraic mode (@kbd{C-u m a}).
15692
15693@item Alg*
15694Total algebraic mode (@kbd{m t}).
15695
15696@item Symb
15697Symbolic mode (@kbd{m s}; @pxref{Symbolic Mode}).
15698
15699@item Matrix
15700Matrix mode (@kbd{m v}; @pxref{Matrix Mode}).
15701
15702@item Matrix@var{n}
15703Dimensioned Matrix mode (@kbd{C-u @var{n} m v}; @pxref{Matrix Mode}).
15704
15705@item SqMatrix
15706Square Matrix mode (@kbd{C-u m v}; @pxref{Matrix Mode}).
15707
15708@item Scalar
15709Scalar mode (@kbd{m v}; @pxref{Matrix Mode}).
15710
15711@item Polar
15712Polar complex mode (@kbd{m p}; @pxref{Polar Mode}).
15713
15714@item Frac
15715Fraction mode (@kbd{m f}; @pxref{Fraction Mode}).
15716
15717@item Inf
15718Infinite mode (@kbd{m i}; @pxref{Infinite Mode}).
15719
15720@item +Inf
15721Positive Infinite mode (@kbd{C-u 0 m i}).
15722
15723@item NoSimp
15724Default simplifications off (@kbd{m O}; @pxref{Simplification Modes}).
15725
15726@item NumSimp
15727Default simplifications for numeric arguments only (@kbd{m N}).
15728
15729@item BinSimp@var{w}
15730Binary-integer simplification mode; word size @var{w} (@kbd{m B}, @kbd{b w}).
15731
15732@item AlgSimp
15733Algebraic simplification mode (@kbd{m A}).
15734
15735@item ExtSimp
15736Extended algebraic simplification mode (@kbd{m E}).
15737
15738@item UnitSimp
15739Units simplification mode (@kbd{m U}).
15740
15741@item Bin
15742Current radix is 2 (@kbd{d 2}; @pxref{Radix Modes}).
15743
15744@item Oct
15745Current radix is 8 (@kbd{d 8}).
15746
15747@item Hex
15748Current radix is 16 (@kbd{d 6}).
15749
15750@item Radix@var{n}
15751Current radix is @var{n} (@kbd{d r}).
15752
15753@item Zero
15754Leading zeros (@kbd{d z}; @pxref{Radix Modes}).
15755
15756@item Big
15757Big language mode (@kbd{d B}; @pxref{Normal Language Modes}).
15758
15759@item Flat
15760One-line normal language mode (@kbd{d O}).
15761
15762@item Unform
15763Unformatted language mode (@kbd{d U}).
15764
15765@item C
15766C language mode (@kbd{d C}; @pxref{C FORTRAN Pascal}).
15767
15768@item Pascal
15769Pascal language mode (@kbd{d P}).
15770
15771@item Fortran
15772FORTRAN language mode (@kbd{d F}).
15773
15774@item TeX
15775@TeX{} language mode (@kbd{d T}; @pxref{TeX and LaTeX Language Modes}).
15776
15777@item LaTeX
15778La@TeX{} language mode (@kbd{d L}; @pxref{TeX and LaTeX Language Modes}).
15779
15780@item Eqn
15781@dfn{Eqn} language mode (@kbd{d E}; @pxref{Eqn Language Mode}).
15782
15783@item Math
15784Mathematica language mode (@kbd{d M}; @pxref{Mathematica Language Mode}).
15785
15786@item Maple
15787Maple language mode (@kbd{d W}; @pxref{Maple Language Mode}).
15788
15789@item Norm@var{n}
15790Normal float mode with @var{n} digits (@kbd{d n}; @pxref{Float Formats}).
15791
15792@item Fix@var{n}
15793Fixed point mode with @var{n} digits after the point (@kbd{d f}).
15794
15795@item Sci
15796Scientific notation mode (@kbd{d s}).
15797
15798@item Sci@var{n}
15799Scientific notation with @var{n} digits (@kbd{d s}).
15800
15801@item Eng
15802Engineering notation mode (@kbd{d e}).
15803
15804@item Eng@var{n}
15805Engineering notation with @var{n} digits (@kbd{d e}).
15806
15807@item Left@var{n}
15808Left-justified display indented by @var{n} (@kbd{d <}; @pxref{Justification}).
15809
15810@item Right
15811Right-justified display (@kbd{d >}).
15812
15813@item Right@var{n}
15814Right-justified display with width @var{n} (@kbd{d >}).
15815
15816@item Center
15817Centered display (@kbd{d =}).
15818
15819@item Center@var{n}
15820Centered display with center column @var{n} (@kbd{d =}).
15821
15822@item Wid@var{n}
15823Line breaking with width @var{n} (@kbd{d b}; @pxref{Normal Language Modes}).
15824
15825@item Wide
15826No line breaking (@kbd{d b}).
15827
15828@item Break
15829Selections show deep structure (@kbd{j b}; @pxref{Making Selections}).
15830
15831@item Save
15832Record modes in @file{~/.calc.el} (@kbd{m R}; @pxref{General Mode Commands}).
15833
15834@item Local
15835Record modes in Embedded buffer (@kbd{m R}).
15836
15837@item LocEdit
15838Record modes as editing-only in Embedded buffer (@kbd{m R}).
15839
15840@item LocPerm
15841Record modes as permanent-only in Embedded buffer (@kbd{m R}).
15842
15843@item Global
15844Record modes as global in Embedded buffer (@kbd{m R}).
15845
15846@item Manual
15847Automatic recomputation turned off (@kbd{m C}; @pxref{Automatic
15848Recomputation}).
15849
15850@item Graph
15851GNUPLOT process is alive in background (@pxref{Graphics}).
15852
15853@item Sel
15854Top-of-stack has a selection (Embedded only; @pxref{Making Selections}).
15855
15856@item Dirty
15857The stack display may not be up-to-date (@pxref{Display Modes}).
15858
15859@item Inv
15860``Inverse'' prefix was pressed (@kbd{I}; @pxref{Inverse and Hyperbolic}).
15861
15862@item Hyp
15863``Hyperbolic'' prefix was pressed (@kbd{H}).
15864
15865@item Keep
15866``Keep-arguments'' prefix was pressed (@kbd{K}).
15867
15868@item Narrow
15869Stack is truncated (@kbd{d t}; @pxref{Truncating the Stack}).
15870@end table
15871
15872In addition, the symbols @code{Active} and @code{~Active} can appear
15873as minor modes on an Embedded buffer's mode line. @xref{Embedded Mode}.
15874
15875@node Arithmetic, Scientific Functions, Mode Settings, Top
15876@chapter Arithmetic Functions
15877
15878@noindent
15879This chapter describes the Calc commands for doing simple calculations
15880on numbers, such as addition, absolute value, and square roots. These
15881commands work by removing the top one or two values from the stack,
15882performing the desired operation, and pushing the result back onto the
15883stack. If the operation cannot be performed, the result pushed is a
15884formula instead of a number, such as @samp{2/0} (because division by zero
15885is invalid) or @samp{sqrt(x)} (because the argument @samp{x} is a formula).
15886
15887Most of the commands described here can be invoked by a single keystroke.
15888Some of the more obscure ones are two-letter sequences beginning with
15889the @kbd{f} (``functions'') prefix key.
15890
15891@xref{Prefix Arguments}, for a discussion of the effect of numeric
15892prefix arguments on commands in this chapter which do not otherwise
15893interpret a prefix argument.
15894
15895@menu
15896* Basic Arithmetic::
15897* Integer Truncation::
15898* Complex Number Functions::
15899* Conversions::
15900* Date Arithmetic::
15901* Financial Functions::
15902* Binary Functions::
15903@end menu
15904
15905@node Basic Arithmetic, Integer Truncation, Arithmetic, Arithmetic
15906@section Basic Arithmetic
15907
15908@noindent
15909@kindex +
15910@pindex calc-plus
15911@ignore
15912@mindex @null
15913@end ignore
15914@tindex +
15915The @kbd{+} (@code{calc-plus}) command adds two numbers. The numbers may
15916be any of the standard Calc data types. The resulting sum is pushed back
15917onto the stack.
15918
15919If both arguments of @kbd{+} are vectors or matrices (of matching dimensions),
15920the result is a vector or matrix sum. If one argument is a vector and the
15921other a scalar (i.e., a non-vector), the scalar is added to each of the
15922elements of the vector to form a new vector. If the scalar is not a
15923number, the operation is left in symbolic form: Suppose you added @samp{x}
15924to the vector @samp{[1,2]}. You may want the result @samp{[1+x,2+x]}, or
15925you may plan to substitute a 2-vector for @samp{x} in the future. Since
15926the Calculator can't tell which interpretation you want, it makes the
15927safest assumption. @xref{Reducing and Mapping}, for a way to add @samp{x}
15928to every element of a vector.
15929
15930If either argument of @kbd{+} is a complex number, the result will in general
15931be complex. If one argument is in rectangular form and the other polar,
15932the current Polar mode determines the form of the result. If Symbolic
15933mode is enabled, the sum may be left as a formula if the necessary
15934conversions for polar addition are non-trivial.
15935
15936If both arguments of @kbd{+} are HMS forms, the forms are added according to
15937the usual conventions of hours-minutes-seconds notation. If one argument
15938is an HMS form and the other is a number, that number is converted from
15939degrees or radians (depending on the current Angular mode) to HMS format
15940and then the two HMS forms are added.
15941
15942If one argument of @kbd{+} is a date form, the other can be either a
15943real number, which advances the date by a certain number of days, or
15944an HMS form, which advances the date by a certain amount of time.
15945Subtracting two date forms yields the number of days between them.
15946Adding two date forms is meaningless, but Calc interprets it as the
15947subtraction of one date form and the negative of the other. (The
15948negative of a date form can be understood by remembering that dates
15949are stored as the number of days before or after Jan 1, 1 AD.)
15950
15951If both arguments of @kbd{+} are error forms, the result is an error form
15952with an appropriately computed standard deviation. If one argument is an
15953error form and the other is a number, the number is taken to have zero error.
15954Error forms may have symbolic formulas as their mean and/or error parts;
15955adding these will produce a symbolic error form result. However, adding an
15956error form to a plain symbolic formula (as in @samp{(a +/- b) + c}) will not
15957work, for the same reasons just mentioned for vectors. Instead you must
15958write @samp{(a +/- b) + (c +/- 0)}.
15959
15960If both arguments of @kbd{+} are modulo forms with equal values of @expr{M},
15961or if one argument is a modulo form and the other a plain number, the
15962result is a modulo form which represents the sum, modulo @expr{M}, of
15963the two values.
15964
15965If both arguments of @kbd{+} are intervals, the result is an interval
15966which describes all possible sums of the possible input values. If
15967one argument is a plain number, it is treated as the interval
15968@w{@samp{[x ..@: x]}}.
15969
15970If one argument of @kbd{+} is an infinity and the other is not, the
15971result is that same infinity. If both arguments are infinite and in
15972the same direction, the result is the same infinity, but if they are
15973infinite in different directions the result is @code{nan}.
15974
15975@kindex -
15976@pindex calc-minus
15977@ignore
15978@mindex @null
15979@end ignore
15980@tindex -
15981The @kbd{-} (@code{calc-minus}) command subtracts two values. The top
15982number on the stack is subtracted from the one behind it, so that the
15983computation @kbd{5 @key{RET} 2 -} produces 3, not @mathit{-3}. All options
15984available for @kbd{+} are available for @kbd{-} as well.
15985
15986@kindex *
15987@pindex calc-times
15988@ignore
15989@mindex @null
15990@end ignore
15991@tindex *
15992The @kbd{*} (@code{calc-times}) command multiplies two numbers. If one
15993argument is a vector and the other a scalar, the scalar is multiplied by
15994the elements of the vector to produce a new vector. If both arguments
15995are vectors, the interpretation depends on the dimensions of the
15996vectors: If both arguments are matrices, a matrix multiplication is
15997done. If one argument is a matrix and the other a plain vector, the
15998vector is interpreted as a row vector or column vector, whichever is
15999dimensionally correct. If both arguments are plain vectors, the result
16000is a single scalar number which is the dot product of the two vectors.
16001
16002If one argument of @kbd{*} is an HMS form and the other a number, the
16003HMS form is multiplied by that amount. It is an error to multiply two
16004HMS forms together, or to attempt any multiplication involving date
16005forms. Error forms, modulo forms, and intervals can be multiplied;
16006see the comments for addition of those forms. When two error forms
16007or intervals are multiplied they are considered to be statistically
16008independent; thus, @samp{[-2 ..@: 3] * [-2 ..@: 3]} is @samp{[-6 ..@: 9]},
16009whereas @w{@samp{[-2 ..@: 3] ^ 2}} is @samp{[0 ..@: 9]}.
16010
16011@kindex /
16012@pindex calc-divide
16013@ignore
16014@mindex @null
16015@end ignore
16016@tindex /
16017The @kbd{/} (@code{calc-divide}) command divides two numbers.
16018
16019When combining multiplication and division in an algebraic formula, it
16020is good style to use parentheses to distinguish between possible
16021interpretations; the expression @samp{a/b*c} should be written
16022@samp{(a/b)*c} or @samp{a/(b*c)}, as appropriate. Without the
16023parentheses, Calc will interpret @samp{a/b*c} as @samp{a/(b*c)}, since
16024in algebraic entry Calc gives division a lower precedence than
16025multiplication. (This is not standard across all computer languages, and
16026Calc may change the precedence depending on the language mode being used.
16027@xref{Language Modes}.) This default ordering can be changed by setting
16028the customizable variable @code{calc-multiplication-has-precedence} to
16029@code{nil} (@pxref{Customizing Calc}); this will give multiplication and
16030division equal precedences. Note that Calc's default choice of
16031precedence allows @samp{a b / c d} to be used as a shortcut for
16032@smallexample
16033@group
16034a b
16035---.
16036c d
16037@end group
16038@end smallexample
16039
16040When dividing a scalar @expr{B} by a square matrix @expr{A}, the
16041computation performed is @expr{B} times the inverse of @expr{A}. This
16042also occurs if @expr{B} is itself a vector or matrix, in which case the
16043effect is to solve the set of linear equations represented by @expr{B}.
16044If @expr{B} is a matrix with the same number of rows as @expr{A}, or a
16045plain vector (which is interpreted here as a column vector), then the
16046equation @expr{A X = B} is solved for the vector or matrix @expr{X}.
16047Otherwise, if @expr{B} is a non-square matrix with the same number of
16048@emph{columns} as @expr{A}, the equation @expr{X A = B} is solved. If
16049you wish a vector @expr{B} to be interpreted as a row vector to be
16050solved as @expr{X A = B}, make it into a one-row matrix with @kbd{C-u 1
16051v p} first. To force a left-handed solution with a square matrix
16052@expr{B}, transpose @expr{A} and @expr{B} before dividing, then
16053transpose the result.
16054
16055HMS forms can be divided by real numbers or by other HMS forms. Error
16056forms can be divided in any combination of ways. Modulo forms where both
16057values and the modulo are integers can be divided to get an integer modulo
16058form result. Intervals can be divided; dividing by an interval that
16059encompasses zero or has zero as a limit will result in an infinite
16060interval.
16061
16062@kindex ^
16063@pindex calc-power
16064@ignore
16065@mindex @null
16066@end ignore
16067@tindex ^
16068The @kbd{^} (@code{calc-power}) command raises a number to a power. If
16069the power is an integer, an exact result is computed using repeated
16070multiplications. For non-integer powers, Calc uses Newton's method or
16071logarithms and exponentials. Square matrices can be raised to integer
16072powers. If either argument is an error (or interval or modulo) form,
16073the result is also an error (or interval or modulo) form.
16074
16075@kindex I ^
16076@tindex nroot
16077If you press the @kbd{I} (inverse) key first, the @kbd{I ^} command
16078computes an Nth root: @kbd{125 @key{RET} 3 I ^} computes the number 5.
16079(This is entirely equivalent to @kbd{125 @key{RET} 1:3 ^}.)
16080
16081@kindex \
16082@pindex calc-idiv
16083@tindex idiv
16084@ignore
16085@mindex @null
16086@end ignore
16087@tindex \
16088The @kbd{\} (@code{calc-idiv}) command divides two numbers on the stack
16089to produce an integer result. It is equivalent to dividing with
16090@key{/}, then rounding down with @kbd{F} (@code{calc-floor}), only a bit
16091more convenient and efficient. Also, since it is an all-integer
16092operation when the arguments are integers, it avoids problems that
16093@kbd{/ F} would have with floating-point roundoff.
16094
16095@kindex %
16096@pindex calc-mod
16097@ignore
16098@mindex @null
16099@end ignore
16100@tindex %
16101The @kbd{%} (@code{calc-mod}) command performs a ``modulo'' (or ``remainder'')
16102operation. Mathematically, @samp{a%b = a - (a\b)*b}, and is defined
16103for all real numbers @expr{a} and @expr{b} (except @expr{b=0}). For
16104positive @expr{b}, the result will always be between 0 (inclusive) and
16105@expr{b} (exclusive). Modulo does not work for HMS forms and error forms.
16106If @expr{a} is a modulo form, its modulo is changed to @expr{b}, which
16107must be positive real number.
16108
16109@kindex :
16110@pindex calc-fdiv
16111@tindex fdiv
16112The @kbd{:} (@code{calc-fdiv}) [@code{fdiv}] command
16113divides the two integers on the top of the stack to produce a fractional
16114result. This is a convenient shorthand for enabling Fraction mode (with
16115@kbd{m f}) temporarily and using @samp{/}. Note that during numeric entry
16116the @kbd{:} key is interpreted as a fraction separator, so to divide 8 by 6
16117you would have to type @kbd{8 @key{RET} 6 @key{RET} :}. (Of course, in
16118this case, it would be much easier simply to enter the fraction directly
16119as @kbd{8:6 @key{RET}}!)
16120
16121@kindex n
16122@pindex calc-change-sign
16123The @kbd{n} (@code{calc-change-sign}) command negates the number on the top
16124of the stack. It works on numbers, vectors and matrices, HMS forms, date
16125forms, error forms, intervals, and modulo forms.
16126
16127@kindex A
16128@pindex calc-abs
16129@tindex abs
16130The @kbd{A} (@code{calc-abs}) [@code{abs}] command computes the absolute
16131value of a number. The result of @code{abs} is always a nonnegative
16132real number: With a complex argument, it computes the complex magnitude.
16133With a vector or matrix argument, it computes the Frobenius norm, i.e.,
16134the square root of the sum of the squares of the absolute values of the
16135elements. The absolute value of an error form is defined by replacing
16136the mean part with its absolute value and leaving the error part the same.
16137The absolute value of a modulo form is undefined. The absolute value of
16138an interval is defined in the obvious way.
16139
16140@kindex f A
16141@pindex calc-abssqr
16142@tindex abssqr
16143The @kbd{f A} (@code{calc-abssqr}) [@code{abssqr}] command computes the
16144absolute value squared of a number, vector or matrix, or error form.
16145
16146@kindex f s
16147@pindex calc-sign
16148@tindex sign
16149The @kbd{f s} (@code{calc-sign}) [@code{sign}] command returns 1 if its
16150argument is positive, @mathit{-1} if its argument is negative, or 0 if its
16151argument is zero. In algebraic form, you can also write @samp{sign(a,x)}
16152which evaluates to @samp{x * sign(a)}, i.e., either @samp{x}, @samp{-x}, or
16153zero depending on the sign of @samp{a}.
16154
16155@kindex &
16156@pindex calc-inv
16157@tindex inv
16158@cindex Reciprocal
16159The @kbd{&} (@code{calc-inv}) [@code{inv}] command computes the
16160reciprocal of a number, i.e., @expr{1 / x}. Operating on a square
16161matrix, it computes the inverse of that matrix.
16162
16163@kindex Q
16164@pindex calc-sqrt
16165@tindex sqrt
16166The @kbd{Q} (@code{calc-sqrt}) [@code{sqrt}] command computes the square
16167root of a number. For a negative real argument, the result will be a
16168complex number whose form is determined by the current Polar mode.
16169
16170@kindex f h
16171@pindex calc-hypot
16172@tindex hypot
16173The @kbd{f h} (@code{calc-hypot}) [@code{hypot}] command computes the square
16174root of the sum of the squares of two numbers. That is, @samp{hypot(a,b)}
16175is the length of the hypotenuse of a right triangle with sides @expr{a}
16176and @expr{b}. If the arguments are complex numbers, their squared
16177magnitudes are used.
16178
16179@kindex f Q
16180@pindex calc-isqrt
16181@tindex isqrt
16182The @kbd{f Q} (@code{calc-isqrt}) [@code{isqrt}] command computes the
16183integer square root of an integer. This is the true square root of the
16184number, rounded down to an integer. For example, @samp{isqrt(10)}
16185produces 3. Note that, like @kbd{\} [@code{idiv}], this uses exact
16186integer arithmetic throughout to avoid roundoff problems. If the input
16187is a floating-point number or other non-integer value, this is exactly
16188the same as @samp{floor(sqrt(x))}.
16189
16190@kindex f n
16191@kindex f x
16192@pindex calc-min
16193@tindex min
16194@pindex calc-max
16195@tindex max
16196The @kbd{f n} (@code{calc-min}) [@code{min}] and @kbd{f x} (@code{calc-max})
16197[@code{max}] commands take the minimum or maximum of two real numbers,
16198respectively. These commands also work on HMS forms, date forms,
16199intervals, and infinities. (In algebraic expressions, these functions
16200take any number of arguments and return the maximum or minimum among
16201all the arguments.)
16202
16203@kindex f M
16204@kindex f X
16205@pindex calc-mant-part
16206@tindex mant
16207@pindex calc-xpon-part
16208@tindex xpon
16209The @kbd{f M} (@code{calc-mant-part}) [@code{mant}] function extracts
16210the ``mantissa'' part @expr{m} of its floating-point argument; @kbd{f X}
16211(@code{calc-xpon-part}) [@code{xpon}] extracts the ``exponent'' part
16212@expr{e}. The original number is equal to
16213@texline @math{m \times 10^e},
16214@infoline @expr{m * 10^e},
16215where @expr{m} is in the interval @samp{[1.0 ..@: 10.0)} except that
16216@expr{m=e=0} if the original number is zero. For integers
16217and fractions, @code{mant} returns the number unchanged and @code{xpon}
16218returns zero. The @kbd{v u} (@code{calc-unpack}) command can also be
16219used to ``unpack'' a floating-point number; this produces an integer
16220mantissa and exponent, with the constraint that the mantissa is not
16221a multiple of ten (again except for the @expr{m=e=0} case).
16222
16223@kindex f S
16224@pindex calc-scale-float
16225@tindex scf
16226The @kbd{f S} (@code{calc-scale-float}) [@code{scf}] function scales a number
16227by a given power of ten. Thus, @samp{scf(mant(x), xpon(x)) = x} for any
16228real @samp{x}. The second argument must be an integer, but the first
16229may actually be any numeric value. For example, @samp{scf(5,-2) = 0.05}
16230or @samp{1:20} depending on the current Fraction mode.
16231
16232@kindex f [
16233@kindex f ]
16234@pindex calc-decrement
16235@pindex calc-increment
16236@tindex decr
16237@tindex incr
16238The @kbd{f [} (@code{calc-decrement}) [@code{decr}] and @kbd{f ]}
16239(@code{calc-increment}) [@code{incr}] functions decrease or increase
16240a number by one unit. For integers, the effect is obvious. For
16241floating-point numbers, the change is by one unit in the last place.
16242For example, incrementing @samp{12.3456} when the current precision
16243is 6 digits yields @samp{12.3457}. If the current precision had been
162448 digits, the result would have been @samp{12.345601}. Incrementing
16245@samp{0.0} produces
16246@texline @math{10^{-p}},
16247@infoline @expr{10^-p},
16248where @expr{p} is the current
16249precision. These operations are defined only on integers and floats.
16250With numeric prefix arguments, they change the number by @expr{n} units.
16251
16252Note that incrementing followed by decrementing, or vice-versa, will
16253almost but not quite always cancel out. Suppose the precision is
162546 digits and the number @samp{9.99999} is on the stack. Incrementing
16255will produce @samp{10.0000}; decrementing will produce @samp{9.9999}.
16256One digit has been dropped. This is an unavoidable consequence of the
16257way floating-point numbers work.
16258
16259Incrementing a date/time form adjusts it by a certain number of seconds.
16260Incrementing a pure date form adjusts it by a certain number of days.
16261
16262@node Integer Truncation, Complex Number Functions, Basic Arithmetic, Arithmetic
16263@section Integer Truncation
16264
16265@noindent
16266There are four commands for truncating a real number to an integer,
16267differing mainly in their treatment of negative numbers. All of these
16268commands have the property that if the argument is an integer, the result
16269is the same integer. An integer-valued floating-point argument is converted
16270to integer form.
16271
16272If you press @kbd{H} (@code{calc-hyperbolic}) first, the result will be
16273expressed as an integer-valued floating-point number.
16274
16275@cindex Integer part of a number
16276@kindex F
16277@pindex calc-floor
16278@tindex floor
16279@tindex ffloor
16280@ignore
16281@mindex @null
16282@end ignore
16283@kindex H F
16284The @kbd{F} (@code{calc-floor}) [@code{floor} or @code{ffloor}] command
16285truncates a real number to the next lower integer, i.e., toward minus
16286infinity. Thus @kbd{3.6 F} produces 3, but @kbd{_3.6 F} produces
16287@mathit{-4}.
16288
16289@kindex I F
16290@pindex calc-ceiling
16291@tindex ceil
16292@tindex fceil
16293@ignore
16294@mindex @null
16295@end ignore
16296@kindex H I F
16297The @kbd{I F} (@code{calc-ceiling}) [@code{ceil} or @code{fceil}]
16298command truncates toward positive infinity. Thus @kbd{3.6 I F} produces
162994, and @kbd{_3.6 I F} produces @mathit{-3}.
16300
16301@kindex R
16302@pindex calc-round
16303@tindex round
16304@tindex fround
16305@ignore
16306@mindex @null
16307@end ignore
16308@kindex H R
16309The @kbd{R} (@code{calc-round}) [@code{round} or @code{fround}] command
16310rounds to the nearest integer. When the fractional part is .5 exactly,
16311this command rounds away from zero. (All other rounding in the
16312Calculator uses this convention as well.) Thus @kbd{3.5 R} produces 4
16313but @kbd{3.4 R} produces 3; @kbd{_3.5 R} produces @mathit{-4}.
16314
16315@kindex I R
16316@pindex calc-trunc
16317@tindex trunc
16318@tindex ftrunc
16319@ignore
16320@mindex @null
16321@end ignore
16322@kindex H I R
16323The @kbd{I R} (@code{calc-trunc}) [@code{trunc} or @code{ftrunc}]
16324command truncates toward zero. In other words, it ``chops off''
16325everything after the decimal point. Thus @kbd{3.6 I R} produces 3 and
16326@kbd{_3.6 I R} produces @mathit{-3}.
16327
16328These functions may not be applied meaningfully to error forms, but they
16329do work for intervals. As a convenience, applying @code{floor} to a
16330modulo form floors the value part of the form. Applied to a vector,
16331these functions operate on all elements of the vector one by one.
16332Applied to a date form, they operate on the internal numerical
16333representation of dates, converting a date/time form into a pure date.
16334
16335@ignore
16336@starindex
16337@end ignore
16338@tindex rounde
16339@ignore
16340@starindex
16341@end ignore
16342@tindex roundu
16343@ignore
16344@starindex
16345@end ignore
16346@tindex frounde
16347@ignore
16348@starindex
16349@end ignore
16350@tindex froundu
16351There are two more rounding functions which can only be entered in
16352algebraic notation. The @code{roundu} function is like @code{round}
16353except that it rounds up, toward plus infinity, when the fractional
16354part is .5. This distinction matters only for negative arguments.
16355Also, @code{rounde} rounds to an even number in the case of a tie,
16356rounding up or down as necessary. For example, @samp{rounde(3.5)} and
16357@samp{rounde(4.5)} both return 4, but @samp{rounde(5.5)} returns 6.
16358The advantage of round-to-even is that the net error due to rounding
16359after a long calculation tends to cancel out to zero. An important
16360subtle point here is that the number being fed to @code{rounde} will
16361already have been rounded to the current precision before @code{rounde}
16362begins. For example, @samp{rounde(2.500001)} with a current precision
16363of 6 will incorrectly, or at least surprisingly, yield 2 because the
16364argument will first have been rounded down to @expr{2.5} (which
16365@code{rounde} sees as an exact tie between 2 and 3).
16366
16367Each of these functions, when written in algebraic formulas, allows
16368a second argument which specifies the number of digits after the
16369decimal point to keep. For example, @samp{round(123.4567, 2)} will
16370produce the answer 123.46, and @samp{round(123.4567, -1)} will
16371produce 120 (i.e., the cutoff is one digit to the @emph{left} of
16372the decimal point). A second argument of zero is equivalent to
16373no second argument at all.
16374
16375@cindex Fractional part of a number
16376To compute the fractional part of a number (i.e., the amount which, when
16377added to `@tfn{floor(}@var{n}@tfn{)}', will produce @var{n}) just take @var{n}
16378modulo 1 using the @code{%} command.
16379
16380Note also the @kbd{\} (integer quotient), @kbd{f I} (integer logarithm),
16381and @kbd{f Q} (integer square root) commands, which are analogous to
16382@kbd{/}, @kbd{B}, and @kbd{Q}, respectively, except that they take integer
16383arguments and return the result rounded down to an integer.
16384
16385@node Complex Number Functions, Conversions, Integer Truncation, Arithmetic
16386@section Complex Number Functions
16387
16388@noindent
16389@kindex J
16390@pindex calc-conj
16391@tindex conj
16392The @kbd{J} (@code{calc-conj}) [@code{conj}] command computes the
16393complex conjugate of a number. For complex number @expr{a+bi}, the
16394complex conjugate is @expr{a-bi}. If the argument is a real number,
16395this command leaves it the same. If the argument is a vector or matrix,
16396this command replaces each element by its complex conjugate.
16397
16398@kindex G
16399@pindex calc-argument
16400@tindex arg
16401The @kbd{G} (@code{calc-argument}) [@code{arg}] command computes the
16402``argument'' or polar angle of a complex number. For a number in polar
16403notation, this is simply the second component of the pair
16404@texline `@tfn{(}@var{r}@tfn{;}@math{\theta}@tfn{)}'.
16405@infoline `@tfn{(}@var{r}@tfn{;}@var{theta}@tfn{)}'.
16406The result is expressed according to the current angular mode and will
16407be in the range @mathit{-180} degrees (exclusive) to @mathit{+180} degrees
16408(inclusive), or the equivalent range in radians.
16409
16410@pindex calc-imaginary
16411The @code{calc-imaginary} command multiplies the number on the
16412top of the stack by the imaginary number @expr{i = (0,1)}. This
16413command is not normally bound to a key in Calc, but it is available
16414on the @key{IMAG} button in Keypad mode.
16415
16416@kindex f r
16417@pindex calc-re
16418@tindex re
16419The @kbd{f r} (@code{calc-re}) [@code{re}] command replaces a complex number
16420by its real part. This command has no effect on real numbers. (As an
16421added convenience, @code{re} applied to a modulo form extracts
16422the value part.)
16423
16424@kindex f i
16425@pindex calc-im
16426@tindex im
16427The @kbd{f i} (@code{calc-im}) [@code{im}] command replaces a complex number
16428by its imaginary part; real numbers are converted to zero. With a vector
16429or matrix argument, these functions operate element-wise.
16430
16431@ignore
16432@mindex v p
16433@end ignore
16434@kindex v p (complex)
16435@pindex calc-pack
16436The @kbd{v p} (@code{calc-pack}) command can pack the top two numbers on
16437the stack into a composite object such as a complex number. With
16438a prefix argument of @mathit{-1}, it produces a rectangular complex number;
16439with an argument of @mathit{-2}, it produces a polar complex number.
16440(Also, @pxref{Building Vectors}.)
16441
16442@ignore
16443@mindex v u
16444@end ignore
16445@kindex v u (complex)
16446@pindex calc-unpack
16447The @kbd{v u} (@code{calc-unpack}) command takes the complex number
16448(or other composite object) on the top of the stack and unpacks it
16449into its separate components.
16450
16451@node Conversions, Date Arithmetic, Complex Number Functions, Arithmetic
16452@section Conversions
16453
16454@noindent
16455The commands described in this section convert numbers from one form
16456to another; they are two-key sequences beginning with the letter @kbd{c}.
16457
16458@kindex c f
16459@pindex calc-float
16460@tindex pfloat
16461The @kbd{c f} (@code{calc-float}) [@code{pfloat}] command converts the
16462number on the top of the stack to floating-point form. For example,
16463@expr{23} is converted to @expr{23.0}, @expr{3:2} is converted to
16464@expr{1.5}, and @expr{2.3} is left the same. If the value is a composite
16465object such as a complex number or vector, each of the components is
16466converted to floating-point. If the value is a formula, all numbers
16467in the formula are converted to floating-point. Note that depending
16468on the current floating-point precision, conversion to floating-point
16469format may lose information.
16470
16471As a special exception, integers which appear as powers or subscripts
16472are not floated by @kbd{c f}. If you really want to float a power,
16473you can use a @kbd{j s} command to select the power followed by @kbd{c f}.
16474Because @kbd{c f} cannot examine the formula outside of the selection,
16475it does not notice that the thing being floated is a power.
16476@xref{Selecting Subformulas}.
16477
16478The normal @kbd{c f} command is ``pervasive'' in the sense that it
16479applies to all numbers throughout the formula. The @code{pfloat}
16480algebraic function never stays around in a formula; @samp{pfloat(a + 1)}
16481changes to @samp{a + 1.0} as soon as it is evaluated.
16482
16483@kindex H c f
16484@tindex float
16485With the Hyperbolic flag, @kbd{H c f} [@code{float}] operates
16486only on the number or vector of numbers at the top level of its
16487argument. Thus, @samp{float(1)} is 1.0, but @samp{float(a + 1)}
16488is left unevaluated because its argument is not a number.
16489
16490You should use @kbd{H c f} if you wish to guarantee that the final
16491value, once all the variables have been assigned, is a float; you
16492would use @kbd{c f} if you wish to do the conversion on the numbers
16493that appear right now.
16494
16495@kindex c F
16496@pindex calc-fraction
16497@tindex pfrac
16498The @kbd{c F} (@code{calc-fraction}) [@code{pfrac}] command converts a
16499floating-point number into a fractional approximation. By default, it
16500produces a fraction whose decimal representation is the same as the
16501input number, to within the current precision. You can also give a
16502numeric prefix argument to specify a tolerance, either directly, or,
16503if the prefix argument is zero, by using the number on top of the stack
16504as the tolerance. If the tolerance is a positive integer, the fraction
16505is correct to within that many significant figures. If the tolerance is
16506a non-positive integer, it specifies how many digits fewer than the current
16507precision to use. If the tolerance is a floating-point number, the
16508fraction is correct to within that absolute amount.
16509
16510@kindex H c F
16511@tindex frac
16512The @code{pfrac} function is pervasive, like @code{pfloat}.
16513There is also a non-pervasive version, @kbd{H c F} [@code{frac}],
16514which is analogous to @kbd{H c f} discussed above.
16515
16516@kindex c d
16517@pindex calc-to-degrees
16518@tindex deg
16519The @kbd{c d} (@code{calc-to-degrees}) [@code{deg}] command converts a
16520number into degrees form. The value on the top of the stack may be an
16521HMS form (interpreted as degrees-minutes-seconds), or a real number which
16522will be interpreted in radians regardless of the current angular mode.
16523
16524@kindex c r
16525@pindex calc-to-radians
16526@tindex rad
16527The @kbd{c r} (@code{calc-to-radians}) [@code{rad}] command converts an
16528HMS form or angle in degrees into an angle in radians.
16529
16530@kindex c h
16531@pindex calc-to-hms
16532@tindex hms
16533The @kbd{c h} (@code{calc-to-hms}) [@code{hms}] command converts a real
16534number, interpreted according to the current angular mode, to an HMS
16535form describing the same angle. In algebraic notation, the @code{hms}
16536function also accepts three arguments: @samp{hms(@var{h}, @var{m}, @var{s})}.
16537(The three-argument version is independent of the current angular mode.)
16538
16539@pindex calc-from-hms
16540The @code{calc-from-hms} command converts the HMS form on the top of the
16541stack into a real number according to the current angular mode.
16542
16543@kindex c p
16544@kindex I c p
16545@pindex calc-polar
16546@tindex polar
16547@tindex rect
16548The @kbd{c p} (@code{calc-polar}) command converts the complex number on
16549the top of the stack from polar to rectangular form, or from rectangular
16550to polar form, whichever is appropriate. Real numbers are left the same.
16551This command is equivalent to the @code{rect} or @code{polar}
16552functions in algebraic formulas, depending on the direction of
16553conversion. (It uses @code{polar}, except that if the argument is
16554already a polar complex number, it uses @code{rect} instead. The
16555@kbd{I c p} command always uses @code{rect}.)
16556
16557@kindex c c
16558@pindex calc-clean
16559@tindex pclean
16560The @kbd{c c} (@code{calc-clean}) [@code{pclean}] command ``cleans'' the
16561number on the top of the stack. Floating point numbers are re-rounded
16562according to the current precision. Polar numbers whose angular
16563components have strayed from the @mathit{-180} to @mathit{+180} degree range
16564are normalized. (Note that results will be undesirable if the current
16565angular mode is different from the one under which the number was
16566produced!) Integers and fractions are generally unaffected by this
16567operation. Vectors and formulas are cleaned by cleaning each component
16568number (i.e., pervasively).
16569
16570If the simplification mode is set below the default level, it is raised
16571to the default level for the purposes of this command. Thus, @kbd{c c}
16572applies the default simplifications even if their automatic application
16573is disabled. @xref{Simplification Modes}.
16574
16575@cindex Roundoff errors, correcting
16576A numeric prefix argument to @kbd{c c} sets the floating-point precision
16577to that value for the duration of the command. A positive prefix (of at
16578least 3) sets the precision to the specified value; a negative or zero
16579prefix decreases the precision by the specified amount.
16580
16581@kindex c 0-9
16582@pindex calc-clean-num
16583The keystroke sequences @kbd{c 0} through @kbd{c 9} are equivalent
16584to @kbd{c c} with the corresponding negative prefix argument. If roundoff
16585errors have changed 2.0 into 1.999999, typing @kbd{c 1} to clip off one
16586decimal place often conveniently does the trick.
16587
16588The @kbd{c c} command with a numeric prefix argument, and the @kbd{c 0}
16589through @kbd{c 9} commands, also ``clip'' very small floating-point
16590numbers to zero. If the exponent is less than or equal to the negative
16591of the specified precision, the number is changed to 0.0. For example,
16592if the current precision is 12, then @kbd{c 2} changes the vector
16593@samp{[1e-8, 1e-9, 1e-10, 1e-11]} to @samp{[1e-8, 1e-9, 0, 0]}.
16594Numbers this small generally arise from roundoff noise.
16595
16596If the numbers you are using really are legitimately this small,
16597you should avoid using the @kbd{c 0} through @kbd{c 9} commands.
16598(The plain @kbd{c c} command rounds to the current precision but
16599does not clip small numbers.)
16600
16601One more property of @kbd{c 0} through @kbd{c 9}, and of @kbd{c c} with
16602a prefix argument, is that integer-valued floats are converted to
16603plain integers, so that @kbd{c 1} on @samp{[1., 1.5, 2., 2.5, 3.]}
16604produces @samp{[1, 1.5, 2, 2.5, 3]}. This is not done for huge
16605numbers (@samp{1e100} is technically an integer-valued float, but
16606you wouldn't want it automatically converted to a 100-digit integer).
16607
16608@kindex H c 0-9
16609@kindex H c c
16610@tindex clean
16611With the Hyperbolic flag, @kbd{H c c} and @kbd{H c 0} through @kbd{H c 9}
16612operate non-pervasively [@code{clean}].
16613
16614@node Date Arithmetic, Financial Functions, Conversions, Arithmetic
16615@section Date Arithmetic
16616
16617@noindent
16618@cindex Date arithmetic, additional functions
16619The commands described in this section perform various conversions
16620and calculations involving date forms (@pxref{Date Forms}). They
16621use the @kbd{t} (for time/date) prefix key followed by shifted
16622letters.
16623
16624The simplest date arithmetic is done using the regular @kbd{+} and @kbd{-}
16625commands. In particular, adding a number to a date form advances the
16626date form by a certain number of days; adding an HMS form to a date
16627form advances the date by a certain amount of time; and subtracting two
16628date forms produces a difference measured in days. The commands
16629described here provide additional, more specialized operations on dates.
16630
16631Many of these commands accept a numeric prefix argument; if you give
16632plain @kbd{C-u} as the prefix, these commands will instead take the
16633additional argument from the top of the stack.
16634
16635@menu
16636* Date Conversions::
16637* Date Functions::
16638* Time Zones::
16639* Business Days::
16640@end menu
16641
16642@node Date Conversions, Date Functions, Date Arithmetic, Date Arithmetic
16643@subsection Date Conversions
16644
16645@noindent
16646@kindex t D
16647@pindex calc-date
16648@tindex date
16649The @kbd{t D} (@code{calc-date}) [@code{date}] command converts a
16650date form into a number, measured in days since Jan 1, 1 AD. The
16651result will be an integer if @var{date} is a pure date form, or a
16652fraction or float if @var{date} is a date/time form. Or, if its
16653argument is a number, it converts this number into a date form.
16654
16655With a numeric prefix argument, @kbd{t D} takes that many objects
16656(up to six) from the top of the stack and interprets them in one
16657of the following ways:
16658
16659The @samp{date(@var{year}, @var{month}, @var{day})} function
16660builds a pure date form out of the specified year, month, and
16661day, which must all be integers. @var{Year} is a year number,
16662such as 1991 (@emph{not} the same as 91!). @var{Month} must be
16663an integer in the range 1 to 12; @var{day} must be in the range
166641 to 31. If the specified month has fewer than 31 days and
16665@var{day} is too large, the equivalent day in the following
16666month will be used.
16667
16668The @samp{date(@var{month}, @var{day})} function builds a
16669pure date form using the current year, as determined by the
16670real-time clock.
16671
16672The @samp{date(@var{year}, @var{month}, @var{day}, @var{hms})}
16673function builds a date/time form using an @var{hms} form.
16674
16675The @samp{date(@var{year}, @var{month}, @var{day}, @var{hour},
16676@var{minute}, @var{second})} function builds a date/time form.
16677@var{hour} should be an integer in the range 0 to 23;
16678@var{minute} should be an integer in the range 0 to 59;
16679@var{second} should be any real number in the range @samp{[0 .. 60)}.
16680The last two arguments default to zero if omitted.
16681
16682@kindex t J
16683@pindex calc-julian
16684@tindex julian
16685@cindex Julian day counts, conversions
16686The @kbd{t J} (@code{calc-julian}) [@code{julian}] command converts
16687a date form into a Julian day count, which is the number of days
7c1a0036
GM
16688since noon (GMT) on Jan 1, 4713 BC. A pure date is converted to an
16689integer Julian count representing noon of that day. A date/time form
16690is converted to an exact floating-point Julian count, adjusted to
4009494e
GM
16691interpret the date form in the current time zone but the Julian
16692day count in Greenwich Mean Time. A numeric prefix argument allows
16693you to specify the time zone; @pxref{Time Zones}. Use a prefix of
16694zero to suppress the time zone adjustment. Note that pure date forms
16695are never time-zone adjusted.
16696
16697This command can also do the opposite conversion, from a Julian day
16698count (either an integer day, or a floating-point day and time in
16699the GMT zone), into a pure date form or a date/time form in the
16700current or specified time zone.
16701
16702@kindex t U
16703@pindex calc-unix-time
16704@tindex unixtime
16705@cindex Unix time format, conversions
16706The @kbd{t U} (@code{calc-unix-time}) [@code{unixtime}] command
16707converts a date form into a Unix time value, which is the number of
16708seconds since midnight on Jan 1, 1970, or vice-versa. The numeric result
16709will be an integer if the current precision is 12 or less; for higher
16710precisions, the result may be a float with (@var{precision}@minus{}12)
16711digits after the decimal. Just as for @kbd{t J}, the numeric time
16712is interpreted in the GMT time zone and the date form is interpreted
16713in the current or specified zone. Some systems use Unix-like
16714numbering but with the local time zone; give a prefix of zero to
16715suppress the adjustment if so.
16716
16717@kindex t C
16718@pindex calc-convert-time-zones
16719@tindex tzconv
16720@cindex Time Zones, converting between
16721The @kbd{t C} (@code{calc-convert-time-zones}) [@code{tzconv}]
16722command converts a date form from one time zone to another. You
16723are prompted for each time zone name in turn; you can answer with
16724any suitable Calc time zone expression (@pxref{Time Zones}).
16725If you answer either prompt with a blank line, the local time
16726zone is used for that prompt. You can also answer the first
16727prompt with @kbd{$} to take the two time zone names from the
16728stack (and the date to be converted from the third stack level).
16729
16730@node Date Functions, Business Days, Date Conversions, Date Arithmetic
16731@subsection Date Functions
16732
16733@noindent
16734@kindex t N
16735@pindex calc-now
16736@tindex now
16737The @kbd{t N} (@code{calc-now}) [@code{now}] command pushes the
16738current date and time on the stack as a date form. The time is
16739reported in terms of the specified time zone; with no numeric prefix
16740argument, @kbd{t N} reports for the current time zone.
16741
16742@kindex t P
16743@pindex calc-date-part
16744The @kbd{t P} (@code{calc-date-part}) command extracts one part
16745of a date form. The prefix argument specifies the part; with no
16746argument, this command prompts for a part code from 1 to 9.
16747The various part codes are described in the following paragraphs.
16748
16749@tindex year
16750The @kbd{M-1 t P} [@code{year}] function extracts the year number
16751from a date form as an integer, e.g., 1991. This and the
16752following functions will also accept a real number for an
16753argument, which is interpreted as a standard Calc day number.
16754Note that this function will never return zero, since the year
167551 BC immediately precedes the year 1 AD.
16756
16757@tindex month
16758The @kbd{M-2 t P} [@code{month}] function extracts the month number
16759from a date form as an integer in the range 1 to 12.
16760
16761@tindex day
16762The @kbd{M-3 t P} [@code{day}] function extracts the day number
16763from a date form as an integer in the range 1 to 31.
16764
16765@tindex hour
16766The @kbd{M-4 t P} [@code{hour}] function extracts the hour from
16767a date form as an integer in the range 0 (midnight) to 23. Note
16768that 24-hour time is always used. This returns zero for a pure
16769date form. This function (and the following two) also accept
16770HMS forms as input.
16771
16772@tindex minute
16773The @kbd{M-5 t P} [@code{minute}] function extracts the minute
16774from a date form as an integer in the range 0 to 59.
16775
16776@tindex second
16777The @kbd{M-6 t P} [@code{second}] function extracts the second
16778from a date form. If the current precision is 12 or less,
16779the result is an integer in the range 0 to 59. For higher
16780precisions, the result may instead be a floating-point number.
16781
16782@tindex weekday
16783The @kbd{M-7 t P} [@code{weekday}] function extracts the weekday
16784number from a date form as an integer in the range 0 (Sunday)
16785to 6 (Saturday).
16786
16787@tindex yearday
16788The @kbd{M-8 t P} [@code{yearday}] function extracts the day-of-year
16789number from a date form as an integer in the range 1 (January 1)
16790to 366 (December 31 of a leap year).
16791
16792@tindex time
16793The @kbd{M-9 t P} [@code{time}] function extracts the time portion
16794of a date form as an HMS form. This returns @samp{0@@ 0' 0"}
16795for a pure date form.
16796
16797@kindex t M
16798@pindex calc-new-month
16799@tindex newmonth
16800The @kbd{t M} (@code{calc-new-month}) [@code{newmonth}] command
16801computes a new date form that represents the first day of the month
16802specified by the input date. The result is always a pure date
16803form; only the year and month numbers of the input are retained.
16804With a numeric prefix argument @var{n} in the range from 1 to 31,
16805@kbd{t M} computes the @var{n}th day of the month. (If @var{n}
16806is greater than the actual number of days in the month, or if
16807@var{n} is zero, the last day of the month is used.)
16808
16809@kindex t Y
16810@pindex calc-new-year
16811@tindex newyear
16812The @kbd{t Y} (@code{calc-new-year}) [@code{newyear}] command
16813computes a new pure date form that represents the first day of
16814the year specified by the input. The month, day, and time
16815of the input date form are lost. With a numeric prefix argument
16816@var{n} in the range from 1 to 366, @kbd{t Y} computes the
16817@var{n}th day of the year (366 is treated as 365 in non-leap
16818years). A prefix argument of 0 computes the last day of the
16819year (December 31). A negative prefix argument from @mathit{-1} to
16820@mathit{-12} computes the first day of the @var{n}th month of the year.
16821
16822@kindex t W
16823@pindex calc-new-week
16824@tindex newweek
16825The @kbd{t W} (@code{calc-new-week}) [@code{newweek}] command
16826computes a new pure date form that represents the Sunday on or before
16827the input date. With a numeric prefix argument, it can be made to
16828use any day of the week as the starting day; the argument must be in
16829the range from 0 (Sunday) to 6 (Saturday). This function always
16830subtracts between 0 and 6 days from the input date.
16831
16832Here's an example use of @code{newweek}: Find the date of the next
16833Wednesday after a given date. Using @kbd{M-3 t W} or @samp{newweek(d, 3)}
16834will give you the @emph{preceding} Wednesday, so @samp{newweek(d+7, 3)}
16835will give you the following Wednesday. A further look at the definition
16836of @code{newweek} shows that if the input date is itself a Wednesday,
16837this formula will return the Wednesday one week in the future. An
16838exercise for the reader is to modify this formula to yield the same day
16839if the input is already a Wednesday. Another interesting exercise is
16840to preserve the time-of-day portion of the input (@code{newweek} resets
16841the time to midnight; hint:@: how can @code{newweek} be defined in terms
16842of the @code{weekday} function?).
16843
16844@ignore
16845@starindex
16846@end ignore
16847@tindex pwday
16848The @samp{pwday(@var{date})} function (not on any key) computes the
16849day-of-month number of the Sunday on or before @var{date}. With
16850two arguments, @samp{pwday(@var{date}, @var{day})} computes the day
16851number of the Sunday on or before day number @var{day} of the month
16852specified by @var{date}. The @var{day} must be in the range from
168537 to 31; if the day number is greater than the actual number of days
16854in the month, the true number of days is used instead. Thus
16855@samp{pwday(@var{date}, 7)} finds the first Sunday of the month, and
16856@samp{pwday(@var{date}, 31)} finds the last Sunday of the month.
16857With a third @var{weekday} argument, @code{pwday} can be made to look
16858for any day of the week instead of Sunday.
16859
16860@kindex t I
16861@pindex calc-inc-month
16862@tindex incmonth
16863The @kbd{t I} (@code{calc-inc-month}) [@code{incmonth}] command
16864increases a date form by one month, or by an arbitrary number of
16865months specified by a numeric prefix argument. The time portion,
16866if any, of the date form stays the same. The day also stays the
16867same, except that if the new month has fewer days the day
16868number may be reduced to lie in the valid range. For example,
16869@samp{incmonth(<Jan 31, 1991>)} produces @samp{<Feb 28, 1991>}.
16870Because of this, @kbd{t I t I} and @kbd{M-2 t I} do not always give
16871the same results (@samp{<Mar 28, 1991>} versus @samp{<Mar 31, 1991>}
16872in this case).
16873
16874@ignore
16875@starindex
16876@end ignore
16877@tindex incyear
16878The @samp{incyear(@var{date}, @var{step})} function increases
16879a date form by the specified number of years, which may be
16880any positive or negative integer. Note that @samp{incyear(d, n)}
16881is equivalent to @w{@samp{incmonth(d, 12*n)}}, but these do not have
16882simple equivalents in terms of day arithmetic because
16883months and years have varying lengths. If the @var{step}
16884argument is omitted, 1 year is assumed. There is no keyboard
16885command for this function; use @kbd{C-u 12 t I} instead.
16886
16887There is no @code{newday} function at all because @kbd{F} [@code{floor}]
16888serves this purpose. Similarly, instead of @code{incday} and
16889@code{incweek} simply use @expr{d + n} or @expr{d + 7 n}.
16890
16891@xref{Basic Arithmetic}, for the @kbd{f ]} [@code{incr}] command
16892which can adjust a date/time form by a certain number of seconds.
16893
16894@node Business Days, Time Zones, Date Functions, Date Arithmetic
16895@subsection Business Days
16896
16897@noindent
16898Often time is measured in ``business days'' or ``working days,''
16899where weekends and holidays are skipped. Calc's normal date
16900arithmetic functions use calendar days, so that subtracting two
16901consecutive Mondays will yield a difference of 7 days. By contrast,
16902subtracting two consecutive Mondays would yield 5 business days
16903(assuming two-day weekends and the absence of holidays).
16904
16905@kindex t +
16906@kindex t -
16907@tindex badd
16908@tindex bsub
16909@pindex calc-business-days-plus
16910@pindex calc-business-days-minus
16911The @kbd{t +} (@code{calc-business-days-plus}) [@code{badd}]
16912and @kbd{t -} (@code{calc-business-days-minus}) [@code{bsub}]
16913commands perform arithmetic using business days. For @kbd{t +},
16914one argument must be a date form and the other must be a real
16915number (positive or negative). If the number is not an integer,
16916then a certain amount of time is added as well as a number of
16917days; for example, adding 0.5 business days to a time in Friday
16918evening will produce a time in Monday morning. It is also
16919possible to add an HMS form; adding @samp{12@@ 0' 0"} also adds
16920half a business day. For @kbd{t -}, the arguments are either a
16921date form and a number or HMS form, or two date forms, in which
16922case the result is the number of business days between the two
16923dates.
16924
16925@cindex @code{Holidays} variable
16926@vindex Holidays
16927By default, Calc considers any day that is not a Saturday or
16928Sunday to be a business day. You can define any number of
16929additional holidays by editing the variable @code{Holidays}.
16930(There is an @w{@kbd{s H}} convenience command for editing this
16931variable.) Initially, @code{Holidays} contains the vector
16932@samp{[sat, sun]}. Entries in the @code{Holidays} vector may
16933be any of the following kinds of objects:
16934
16935@itemize @bullet
16936@item
16937Date forms (pure dates, not date/time forms). These specify
16938particular days which are to be treated as holidays.
16939
16940@item
16941Intervals of date forms. These specify a range of days, all of
16942which are holidays (e.g., Christmas week). @xref{Interval Forms}.
16943
16944@item
16945Nested vectors of date forms. Each date form in the vector is
16946considered to be a holiday.
16947
16948@item
16949Any Calc formula which evaluates to one of the above three things.
16950If the formula involves the variable @expr{y}, it stands for a
16951yearly repeating holiday; @expr{y} will take on various year
16952numbers like 1992. For example, @samp{date(y, 12, 25)} specifies
16953Christmas day, and @samp{newweek(date(y, 11, 7), 4) + 21} specifies
16954Thanksgiving (which is held on the fourth Thursday of November).
16955If the formula involves the variable @expr{m}, that variable
16956takes on month numbers from 1 to 12: @samp{date(y, m, 15)} is
16957a holiday that takes place on the 15th of every month.
16958
16959@item
16960A weekday name, such as @code{sat} or @code{sun}. This is really
16961a variable whose name is a three-letter, lower-case day name.
16962
16963@item
16964An interval of year numbers (integers). This specifies the span of
16965years over which this holiday list is to be considered valid. Any
16966business-day arithmetic that goes outside this range will result
16967in an error message. Use this if you are including an explicit
16968list of holidays, rather than a formula to generate them, and you
16969want to make sure you don't accidentally go beyond the last point
16970where the holidays you entered are complete. If there is no
16971limiting interval in the @code{Holidays} vector, the default
16972@samp{[1 .. 2737]} is used. (This is the absolute range of years
16973for which Calc's business-day algorithms will operate.)
16974
16975@item
16976An interval of HMS forms. This specifies the span of hours that
16977are to be considered one business day. For example, if this
16978range is @samp{[9@@ 0' 0" .. 17@@ 0' 0"]} (i.e., 9am to 5pm), then
16979the business day is only eight hours long, so that @kbd{1.5 t +}
16980on @samp{<4:00pm Fri Dec 13, 1991>} will add one business day and
16981four business hours to produce @samp{<12:00pm Tue Dec 17, 1991>}.
16982Likewise, @kbd{t -} will now express differences in time as
16983fractions of an eight-hour day. Times before 9am will be treated
16984as 9am by business date arithmetic, and times at or after 5pm will
16985be treated as 4:59:59pm. If there is no HMS interval in @code{Holidays},
16986the full 24-hour day @samp{[0@ 0' 0" .. 24@ 0' 0"]} is assumed.
16987(Regardless of the type of bounds you specify, the interval is
16988treated as inclusive on the low end and exclusive on the high end,
16989so that the work day goes from 9am up to, but not including, 5pm.)
16990@end itemize
16991
16992If the @code{Holidays} vector is empty, then @kbd{t +} and
16993@kbd{t -} will act just like @kbd{+} and @kbd{-} because there will
16994then be no difference between business days and calendar days.
16995
16996Calc expands the intervals and formulas you give into a complete
16997list of holidays for internal use. This is done mainly to make
16998sure it can detect multiple holidays. (For example,
16999@samp{<Jan 1, 1989>} is both New Year's Day and a Sunday, but
17000Calc's algorithms take care to count it only once when figuring
17001the number of holidays between two dates.)
17002
17003Since the complete list of holidays for all the years from 1 to
170042737 would be huge, Calc actually computes only the part of the
17005list between the smallest and largest years that have been involved
17006in business-day calculations so far. Normally, you won't have to
17007worry about this. Keep in mind, however, that if you do one
17008calculation for 1992, and another for 1792, even if both involve
17009only a small range of years, Calc will still work out all the
17010holidays that fall in that 200-year span.
17011
17012If you add a (positive) number of days to a date form that falls on a
17013weekend or holiday, the date form is treated as if it were the most
17014recent business day. (Thus adding one business day to a Friday,
17015Saturday, or Sunday will all yield the following Monday.) If you
17016subtract a number of days from a weekend or holiday, the date is
17017effectively on the following business day. (So subtracting one business
17018day from Saturday, Sunday, or Monday yields the preceding Friday.) The
17019difference between two dates one or both of which fall on holidays
17020equals the number of actual business days between them. These
17021conventions are consistent in the sense that, if you add @var{n}
17022business days to any date, the difference between the result and the
17023original date will come out to @var{n} business days. (It can't be
17024completely consistent though; a subtraction followed by an addition
17025might come out a bit differently, since @kbd{t +} is incapable of
17026producing a date that falls on a weekend or holiday.)
17027
17028@ignore
17029@starindex
17030@end ignore
17031@tindex holiday
17032There is a @code{holiday} function, not on any keys, that takes
17033any date form and returns 1 if that date falls on a weekend or
17034holiday, as defined in @code{Holidays}, or 0 if the date is a
17035business day.
17036
17037@node Time Zones, , Business Days, Date Arithmetic
17038@subsection Time Zones
17039
17040@noindent
17041@cindex Time zones
17042@cindex Daylight saving time
17043Time zones and daylight saving time are a complicated business.
17044The conversions to and from Julian and Unix-style dates automatically
17045compute the correct time zone and daylight saving adjustment to use,
17046provided they can figure out this information. This section describes
17047Calc's time zone adjustment algorithm in detail, in case you want to
17048do conversions in different time zones or in case Calc's algorithms
17049can't determine the right correction to use.
17050
17051Adjustments for time zones and daylight saving time are done by
17052@kbd{t U}, @kbd{t J}, @kbd{t N}, and @kbd{t C}, but not by any other
17053commands. In particular, @samp{<may 1 1991> - <apr 1 1991>} evaluates
17054to exactly 30 days even though there is a daylight-saving
17055transition in between. This is also true for Julian pure dates:
17056@samp{julian(<may 1 1991>) - julian(<apr 1 1991>)}. But Julian
17057and Unix date/times will adjust for daylight saving time: using Calc's
17058default daylight saving time rule (see the explanation below),
17059@samp{julian(<12am may 1 1991>) - julian(<12am apr 1 1991>)}
17060evaluates to @samp{29.95833} (that's 29 days and 23 hours)
17061because one hour was lost when daylight saving commenced on
17062April 7, 1991.
17063
17064In brief, the idiom @samp{julian(@var{date1}) - julian(@var{date2})}
17065computes the actual number of 24-hour periods between two dates, whereas
17066@samp{@var{date1} - @var{date2}} computes the number of calendar
17067days between two dates without taking daylight saving into account.
17068
17069@pindex calc-time-zone
17070@ignore
17071@starindex
17072@end ignore
17073@tindex tzone
17074The @code{calc-time-zone} [@code{tzone}] command converts the time
17075zone specified by its numeric prefix argument into a number of
17076seconds difference from Greenwich mean time (GMT). If the argument
17077is a number, the result is simply that value multiplied by 3600.
17078Typical arguments for North America are 5 (Eastern) or 8 (Pacific). If
17079Daylight Saving time is in effect, one hour should be subtracted from
17080the normal difference.
17081
17082If you give a prefix of plain @kbd{C-u}, @code{calc-time-zone} (like other
17083date arithmetic commands that include a time zone argument) takes the
17084zone argument from the top of the stack. (In the case of @kbd{t J}
17085and @kbd{t U}, the normal argument is then taken from the second-to-top
17086stack position.) This allows you to give a non-integer time zone
17087adjustment. The time-zone argument can also be an HMS form, or
17088it can be a variable which is a time zone name in upper- or lower-case.
17089For example @samp{tzone(PST) = tzone(8)} and @samp{tzone(pdt) = tzone(7)}
17090(for Pacific standard and daylight saving times, respectively).
17091
17092North American and European time zone names are defined as follows;
17093note that for each time zone there is one name for standard time,
17094another for daylight saving time, and a third for ``generalized'' time
17095in which the daylight saving adjustment is computed from context.
17096
17097@smallexample
17098@group
17099YST PST MST CST EST AST NST GMT WET MET MEZ
17100 9 8 7 6 5 4 3.5 0 -1 -2 -2
17101
17102YDT PDT MDT CDT EDT ADT NDT BST WETDST METDST MESZ
17103 8 7 6 5 4 3 2.5 -1 -2 -3 -3
17104
17105YGT PGT MGT CGT EGT AGT NGT BGT WEGT MEGT MEGZ
171069/8 8/7 7/6 6/5 5/4 4/3 3.5/2.5 0/-1 -1/-2 -2/-3 -2/-3
17107@end group
17108@end smallexample
17109
17110@vindex math-tzone-names
17111To define time zone names that do not appear in the above table,
17112you must modify the Lisp variable @code{math-tzone-names}. This
17113is a list of lists describing the different time zone names; its
17114structure is best explained by an example. The three entries for
17115Pacific Time look like this:
17116
17117@smallexample
17118@group
17119( ( "PST" 8 0 ) ; Name as an upper-case string, then standard
17120 ( "PDT" 8 -1 ) ; adjustment, then daylight saving adjustment.
17121 ( "PGT" 8 "PST" "PDT" ) ) ; Generalized time zone.
17122@end group
17123@end smallexample
17124
17125@cindex @code{TimeZone} variable
17126@vindex TimeZone
17127With no arguments, @code{calc-time-zone} or @samp{tzone()} will by
17128default get the time zone and daylight saving information from the
17129calendar (@pxref{Daylight Saving,Calendar/Diary,The Calendar and the Diary,
17130emacs,The GNU Emacs Manual}). To use a different time zone, or if the
17131calendar does not give the desired result, you can set the Calc variable
17132@code{TimeZone} (which is by default @code{nil}) to an appropriate
17133time zone name. (The easiest way to do this is to edit the
17134@code{TimeZone} variable using Calc's @kbd{s T} command, then use the
17135@kbd{s p} (@code{calc-permanent-variable}) command to save the value of
17136@code{TimeZone} permanently.)
17137If the time zone given by @code{TimeZone} is a generalized time zone,
17138e.g., @code{EGT}, Calc examines the date being converted to tell whether
17139to use standard or daylight saving time. But if the current time zone
17140is explicit, e.g., @code{EST} or @code{EDT}, then that adjustment is
17141used exactly and Calc's daylight saving algorithm is not consulted.
17142The special time zone name @code{local}
17143is equivalent to no argument; i.e., it uses the information obtained
17144from the calendar.
17145
17146The @kbd{t J} and @code{t U} commands with no numeric prefix
17147arguments do the same thing as @samp{tzone()}; namely, use the
17148information from the calendar if @code{TimeZone} is @code{nil},
17149otherwise use the time zone given by @code{TimeZone}.
17150
17151@vindex math-daylight-savings-hook
17152@findex math-std-daylight-savings
17153When Calc computes the daylight saving information itself (i.e., when
17154the @code{TimeZone} variable is set), it will by default consider
17155daylight saving time to begin at 2 a.m.@: on the second Sunday of March
17156(for years from 2007 on) or on the last Sunday in April (for years
17157before 2007), and to end at 2 a.m.@: on the first Sunday of
17158November. (for years from 2007 on) or the last Sunday in October (for
17159years before 2007). These are the rules that have been in effect in
17160much of North America since 1966 and take into account the rule change
17161that began in 2007. If you are in a country that uses different rules
17162for computing daylight saving time, you have two choices: Write your own
17163daylight saving hook, or control time zones explicitly by setting the
17164@code{TimeZone} variable and/or always giving a time-zone argument for
17165the conversion functions.
17166
17167The Lisp variable @code{math-daylight-savings-hook} holds the
17168name of a function that is used to compute the daylight saving
17169adjustment for a given date. The default is
17170@code{math-std-daylight-savings}, which computes an adjustment
17171(either 0 or @mathit{-1}) using the North American rules given above.
17172
17173The daylight saving hook function is called with four arguments:
17174The date, as a floating-point number in standard Calc format;
17175a six-element list of the date decomposed into year, month, day,
17176hour, minute, and second, respectively; a string which contains
17177the generalized time zone name in upper-case, e.g., @code{"WEGT"};
17178and a special adjustment to be applied to the hour value when
17179converting into a generalized time zone (see below).
17180
17181@findex math-prev-weekday-in-month
17182The Lisp function @code{math-prev-weekday-in-month} is useful for
17183daylight saving computations. This is an internal version of
17184the user-level @code{pwday} function described in the previous
17185section. It takes four arguments: The floating-point date value,
17186the corresponding six-element date list, the day-of-month number,
17187and the weekday number (0-6).
17188
17189The default daylight saving hook ignores the time zone name, but a
17190more sophisticated hook could use different algorithms for different
17191time zones. It would also be possible to use different algorithms
17192depending on the year number, but the default hook always uses the
17193algorithm for 1987 and later. Here is a listing of the default
17194daylight saving hook:
17195
17196@smallexample
17197(defun math-std-daylight-savings (date dt zone bump)
17198 (cond ((< (nth 1 dt) 4) 0)
17199 ((= (nth 1 dt) 4)
17200 (let ((sunday (math-prev-weekday-in-month date dt 7 0)))
17201 (cond ((< (nth 2 dt) sunday) 0)
17202 ((= (nth 2 dt) sunday)
17203 (if (>= (nth 3 dt) (+ 3 bump)) -1 0))
17204 (t -1))))
17205 ((< (nth 1 dt) 10) -1)
17206 ((= (nth 1 dt) 10)
17207 (let ((sunday (math-prev-weekday-in-month date dt 31 0)))
17208 (cond ((< (nth 2 dt) sunday) -1)
17209 ((= (nth 2 dt) sunday)
17210 (if (>= (nth 3 dt) (+ 2 bump)) 0 -1))
17211 (t 0))))
17212 (t 0))
17213)
17214@end smallexample
17215
17216@noindent
17217The @code{bump} parameter is equal to zero when Calc is converting
17218from a date form in a generalized time zone into a GMT date value.
17219It is @mathit{-1} when Calc is converting in the other direction. The
17220adjustments shown above ensure that the conversion behaves correctly
17221and reasonably around the 2 a.m.@: transition in each direction.
17222
17223There is a ``missing'' hour between 2 a.m.@: and 3 a.m.@: at the
17224beginning of daylight saving time; converting a date/time form that
17225falls in this hour results in a time value for the following hour,
17226from 3 a.m.@: to 4 a.m. At the end of daylight saving time, the
17227hour from 1 a.m.@: to 2 a.m.@: repeats itself; converting a date/time
17228form that falls in this hour results in a time value for the first
17229manifestation of that time (@emph{not} the one that occurs one hour
17230later).
17231
17232If @code{math-daylight-savings-hook} is @code{nil}, then the
17233daylight saving adjustment is always taken to be zero.
17234
17235In algebraic formulas, @samp{tzone(@var{zone}, @var{date})}
17236computes the time zone adjustment for a given zone name at a
17237given date. The @var{date} is ignored unless @var{zone} is a
17238generalized time zone. If @var{date} is a date form, the
17239daylight saving computation is applied to it as it appears.
17240If @var{date} is a numeric date value, it is adjusted for the
17241daylight-saving version of @var{zone} before being given to
17242the daylight saving hook. This odd-sounding rule ensures
17243that the daylight-saving computation is always done in
17244local time, not in the GMT time that a numeric @var{date}
17245is typically represented in.
17246
17247@ignore
17248@starindex
17249@end ignore
17250@tindex dsadj
17251The @samp{dsadj(@var{date}, @var{zone})} function computes the
17252daylight saving adjustment that is appropriate for @var{date} in
17253time zone @var{zone}. If @var{zone} is explicitly in or not in
17254daylight saving time (e.g., @code{PDT} or @code{PST}) the
17255@var{date} is ignored. If @var{zone} is a generalized time zone,
17256the algorithms described above are used. If @var{zone} is omitted,
17257the computation is done for the current time zone.
17258
4009494e
GM
17259@node Financial Functions, Binary Functions, Date Arithmetic, Arithmetic
17260@section Financial Functions
17261
17262@noindent
17263Calc's financial or business functions use the @kbd{b} prefix
17264key followed by a shifted letter. (The @kbd{b} prefix followed by
17265a lower-case letter is used for operations on binary numbers.)
17266
17267Note that the rate and the number of intervals given to these
17268functions must be on the same time scale, e.g., both months or
17269both years. Mixing an annual interest rate with a time expressed
17270in months will give you very wrong answers!
17271
17272It is wise to compute these functions to a higher precision than
17273you really need, just to make sure your answer is correct to the
17274last penny; also, you may wish to check the definitions at the end
17275of this section to make sure the functions have the meaning you expect.
17276
17277@menu
17278* Percentages::
17279* Future Value::
17280* Present Value::
17281* Related Financial Functions::
17282* Depreciation Functions::
17283* Definitions of Financial Functions::
17284@end menu
17285
17286@node Percentages, Future Value, Financial Functions, Financial Functions
17287@subsection Percentages
17288
17289@kindex M-%
17290@pindex calc-percent
17291@tindex %
17292@tindex percent
17293The @kbd{M-%} (@code{calc-percent}) command takes a percentage value,
17294say 5.4, and converts it to an equivalent actual number. For example,
17295@kbd{5.4 M-%} enters 0.054 on the stack. (That's the @key{META} or
17296@key{ESC} key combined with @kbd{%}.)
17297
17298Actually, @kbd{M-%} creates a formula of the form @samp{5.4%}.
17299You can enter @samp{5.4%} yourself during algebraic entry. The
17300@samp{%} operator simply means, ``the preceding value divided by
17301100.'' The @samp{%} operator has very high precedence, so that
17302@samp{1+8%} is interpreted as @samp{1+(8%)}, not as @samp{(1+8)%}.
17303(The @samp{%} operator is just a postfix notation for the
17304@code{percent} function, just like @samp{20!} is the notation for
17305@samp{fact(20)}, or twenty-factorial.)
17306
17307The formula @samp{5.4%} would normally evaluate immediately to
173080.054, but the @kbd{M-%} command suppresses evaluation as it puts
17309the formula onto the stack. However, the next Calc command that
17310uses the formula @samp{5.4%} will evaluate it as its first step.
17311The net effect is that you get to look at @samp{5.4%} on the stack,
17312but Calc commands see it as @samp{0.054}, which is what they expect.
17313
17314In particular, @samp{5.4%} and @samp{0.054} are suitable values
17315for the @var{rate} arguments of the various financial functions,
17316but the number @samp{5.4} is probably @emph{not} suitable---it
17317represents a rate of 540 percent!
17318
17319The key sequence @kbd{M-% *} effectively means ``percent-of.''
17320For example, @kbd{68 @key{RET} 25 M-% *} computes 17, which is 25% of
1732168 (and also 68% of 25, which comes out to the same thing).
17322
17323@kindex c %
17324@pindex calc-convert-percent
17325The @kbd{c %} (@code{calc-convert-percent}) command converts the
17326value on the top of the stack from numeric to percentage form.
17327For example, if 0.08 is on the stack, @kbd{c %} converts it to
17328@samp{8%}. The quantity is the same, it's just represented
17329differently. (Contrast this with @kbd{M-%}, which would convert
17330this number to @samp{0.08%}.) The @kbd{=} key is a convenient way
17331to convert a formula like @samp{8%} back to numeric form, 0.08.
17332
17333To compute what percentage one quantity is of another quantity,
17334use @kbd{/ c %}. For example, @w{@kbd{17 @key{RET} 68 / c %}} displays
17335@samp{25%}.
17336
17337@kindex b %
17338@pindex calc-percent-change
17339@tindex relch
17340The @kbd{b %} (@code{calc-percent-change}) [@code{relch}] command
17341calculates the percentage change from one number to another.
17342For example, @kbd{40 @key{RET} 50 b %} produces the answer @samp{25%},
17343since 50 is 25% larger than 40. A negative result represents a
17344decrease: @kbd{50 @key{RET} 40 b %} produces @samp{-20%}, since 40 is
1734520% smaller than 50. (The answers are different in magnitude
17346because, in the first case, we're increasing by 25% of 40, but
17347in the second case, we're decreasing by 20% of 50.) The effect
17348of @kbd{40 @key{RET} 50 b %} is to compute @expr{(50-40)/40}, converting
17349the answer to percentage form as if by @kbd{c %}.
17350
17351@node Future Value, Present Value, Percentages, Financial Functions
17352@subsection Future Value
17353
17354@noindent
17355@kindex b F
17356@pindex calc-fin-fv
17357@tindex fv
17358The @kbd{b F} (@code{calc-fin-fv}) [@code{fv}] command computes
17359the future value of an investment. It takes three arguments
17360from the stack: @samp{fv(@var{rate}, @var{n}, @var{payment})}.
17361If you give payments of @var{payment} every year for @var{n}
17362years, and the money you have paid earns interest at @var{rate} per
17363year, then this function tells you what your investment would be
17364worth at the end of the period. (The actual interval doesn't
17365have to be years, as long as @var{n} and @var{rate} are expressed
17366in terms of the same intervals.) This function assumes payments
17367occur at the @emph{end} of each interval.
17368
17369@kindex I b F
17370@tindex fvb
17371The @kbd{I b F} [@code{fvb}] command does the same computation,
17372but assuming your payments are at the beginning of each interval.
17373Suppose you plan to deposit $1000 per year in a savings account
17374earning 5.4% interest, starting right now. How much will be
17375in the account after five years? @code{fvb(5.4%, 5, 1000) = 5870.73}.
17376Thus you will have earned $870 worth of interest over the years.
17377Using the stack, this calculation would have been
17378@kbd{5.4 M-% 5 @key{RET} 1000 I b F}. Note that the rate is expressed
17379as a number between 0 and 1, @emph{not} as a percentage.
17380
17381@kindex H b F
17382@tindex fvl
17383The @kbd{H b F} [@code{fvl}] command computes the future value
17384of an initial lump sum investment. Suppose you could deposit
17385those five thousand dollars in the bank right now; how much would
17386they be worth in five years? @code{fvl(5.4%, 5, 5000) = 6503.89}.
17387
17388The algebraic functions @code{fv} and @code{fvb} accept an optional
17389fourth argument, which is used as an initial lump sum in the sense
17390of @code{fvl}. In other words, @code{fv(@var{rate}, @var{n},
17391@var{payment}, @var{initial}) = fv(@var{rate}, @var{n}, @var{payment})
17392+ fvl(@var{rate}, @var{n}, @var{initial})}.
17393
17394To illustrate the relationships between these functions, we could
17395do the @code{fvb} calculation ``by hand'' using @code{fvl}. The
17396final balance will be the sum of the contributions of our five
17397deposits at various times. The first deposit earns interest for
17398five years: @code{fvl(5.4%, 5, 1000) = 1300.78}. The second
17399deposit only earns interest for four years: @code{fvl(5.4%, 4, 1000) =
174001234.13}. And so on down to the last deposit, which earns one
17401year's interest: @code{fvl(5.4%, 1, 1000) = 1054.00}. The sum of
17402these five values is, sure enough, $5870.73, just as was computed
17403by @code{fvb} directly.
17404
17405What does @code{fv(5.4%, 5, 1000) = 5569.96} mean? The payments
17406are now at the ends of the periods. The end of one year is the same
17407as the beginning of the next, so what this really means is that we've
17408lost the payment at year zero (which contributed $1300.78), but we're
17409now counting the payment at year five (which, since it didn't have
17410a chance to earn interest, counts as $1000). Indeed, @expr{5569.96 =
174115870.73 - 1300.78 + 1000} (give or take a bit of roundoff error).
17412
17413@node Present Value, Related Financial Functions, Future Value, Financial Functions
17414@subsection Present Value
17415
17416@noindent
17417@kindex b P
17418@pindex calc-fin-pv
17419@tindex pv
17420The @kbd{b P} (@code{calc-fin-pv}) [@code{pv}] command computes
17421the present value of an investment. Like @code{fv}, it takes
17422three arguments: @code{pv(@var{rate}, @var{n}, @var{payment})}.
17423It computes the present value of a series of regular payments.
17424Suppose you have the chance to make an investment that will
17425pay $2000 per year over the next four years; as you receive
17426these payments you can put them in the bank at 9% interest.
17427You want to know whether it is better to make the investment, or
17428to keep the money in the bank where it earns 9% interest right
17429from the start. The calculation @code{pv(9%, 4, 2000)} gives the
17430result 6479.44. If your initial investment must be less than this,
17431say, $6000, then the investment is worthwhile. But if you had to
17432put up $7000, then it would be better just to leave it in the bank.
17433
17434Here is the interpretation of the result of @code{pv}: You are
17435trying to compare the return from the investment you are
17436considering, which is @code{fv(9%, 4, 2000) = 9146.26}, with
17437the return from leaving the money in the bank, which is
17438@code{fvl(9%, 4, @var{x})} where @var{x} is the amount of money
17439you would have to put up in advance. The @code{pv} function
17440finds the break-even point, @expr{x = 6479.44}, at which
17441@code{fvl(9%, 4, 6479.44)} is also equal to 9146.26. This is
17442the largest amount you should be willing to invest.
17443
17444@kindex I b P
17445@tindex pvb
17446The @kbd{I b P} [@code{pvb}] command solves the same problem,
17447but with payments occurring at the beginning of each interval.
17448It has the same relationship to @code{fvb} as @code{pv} has
17449to @code{fv}. For example @code{pvb(9%, 4, 2000) = 7062.59},
17450a larger number than @code{pv} produced because we get to start
17451earning interest on the return from our investment sooner.
17452
17453@kindex H b P
17454@tindex pvl
17455The @kbd{H b P} [@code{pvl}] command computes the present value of
17456an investment that will pay off in one lump sum at the end of the
17457period. For example, if we get our $8000 all at the end of the
17458four years, @code{pvl(9%, 4, 8000) = 5667.40}. This is much
17459less than @code{pv} reported, because we don't earn any interest
17460on the return from this investment. Note that @code{pvl} and
17461@code{fvl} are simple inverses: @code{fvl(9%, 4, 5667.40) = 8000}.
17462
17463You can give an optional fourth lump-sum argument to @code{pv}
17464and @code{pvb}; this is handled in exactly the same way as the
17465fourth argument for @code{fv} and @code{fvb}.
17466
17467@kindex b N
17468@pindex calc-fin-npv
17469@tindex npv
17470The @kbd{b N} (@code{calc-fin-npv}) [@code{npv}] command computes
17471the net present value of a series of irregular investments.
17472The first argument is the interest rate. The second argument is
17473a vector which represents the expected return from the investment
17474at the end of each interval. For example, if the rate represents
17475a yearly interest rate, then the vector elements are the return
17476from the first year, second year, and so on.
17477
17478Thus, @code{npv(9%, [2000,2000,2000,2000]) = pv(9%, 4, 2000) = 6479.44}.
17479Obviously this function is more interesting when the payments are
17480not all the same!
17481
17482The @code{npv} function can actually have two or more arguments.
17483Multiple arguments are interpreted in the same way as for the
17484vector statistical functions like @code{vsum}.
17485@xref{Single-Variable Statistics}. Basically, if there are several
17486payment arguments, each either a vector or a plain number, all these
17487values are collected left-to-right into the complete list of payments.
17488A numeric prefix argument on the @kbd{b N} command says how many
17489payment values or vectors to take from the stack.
17490
17491@kindex I b N
17492@tindex npvb
17493The @kbd{I b N} [@code{npvb}] command computes the net present
17494value where payments occur at the beginning of each interval
17495rather than at the end.
17496
17497@node Related Financial Functions, Depreciation Functions, Present Value, Financial Functions
17498@subsection Related Financial Functions
17499
17500@noindent
17501The functions in this section are basically inverses of the
17502present value functions with respect to the various arguments.
17503
17504@kindex b M
17505@pindex calc-fin-pmt
17506@tindex pmt
17507The @kbd{b M} (@code{calc-fin-pmt}) [@code{pmt}] command computes
17508the amount of periodic payment necessary to amortize a loan.
17509Thus @code{pmt(@var{rate}, @var{n}, @var{amount})} equals the
17510value of @var{payment} such that @code{pv(@var{rate}, @var{n},
17511@var{payment}) = @var{amount}}.
17512
17513@kindex I b M
17514@tindex pmtb
17515The @kbd{I b M} [@code{pmtb}] command does the same computation
17516but using @code{pvb} instead of @code{pv}. Like @code{pv} and
17517@code{pvb}, these functions can also take a fourth argument which
17518represents an initial lump-sum investment.
17519
17520@kindex H b M
17521The @kbd{H b M} key just invokes the @code{fvl} function, which is
17522the inverse of @code{pvl}. There is no explicit @code{pmtl} function.
17523
17524@kindex b #
17525@pindex calc-fin-nper
17526@tindex nper
17527The @kbd{b #} (@code{calc-fin-nper}) [@code{nper}] command computes
17528the number of regular payments necessary to amortize a loan.
17529Thus @code{nper(@var{rate}, @var{payment}, @var{amount})} equals
17530the value of @var{n} such that @code{pv(@var{rate}, @var{n},
17531@var{payment}) = @var{amount}}. If @var{payment} is too small
17532ever to amortize a loan for @var{amount} at interest rate @var{rate},
17533the @code{nper} function is left in symbolic form.
17534
17535@kindex I b #
17536@tindex nperb
17537The @kbd{I b #} [@code{nperb}] command does the same computation
17538but using @code{pvb} instead of @code{pv}. You can give a fourth
17539lump-sum argument to these functions, but the computation will be
17540rather slow in the four-argument case.
17541
17542@kindex H b #
17543@tindex nperl
17544The @kbd{H b #} [@code{nperl}] command does the same computation
17545using @code{pvl}. By exchanging @var{payment} and @var{amount} you
17546can also get the solution for @code{fvl}. For example,
17547@code{nperl(8%, 2000, 1000) = 9.006}, so if you place $1000 in a
17548bank account earning 8%, it will take nine years to grow to $2000.
17549
17550@kindex b T
17551@pindex calc-fin-rate
17552@tindex rate
17553The @kbd{b T} (@code{calc-fin-rate}) [@code{rate}] command computes
17554the rate of return on an investment. This is also an inverse of @code{pv}:
17555@code{rate(@var{n}, @var{payment}, @var{amount})} computes the value of
17556@var{rate} such that @code{pv(@var{rate}, @var{n}, @var{payment}) =
17557@var{amount}}. The result is expressed as a formula like @samp{6.3%}.
17558
17559@kindex I b T
17560@kindex H b T
17561@tindex rateb
17562@tindex ratel
17563The @kbd{I b T} [@code{rateb}] and @kbd{H b T} [@code{ratel}]
17564commands solve the analogous equations with @code{pvb} or @code{pvl}
17565in place of @code{pv}. Also, @code{rate} and @code{rateb} can
17566accept an optional fourth argument just like @code{pv} and @code{pvb}.
17567To redo the above example from a different perspective,
17568@code{ratel(9, 2000, 1000) = 8.00597%}, which says you will need an
17569interest rate of 8% in order to double your account in nine years.
17570
17571@kindex b I
17572@pindex calc-fin-irr
17573@tindex irr
17574The @kbd{b I} (@code{calc-fin-irr}) [@code{irr}] command is the
17575analogous function to @code{rate} but for net present value.
17576Its argument is a vector of payments. Thus @code{irr(@var{payments})}
17577computes the @var{rate} such that @code{npv(@var{rate}, @var{payments}) = 0};
17578this rate is known as the @dfn{internal rate of return}.
17579
17580@kindex I b I
17581@tindex irrb
17582The @kbd{I b I} [@code{irrb}] command computes the internal rate of
17583return assuming payments occur at the beginning of each period.
17584
17585@node Depreciation Functions, Definitions of Financial Functions, Related Financial Functions, Financial Functions
17586@subsection Depreciation Functions
17587
17588@noindent
17589The functions in this section calculate @dfn{depreciation}, which is
17590the amount of value that a possession loses over time. These functions
17591are characterized by three parameters: @var{cost}, the original cost
17592of the asset; @var{salvage}, the value the asset will have at the end
17593of its expected ``useful life''; and @var{life}, the number of years
17594(or other periods) of the expected useful life.
17595
17596There are several methods for calculating depreciation that differ in
17597the way they spread the depreciation over the lifetime of the asset.
17598
17599@kindex b S
17600@pindex calc-fin-sln
17601@tindex sln
17602The @kbd{b S} (@code{calc-fin-sln}) [@code{sln}] command computes the
17603``straight-line'' depreciation. In this method, the asset depreciates
17604by the same amount every year (or period). For example,
17605@samp{sln(12000, 2000, 5)} returns 2000. The asset costs $12000
17606initially and will be worth $2000 after five years; it loses $2000
17607per year.
17608
17609@kindex b Y
17610@pindex calc-fin-syd
17611@tindex syd
17612The @kbd{b Y} (@code{calc-fin-syd}) [@code{syd}] command computes the
17613accelerated ``sum-of-years'-digits'' depreciation. Here the depreciation
17614is higher during the early years of the asset's life. Since the
17615depreciation is different each year, @kbd{b Y} takes a fourth @var{period}
17616parameter which specifies which year is requested, from 1 to @var{life}.
17617If @var{period} is outside this range, the @code{syd} function will
17618return zero.
17619
17620@kindex b D
17621@pindex calc-fin-ddb
17622@tindex ddb
17623The @kbd{b D} (@code{calc-fin-ddb}) [@code{ddb}] command computes an
17624accelerated depreciation using the double-declining balance method.
17625It also takes a fourth @var{period} parameter.
17626
17627For symmetry, the @code{sln} function will accept a @var{period}
17628parameter as well, although it will ignore its value except that the
17629return value will as usual be zero if @var{period} is out of range.
17630
17631For example, pushing the vector @expr{[1,2,3,4,5]} (perhaps with @kbd{v x 5})
17632and then mapping @kbd{V M ' [sln(12000,2000,5,$), syd(12000,2000,5,$),
17633ddb(12000,2000,5,$)] @key{RET}} produces a matrix that allows us to compare
17634the three depreciation methods:
17635
17636@example
17637@group
17638[ [ 2000, 3333, 4800 ]
17639 [ 2000, 2667, 2880 ]
17640 [ 2000, 2000, 1728 ]
17641 [ 2000, 1333, 592 ]
17642 [ 2000, 667, 0 ] ]
17643@end group
17644@end example
17645
17646@noindent
17647(Values have been rounded to nearest integers in this figure.)
17648We see that @code{sln} depreciates by the same amount each year,
17649@kbd{syd} depreciates more at the beginning and less at the end,
17650and @kbd{ddb} weights the depreciation even more toward the beginning.
17651
17652Summing columns with @kbd{V R : +} yields @expr{[10000, 10000, 10000]};
17653the total depreciation in any method is (by definition) the
17654difference between the cost and the salvage value.
17655
17656@node Definitions of Financial Functions, , Depreciation Functions, Financial Functions
17657@subsection Definitions
17658
17659@noindent
17660For your reference, here are the actual formulas used to compute
17661Calc's financial functions.
17662
17663Calc will not evaluate a financial function unless the @var{rate} or
17664@var{n} argument is known. However, @var{payment} or @var{amount} can
17665be a variable. Calc expands these functions according to the
17666formulas below for symbolic arguments only when you use the @kbd{a "}
17667(@code{calc-expand-formula}) command, or when taking derivatives or
17668integrals or solving equations involving the functions.
17669
17670@ifnottex
17671These formulas are shown using the conventions of Big display
17672mode (@kbd{d B}); for example, the formula for @code{fv} written
17673linearly is @samp{pmt * ((1 + rate)^n) - 1) / rate}.
17674
17675@example
17676 n
17677 (1 + rate) - 1
17678fv(rate, n, pmt) = pmt * ---------------
17679 rate
17680
17681 n
17682 ((1 + rate) - 1) (1 + rate)
17683fvb(rate, n, pmt) = pmt * ----------------------------
17684 rate
17685
17686 n
17687fvl(rate, n, pmt) = pmt * (1 + rate)
17688
17689 -n
17690 1 - (1 + rate)
17691pv(rate, n, pmt) = pmt * ----------------
17692 rate
17693
17694 -n
17695 (1 - (1 + rate) ) (1 + rate)
17696pvb(rate, n, pmt) = pmt * -----------------------------
17697 rate
17698
17699 -n
17700pvl(rate, n, pmt) = pmt * (1 + rate)
17701
17702 -1 -2 -3
17703npv(rate, [a, b, c]) = a*(1 + rate) + b*(1 + rate) + c*(1 + rate)
17704
17705 -1 -2
17706npvb(rate, [a, b, c]) = a + b*(1 + rate) + c*(1 + rate)
17707
17708 -n
17709 (amt - x * (1 + rate) ) * rate
17710pmt(rate, n, amt, x) = -------------------------------
17711 -n
17712 1 - (1 + rate)
17713
17714 -n
17715 (amt - x * (1 + rate) ) * rate
17716pmtb(rate, n, amt, x) = -------------------------------
17717 -n
17718 (1 - (1 + rate) ) (1 + rate)
17719
17720 amt * rate
17721nper(rate, pmt, amt) = - log(1 - ------------, 1 + rate)
17722 pmt
17723
17724 amt * rate
17725nperb(rate, pmt, amt) = - log(1 - ---------------, 1 + rate)
17726 pmt * (1 + rate)
17727
17728 amt
17729nperl(rate, pmt, amt) = - log(---, 1 + rate)
17730 pmt
17731
17732 1/n
17733 pmt
17734ratel(n, pmt, amt) = ------ - 1
17735 1/n
17736 amt
17737
17738 cost - salv
17739sln(cost, salv, life) = -----------
17740 life
17741
17742 (cost - salv) * (life - per + 1)
17743syd(cost, salv, life, per) = --------------------------------
17744 life * (life + 1) / 2
17745
17746 book * 2
17747ddb(cost, salv, life, per) = --------, book = cost - depreciation so far
17748 life
17749@end example
17750@end ifnottex
17751@tex
17752\turnoffactive
17753$$ \code{fv}(r, n, p) = p { (1 + r)^n - 1 \over r } $$
17754$$ \code{fvb}(r, n, p) = p { ((1 + r)^n - 1) (1 + r) \over r } $$
17755$$ \code{fvl}(r, n, p) = p (1 + r)^n $$
17756$$ \code{pv}(r, n, p) = p { 1 - (1 + r)^{-n} \over r } $$
17757$$ \code{pvb}(r, n, p) = p { (1 - (1 + r)^{-n}) (1 + r) \over r } $$
17758$$ \code{pvl}(r, n, p) = p (1 + r)^{-n} $$
17759$$ \code{npv}(r, [a,b,c]) = a (1 + r)^{-1} + b (1 + r)^{-2} + c (1 + r)^{-3} $$
17760$$ \code{npvb}(r, [a,b,c]) = a + b (1 + r)^{-1} + c (1 + r)^{-2} $$
17761$$ \code{pmt}(r, n, a, x) = { (a - x (1 + r)^{-n}) r \over 1 - (1 + r)^{-n} }$$
17762$$ \code{pmtb}(r, n, a, x) = { (a - x (1 + r)^{-n}) r \over
17763 (1 - (1 + r)^{-n}) (1 + r) } $$
17764$$ \code{nper}(r, p, a) = -\code{log}(1 - { a r \over p }, 1 + r) $$
17765$$ \code{nperb}(r, p, a) = -\code{log}(1 - { a r \over p (1 + r) }, 1 + r) $$
17766$$ \code{nperl}(r, p, a) = -\code{log}({a \over p}, 1 + r) $$
17767$$ \code{ratel}(n, p, a) = { p^{1/n} \over a^{1/n} } - 1 $$
17768$$ \code{sln}(c, s, l) = { c - s \over l } $$
17769$$ \code{syd}(c, s, l, p) = { (c - s) (l - p + 1) \over l (l+1) / 2 } $$
17770$$ \code{ddb}(c, s, l, p) = { 2 (c - \hbox{depreciation so far}) \over l } $$
17771@end tex
17772
17773@noindent
17774In @code{pmt} and @code{pmtb}, @expr{x=0} if omitted.
17775
17776These functions accept any numeric objects, including error forms,
17777intervals, and even (though not very usefully) complex numbers. The
17778above formulas specify exactly the behavior of these functions with
17779all sorts of inputs.
17780
17781Note that if the first argument to the @code{log} in @code{nper} is
17782negative, @code{nper} leaves itself in symbolic form rather than
17783returning a (financially meaningless) complex number.
17784
17785@samp{rate(num, pmt, amt)} solves the equation
17786@samp{pv(rate, num, pmt) = amt} for @samp{rate} using @kbd{H a R}
17787(@code{calc-find-root}), with the interval @samp{[.01% .. 100%]}
17788for an initial guess. The @code{rateb} function is the same except
17789that it uses @code{pvb}. Note that @code{ratel} can be solved
17790directly; its formula is shown in the above list.
17791
17792Similarly, @samp{irr(pmts)} solves the equation @samp{npv(rate, pmts) = 0}
17793for @samp{rate}.
17794
17795If you give a fourth argument to @code{nper} or @code{nperb}, Calc
17796will also use @kbd{H a R} to solve the equation using an initial
17797guess interval of @samp{[0 .. 100]}.
17798
17799A fourth argument to @code{fv} simply sums the two components
17800calculated from the above formulas for @code{fv} and @code{fvl}.
17801The same is true of @code{fvb}, @code{pv}, and @code{pvb}.
17802
17803The @kbd{ddb} function is computed iteratively; the ``book'' value
17804starts out equal to @var{cost}, and decreases according to the above
17805formula for the specified number of periods. If the book value
17806would decrease below @var{salvage}, it only decreases to @var{salvage}
17807and the depreciation is zero for all subsequent periods. The @code{ddb}
17808function returns the amount the book value decreased in the specified
17809period.
17810
17811@node Binary Functions, , Financial Functions, Arithmetic
17812@section Binary Number Functions
17813
17814@noindent
17815The commands in this chapter all use two-letter sequences beginning with
17816the @kbd{b} prefix.
17817
17818@cindex Binary numbers
17819The ``binary'' operations actually work regardless of the currently
17820displayed radix, although their results make the most sense in a radix
17821like 2, 8, or 16 (as obtained by the @kbd{d 2}, @kbd{d 8}, or @w{@kbd{d 6}}
17822commands, respectively). You may also wish to enable display of leading
17823zeros with @kbd{d z}. @xref{Radix Modes}.
17824
17825@cindex Word size for binary operations
17826The Calculator maintains a current @dfn{word size} @expr{w}, an
17827arbitrary positive or negative integer. For a positive word size, all
17828of the binary operations described here operate modulo @expr{2^w}. In
17829particular, negative arguments are converted to positive integers modulo
17830@expr{2^w} by all binary functions.
17831
17832If the word size is negative, binary operations produce 2's complement
17833integers from
17834@texline @math{-2^{-w-1}}
17835@infoline @expr{-(2^(-w-1))}
17836to
17837@texline @math{2^{-w-1}-1}
17838@infoline @expr{2^(-w-1)-1}
17839inclusive. Either mode accepts inputs in any range; the sign of
17840@expr{w} affects only the results produced.
17841
17842@kindex b c
17843@pindex calc-clip
17844@tindex clip
17845The @kbd{b c} (@code{calc-clip})
17846[@code{clip}] command can be used to clip a number by reducing it modulo
17847@expr{2^w}. The commands described in this chapter automatically clip
17848their results to the current word size. Note that other operations like
17849addition do not use the current word size, since integer addition
17850generally is not ``binary.'' (However, @pxref{Simplification Modes},
17851@code{calc-bin-simplify-mode}.) For example, with a word size of 8
17852bits @kbd{b c} converts a number to the range 0 to 255; with a word
17853size of @mathit{-8} @kbd{b c} converts to the range @mathit{-128} to 127.
17854
17855@kindex b w
17856@pindex calc-word-size
17857The default word size is 32 bits. All operations except the shifts and
17858rotates allow you to specify a different word size for that one
17859operation by giving a numeric prefix argument: @kbd{C-u 8 b c} clips the
17860top of stack to the range 0 to 255 regardless of the current word size.
17861To set the word size permanently, use @kbd{b w} (@code{calc-word-size}).
17862This command displays a prompt with the current word size; press @key{RET}
17863immediately to keep this word size, or type a new word size at the prompt.
17864
17865When the binary operations are written in symbolic form, they take an
17866optional second (or third) word-size parameter. When a formula like
17867@samp{and(a,b)} is finally evaluated, the word size current at that time
17868will be used, but when @samp{and(a,b,-8)} is evaluated, a word size of
17869@mathit{-8} will always be used. A symbolic binary function will be left
17870in symbolic form unless the all of its argument(s) are integers or
17871integer-valued floats.
17872
17873If either or both arguments are modulo forms for which @expr{M} is a
17874power of two, that power of two is taken as the word size unless a
17875numeric prefix argument overrides it. The current word size is never
17876consulted when modulo-power-of-two forms are involved.
17877
17878@kindex b a
17879@pindex calc-and
17880@tindex and
17881The @kbd{b a} (@code{calc-and}) [@code{and}] command computes the bitwise
17882AND of the two numbers on the top of the stack. In other words, for each
17883of the @expr{w} binary digits of the two numbers (pairwise), the corresponding
17884bit of the result is 1 if and only if both input bits are 1:
17885@samp{and(2#1100, 2#1010) = 2#1000}.
17886
17887@kindex b o
17888@pindex calc-or
17889@tindex or
17890The @kbd{b o} (@code{calc-or}) [@code{or}] command computes the bitwise
17891inclusive OR of two numbers. A bit is 1 if either of the input bits, or
17892both, are 1: @samp{or(2#1100, 2#1010) = 2#1110}.
17893
17894@kindex b x
17895@pindex calc-xor
17896@tindex xor
17897The @kbd{b x} (@code{calc-xor}) [@code{xor}] command computes the bitwise
17898exclusive OR of two numbers. A bit is 1 if exactly one of the input bits
17899is 1: @samp{xor(2#1100, 2#1010) = 2#0110}.
17900
17901@kindex b d
17902@pindex calc-diff
17903@tindex diff
17904The @kbd{b d} (@code{calc-diff}) [@code{diff}] command computes the bitwise
17905difference of two numbers; this is defined by @samp{diff(a,b) = and(a,not(b))},
17906so that @samp{diff(2#1100, 2#1010) = 2#0100}.
17907
17908@kindex b n
17909@pindex calc-not
17910@tindex not
17911The @kbd{b n} (@code{calc-not}) [@code{not}] command computes the bitwise
17912NOT of a number. A bit is 1 if the input bit is 0 and vice-versa.
17913
17914@kindex b l
17915@pindex calc-lshift-binary
17916@tindex lsh
17917The @kbd{b l} (@code{calc-lshift-binary}) [@code{lsh}] command shifts a
17918number left by one bit, or by the number of bits specified in the numeric
17919prefix argument. A negative prefix argument performs a logical right shift,
17920in which zeros are shifted in on the left. In symbolic form, @samp{lsh(a)}
17921is short for @samp{lsh(a,1)}, which in turn is short for @samp{lsh(a,n,w)}.
17922Bits shifted ``off the end,'' according to the current word size, are lost.
17923
17924@kindex H b l
17925@kindex H b r
17926@ignore
17927@mindex @idots
17928@end ignore
17929@kindex H b L
17930@ignore
17931@mindex @null
17932@end ignore
17933@kindex H b R
17934@ignore
17935@mindex @null
17936@end ignore
17937@kindex H b t
17938The @kbd{H b l} command also does a left shift, but it takes two arguments
17939from the stack (the value to shift, and, at top-of-stack, the number of
17940bits to shift). This version interprets the prefix argument just like
17941the regular binary operations, i.e., as a word size. The Hyperbolic flag
17942has a similar effect on the rest of the binary shift and rotate commands.
17943
17944@kindex b r
17945@pindex calc-rshift-binary
17946@tindex rsh
17947The @kbd{b r} (@code{calc-rshift-binary}) [@code{rsh}] command shifts a
17948number right by one bit, or by the number of bits specified in the numeric
17949prefix argument: @samp{rsh(a,n) = lsh(a,-n)}.
17950
17951@kindex b L
17952@pindex calc-lshift-arith
17953@tindex ash
17954The @kbd{b L} (@code{calc-lshift-arith}) [@code{ash}] command shifts a
17955number left. It is analogous to @code{lsh}, except that if the shift
17956is rightward (the prefix argument is negative), an arithmetic shift
17957is performed as described below.
17958
17959@kindex b R
17960@pindex calc-rshift-arith
17961@tindex rash
17962The @kbd{b R} (@code{calc-rshift-arith}) [@code{rash}] command performs
17963an ``arithmetic'' shift to the right, in which the leftmost bit (according
17964to the current word size) is duplicated rather than shifting in zeros.
17965This corresponds to dividing by a power of two where the input is interpreted
17966as a signed, twos-complement number. (The distinction between the @samp{rsh}
17967and @samp{rash} operations is totally independent from whether the word
17968size is positive or negative.) With a negative prefix argument, this
17969performs a standard left shift.
17970
17971@kindex b t
17972@pindex calc-rotate-binary
17973@tindex rot
17974The @kbd{b t} (@code{calc-rotate-binary}) [@code{rot}] command rotates a
17975number one bit to the left. The leftmost bit (according to the current
17976word size) is dropped off the left and shifted in on the right. With a
17977numeric prefix argument, the number is rotated that many bits to the left
17978or right.
17979
17980@xref{Set Operations}, for the @kbd{b p} and @kbd{b u} commands that
17981pack and unpack binary integers into sets. (For example, @kbd{b u}
17982unpacks the number @samp{2#11001} to the set of bit-numbers
17983@samp{[0, 3, 4]}.) Type @kbd{b u V #} to count the number of ``1''
17984bits in a binary integer.
17985
17986Another interesting use of the set representation of binary integers
17987is to reverse the bits in, say, a 32-bit integer. Type @kbd{b u} to
17988unpack; type @kbd{31 @key{TAB} -} to replace each bit-number in the set
17989with 31 minus that bit-number; type @kbd{b p} to pack the set back
17990into a binary integer.
17991
17992@node Scientific Functions, Matrix Functions, Arithmetic, Top
17993@chapter Scientific Functions
17994
17995@noindent
17996The functions described here perform trigonometric and other transcendental
17997calculations. They generally produce floating-point answers correct to the
17998full current precision. The @kbd{H} (Hyperbolic) and @kbd{I} (Inverse)
17999flag keys must be used to get some of these functions from the keyboard.
18000
18001@kindex P
18002@pindex calc-pi
18003@cindex @code{pi} variable
18004@vindex pi
18005@kindex H P
18006@cindex @code{e} variable
18007@vindex e
18008@kindex I P
18009@cindex @code{gamma} variable
18010@vindex gamma
18011@cindex Gamma constant, Euler's
18012@cindex Euler's gamma constant
18013@kindex H I P
18014@cindex @code{phi} variable
18015@cindex Phi, golden ratio
18016@cindex Golden ratio
18017One miscellaneous command is shift-@kbd{P} (@code{calc-pi}), which pushes
18018the value of @cpi{} (at the current precision) onto the stack. With the
18019Hyperbolic flag, it pushes the value @expr{e}, the base of natural logarithms.
18020With the Inverse flag, it pushes Euler's constant
18021@texline @math{\gamma}
18022@infoline @expr{gamma}
18023(about 0.5772). With both Inverse and Hyperbolic, it
18024pushes the ``golden ratio''
18025@texline @math{\phi}
18026@infoline @expr{phi}
18027(about 1.618). (At present, Euler's constant is not available
18028to unlimited precision; Calc knows only the first 100 digits.)
18029In Symbolic mode, these commands push the
18030actual variables @samp{pi}, @samp{e}, @samp{gamma}, and @samp{phi},
18031respectively, instead of their values; @pxref{Symbolic Mode}.
18032
18033@ignore
18034@mindex Q
18035@end ignore
18036@ignore
18037@mindex I Q
18038@end ignore
18039@kindex I Q
18040@tindex sqr
18041The @kbd{Q} (@code{calc-sqrt}) [@code{sqrt}] function is described elsewhere;
18042@pxref{Basic Arithmetic}. With the Inverse flag [@code{sqr}], this command
18043computes the square of the argument.
18044
18045@xref{Prefix Arguments}, for a discussion of the effect of numeric
18046prefix arguments on commands in this chapter which do not otherwise
18047interpret a prefix argument.
18048
18049@menu
18050* Logarithmic Functions::
18051* Trigonometric and Hyperbolic Functions::
18052* Advanced Math Functions::
18053* Branch Cuts::
18054* Random Numbers::
18055* Combinatorial Functions::
18056* Probability Distribution Functions::
18057@end menu
18058
18059@node Logarithmic Functions, Trigonometric and Hyperbolic Functions, Scientific Functions, Scientific Functions
18060@section Logarithmic Functions
18061
18062@noindent
18063@kindex L
18064@pindex calc-ln
18065@tindex ln
18066@ignore
18067@mindex @null
18068@end ignore
18069@kindex I E
18070The shift-@kbd{L} (@code{calc-ln}) [@code{ln}] command computes the natural
18071logarithm of the real or complex number on the top of the stack. With
18072the Inverse flag it computes the exponential function instead, although
18073this is redundant with the @kbd{E} command.
18074
18075@kindex E
18076@pindex calc-exp
18077@tindex exp
18078@ignore
18079@mindex @null
18080@end ignore
18081@kindex I L
18082The shift-@kbd{E} (@code{calc-exp}) [@code{exp}] command computes the
18083exponential, i.e., @expr{e} raised to the power of the number on the stack.
18084The meanings of the Inverse and Hyperbolic flags follow from those for
18085the @code{calc-ln} command.
18086
18087@kindex H L
18088@kindex H E
18089@pindex calc-log10
18090@tindex log10
18091@tindex exp10
18092@ignore
18093@mindex @null
18094@end ignore
18095@kindex H I L
18096@ignore
18097@mindex @null
18098@end ignore
18099@kindex H I E
18100The @kbd{H L} (@code{calc-log10}) [@code{log10}] command computes the common
18101(base-10) logarithm of a number. (With the Inverse flag [@code{exp10}],
18102it raises ten to a given power.) Note that the common logarithm of a
18103complex number is computed by taking the natural logarithm and dividing
18104by
18105@texline @math{\ln10}.
18106@infoline @expr{ln(10)}.
18107
18108@kindex B
18109@kindex I B
18110@pindex calc-log
18111@tindex log
18112@tindex alog
18113The @kbd{B} (@code{calc-log}) [@code{log}] command computes a logarithm
18114to any base. For example, @kbd{1024 @key{RET} 2 B} produces 10, since
18115@texline @math{2^{10} = 1024}.
18116@infoline @expr{2^10 = 1024}.
18117In certain cases like @samp{log(3,9)}, the result
18118will be either @expr{1:2} or @expr{0.5} depending on the current Fraction
18119mode setting. With the Inverse flag [@code{alog}], this command is
18120similar to @kbd{^} except that the order of the arguments is reversed.
18121
18122@kindex f I
18123@pindex calc-ilog
18124@tindex ilog
18125The @kbd{f I} (@code{calc-ilog}) [@code{ilog}] command computes the
18126integer logarithm of a number to any base. The number and the base must
18127themselves be positive integers. This is the true logarithm, rounded
18128down to an integer. Thus @kbd{ilog(x,10)} is 3 for all @expr{x} in the
18129range from 1000 to 9999. If both arguments are positive integers, exact
18130integer arithmetic is used; otherwise, this is equivalent to
18131@samp{floor(log(x,b))}.
18132
18133@kindex f E
18134@pindex calc-expm1
18135@tindex expm1
18136The @kbd{f E} (@code{calc-expm1}) [@code{expm1}] command computes
18137@texline @math{e^x - 1},
18138@infoline @expr{exp(x)-1},
18139but using an algorithm that produces a more accurate
18140answer when the result is close to zero, i.e., when
18141@texline @math{e^x}
18142@infoline @expr{exp(x)}
18143is close to one.
18144
18145@kindex f L
18146@pindex calc-lnp1
18147@tindex lnp1
18148The @kbd{f L} (@code{calc-lnp1}) [@code{lnp1}] command computes
18149@texline @math{\ln(x+1)},
18150@infoline @expr{ln(x+1)},
18151producing a more accurate answer when @expr{x} is close to zero.
18152
18153@node Trigonometric and Hyperbolic Functions, Advanced Math Functions, Logarithmic Functions, Scientific Functions
18154@section Trigonometric/Hyperbolic Functions
18155
18156@noindent
18157@kindex S
18158@pindex calc-sin
18159@tindex sin
18160The shift-@kbd{S} (@code{calc-sin}) [@code{sin}] command computes the sine
18161of an angle or complex number. If the input is an HMS form, it is interpreted
18162as degrees-minutes-seconds; otherwise, the input is interpreted according
18163to the current angular mode. It is best to use Radians mode when operating
18164on complex numbers.
18165
18166Calc's ``units'' mechanism includes angular units like @code{deg},
18167@code{rad}, and @code{grad}. While @samp{sin(45 deg)} is not evaluated
18168all the time, the @kbd{u s} (@code{calc-simplify-units}) command will
18169simplify @samp{sin(45 deg)} by taking the sine of 45 degrees, regardless
18170of the current angular mode. @xref{Basic Operations on Units}.
18171
18172Also, the symbolic variable @code{pi} is not ordinarily recognized in
18173arguments to trigonometric functions, as in @samp{sin(3 pi / 4)}, but
18174the @kbd{a s} (@code{calc-simplify}) command recognizes many such
18175formulas when the current angular mode is Radians @emph{and} Symbolic
18176mode is enabled; this example would be replaced by @samp{sqrt(2) / 2}.
18177@xref{Symbolic Mode}. Beware, this simplification occurs even if you
18178have stored a different value in the variable @samp{pi}; this is one
18179reason why changing built-in variables is a bad idea. Arguments of
18180the form @expr{x} plus a multiple of @cpiover{2} are also simplified.
18181Calc includes similar formulas for @code{cos} and @code{tan}.
18182
18183The @kbd{a s} command knows all angles which are integer multiples of
18184@cpiover{12}, @cpiover{10}, or @cpiover{8} radians. In Degrees mode,
18185analogous simplifications occur for integer multiples of 15 or 18
18186degrees, and for arguments plus multiples of 90 degrees.
18187
18188@kindex I S
18189@pindex calc-arcsin
18190@tindex arcsin
18191With the Inverse flag, @code{calc-sin} computes an arcsine. This is also
18192available as the @code{calc-arcsin} command or @code{arcsin} algebraic
18193function. The returned argument is converted to degrees, radians, or HMS
18194notation depending on the current angular mode.
18195
18196@kindex H S
18197@pindex calc-sinh
18198@tindex sinh
18199@kindex H I S
18200@pindex calc-arcsinh
18201@tindex arcsinh
18202With the Hyperbolic flag, @code{calc-sin} computes the hyperbolic
18203sine, also available as @code{calc-sinh} [@code{sinh}]. With the
18204Hyperbolic and Inverse flags, it computes the hyperbolic arcsine
18205(@code{calc-arcsinh}) [@code{arcsinh}].
18206
18207@kindex C
18208@pindex calc-cos
18209@tindex cos
18210@ignore
18211@mindex @idots
18212@end ignore
18213@kindex I C
18214@pindex calc-arccos
18215@ignore
18216@mindex @null
18217@end ignore
18218@tindex arccos
18219@ignore
18220@mindex @null
18221@end ignore
18222@kindex H C
18223@pindex calc-cosh
18224@ignore
18225@mindex @null
18226@end ignore
18227@tindex cosh
18228@ignore
18229@mindex @null
18230@end ignore
18231@kindex H I C
18232@pindex calc-arccosh
18233@ignore
18234@mindex @null
18235@end ignore
18236@tindex arccosh
18237@ignore
18238@mindex @null
18239@end ignore
18240@kindex T
18241@pindex calc-tan
18242@ignore
18243@mindex @null
18244@end ignore
18245@tindex tan
18246@ignore
18247@mindex @null
18248@end ignore
18249@kindex I T
18250@pindex calc-arctan
18251@ignore
18252@mindex @null
18253@end ignore
18254@tindex arctan
18255@ignore
18256@mindex @null
18257@end ignore
18258@kindex H T
18259@pindex calc-tanh
18260@ignore
18261@mindex @null
18262@end ignore
18263@tindex tanh
18264@ignore
18265@mindex @null
18266@end ignore
18267@kindex H I T
18268@pindex calc-arctanh
18269@ignore
18270@mindex @null
18271@end ignore
18272@tindex arctanh
18273The shift-@kbd{C} (@code{calc-cos}) [@code{cos}] command computes the cosine
18274of an angle or complex number, and shift-@kbd{T} (@code{calc-tan}) [@code{tan}]
18275computes the tangent, along with all the various inverse and hyperbolic
18276variants of these functions.
18277
18278@kindex f T
18279@pindex calc-arctan2
18280@tindex arctan2
18281The @kbd{f T} (@code{calc-arctan2}) [@code{arctan2}] command takes two
18282numbers from the stack and computes the arc tangent of their ratio. The
18283result is in the full range from @mathit{-180} (exclusive) to @mathit{+180}
18284(inclusive) degrees, or the analogous range in radians. A similar
18285result would be obtained with @kbd{/} followed by @kbd{I T}, but the
18286value would only be in the range from @mathit{-90} to @mathit{+90} degrees
18287since the division loses information about the signs of the two
18288components, and an error might result from an explicit division by zero
18289which @code{arctan2} would avoid. By (arbitrary) definition,
18290@samp{arctan2(0,0)=0}.
18291
18292@pindex calc-sincos
18293@ignore
18294@starindex
18295@end ignore
18296@tindex sincos
18297@ignore
18298@starindex
18299@end ignore
18300@ignore
18301@mindex arc@idots
18302@end ignore
18303@tindex arcsincos
18304The @code{calc-sincos} [@code{sincos}] command computes the sine and
18305cosine of a number, returning them as a vector of the form
18306@samp{[@var{cos}, @var{sin}]}.
18307With the Inverse flag [@code{arcsincos}], this command takes a two-element
18308vector as an argument and computes @code{arctan2} of the elements.
18309(This command does not accept the Hyperbolic flag.)
18310
18311@pindex calc-sec
18312@tindex sec
18313@pindex calc-csc
18314@tindex csc
18315@pindex calc-cot
18316@tindex cot
18317@pindex calc-sech
18318@tindex sech
18319@pindex calc-csch
18320@tindex csch
18321@pindex calc-coth
18322@tindex coth
18323The remaining trigonometric functions, @code{calc-sec} [@code{sec}],
4bb49b43 18324@code{calc-csc} [@code{csc}] and @code{calc-cot} [@code{cot}], are also
4009494e
GM
18325available. With the Hyperbolic flag, these compute their hyperbolic
18326counterparts, which are also available separately as @code{calc-sech}
4bb49b43 18327[@code{sech}], @code{calc-csch} [@code{csch}] and @code{calc-coth}
9c264403 18328[@code{coth}]. (These commands do not accept the Inverse flag.)
4009494e
GM
18329
18330@node Advanced Math Functions, Branch Cuts, Trigonometric and Hyperbolic Functions, Scientific Functions
18331@section Advanced Mathematical Functions
18332
18333@noindent
18334Calc can compute a variety of less common functions that arise in
18335various branches of mathematics. All of the functions described in
18336this section allow arbitrary complex arguments and, except as noted,
18337will work to arbitrarily large precisions. They can not at present
18338handle error forms or intervals as arguments.
18339
18340NOTE: These functions are still experimental. In particular, their
18341accuracy is not guaranteed in all domains. It is advisable to set the
18342current precision comfortably higher than you actually need when
18343using these functions. Also, these functions may be impractically
18344slow for some values of the arguments.
18345
18346@kindex f g
18347@pindex calc-gamma
18348@tindex gamma
18349The @kbd{f g} (@code{calc-gamma}) [@code{gamma}] command computes the Euler
18350gamma function. For positive integer arguments, this is related to the
18351factorial function: @samp{gamma(n+1) = fact(n)}. For general complex
18352arguments the gamma function can be defined by the following definite
18353integral:
18354@texline @math{\Gamma(a) = \int_0^\infty t^{a-1} e^t dt}.
18355@infoline @expr{gamma(a) = integ(t^(a-1) exp(t), t, 0, inf)}.
18356(The actual implementation uses far more efficient computational methods.)
18357
18358@kindex f G
18359@tindex gammaP
18360@ignore
18361@mindex @idots
18362@end ignore
18363@kindex I f G
18364@ignore
18365@mindex @null
18366@end ignore
18367@kindex H f G
18368@ignore
18369@mindex @null
18370@end ignore
18371@kindex H I f G
18372@pindex calc-inc-gamma
18373@ignore
18374@mindex @null
18375@end ignore
18376@tindex gammaQ
18377@ignore
18378@mindex @null
18379@end ignore
18380@tindex gammag
18381@ignore
18382@mindex @null
18383@end ignore
18384@tindex gammaG
18385The @kbd{f G} (@code{calc-inc-gamma}) [@code{gammaP}] command computes
18386the incomplete gamma function, denoted @samp{P(a,x)}. This is defined by
18387the integral,
18388@texline @math{P(a,x) = \left( \int_0^x t^{a-1} e^t dt \right) / \Gamma(a)}.
18389@infoline @expr{gammaP(a,x) = integ(t^(a-1) exp(t), t, 0, x) / gamma(a)}.
18390This implies that @samp{gammaP(a,inf) = 1} for any @expr{a} (see the
18391definition of the normal gamma function).
18392
18393Several other varieties of incomplete gamma function are defined.
18394The complement of @expr{P(a,x)}, called @expr{Q(a,x) = 1-P(a,x)} by
18395some authors, is computed by the @kbd{I f G} [@code{gammaQ}] command.
18396You can think of this as taking the other half of the integral, from
18397@expr{x} to infinity.
18398
18399@ifnottex
18400The functions corresponding to the integrals that define @expr{P(a,x)}
18401and @expr{Q(a,x)} but without the normalizing @expr{1/gamma(a)}
18402factor are called @expr{g(a,x)} and @expr{G(a,x)}, respectively
18403(where @expr{g} and @expr{G} represent the lower- and upper-case Greek
18404letter gamma). You can obtain these using the @kbd{H f G} [@code{gammag}]
18405and @kbd{H I f G} [@code{gammaG}] commands.
18406@end ifnottex
18407@tex
18408\turnoffactive
18409The functions corresponding to the integrals that define $P(a,x)$
18410and $Q(a,x)$ but without the normalizing $1/\Gamma(a)$
18411factor are called $\gamma(a,x)$ and $\Gamma(a,x)$, respectively.
18412You can obtain these using the \kbd{H f G} [\code{gammag}] and
18413\kbd{I H f G} [\code{gammaG}] commands.
18414@end tex
18415
18416@kindex f b
18417@pindex calc-beta
18418@tindex beta
18419The @kbd{f b} (@code{calc-beta}) [@code{beta}] command computes the
18420Euler beta function, which is defined in terms of the gamma function as
18421@texline @math{B(a,b) = \Gamma(a) \Gamma(b) / \Gamma(a+b)},
18422@infoline @expr{beta(a,b) = gamma(a) gamma(b) / gamma(a+b)},
18423or by
18424@texline @math{B(a,b) = \int_0^1 t^{a-1} (1-t)^{b-1} dt}.
18425@infoline @expr{beta(a,b) = integ(t^(a-1) (1-t)^(b-1), t, 0, 1)}.
18426
18427@kindex f B
18428@kindex H f B
18429@pindex calc-inc-beta
18430@tindex betaI
18431@tindex betaB
18432The @kbd{f B} (@code{calc-inc-beta}) [@code{betaI}] command computes
18433the incomplete beta function @expr{I(x,a,b)}. It is defined by
18434@texline @math{I(x,a,b) = \left( \int_0^x t^{a-1} (1-t)^{b-1} dt \right) / B(a,b)}.
18435@infoline @expr{betaI(x,a,b) = integ(t^(a-1) (1-t)^(b-1), t, 0, x) / beta(a,b)}.
18436Once again, the @kbd{H} (hyperbolic) prefix gives the corresponding
18437un-normalized version [@code{betaB}].
18438
18439@kindex f e
18440@kindex I f e
18441@pindex calc-erf
18442@tindex erf
18443@tindex erfc
18444The @kbd{f e} (@code{calc-erf}) [@code{erf}] command computes the
18445error function
18446@texline @math{\hbox{erf}(x) = {2 \over \sqrt{\pi}} \int_0^x e^{-t^2} dt}.
18447@infoline @expr{erf(x) = 2 integ(exp(-(t^2)), t, 0, x) / sqrt(pi)}.
18448The complementary error function @kbd{I f e} (@code{calc-erfc}) [@code{erfc}]
18449is the corresponding integral from @samp{x} to infinity; the sum
18450@texline @math{\hbox{erf}(x) + \hbox{erfc}(x) = 1}.
18451@infoline @expr{erf(x) + erfc(x) = 1}.
18452
18453@kindex f j
18454@kindex f y
18455@pindex calc-bessel-J
18456@pindex calc-bessel-Y
18457@tindex besJ
18458@tindex besY
18459The @kbd{f j} (@code{calc-bessel-J}) [@code{besJ}] and @kbd{f y}
18460(@code{calc-bessel-Y}) [@code{besY}] commands compute the Bessel
18461functions of the first and second kinds, respectively.
18462In @samp{besJ(n,x)} and @samp{besY(n,x)} the ``order'' parameter
18463@expr{n} is often an integer, but is not required to be one.
18464Calc's implementation of the Bessel functions currently limits the
18465precision to 8 digits, and may not be exact even to that precision.
18466Use with care!
18467
18468@node Branch Cuts, Random Numbers, Advanced Math Functions, Scientific Functions
18469@section Branch Cuts and Principal Values
18470
18471@noindent
18472@cindex Branch cuts
18473@cindex Principal values
18474All of the logarithmic, trigonometric, and other scientific functions are
18475defined for complex numbers as well as for reals.
18476This section describes the values
18477returned in cases where the general result is a family of possible values.
18478Calc follows section 12.5.3 of Steele's @dfn{Common Lisp, the Language},
18479second edition, in these matters. This section will describe each
18480function briefly; for a more detailed discussion (including some nifty
18481diagrams), consult Steele's book.
18482
18483Note that the branch cuts for @code{arctan} and @code{arctanh} were
18484changed between the first and second editions of Steele. Versions of
18485Calc starting with 2.00 follow the second edition.
18486
18487The new branch cuts exactly match those of the HP-28/48 calculators.
18488They also match those of Mathematica 1.2, except that Mathematica's
18489@code{arctan} cut is always in the right half of the complex plane,
18490and its @code{arctanh} cut is always in the top half of the plane.
18491Calc's cuts are continuous with quadrants I and III for @code{arctan},
18492or II and IV for @code{arctanh}.
18493
18494Note: The current implementations of these functions with complex arguments
18495are designed with proper behavior around the branch cuts in mind, @emph{not}
18496efficiency or accuracy. You may need to increase the floating precision
18497and wait a while to get suitable answers from them.
18498
18499For @samp{sqrt(a+bi)}: When @expr{a<0} and @expr{b} is small but positive
18500or zero, the result is close to the @expr{+i} axis. For @expr{b} small and
18501negative, the result is close to the @expr{-i} axis. The result always lies
18502in the right half of the complex plane.
18503
18504For @samp{ln(a+bi)}: The real part is defined as @samp{ln(abs(a+bi))}.
18505The imaginary part is defined as @samp{arg(a+bi) = arctan2(b,a)}.
18506Thus the branch cuts for @code{sqrt} and @code{ln} both lie on the
18507negative real axis.
18508
18509The following table describes these branch cuts in another way.
18510If the real and imaginary parts of @expr{z} are as shown, then
18511the real and imaginary parts of @expr{f(z)} will be as shown.
18512Here @code{eps} stands for a small positive value; each
18513occurrence of @code{eps} may stand for a different small value.
18514
18515@smallexample
18516 z sqrt(z) ln(z)
18517----------------------------------------
18518 +, 0 +, 0 any, 0
18519 -, 0 0, + any, pi
18520 -, +eps +eps, + +eps, +
18521 -, -eps +eps, - +eps, -
18522@end smallexample
18523
18524For @samp{z1^z2}: This is defined by @samp{exp(ln(z1)*z2)}.
18525One interesting consequence of this is that @samp{(-8)^1:3} does
18526not evaluate to @mathit{-2} as you might expect, but to the complex
18527number @expr{(1., 1.732)}. Both of these are valid cube roots
18528of @mathit{-8} (as is @expr{(1., -1.732)}); Calc chooses a perhaps
18529less-obvious root for the sake of mathematical consistency.
18530
18531For @samp{arcsin(z)}: This is defined by @samp{-i*ln(i*z + sqrt(1-z^2))}.
18532The branch cuts are on the real axis, less than @mathit{-1} and greater than 1.
18533
18534For @samp{arccos(z)}: This is defined by @samp{-i*ln(z + i*sqrt(1-z^2))},
18535or equivalently by @samp{pi/2 - arcsin(z)}. The branch cuts are on
18536the real axis, less than @mathit{-1} and greater than 1.
18537
18538For @samp{arctan(z)}: This is defined by
18539@samp{(ln(1+i*z) - ln(1-i*z)) / (2*i)}. The branch cuts are on the
18540imaginary axis, below @expr{-i} and above @expr{i}.
18541
18542For @samp{arcsinh(z)}: This is defined by @samp{ln(z + sqrt(1+z^2))}.
18543The branch cuts are on the imaginary axis, below @expr{-i} and
18544above @expr{i}.
18545
18546For @samp{arccosh(z)}: This is defined by
18547@samp{ln(z + (z+1)*sqrt((z-1)/(z+1)))}. The branch cut is on the
18548real axis less than 1.
18549
18550For @samp{arctanh(z)}: This is defined by @samp{(ln(1+z) - ln(1-z)) / 2}.
18551The branch cuts are on the real axis, less than @mathit{-1} and greater than 1.
18552
18553The following tables for @code{arcsin}, @code{arccos}, and
18554@code{arctan} assume the current angular mode is Radians. The
18555hyperbolic functions operate independently of the angular mode.
18556
18557@smallexample
18558 z arcsin(z) arccos(z)
18559-------------------------------------------------------
18560 (-1..1), 0 (-pi/2..pi/2), 0 (0..pi), 0
18561 (-1..1), +eps (-pi/2..pi/2), +eps (0..pi), -eps
18562 (-1..1), -eps (-pi/2..pi/2), -eps (0..pi), +eps
18563 <-1, 0 -pi/2, + pi, -
18564 <-1, +eps -pi/2 + eps, + pi - eps, -
18565 <-1, -eps -pi/2 + eps, - pi - eps, +
18566 >1, 0 pi/2, - 0, +
18567 >1, +eps pi/2 - eps, + +eps, -
18568 >1, -eps pi/2 - eps, - +eps, +
18569@end smallexample
18570
18571@smallexample
18572 z arccosh(z) arctanh(z)
18573-----------------------------------------------------
18574 (-1..1), 0 0, (0..pi) any, 0
18575 (-1..1), +eps +eps, (0..pi) any, +eps
18576 (-1..1), -eps +eps, (-pi..0) any, -eps
18577 <-1, 0 +, pi -, pi/2
18578 <-1, +eps +, pi - eps -, pi/2 - eps
18579 <-1, -eps +, -pi + eps -, -pi/2 + eps
18580 >1, 0 +, 0 +, -pi/2
18581 >1, +eps +, +eps +, pi/2 - eps
18582 >1, -eps +, -eps +, -pi/2 + eps
18583@end smallexample
18584
18585@smallexample
18586 z arcsinh(z) arctan(z)
18587-----------------------------------------------------
18588 0, (-1..1) 0, (-pi/2..pi/2) 0, any
18589 0, <-1 -, -pi/2 -pi/2, -
18590 +eps, <-1 +, -pi/2 + eps pi/2 - eps, -
18591 -eps, <-1 -, -pi/2 + eps -pi/2 + eps, -
18592 0, >1 +, pi/2 pi/2, +
18593 +eps, >1 +, pi/2 - eps pi/2 - eps, +
18594 -eps, >1 -, pi/2 - eps -pi/2 + eps, +
18595@end smallexample
18596
18597Finally, the following identities help to illustrate the relationship
18598between the complex trigonometric and hyperbolic functions. They
18599are valid everywhere, including on the branch cuts.
18600
18601@smallexample
18602sin(i*z) = i*sinh(z) arcsin(i*z) = i*arcsinh(z)
18603cos(i*z) = cosh(z) arcsinh(i*z) = i*arcsin(z)
18604tan(i*z) = i*tanh(z) arctan(i*z) = i*arctanh(z)
18605sinh(i*z) = i*sin(z) cosh(i*z) = cos(z)
18606@end smallexample
18607
18608The ``advanced math'' functions (gamma, Bessel, etc.@:) are also defined
18609for general complex arguments, but their branch cuts and principal values
18610are not rigorously specified at present.
18611
18612@node Random Numbers, Combinatorial Functions, Branch Cuts, Scientific Functions
18613@section Random Numbers
18614
18615@noindent
18616@kindex k r
18617@pindex calc-random
18618@tindex random
18619The @kbd{k r} (@code{calc-random}) [@code{random}] command produces
18620random numbers of various sorts.
18621
18622Given a positive numeric prefix argument @expr{M}, it produces a random
18623integer @expr{N} in the range
18624@texline @math{0 \le N < M}.
18625@infoline @expr{0 <= N < M}.
f10d0e80 18626Each possible value @expr{N} appears with equal probability.
4009494e
GM
18627
18628With no numeric prefix argument, the @kbd{k r} command takes its argument
18629from the stack instead. Once again, if this is a positive integer @expr{M}
18630the result is a random integer less than @expr{M}. However, note that
18631while numeric prefix arguments are limited to six digits or so, an @expr{M}
18632taken from the stack can be arbitrarily large. If @expr{M} is negative,
18633the result is a random integer in the range
18634@texline @math{M < N \le 0}.
18635@infoline @expr{M < N <= 0}.
18636
18637If the value on the stack is a floating-point number @expr{M}, the result
18638is a random floating-point number @expr{N} in the range
18639@texline @math{0 \le N < M}
18640@infoline @expr{0 <= N < M}
18641or
18642@texline @math{M < N \le 0},
18643@infoline @expr{M < N <= 0},
18644according to the sign of @expr{M}.
18645
18646If @expr{M} is zero, the result is a Gaussian-distributed random real
18647number; the distribution has a mean of zero and a standard deviation
18648of one. The algorithm used generates random numbers in pairs; thus,
18649every other call to this function will be especially fast.
18650
18651If @expr{M} is an error form
18652@texline @math{m} @code{+/-} @math{\sigma}
18653@infoline @samp{m +/- s}
18654where @var{m} and
18655@texline @math{\sigma}
18656@infoline @var{s}
18657are both real numbers, the result uses a Gaussian distribution with mean
18658@var{m} and standard deviation
18659@texline @math{\sigma}.
18660@infoline @var{s}.
18661
18662If @expr{M} is an interval form, the lower and upper bounds specify the
18663acceptable limits of the random numbers. If both bounds are integers,
18664the result is a random integer in the specified range. If either bound
18665is floating-point, the result is a random real number in the specified
18666range. If the interval is open at either end, the result will be sure
18667not to equal that end value. (This makes a big difference for integer
18668intervals, but for floating-point intervals it's relatively minor:
18669with a precision of 6, @samp{random([1.0..2.0))} will return any of one
18670million numbers from 1.00000 to 1.99999; @samp{random([1.0..2.0])} may
18671additionally return 2.00000, but the probability of this happening is
18672extremely small.)
18673
18674If @expr{M} is a vector, the result is one element taken at random from
18675the vector. All elements of the vector are given equal probabilities.
18676
18677@vindex RandSeed
18678The sequence of numbers produced by @kbd{k r} is completely random by
18679default, i.e., the sequence is seeded each time you start Calc using
18680the current time and other information. You can get a reproducible
18681sequence by storing a particular ``seed value'' in the Calc variable
18682@code{RandSeed}. Any integer will do for a seed; integers of from 1
18683to 12 digits are good. If you later store a different integer into
18684@code{RandSeed}, Calc will switch to a different pseudo-random
18685sequence. If you ``unstore'' @code{RandSeed}, Calc will re-seed itself
18686from the current time. If you store the same integer that you used
18687before back into @code{RandSeed}, you will get the exact same sequence
18688of random numbers as before.
18689
18690@pindex calc-rrandom
18691The @code{calc-rrandom} command (not on any key) produces a random real
18692number between zero and one. It is equivalent to @samp{random(1.0)}.
18693
18694@kindex k a
18695@pindex calc-random-again
18696The @kbd{k a} (@code{calc-random-again}) command produces another random
18697number, re-using the most recent value of @expr{M}. With a numeric
18698prefix argument @var{n}, it produces @var{n} more random numbers using
18699that value of @expr{M}.
18700
18701@kindex k h
18702@pindex calc-shuffle
18703@tindex shuffle
18704The @kbd{k h} (@code{calc-shuffle}) command produces a vector of several
18705random values with no duplicates. The value on the top of the stack
18706specifies the set from which the random values are drawn, and may be any
18707of the @expr{M} formats described above. The numeric prefix argument
18708gives the length of the desired list. (If you do not provide a numeric
18709prefix argument, the length of the list is taken from the top of the
18710stack, and @expr{M} from second-to-top.)
18711
18712If @expr{M} is a floating-point number, zero, or an error form (so
18713that the random values are being drawn from the set of real numbers)
18714there is little practical difference between using @kbd{k h} and using
18715@kbd{k r} several times. But if the set of possible values consists
18716of just a few integers, or the elements of a vector, then there is
18717a very real chance that multiple @kbd{k r}'s will produce the same
18718number more than once. The @kbd{k h} command produces a vector whose
18719elements are always distinct. (Actually, there is a slight exception:
18720If @expr{M} is a vector, no given vector element will be drawn more
18721than once, but if several elements of @expr{M} are equal, they may
18722each make it into the result vector.)
18723
18724One use of @kbd{k h} is to rearrange a list at random. This happens
18725if the prefix argument is equal to the number of values in the list:
18726@kbd{[1, 1.5, 2, 2.5, 3] 5 k h} might produce the permuted list
18727@samp{[2.5, 1, 1.5, 3, 2]}. As a convenient feature, if the argument
18728@var{n} is negative it is replaced by the size of the set represented
18729by @expr{M}. Naturally, this is allowed only when @expr{M} specifies
18730a small discrete set of possibilities.
18731
18732To do the equivalent of @kbd{k h} but with duplications allowed,
18733given @expr{M} on the stack and with @var{n} just entered as a numeric
18734prefix, use @kbd{v b} to build a vector of copies of @expr{M}, then use
18735@kbd{V M k r} to ``map'' the normal @kbd{k r} function over the
18736elements of this vector. @xref{Matrix Functions}.
18737
18738@menu
18739* Random Number Generator:: (Complete description of Calc's algorithm)
18740@end menu
18741
18742@node Random Number Generator, , Random Numbers, Random Numbers
18743@subsection Random Number Generator
18744
18745Calc's random number generator uses several methods to ensure that
18746the numbers it produces are highly random. Knuth's @emph{Art of
18747Computer Programming}, Volume II, contains a thorough description
18748of the theory of random number generators and their measurement and
18749characterization.
18750
18751If @code{RandSeed} has no stored value, Calc calls Emacs' built-in
18752@code{random} function to get a stream of random numbers, which it
18753then treats in various ways to avoid problems inherent in the simple
18754random number generators that many systems use to implement @code{random}.
18755
18756When Calc's random number generator is first invoked, it ``seeds''
18757the low-level random sequence using the time of day, so that the
18758random number sequence will be different every time you use Calc.
18759
18760Since Emacs Lisp doesn't specify the range of values that will be
18761returned by its @code{random} function, Calc exercises the function
18762several times to estimate the range. When Calc subsequently uses
18763the @code{random} function, it takes only 10 bits of the result
18764near the most-significant end. (It avoids at least the bottom
18765four bits, preferably more, and also tries to avoid the top two
18766bits.) This strategy works well with the linear congruential
18767generators that are typically used to implement @code{random}.
18768
18769If @code{RandSeed} contains an integer, Calc uses this integer to
18770seed an ``additive congruential'' method (Knuth's algorithm 3.2.2A,
18771computing
18772@texline @math{X_{n-55} - X_{n-24}}.
18773@infoline @expr{X_n-55 - X_n-24}).
18774This method expands the seed
18775value into a large table which is maintained internally; the variable
18776@code{RandSeed} is changed from, e.g., 42 to the vector @expr{[42]}
18777to indicate that the seed has been absorbed into this table. When
18778@code{RandSeed} contains a vector, @kbd{k r} and related commands
18779continue to use the same internal table as last time. There is no
18780way to extract the complete state of the random number generator
18781so that you can restart it from any point; you can only restart it
18782from the same initial seed value. A simple way to restart from the
18783same seed is to type @kbd{s r RandSeed} to get the seed vector,
18784@kbd{v u} to unpack it back into a number, then @kbd{s t RandSeed}
18785to reseed the generator with that number.
18786
18787Calc uses a ``shuffling'' method as described in algorithm 3.2.2B
18788of Knuth. It fills a table with 13 random 10-bit numbers. Then,
18789to generate a new random number, it uses the previous number to
18790index into the table, picks the value it finds there as the new
18791random number, then replaces that table entry with a new value
18792obtained from a call to the base random number generator (either
18793the additive congruential generator or the @code{random} function
18794supplied by the system). If there are any flaws in the base
18795generator, shuffling will tend to even them out. But if the system
18796provides an excellent @code{random} function, shuffling will not
18797damage its randomness.
18798
18799To create a random integer of a certain number of digits, Calc
18800builds the integer three decimal digits at a time. For each group
18801of three digits, Calc calls its 10-bit shuffling random number generator
18802(which returns a value from 0 to 1023); if the random value is 1000
18803or more, Calc throws it out and tries again until it gets a suitable
18804value.
18805
18806To create a random floating-point number with precision @var{p}, Calc
18807simply creates a random @var{p}-digit integer and multiplies by
18808@texline @math{10^{-p}}.
18809@infoline @expr{10^-p}.
18810The resulting random numbers should be very clean, but note
18811that relatively small numbers will have few significant random digits.
18812In other words, with a precision of 12, you will occasionally get
18813numbers on the order of
18814@texline @math{10^{-9}}
18815@infoline @expr{10^-9}
18816or
18817@texline @math{10^{-10}},
18818@infoline @expr{10^-10},
18819but those numbers will only have two or three random digits since they
18820correspond to small integers times
18821@texline @math{10^{-12}}.
18822@infoline @expr{10^-12}.
18823
18824To create a random integer in the interval @samp{[0 .. @var{m})}, Calc
18825counts the digits in @var{m}, creates a random integer with three
18826additional digits, then reduces modulo @var{m}. Unless @var{m} is a
18827power of ten the resulting values will be very slightly biased toward
18828the lower numbers, but this bias will be less than 0.1%. (For example,
18829if @var{m} is 42, Calc will reduce a random integer less than 100000
18830modulo 42 to get a result less than 42. It is easy to show that the
18831numbers 40 and 41 will be only 2380/2381 as likely to result from this
18832modulo operation as numbers 39 and below.) If @var{m} is a power of
18833ten, however, the numbers should be completely unbiased.
18834
18835The Gaussian random numbers generated by @samp{random(0.0)} use the
18836``polar'' method described in Knuth section 3.4.1C. This method
18837generates a pair of Gaussian random numbers at a time, so only every
18838other call to @samp{random(0.0)} will require significant calculations.
18839
18840@node Combinatorial Functions, Probability Distribution Functions, Random Numbers, Scientific Functions
18841@section Combinatorial Functions
18842
18843@noindent
18844Commands relating to combinatorics and number theory begin with the
18845@kbd{k} key prefix.
18846
18847@kindex k g
18848@pindex calc-gcd
18849@tindex gcd
18850The @kbd{k g} (@code{calc-gcd}) [@code{gcd}] command computes the
18851Greatest Common Divisor of two integers. It also accepts fractions;
18852the GCD of two fractions is defined by taking the GCD of the
18853numerators, and the LCM of the denominators. This definition is
18854consistent with the idea that @samp{a / gcd(a,x)} should yield an
18855integer for any @samp{a} and @samp{x}. For other types of arguments,
18856the operation is left in symbolic form.
18857
18858@kindex k l
18859@pindex calc-lcm
18860@tindex lcm
18861The @kbd{k l} (@code{calc-lcm}) [@code{lcm}] command computes the
18862Least Common Multiple of two integers or fractions. The product of
18863the LCM and GCD of two numbers is equal to the product of the
18864numbers.
18865
18866@kindex k E
18867@pindex calc-extended-gcd
18868@tindex egcd
18869The @kbd{k E} (@code{calc-extended-gcd}) [@code{egcd}] command computes
18870the GCD of two integers @expr{x} and @expr{y} and returns a vector
18871@expr{[g, a, b]} where
18872@texline @math{g = \gcd(x,y) = a x + b y}.
18873@infoline @expr{g = gcd(x,y) = a x + b y}.
18874
18875@kindex !
18876@pindex calc-factorial
18877@tindex fact
18878@ignore
18879@mindex @null
18880@end ignore
18881@tindex !
18882The @kbd{!} (@code{calc-factorial}) [@code{fact}] command computes the
18883factorial of the number at the top of the stack. If the number is an
18884integer, the result is an exact integer. If the number is an
18885integer-valued float, the result is a floating-point approximation. If
18886the number is a non-integral real number, the generalized factorial is used,
18887as defined by the Euler Gamma function. Please note that computation of
18888large factorials can be slow; using floating-point format will help
18889since fewer digits must be maintained. The same is true of many of
18890the commands in this section.
18891
18892@kindex k d
18893@pindex calc-double-factorial
18894@tindex dfact
18895@ignore
18896@mindex @null
18897@end ignore
18898@tindex !!
18899The @kbd{k d} (@code{calc-double-factorial}) [@code{dfact}] command
18900computes the ``double factorial'' of an integer. For an even integer,
18901this is the product of even integers from 2 to @expr{N}. For an odd
18902integer, this is the product of odd integers from 3 to @expr{N}. If
18903the argument is an integer-valued float, the result is a floating-point
18904approximation. This function is undefined for negative even integers.
18905The notation @expr{N!!} is also recognized for double factorials.
18906
18907@kindex k c
18908@pindex calc-choose
18909@tindex choose
18910The @kbd{k c} (@code{calc-choose}) [@code{choose}] command computes the
18911binomial coefficient @expr{N}-choose-@expr{M}, where @expr{M} is the number
18912on the top of the stack and @expr{N} is second-to-top. If both arguments
18913are integers, the result is an exact integer. Otherwise, the result is a
18914floating-point approximation. The binomial coefficient is defined for all
18915real numbers by
18916@texline @math{N! \over M! (N-M)!\,}.
18917@infoline @expr{N! / M! (N-M)!}.
18918
18919@kindex H k c
18920@pindex calc-perm
18921@tindex perm
18922@ifnottex
18923The @kbd{H k c} (@code{calc-perm}) [@code{perm}] command computes the
18924number-of-permutations function @expr{N! / (N-M)!}.
18925@end ifnottex
18926@tex
18927The \kbd{H k c} (\code{calc-perm}) [\code{perm}] command computes the
18928number-of-perm\-utations function $N! \over (N-M)!\,$.
18929@end tex
18930
18931@kindex k b
18932@kindex H k b
18933@pindex calc-bernoulli-number
18934@tindex bern
18935The @kbd{k b} (@code{calc-bernoulli-number}) [@code{bern}] command
18936computes a given Bernoulli number. The value at the top of the stack
18937is a nonnegative integer @expr{n} that specifies which Bernoulli number
18938is desired. The @kbd{H k b} command computes a Bernoulli polynomial,
18939taking @expr{n} from the second-to-top position and @expr{x} from the
18940top of the stack. If @expr{x} is a variable or formula the result is
18941a polynomial in @expr{x}; if @expr{x} is a number the result is a number.
18942
18943@kindex k e
18944@kindex H k e
18945@pindex calc-euler-number
18946@tindex euler
18947The @kbd{k e} (@code{calc-euler-number}) [@code{euler}] command similarly
18948computes an Euler number, and @w{@kbd{H k e}} computes an Euler polynomial.
18949Bernoulli and Euler numbers occur in the Taylor expansions of several
18950functions.
18951
18952@kindex k s
18953@kindex H k s
18954@pindex calc-stirling-number
18955@tindex stir1
18956@tindex stir2
18957The @kbd{k s} (@code{calc-stirling-number}) [@code{stir1}] command
18958computes a Stirling number of the first
18959@texline kind@tie{}@math{n \brack m},
18960@infoline kind,
18961given two integers @expr{n} and @expr{m} on the stack. The @kbd{H k s}
18962[@code{stir2}] command computes a Stirling number of the second
18963@texline kind@tie{}@math{n \brace m}.
18964@infoline kind.
18965These are the number of @expr{m}-cycle permutations of @expr{n} objects,
18966and the number of ways to partition @expr{n} objects into @expr{m}
18967non-empty sets, respectively.
18968
18969@kindex k p
18970@pindex calc-prime-test
18971@cindex Primes
18972The @kbd{k p} (@code{calc-prime-test}) command checks if the integer on
18973the top of the stack is prime. For integers less than eight million, the
18974answer is always exact and reasonably fast. For larger integers, a
18975probabilistic method is used (see Knuth vol. II, section 4.5.4, algorithm P).
18976The number is first checked against small prime factors (up to 13). Then,
18977any number of iterations of the algorithm are performed. Each step either
18978discovers that the number is non-prime, or substantially increases the
18979certainty that the number is prime. After a few steps, the chance that
18980a number was mistakenly described as prime will be less than one percent.
18981(Indeed, this is a worst-case estimate of the probability; in practice
18982even a single iteration is quite reliable.) After the @kbd{k p} command,
18983the number will be reported as definitely prime or non-prime if possible,
18984or otherwise ``probably'' prime with a certain probability of error.
18985
18986@ignore
18987@starindex
18988@end ignore
18989@tindex prime
18990The normal @kbd{k p} command performs one iteration of the primality
18991test. Pressing @kbd{k p} repeatedly for the same integer will perform
18992additional iterations. Also, @kbd{k p} with a numeric prefix performs
18993the specified number of iterations. There is also an algebraic function
18994@samp{prime(n)} or @samp{prime(n,iters)} which returns 1 if @expr{n}
18995is (probably) prime and 0 if not.
18996
18997@kindex k f
18998@pindex calc-prime-factors
18999@tindex prfac
19000The @kbd{k f} (@code{calc-prime-factors}) [@code{prfac}] command
19001attempts to decompose an integer into its prime factors. For numbers up
19002to 25 million, the answer is exact although it may take some time. The
19003result is a vector of the prime factors in increasing order. For larger
19004inputs, prime factors above 5000 may not be found, in which case the
19005last number in the vector will be an unfactored integer greater than 25
19006million (with a warning message). For negative integers, the first
19007element of the list will be @mathit{-1}. For inputs @mathit{-1}, @mathit{0}, and
19008@mathit{1}, the result is a list of the same number.
19009
19010@kindex k n
19011@pindex calc-next-prime
19012@ignore
19013@mindex nextpr@idots
19014@end ignore
19015@tindex nextprime
19016The @kbd{k n} (@code{calc-next-prime}) [@code{nextprime}] command finds
19017the next prime above a given number. Essentially, it searches by calling
19018@code{calc-prime-test} on successive integers until it finds one that
19019passes the test. This is quite fast for integers less than eight million,
19020but once the probabilistic test comes into play the search may be rather
19021slow. Ordinarily this command stops for any prime that passes one iteration
19022of the primality test. With a numeric prefix argument, a number must pass
19023the specified number of iterations before the search stops. (This only
19024matters when searching above eight million.) You can always use additional
19025@kbd{k p} commands to increase your certainty that the number is indeed
19026prime.
19027
19028@kindex I k n
19029@pindex calc-prev-prime
19030@ignore
19031@mindex prevpr@idots
19032@end ignore
19033@tindex prevprime
19034The @kbd{I k n} (@code{calc-prev-prime}) [@code{prevprime}] command
19035analogously finds the next prime less than a given number.
19036
19037@kindex k t
19038@pindex calc-totient
19039@tindex totient
19040The @kbd{k t} (@code{calc-totient}) [@code{totient}] command computes the
19041Euler ``totient''
19042@texline function@tie{}@math{\phi(n)},
19043@infoline function,
19044the number of integers less than @expr{n} which
19045are relatively prime to @expr{n}.
19046
19047@kindex k m
19048@pindex calc-moebius
19049@tindex moebius
19050The @kbd{k m} (@code{calc-moebius}) [@code{moebius}] command computes the
19051@texline M@"obius @math{\mu}
19052@infoline Moebius ``mu''
19053function. If the input number is a product of @expr{k}
19054distinct factors, this is @expr{(-1)^k}. If the input number has any
19055duplicate factors (i.e., can be divided by the same prime more than once),
19056the result is zero.
19057
19058@node Probability Distribution Functions, , Combinatorial Functions, Scientific Functions
19059@section Probability Distribution Functions
19060
19061@noindent
19062The functions in this section compute various probability distributions.
19063For continuous distributions, this is the integral of the probability
19064density function from @expr{x} to infinity. (These are the ``upper
19065tail'' distribution functions; there are also corresponding ``lower
19066tail'' functions which integrate from minus infinity to @expr{x}.)
19067For discrete distributions, the upper tail function gives the sum
19068from @expr{x} to infinity; the lower tail function gives the sum
19069from minus infinity up to, but not including,@w{ }@expr{x}.
19070
19071To integrate from @expr{x} to @expr{y}, just use the distribution
19072function twice and subtract. For example, the probability that a
19073Gaussian random variable with mean 2 and standard deviation 1 will
19074lie in the range from 2.5 to 2.8 is @samp{utpn(2.5,2,1) - utpn(2.8,2,1)}
19075(``the probability that it is greater than 2.5, but not greater than 2.8''),
19076or equivalently @samp{ltpn(2.8,2,1) - ltpn(2.5,2,1)}.
19077
19078@kindex k B
19079@kindex I k B
19080@pindex calc-utpb
19081@tindex utpb
19082@tindex ltpb
19083The @kbd{k B} (@code{calc-utpb}) [@code{utpb}] function uses the
19084binomial distribution. Push the parameters @var{n}, @var{p}, and
19085then @var{x} onto the stack; the result (@samp{utpb(x,n,p)}) is the
19086probability that an event will occur @var{x} or more times out
19087of @var{n} trials, if its probability of occurring in any given
19088trial is @var{p}. The @kbd{I k B} [@code{ltpb}] function is
19089the probability that the event will occur fewer than @var{x} times.
19090
19091The other probability distribution functions similarly take the
19092form @kbd{k @var{X}} (@code{calc-utp@var{x}}) [@code{utp@var{x}}]
19093and @kbd{I k @var{X}} [@code{ltp@var{x}}], for various letters
19094@var{x}. The arguments to the algebraic functions are the value of
19095the random variable first, then whatever other parameters define the
19096distribution. Note these are among the few Calc functions where the
19097order of the arguments in algebraic form differs from the order of
19098arguments as found on the stack. (The random variable comes last on
19099the stack, so that you can type, e.g., @kbd{2 @key{RET} 1 @key{RET} 2.5
19100k N M-@key{RET} @key{DEL} 2.8 k N -}, using @kbd{M-@key{RET} @key{DEL}} to
19101recover the original arguments but substitute a new value for @expr{x}.)
19102
19103@kindex k C
19104@pindex calc-utpc
19105@tindex utpc
19106@ignore
19107@mindex @idots
19108@end ignore
19109@kindex I k C
19110@ignore
19111@mindex @null
19112@end ignore
19113@tindex ltpc
19114The @samp{utpc(x,v)} function uses the chi-square distribution with
19115@texline @math{\nu}
19116@infoline @expr{v}
19117degrees of freedom. It is the probability that a model is
19118correct if its chi-square statistic is @expr{x}.
19119
19120@kindex k F
19121@pindex calc-utpf
19122@tindex utpf
19123@ignore
19124@mindex @idots
19125@end ignore
19126@kindex I k F
19127@ignore
19128@mindex @null
19129@end ignore
19130@tindex ltpf
19131The @samp{utpf(F,v1,v2)} function uses the F distribution, used in
19132various statistical tests. The parameters
19133@texline @math{\nu_1}
19134@infoline @expr{v1}
19135and
19136@texline @math{\nu_2}
19137@infoline @expr{v2}
19138are the degrees of freedom in the numerator and denominator,
19139respectively, used in computing the statistic @expr{F}.
19140
19141@kindex k N
19142@pindex calc-utpn
19143@tindex utpn
19144@ignore
19145@mindex @idots
19146@end ignore
19147@kindex I k N
19148@ignore
19149@mindex @null
19150@end ignore
19151@tindex ltpn
19152The @samp{utpn(x,m,s)} function uses a normal (Gaussian) distribution
19153with mean @expr{m} and standard deviation
19154@texline @math{\sigma}.
19155@infoline @expr{s}.
19156It is the probability that such a normal-distributed random variable
19157would exceed @expr{x}.
19158
19159@kindex k P
19160@pindex calc-utpp
19161@tindex utpp
19162@ignore
19163@mindex @idots
19164@end ignore
19165@kindex I k P
19166@ignore
19167@mindex @null
19168@end ignore
19169@tindex ltpp
19170The @samp{utpp(n,x)} function uses a Poisson distribution with
19171mean @expr{x}. It is the probability that @expr{n} or more such
19172Poisson random events will occur.
19173
19174@kindex k T
19175@pindex calc-ltpt
19176@tindex utpt
19177@ignore
19178@mindex @idots
19179@end ignore
19180@kindex I k T
19181@ignore
19182@mindex @null
19183@end ignore
19184@tindex ltpt
19185The @samp{utpt(t,v)} function uses the Student's ``t'' distribution
19186with
19187@texline @math{\nu}
19188@infoline @expr{v}
19189degrees of freedom. It is the probability that a
19190t-distributed random variable will be greater than @expr{t}.
19191(Note: This computes the distribution function
19192@texline @math{A(t|\nu)}
19193@infoline @expr{A(t|v)}
19194where
19195@texline @math{A(0|\nu) = 1}
19196@infoline @expr{A(0|v) = 1}
19197and
19198@texline @math{A(\infty|\nu) \to 0}.
19199@infoline @expr{A(inf|v) -> 0}.
19200The @code{UTPT} operation on the HP-48 uses a different definition which
19201returns half of Calc's value: @samp{UTPT(t,v) = .5*utpt(t,v)}.)
19202
19203While Calc does not provide inverses of the probability distribution
19204functions, the @kbd{a R} command can be used to solve for the inverse.
19205Since the distribution functions are monotonic, @kbd{a R} is guaranteed
19206to be able to find a solution given any initial guess.
19207@xref{Numerical Solutions}.
19208
19209@node Matrix Functions, Algebra, Scientific Functions, Top
19210@chapter Vector/Matrix Functions
19211
19212@noindent
19213Many of the commands described here begin with the @kbd{v} prefix.
19214(For convenience, the shift-@kbd{V} prefix is equivalent to @kbd{v}.)
19215The commands usually apply to both plain vectors and matrices; some
19216apply only to matrices or only to square matrices. If the argument
19217has the wrong dimensions the operation is left in symbolic form.
19218
19219Vectors are entered and displayed using @samp{[a,b,c]} notation.
19220Matrices are vectors of which all elements are vectors of equal length.
19221(Though none of the standard Calc commands use this concept, a
19222three-dimensional matrix or rank-3 tensor could be defined as a
19223vector of matrices, and so on.)
19224
19225@menu
19226* Packing and Unpacking::
19227* Building Vectors::
19228* Extracting Elements::
19229* Manipulating Vectors::
19230* Vector and Matrix Arithmetic::
19231* Set Operations::
19232* Statistical Operations::
19233* Reducing and Mapping::
19234* Vector and Matrix Formats::
19235@end menu
19236
19237@node Packing and Unpacking, Building Vectors, Matrix Functions, Matrix Functions
19238@section Packing and Unpacking
19239
19240@noindent
19241Calc's ``pack'' and ``unpack'' commands collect stack entries to build
19242composite objects such as vectors and complex numbers. They are
19243described in this chapter because they are most often used to build
19244vectors.
19245
19246@kindex v p
19247@pindex calc-pack
19248The @kbd{v p} (@code{calc-pack}) [@code{pack}] command collects several
19249elements from the stack into a matrix, complex number, HMS form, error
19250form, etc. It uses a numeric prefix argument to specify the kind of
19251object to be built; this argument is referred to as the ``packing mode.''
19252If the packing mode is a nonnegative integer, a vector of that
19253length is created. For example, @kbd{C-u 5 v p} will pop the top
19254five stack elements and push back a single vector of those five
19255elements. (@kbd{C-u 0 v p} simply creates an empty vector.)
19256
19257The same effect can be had by pressing @kbd{[} to push an incomplete
19258vector on the stack, using @key{TAB} (@code{calc-roll-down}) to sneak
19259the incomplete object up past a certain number of elements, and
19260then pressing @kbd{]} to complete the vector.
19261
19262Negative packing modes create other kinds of composite objects:
19263
19264@table @cite
19265@item -1
19266Two values are collected to build a complex number. For example,
19267@kbd{5 @key{RET} 7 C-u -1 v p} creates the complex number
19268@expr{(5, 7)}. The result is always a rectangular complex
19269number. The two input values must both be real numbers,
19270i.e., integers, fractions, or floats. If they are not, Calc
19271will instead build a formula like @samp{a + (0, 1) b}. (The
19272other packing modes also create a symbolic answer if the
19273components are not suitable.)
19274
19275@item -2
19276Two values are collected to build a polar complex number.
19277The first is the magnitude; the second is the phase expressed
19278in either degrees or radians according to the current angular
19279mode.
19280
19281@item -3
19282Three values are collected into an HMS form. The first
19283two values (hours and minutes) must be integers or
19284integer-valued floats. The third value may be any real
19285number.
19286
19287@item -4
19288Two values are collected into an error form. The inputs
19289may be real numbers or formulas.
19290
19291@item -5
19292Two values are collected into a modulo form. The inputs
19293must be real numbers.
19294
19295@item -6
19296Two values are collected into the interval @samp{[a .. b]}.
19297The inputs may be real numbers, HMS or date forms, or formulas.
19298
19299@item -7
19300Two values are collected into the interval @samp{[a .. b)}.
19301
19302@item -8
19303Two values are collected into the interval @samp{(a .. b]}.
19304
19305@item -9
19306Two values are collected into the interval @samp{(a .. b)}.
19307
19308@item -10
19309Two integer values are collected into a fraction.
19310
19311@item -11
19312Two values are collected into a floating-point number.
19313The first is the mantissa; the second, which must be an
19314integer, is the exponent. The result is the mantissa
19315times ten to the power of the exponent.
19316
19317@item -12
19318This is treated the same as @mathit{-11} by the @kbd{v p} command.
19319When unpacking, @mathit{-12} specifies that a floating-point mantissa
19320is desired.
19321
19322@item -13
19323A real number is converted into a date form.
19324
19325@item -14
19326Three numbers (year, month, day) are packed into a pure date form.
19327
19328@item -15
19329Six numbers are packed into a date/time form.
19330@end table
19331
19332With any of the two-input negative packing modes, either or both
19333of the inputs may be vectors. If both are vectors of the same
19334length, the result is another vector made by packing corresponding
19335elements of the input vectors. If one input is a vector and the
19336other is a plain number, the number is packed along with each vector
19337element to produce a new vector. For example, @kbd{C-u -4 v p}
19338could be used to convert a vector of numbers and a vector of errors
19339into a single vector of error forms; @kbd{C-u -5 v p} could convert
19340a vector of numbers and a single number @var{M} into a vector of
19341numbers modulo @var{M}.
19342
19343If you don't give a prefix argument to @kbd{v p}, it takes
19344the packing mode from the top of the stack. The elements to
19345be packed then begin at stack level 2. Thus
19346@kbd{1 @key{RET} 2 @key{RET} 4 n v p} is another way to
19347enter the error form @samp{1 +/- 2}.
19348
19349If the packing mode taken from the stack is a vector, the result is a
19350matrix with the dimensions specified by the elements of the vector,
19351which must each be integers. For example, if the packing mode is
19352@samp{[2, 3]}, then six numbers will be taken from the stack and
19353returned in the form @samp{[@w{[a, b, c]}, [d, e, f]]}.
19354
19355If any elements of the vector are negative, other kinds of
19356packing are done at that level as described above. For
19357example, @samp{[2, 3, -4]} takes 12 objects and creates a
19358@texline @math{2\times3}
19359@infoline 2x3
19360matrix of error forms: @samp{[[a +/- b, c +/- d ... ]]}.
19361Also, @samp{[-4, -10]} will convert four integers into an
19362error form consisting of two fractions: @samp{a:b +/- c:d}.
19363
19364@ignore
19365@starindex
19366@end ignore
19367@tindex pack
19368There is an equivalent algebraic function,
19369@samp{pack(@var{mode}, @var{items})} where @var{mode} is a
19370packing mode (an integer or a vector of integers) and @var{items}
19371is a vector of objects to be packed (re-packed, really) according
19372to that mode. For example, @samp{pack([3, -4], [a,b,c,d,e,f])}
19373yields @samp{[a +/- b, @w{c +/- d}, e +/- f]}. The function is
19374left in symbolic form if the packing mode is invalid, or if the
19375number of data items does not match the number of items required
19376by the mode.
19377
19378@kindex v u
19379@pindex calc-unpack
19380The @kbd{v u} (@code{calc-unpack}) command takes the vector, complex
19381number, HMS form, or other composite object on the top of the stack and
19382``unpacks'' it, pushing each of its elements onto the stack as separate
19383objects. Thus, it is the ``inverse'' of @kbd{v p}. If the value
19384at the top of the stack is a formula, @kbd{v u} unpacks it by pushing
19385each of the arguments of the top-level operator onto the stack.
19386
19387You can optionally give a numeric prefix argument to @kbd{v u}
19388to specify an explicit (un)packing mode. If the packing mode is
19389negative and the input is actually a vector or matrix, the result
19390will be two or more similar vectors or matrices of the elements.
19391For example, given the vector @samp{[@w{a +/- b}, c^2, d +/- 7]},
19392the result of @kbd{C-u -4 v u} will be the two vectors
19393@samp{[a, c^2, d]} and @w{@samp{[b, 0, 7]}}.
19394
19395Note that the prefix argument can have an effect even when the input is
19396not a vector. For example, if the input is the number @mathit{-5}, then
19397@kbd{c-u -1 v u} yields @mathit{-5} and 0 (the components of @mathit{-5}
19398when viewed as a rectangular complex number); @kbd{C-u -2 v u} yields 5
19399and 180 (assuming Degrees mode); and @kbd{C-u -10 v u} yields @mathit{-5}
19400and 1 (the numerator and denominator of @mathit{-5}, viewed as a rational
19401number). Plain @kbd{v u} with this input would complain that the input
19402is not a composite object.
19403
19404Unpacking mode @mathit{-11} converts a float into an integer mantissa and
19405an integer exponent, where the mantissa is not divisible by 10
19406(except that 0.0 is represented by a mantissa and exponent of 0).
19407Unpacking mode @mathit{-12} converts a float into a floating-point mantissa
19408and integer exponent, where the mantissa (for non-zero numbers)
19409is guaranteed to lie in the range [1 .. 10). In both cases,
19410the mantissa is shifted left or right (and the exponent adjusted
19411to compensate) in order to satisfy these constraints.
19412
19413Positive unpacking modes are treated differently than for @kbd{v p}.
19414A mode of 1 is much like plain @kbd{v u} with no prefix argument,
19415except that in addition to the components of the input object,
19416a suitable packing mode to re-pack the object is also pushed.
19417Thus, @kbd{C-u 1 v u} followed by @kbd{v p} will re-build the
19418original object.
19419
19420A mode of 2 unpacks two levels of the object; the resulting
19421re-packing mode will be a vector of length 2. This might be used
19422to unpack a matrix, say, or a vector of error forms. Higher
19423unpacking modes unpack the input even more deeply.
19424
19425@ignore
19426@starindex
19427@end ignore
19428@tindex unpack
19429There are two algebraic functions analogous to @kbd{v u}.
19430The @samp{unpack(@var{mode}, @var{item})} function unpacks the
19431@var{item} using the given @var{mode}, returning the result as
19432a vector of components. Here the @var{mode} must be an
19433integer, not a vector. For example, @samp{unpack(-4, a +/- b)}
19434returns @samp{[a, b]}, as does @samp{unpack(1, a +/- b)}.
19435
19436@ignore
19437@starindex
19438@end ignore
19439@tindex unpackt
19440The @code{unpackt} function is like @code{unpack} but instead
19441of returning a simple vector of items, it returns a vector of
19442two things: The mode, and the vector of items. For example,
19443@samp{unpackt(1, 2:3 +/- 1:4)} returns @samp{[-4, [2:3, 1:4]]},
19444and @samp{unpackt(2, 2:3 +/- 1:4)} returns @samp{[[-4, -10], [2, 3, 1, 4]]}.
19445The identity for re-building the original object is
19446@samp{apply(pack, unpackt(@var{n}, @var{x})) = @var{x}}. (The
19447@code{apply} function builds a function call given the function
19448name and a vector of arguments.)
19449
19450@cindex Numerator of a fraction, extracting
19451Subscript notation is a useful way to extract a particular part
19452of an object. For example, to get the numerator of a rational
19453number, you can use @samp{unpack(-10, @var{x})_1}.
19454
19455@node Building Vectors, Extracting Elements, Packing and Unpacking, Matrix Functions
19456@section Building Vectors
19457
19458@noindent
19459Vectors and matrices can be added,
19460subtracted, multiplied, and divided; @pxref{Basic Arithmetic}.
19461
19462@kindex |
19463@pindex calc-concat
19464@ignore
19465@mindex @null
19466@end ignore
19467@tindex |
19468The @kbd{|} (@code{calc-concat}) [@code{vconcat}] command ``concatenates'' two vectors
19469into one. For example, after @kbd{@w{[ 1 , 2 ]} [ 3 , 4 ] |}, the stack
19470will contain the single vector @samp{[1, 2, 3, 4]}. If the arguments
19471are matrices, the rows of the first matrix are concatenated with the
19472rows of the second. (In other words, two matrices are just two vectors
19473of row-vectors as far as @kbd{|} is concerned.)
19474
19475If either argument to @kbd{|} is a scalar (a non-vector), it is treated
19476like a one-element vector for purposes of concatenation: @kbd{1 [ 2 , 3 ] |}
19477produces the vector @samp{[1, 2, 3]}. Likewise, if one argument is a
19478matrix and the other is a plain vector, the vector is treated as a
19479one-row matrix.
19480
19481@kindex H |
19482@tindex append
19483The @kbd{H |} (@code{calc-append}) [@code{append}] command concatenates
19484two vectors without any special cases. Both inputs must be vectors.
19485Whether or not they are matrices is not taken into account. If either
19486argument is a scalar, the @code{append} function is left in symbolic form.
19487See also @code{cons} and @code{rcons} below.
19488
19489@kindex I |
19490@kindex H I |
19491The @kbd{I |} and @kbd{H I |} commands are similar, but they use their
19492two stack arguments in the opposite order. Thus @kbd{I |} is equivalent
19493to @kbd{@key{TAB} |}, but possibly more convenient and also a bit faster.
19494
19495@kindex v d
19496@pindex calc-diag
19497@tindex diag
19498The @kbd{v d} (@code{calc-diag}) [@code{diag}] function builds a diagonal
19499square matrix. The optional numeric prefix gives the number of rows
19500and columns in the matrix. If the value at the top of the stack is a
19501vector, the elements of the vector are used as the diagonal elements; the
19502prefix, if specified, must match the size of the vector. If the value on
19503the stack is a scalar, it is used for each element on the diagonal, and
19504the prefix argument is required.
19505
19506To build a constant square matrix, e.g., a
19507@texline @math{3\times3}
19508@infoline 3x3
19509matrix filled with ones, use @kbd{0 M-3 v d 1 +}, i.e., build a zero
19510matrix first and then add a constant value to that matrix. (Another
19511alternative would be to use @kbd{v b} and @kbd{v a}; see below.)
19512
19513@kindex v i
19514@pindex calc-ident
19515@tindex idn
19516The @kbd{v i} (@code{calc-ident}) [@code{idn}] function builds an identity
19517matrix of the specified size. It is a convenient form of @kbd{v d}
19518where the diagonal element is always one. If no prefix argument is given,
19519this command prompts for one.
19520
19521In algebraic notation, @samp{idn(a,n)} acts much like @samp{diag(a,n)},
19522except that @expr{a} is required to be a scalar (non-vector) quantity.
19523If @expr{n} is omitted, @samp{idn(a)} represents @expr{a} times an
19524identity matrix of unknown size. Calc can operate algebraically on
19525such generic identity matrices, and if one is combined with a matrix
19526whose size is known, it is converted automatically to an identity
19527matrix of a suitable matching size. The @kbd{v i} command with an
19528argument of zero creates a generic identity matrix, @samp{idn(1)}.
19529Note that in dimensioned Matrix mode (@pxref{Matrix Mode}), generic
19530identity matrices are immediately expanded to the current default
19531dimensions.
19532
19533@kindex v x
19534@pindex calc-index
19535@tindex index
19536The @kbd{v x} (@code{calc-index}) [@code{index}] function builds a vector
19537of consecutive integers from 1 to @var{n}, where @var{n} is the numeric
19538prefix argument. If you do not provide a prefix argument, you will be
19539prompted to enter a suitable number. If @var{n} is negative, the result
19540is a vector of negative integers from @var{n} to @mathit{-1}.
19541
19542With a prefix argument of just @kbd{C-u}, the @kbd{v x} command takes
19543three values from the stack: @var{n}, @var{start}, and @var{incr} (with
19544@var{incr} at top-of-stack). Counting starts at @var{start} and increases
19545by @var{incr} for successive vector elements. If @var{start} or @var{n}
19546is in floating-point format, the resulting vector elements will also be
19547floats. Note that @var{start} and @var{incr} may in fact be any kind
19548of numbers or formulas.
19549
19550When @var{start} and @var{incr} are specified, a negative @var{n} has a
19551different interpretation: It causes a geometric instead of arithmetic
19552sequence to be generated. For example, @samp{index(-3, a, b)} produces
19553@samp{[a, a b, a b^2]}. If you omit @var{incr} in the algebraic form,
19554@samp{index(@var{n}, @var{start})}, the default value for @var{incr}
19555is one for positive @var{n} or two for negative @var{n}.
19556
19557@kindex v b
19558@pindex calc-build-vector
19559@tindex cvec
19560The @kbd{v b} (@code{calc-build-vector}) [@code{cvec}] function builds a
19561vector of @var{n} copies of the value on the top of the stack, where @var{n}
19562is the numeric prefix argument. In algebraic formulas, @samp{cvec(x,n,m)}
19563can also be used to build an @var{n}-by-@var{m} matrix of copies of @var{x}.
19564(Interactively, just use @kbd{v b} twice: once to build a row, then again
19565to build a matrix of copies of that row.)
19566
19567@kindex v h
19568@kindex I v h
19569@pindex calc-head
19570@pindex calc-tail
19571@tindex head
19572@tindex tail
19573The @kbd{v h} (@code{calc-head}) [@code{head}] function returns the first
19574element of a vector. The @kbd{I v h} (@code{calc-tail}) [@code{tail}]
19575function returns the vector with its first element removed. In both
19576cases, the argument must be a non-empty vector.
19577
19578@kindex v k
19579@pindex calc-cons
19580@tindex cons
19581The @kbd{v k} (@code{calc-cons}) [@code{cons}] function takes a value @var{h}
19582and a vector @var{t} from the stack, and produces the vector whose head is
19583@var{h} and whose tail is @var{t}. This is similar to @kbd{|}, except
19584if @var{h} is itself a vector, @kbd{|} will concatenate the two vectors
19585whereas @code{cons} will insert @var{h} at the front of the vector @var{t}.
19586
19587@kindex H v h
19588@tindex rhead
19589@ignore
19590@mindex @idots
19591@end ignore
19592@kindex H I v h
19593@ignore
19594@mindex @null
19595@end ignore
19596@kindex H v k
19597@ignore
19598@mindex @null
19599@end ignore
19600@tindex rtail
19601@ignore
19602@mindex @null
19603@end ignore
19604@tindex rcons
19605Each of these three functions also accepts the Hyperbolic flag [@code{rhead},
19606@code{rtail}, @code{rcons}] in which case @var{t} instead represents
19607the @emph{last} single element of the vector, with @var{h}
19608representing the remainder of the vector. Thus the vector
19609@samp{[a, b, c, d] = cons(a, [b, c, d]) = rcons([a, b, c], d)}.
19610Also, @samp{head([a, b, c, d]) = a}, @samp{tail([a, b, c, d]) = [b, c, d]},
19611@samp{rhead([a, b, c, d]) = [a, b, c]}, and @samp{rtail([a, b, c, d]) = d}.
19612
19613@node Extracting Elements, Manipulating Vectors, Building Vectors, Matrix Functions
19614@section Extracting Vector Elements
19615
19616@noindent
19617@kindex v r
19618@pindex calc-mrow
19619@tindex mrow
19620The @kbd{v r} (@code{calc-mrow}) [@code{mrow}] command extracts one row of
19621the matrix on the top of the stack, or one element of the plain vector on
19622the top of the stack. The row or element is specified by the numeric
19623prefix argument; the default is to prompt for the row or element number.
19624The matrix or vector is replaced by the specified row or element in the
19625form of a vector or scalar, respectively.
19626
19627@cindex Permutations, applying
19628With a prefix argument of @kbd{C-u} only, @kbd{v r} takes the index of
19629the element or row from the top of the stack, and the vector or matrix
19630from the second-to-top position. If the index is itself a vector of
19631integers, the result is a vector of the corresponding elements of the
19632input vector, or a matrix of the corresponding rows of the input matrix.
19633This command can be used to obtain any permutation of a vector.
19634
19635With @kbd{C-u}, if the index is an interval form with integer components,
19636it is interpreted as a range of indices and the corresponding subvector or
19637submatrix is returned.
19638
19639@cindex Subscript notation
19640@kindex a _
19641@pindex calc-subscript
19642@tindex subscr
19643@tindex _
19644Subscript notation in algebraic formulas (@samp{a_b}) stands for the
19645Calc function @code{subscr}, which is synonymous with @code{mrow}.
19646Thus, @samp{[x, y, z]_k} produces @expr{x}, @expr{y}, or @expr{z} if
19647@expr{k} is one, two, or three, respectively. A double subscript
19648(@samp{M_i_j}, equivalent to @samp{subscr(subscr(M, i), j)}) will
19649access the element at row @expr{i}, column @expr{j} of a matrix.
19650The @kbd{a _} (@code{calc-subscript}) command creates a subscript
19651formula @samp{a_b} out of two stack entries. (It is on the @kbd{a}
19652``algebra'' prefix because subscripted variables are often used
19653purely as an algebraic notation.)
19654
19655@tindex mrrow
19656Given a negative prefix argument, @kbd{v r} instead deletes one row or
19657element from the matrix or vector on the top of the stack. Thus
19658@kbd{C-u 2 v r} replaces a matrix with its second row, but @kbd{C-u -2 v r}
19659replaces the matrix with the same matrix with its second row removed.
19660In algebraic form this function is called @code{mrrow}.
19661
19662@tindex getdiag
19663Given a prefix argument of zero, @kbd{v r} extracts the diagonal elements
19664of a square matrix in the form of a vector. In algebraic form this
19665function is called @code{getdiag}.
19666
19667@kindex v c
19668@pindex calc-mcol
19669@tindex mcol
19670@tindex mrcol
19671The @kbd{v c} (@code{calc-mcol}) [@code{mcol} or @code{mrcol}] command is
19672the analogous operation on columns of a matrix. Given a plain vector
19673it extracts (or removes) one element, just like @kbd{v r}. If the
19674index in @kbd{C-u v c} is an interval or vector and the argument is a
19675matrix, the result is a submatrix with only the specified columns
19676retained (and possibly permuted in the case of a vector index).
19677
19678To extract a matrix element at a given row and column, use @kbd{v r} to
19679extract the row as a vector, then @kbd{v c} to extract the column element
19680from that vector. In algebraic formulas, it is often more convenient to
19681use subscript notation: @samp{m_i_j} gives row @expr{i}, column @expr{j}
19682of matrix @expr{m}.
19683
19684@kindex v s
19685@pindex calc-subvector
19686@tindex subvec
19687The @kbd{v s} (@code{calc-subvector}) [@code{subvec}] command extracts
19688a subvector of a vector. The arguments are the vector, the starting
19689index, and the ending index, with the ending index in the top-of-stack
19690position. The starting index indicates the first element of the vector
19691to take. The ending index indicates the first element @emph{past} the
19692range to be taken. Thus, @samp{subvec([a, b, c, d, e], 2, 4)} produces
19693the subvector @samp{[b, c]}. You could get the same result using
19694@samp{mrow([a, b, c, d, e], @w{[2 .. 4)})}.
19695
19696If either the start or the end index is zero or negative, it is
19697interpreted as relative to the end of the vector. Thus
19698@samp{subvec([a, b, c, d, e], 2, -2)} also produces @samp{[b, c]}. In
19699the algebraic form, the end index can be omitted in which case it
19700is taken as zero, i.e., elements from the starting element to the
19701end of the vector are used. The infinity symbol, @code{inf}, also
19702has this effect when used as the ending index.
19703
19704@kindex I v s
19705@tindex rsubvec
19706With the Inverse flag, @kbd{I v s} [@code{rsubvec}] removes a subvector
19707from a vector. The arguments are interpreted the same as for the
19708normal @kbd{v s} command. Thus, @samp{rsubvec([a, b, c, d, e], 2, 4)}
19709produces @samp{[a, d, e]}. It is always true that @code{subvec} and
19710@code{rsubvec} return complementary parts of the input vector.
19711
19712@xref{Selecting Subformulas}, for an alternative way to operate on
19713vectors one element at a time.
19714
19715@node Manipulating Vectors, Vector and Matrix Arithmetic, Extracting Elements, Matrix Functions
19716@section Manipulating Vectors
19717
19718@noindent
19719@kindex v l
19720@pindex calc-vlength
19721@tindex vlen
19722The @kbd{v l} (@code{calc-vlength}) [@code{vlen}] command computes the
19723length of a vector. The length of a non-vector is considered to be zero.
19724Note that matrices are just vectors of vectors for the purposes of this
19725command.
19726
19727@kindex H v l
19728@tindex mdims
19729With the Hyperbolic flag, @kbd{H v l} [@code{mdims}] computes a vector
19730of the dimensions of a vector, matrix, or higher-order object. For
19731example, @samp{mdims([[a,b,c],[d,e,f]])} returns @samp{[2, 3]} since
19732its argument is a
19733@texline @math{2\times3}
19734@infoline 2x3
19735matrix.
19736
19737@kindex v f
19738@pindex calc-vector-find
19739@tindex find
19740The @kbd{v f} (@code{calc-vector-find}) [@code{find}] command searches
19741along a vector for the first element equal to a given target. The target
19742is on the top of the stack; the vector is in the second-to-top position.
19743If a match is found, the result is the index of the matching element.
19744Otherwise, the result is zero. The numeric prefix argument, if given,
19745allows you to select any starting index for the search.
19746
19747@kindex v a
19748@pindex calc-arrange-vector
19749@tindex arrange
19750@cindex Arranging a matrix
19751@cindex Reshaping a matrix
19752@cindex Flattening a matrix
19753The @kbd{v a} (@code{calc-arrange-vector}) [@code{arrange}] command
19754rearranges a vector to have a certain number of columns and rows. The
19755numeric prefix argument specifies the number of columns; if you do not
19756provide an argument, you will be prompted for the number of columns.
19757The vector or matrix on the top of the stack is @dfn{flattened} into a
19758plain vector. If the number of columns is nonzero, this vector is
19759then formed into a matrix by taking successive groups of @var{n} elements.
19760If the number of columns does not evenly divide the number of elements
19761in the vector, the last row will be short and the result will not be
19762suitable for use as a matrix. For example, with the matrix
19763@samp{[[1, 2], @w{[3, 4]}]} on the stack, @kbd{v a 4} produces
19764@samp{[[1, 2, 3, 4]]} (a
19765@texline @math{1\times4}
19766@infoline 1x4
19767matrix), @kbd{v a 1} produces @samp{[[1], [2], [3], [4]]} (a
19768@texline @math{4\times1}
19769@infoline 4x1
19770matrix), @kbd{v a 2} produces @samp{[[1, 2], [3, 4]]} (the original
19771@texline @math{2\times2}
19772@infoline 2x2
19773matrix), @w{@kbd{v a 3}} produces @samp{[[1, 2, 3], [4]]} (not a
19774matrix), and @kbd{v a 0} produces the flattened list
19775@samp{[1, 2, @w{3, 4}]}.
19776
19777@cindex Sorting data
19778@kindex V S
19779@kindex I V S
19780@pindex calc-sort
19781@tindex sort
19782@tindex rsort
19783The @kbd{V S} (@code{calc-sort}) [@code{sort}] command sorts the elements of
19784a vector into increasing order. Real numbers, real infinities, and
19785constant interval forms come first in this ordering; next come other
19786kinds of numbers, then variables (in alphabetical order), then finally
19787come formulas and other kinds of objects; these are sorted according
19788to a kind of lexicographic ordering with the useful property that
19789one vector is less or greater than another if the first corresponding
19790unequal elements are less or greater, respectively. Since quoted strings
19791are stored by Calc internally as vectors of ASCII character codes
19792(@pxref{Strings}), this means vectors of strings are also sorted into
19793alphabetical order by this command.
19794
19795The @kbd{I V S} [@code{rsort}] command sorts a vector into decreasing order.
19796
19797@cindex Permutation, inverse of
19798@cindex Inverse of permutation
19799@cindex Index tables
19800@cindex Rank tables
19801@kindex V G
19802@kindex I V G
19803@pindex calc-grade
19804@tindex grade
19805@tindex rgrade
19806The @kbd{V G} (@code{calc-grade}) [@code{grade}, @code{rgrade}] command
19807produces an index table or permutation vector which, if applied to the
19808input vector (as the index of @kbd{C-u v r}, say), would sort the vector.
19809A permutation vector is just a vector of integers from 1 to @var{n}, where
19810each integer occurs exactly once. One application of this is to sort a
19811matrix of data rows using one column as the sort key; extract that column,
19812grade it with @kbd{V G}, then use the result to reorder the original matrix
19813with @kbd{C-u v r}. Another interesting property of the @code{V G} command
19814is that, if the input is itself a permutation vector, the result will
19815be the inverse of the permutation. The inverse of an index table is
19816a rank table, whose @var{k}th element says where the @var{k}th original
19817vector element will rest when the vector is sorted. To get a rank
19818table, just use @kbd{V G V G}.
19819
19820With the Inverse flag, @kbd{I V G} produces an index table that would
19821sort the input into decreasing order. Note that @kbd{V S} and @kbd{V G}
19822use a ``stable'' sorting algorithm, i.e., any two elements which are equal
19823will not be moved out of their original order. Generally there is no way
19824to tell with @kbd{V S}, since two elements which are equal look the same,
19825but with @kbd{V G} this can be an important issue. In the matrix-of-rows
19826example, suppose you have names and telephone numbers as two columns and
19827you wish to sort by phone number primarily, and by name when the numbers
19828are equal. You can sort the data matrix by names first, and then again
19829by phone numbers. Because the sort is stable, any two rows with equal
19830phone numbers will remain sorted by name even after the second sort.
19831
19832@cindex Histograms
19833@kindex V H
19834@pindex calc-histogram
19835@ignore
19836@mindex histo@idots
19837@end ignore
19838@tindex histogram
19839The @kbd{V H} (@code{calc-histogram}) [@code{histogram}] command builds a
19840histogram of a vector of numbers. Vector elements are assumed to be
19841integers or real numbers in the range [0..@var{n}) for some ``number of
19842bins'' @var{n}, which is the numeric prefix argument given to the
19843command. The result is a vector of @var{n} counts of how many times
19844each value appeared in the original vector. Non-integers in the input
19845are rounded down to integers. Any vector elements outside the specified
19846range are ignored. (You can tell if elements have been ignored by noting
19847that the counts in the result vector don't add up to the length of the
19848input vector.)
19849
19850@kindex H V H
19851With the Hyperbolic flag, @kbd{H V H} pulls two vectors from the stack.
19852The second-to-top vector is the list of numbers as before. The top
19853vector is an equal-sized list of ``weights'' to attach to the elements
19854of the data vector. For example, if the first data element is 4.2 and
19855the first weight is 10, then 10 will be added to bin 4 of the result
19856vector. Without the hyperbolic flag, every element has a weight of one.
19857
19858@kindex v t
19859@pindex calc-transpose
19860@tindex trn
19861The @kbd{v t} (@code{calc-transpose}) [@code{trn}] command computes
19862the transpose of the matrix at the top of the stack. If the argument
19863is a plain vector, it is treated as a row vector and transposed into
19864a one-column matrix.
19865
19866@kindex v v
19867@pindex calc-reverse-vector
19868@tindex rev
19869The @kbd{v v} (@code{calc-reverse-vector}) [@code{rev}] command reverses
19870a vector end-for-end. Given a matrix, it reverses the order of the rows.
19871(To reverse the columns instead, just use @kbd{v t v v v t}. The same
19872principle can be used to apply other vector commands to the columns of
19873a matrix.)
19874
19875@kindex v m
19876@pindex calc-mask-vector
19877@tindex vmask
19878The @kbd{v m} (@code{calc-mask-vector}) [@code{vmask}] command uses
19879one vector as a mask to extract elements of another vector. The mask
19880is in the second-to-top position; the target vector is on the top of
19881the stack. These vectors must have the same length. The result is
19882the same as the target vector, but with all elements which correspond
19883to zeros in the mask vector deleted. Thus, for example,
19884@samp{vmask([1, 0, 1, 0, 1], [a, b, c, d, e])} produces @samp{[a, c, e]}.
19885@xref{Logical Operations}.
19886
19887@kindex v e
19888@pindex calc-expand-vector
19889@tindex vexp
19890The @kbd{v e} (@code{calc-expand-vector}) [@code{vexp}] command
19891expands a vector according to another mask vector. The result is a
19892vector the same length as the mask, but with nonzero elements replaced
19893by successive elements from the target vector. The length of the target
19894vector is normally the number of nonzero elements in the mask. If the
19895target vector is longer, its last few elements are lost. If the target
19896vector is shorter, the last few nonzero mask elements are left
19897unreplaced in the result. Thus @samp{vexp([2, 0, 3, 0, 7], [a, b])}
19898produces @samp{[a, 0, b, 0, 7]}.
19899
19900@kindex H v e
19901With the Hyperbolic flag, @kbd{H v e} takes a filler value from the
19902top of the stack; the mask and target vectors come from the third and
19903second elements of the stack. This filler is used where the mask is
19904zero: @samp{vexp([2, 0, 3, 0, 7], [a, b], z)} produces
19905@samp{[a, z, c, z, 7]}. If the filler value is itself a vector,
19906then successive values are taken from it, so that the effect is to
19907interleave two vectors according to the mask:
19908@samp{vexp([2, 0, 3, 7, 0, 0], [a, b], [x, y])} produces
19909@samp{[a, x, b, 7, y, 0]}.
19910
19911Another variation on the masking idea is to combine @samp{[a, b, c, d, e]}
19912with the mask @samp{[1, 0, 1, 0, 1]} to produce @samp{[a, 0, c, 0, e]}.
19913You can accomplish this with @kbd{V M a &}, mapping the logical ``and''
19914operation across the two vectors. @xref{Logical Operations}. Note that
19915the @code{? :} operation also discussed there allows other types of
19916masking using vectors.
19917
19918@node Vector and Matrix Arithmetic, Set Operations, Manipulating Vectors, Matrix Functions
19919@section Vector and Matrix Arithmetic
19920
19921@noindent
19922Basic arithmetic operations like addition and multiplication are defined
19923for vectors and matrices as well as for numbers. Division of matrices, in
19924the sense of multiplying by the inverse, is supported. (Division by a
19925matrix actually uses LU-decomposition for greater accuracy and speed.)
19926@xref{Basic Arithmetic}.
19927
19928The following functions are applied element-wise if their arguments are
19929vectors or matrices: @code{change-sign}, @code{conj}, @code{arg},
19930@code{re}, @code{im}, @code{polar}, @code{rect}, @code{clean},
19931@code{float}, @code{frac}. @xref{Function Index}.
19932
19933@kindex V J
19934@pindex calc-conj-transpose
19935@tindex ctrn
19936The @kbd{V J} (@code{calc-conj-transpose}) [@code{ctrn}] command computes
19937the conjugate transpose of its argument, i.e., @samp{conj(trn(x))}.
19938
19939@ignore
19940@mindex A
19941@end ignore
19942@kindex A (vectors)
19943@pindex calc-abs (vectors)
19944@ignore
19945@mindex abs
19946@end ignore
19947@tindex abs (vectors)
19948The @kbd{A} (@code{calc-abs}) [@code{abs}] command computes the
19949Frobenius norm of a vector or matrix argument. This is the square
19950root of the sum of the squares of the absolute values of the
19951elements of the vector or matrix. If the vector is interpreted as
19952a point in two- or three-dimensional space, this is the distance
19953from that point to the origin.
19954
19955@kindex v n
19956@pindex calc-rnorm
19957@tindex rnorm
19958The @kbd{v n} (@code{calc-rnorm}) [@code{rnorm}] command computes
19959the row norm, or infinity-norm, of a vector or matrix. For a plain
19960vector, this is the maximum of the absolute values of the elements.
19961For a matrix, this is the maximum of the row-absolute-value-sums,
19962i.e., of the sums of the absolute values of the elements along the
19963various rows.
19964
19965@kindex V N
19966@pindex calc-cnorm
19967@tindex cnorm
19968The @kbd{V N} (@code{calc-cnorm}) [@code{cnorm}] command computes
19969the column norm, or one-norm, of a vector or matrix. For a plain
19970vector, this is the sum of the absolute values of the elements.
19971For a matrix, this is the maximum of the column-absolute-value-sums.
19972General @expr{k}-norms for @expr{k} other than one or infinity are
19973not provided.
19974
19975@kindex V C
19976@pindex calc-cross
19977@tindex cross
19978The @kbd{V C} (@code{calc-cross}) [@code{cross}] command computes the
19979right-handed cross product of two vectors, each of which must have
19980exactly three elements.
19981
19982@ignore
19983@mindex &
19984@end ignore
19985@kindex & (matrices)
19986@pindex calc-inv (matrices)
19987@ignore
19988@mindex inv
19989@end ignore
19990@tindex inv (matrices)
19991The @kbd{&} (@code{calc-inv}) [@code{inv}] command computes the
19992inverse of a square matrix. If the matrix is singular, the inverse
19993operation is left in symbolic form. Matrix inverses are recorded so
19994that once an inverse (or determinant) of a particular matrix has been
19995computed, the inverse and determinant of the matrix can be recomputed
19996quickly in the future.
19997
19998If the argument to @kbd{&} is a plain number @expr{x}, this
19999command simply computes @expr{1/x}. This is okay, because the
20000@samp{/} operator also does a matrix inversion when dividing one
20001by a matrix.
20002
20003@kindex V D
20004@pindex calc-mdet
20005@tindex det
20006The @kbd{V D} (@code{calc-mdet}) [@code{det}] command computes the
20007determinant of a square matrix.
20008
20009@kindex V L
20010@pindex calc-mlud
20011@tindex lud
20012The @kbd{V L} (@code{calc-mlud}) [@code{lud}] command computes the
20013LU decomposition of a matrix. The result is a list of three matrices
20014which, when multiplied together left-to-right, form the original matrix.
20015The first is a permutation matrix that arises from pivoting in the
20016algorithm, the second is lower-triangular with ones on the diagonal,
20017and the third is upper-triangular.
20018
20019@kindex V T
20020@pindex calc-mtrace
20021@tindex tr
20022The @kbd{V T} (@code{calc-mtrace}) [@code{tr}] command computes the
20023trace of a square matrix. This is defined as the sum of the diagonal
20024elements of the matrix.
20025
20026@node Set Operations, Statistical Operations, Vector and Matrix Arithmetic, Matrix Functions
20027@section Set Operations using Vectors
20028
20029@noindent
20030@cindex Sets, as vectors
20031Calc includes several commands which interpret vectors as @dfn{sets} of
20032objects. A set is a collection of objects; any given object can appear
20033only once in the set. Calc stores sets as vectors of objects in
20034sorted order. Objects in a Calc set can be any of the usual things,
20035such as numbers, variables, or formulas. Two set elements are considered
20036equal if they are identical, except that numerically equal numbers like
20037the integer 4 and the float 4.0 are considered equal even though they
20038are not ``identical.'' Variables are treated like plain symbols without
20039attached values by the set operations; subtracting the set @samp{[b]}
20040from @samp{[a, b]} always yields the set @samp{[a]} even though if
20041the variables @samp{a} and @samp{b} both equaled 17, you might
20042expect the answer @samp{[]}.
20043
20044If a set contains interval forms, then it is assumed to be a set of
20045real numbers. In this case, all set operations require the elements
20046of the set to be only things that are allowed in intervals: Real
20047numbers, plus and minus infinity, HMS forms, and date forms. If
20048there are variables or other non-real objects present in a real set,
20049all set operations on it will be left in unevaluated form.
20050
20051If the input to a set operation is a plain number or interval form
20052@var{a}, it is treated like the one-element vector @samp{[@var{a}]}.
20053The result is always a vector, except that if the set consists of a
20054single interval, the interval itself is returned instead.
20055
20056@xref{Logical Operations}, for the @code{in} function which tests if
20057a certain value is a member of a given set. To test if the set @expr{A}
20058is a subset of the set @expr{B}, use @samp{vdiff(A, B) = []}.
20059
20060@kindex V +
20061@pindex calc-remove-duplicates
20062@tindex rdup
20063The @kbd{V +} (@code{calc-remove-duplicates}) [@code{rdup}] command
20064converts an arbitrary vector into set notation. It works by sorting
20065the vector as if by @kbd{V S}, then removing duplicates. (For example,
20066@kbd{[a, 5, 4, a, 4.0]} is sorted to @samp{[4, 4.0, 5, a, a]} and then
20067reduced to @samp{[4, 5, a]}). Overlapping intervals are merged as
20068necessary. You rarely need to use @kbd{V +} explicitly, since all the
20069other set-based commands apply @kbd{V +} to their inputs before using
20070them.
20071
20072@kindex V V
20073@pindex calc-set-union
20074@tindex vunion
20075The @kbd{V V} (@code{calc-set-union}) [@code{vunion}] command computes
20076the union of two sets. An object is in the union of two sets if and
20077only if it is in either (or both) of the input sets. (You could
20078accomplish the same thing by concatenating the sets with @kbd{|},
20079then using @kbd{V +}.)
20080
20081@kindex V ^
20082@pindex calc-set-intersect
20083@tindex vint
20084The @kbd{V ^} (@code{calc-set-intersect}) [@code{vint}] command computes
20085the intersection of two sets. An object is in the intersection if
20086and only if it is in both of the input sets. Thus if the input
20087sets are disjoint, i.e., if they share no common elements, the result
20088will be the empty vector @samp{[]}. Note that the characters @kbd{V}
20089and @kbd{^} were chosen to be close to the conventional mathematical
20090notation for set
20091@texline union@tie{}(@math{A \cup B})
20092@infoline union
20093and
20094@texline intersection@tie{}(@math{A \cap B}).
20095@infoline intersection.
20096
20097@kindex V -
20098@pindex calc-set-difference
20099@tindex vdiff
20100The @kbd{V -} (@code{calc-set-difference}) [@code{vdiff}] command computes
20101the difference between two sets. An object is in the difference
20102@expr{A - B} if and only if it is in @expr{A} but not in @expr{B}.
20103Thus subtracting @samp{[y,z]} from a set will remove the elements
20104@samp{y} and @samp{z} if they are present. You can also think of this
20105as a general @dfn{set complement} operator; if @expr{A} is the set of
20106all possible values, then @expr{A - B} is the ``complement'' of @expr{B}.
20107Obviously this is only practical if the set of all possible values in
20108your problem is small enough to list in a Calc vector (or simple
20109enough to express in a few intervals).
20110
20111@kindex V X
20112@pindex calc-set-xor
20113@tindex vxor
20114The @kbd{V X} (@code{calc-set-xor}) [@code{vxor}] command computes
20115the ``exclusive-or,'' or ``symmetric difference'' of two sets.
20116An object is in the symmetric difference of two sets if and only
20117if it is in one, but @emph{not} both, of the sets. Objects that
20118occur in both sets ``cancel out.''
20119
20120@kindex V ~
20121@pindex calc-set-complement
20122@tindex vcompl
20123The @kbd{V ~} (@code{calc-set-complement}) [@code{vcompl}] command
20124computes the complement of a set with respect to the real numbers.
20125Thus @samp{vcompl(x)} is equivalent to @samp{vdiff([-inf .. inf], x)}.
20126For example, @samp{vcompl([2, (3 .. 4]])} evaluates to
20127@samp{[[-inf .. 2), (2 .. 3], (4 .. inf]]}.
20128
20129@kindex V F
20130@pindex calc-set-floor
20131@tindex vfloor
20132The @kbd{V F} (@code{calc-set-floor}) [@code{vfloor}] command
20133reinterprets a set as a set of integers. Any non-integer values,
20134and intervals that do not enclose any integers, are removed. Open
20135intervals are converted to equivalent closed intervals. Successive
20136integers are converted into intervals of integers. For example, the
20137complement of the set @samp{[2, 6, 7, 8]} is messy, but if you wanted
20138the complement with respect to the set of integers you could type
20139@kbd{V ~ V F} to get @samp{[[-inf .. 1], [3 .. 5], [9 .. inf]]}.
20140
20141@kindex V E
20142@pindex calc-set-enumerate
20143@tindex venum
20144The @kbd{V E} (@code{calc-set-enumerate}) [@code{venum}] command
20145converts a set of integers into an explicit vector. Intervals in
20146the set are expanded out to lists of all integers encompassed by
20147the intervals. This only works for finite sets (i.e., sets which
20148do not involve @samp{-inf} or @samp{inf}).
20149
20150@kindex V :
20151@pindex calc-set-span
20152@tindex vspan
20153The @kbd{V :} (@code{calc-set-span}) [@code{vspan}] command converts any
20154set of reals into an interval form that encompasses all its elements.
20155The lower limit will be the smallest element in the set; the upper
20156limit will be the largest element. For an empty set, @samp{vspan([])}
20157returns the empty interval @w{@samp{[0 .. 0)}}.
20158
20159@kindex V #
20160@pindex calc-set-cardinality
20161@tindex vcard
20162The @kbd{V #} (@code{calc-set-cardinality}) [@code{vcard}] command counts
20163the number of integers in a set. The result is the length of the vector
20164that would be produced by @kbd{V E}, although the computation is much
20165more efficient than actually producing that vector.
20166
20167@cindex Sets, as binary numbers
20168Another representation for sets that may be more appropriate in some
20169cases is binary numbers. If you are dealing with sets of integers
20170in the range 0 to 49, you can use a 50-bit binary number where a
20171particular bit is 1 if the corresponding element is in the set.
20172@xref{Binary Functions}, for a list of commands that operate on
20173binary numbers. Note that many of the above set operations have
20174direct equivalents in binary arithmetic: @kbd{b o} (@code{calc-or}),
20175@kbd{b a} (@code{calc-and}), @kbd{b d} (@code{calc-diff}),
20176@kbd{b x} (@code{calc-xor}), and @kbd{b n} (@code{calc-not}),
20177respectively. You can use whatever representation for sets is most
20178convenient to you.
20179
20180@kindex b p
20181@kindex b u
20182@pindex calc-pack-bits
20183@pindex calc-unpack-bits
20184@tindex vpack
20185@tindex vunpack
20186The @kbd{b u} (@code{calc-unpack-bits}) [@code{vunpack}] command
20187converts an integer that represents a set in binary into a set
20188in vector/interval notation. For example, @samp{vunpack(67)}
20189returns @samp{[[0 .. 1], 6]}. If the input is negative, the set
20190it represents is semi-infinite: @samp{vunpack(-4) = [2 .. inf)}.
20191Use @kbd{V E} afterwards to expand intervals to individual
20192values if you wish. Note that this command uses the @kbd{b}
20193(binary) prefix key.
20194
20195The @kbd{b p} (@code{calc-pack-bits}) [@code{vpack}] command
20196converts the other way, from a vector or interval representing
20197a set of nonnegative integers into a binary integer describing
20198the same set. The set may include positive infinity, but must
20199not include any negative numbers. The input is interpreted as a
20200set of integers in the sense of @kbd{V F} (@code{vfloor}). Beware
20201that a simple input like @samp{[100]} can result in a huge integer
20202representation
20203@texline (@math{2^{100}}, a 31-digit integer, in this case).
20204@infoline (@expr{2^100}, a 31-digit integer, in this case).
20205
20206@node Statistical Operations, Reducing and Mapping, Set Operations, Matrix Functions
20207@section Statistical Operations on Vectors
20208
20209@noindent
20210@cindex Statistical functions
20211The commands in this section take vectors as arguments and compute
20212various statistical measures on the data stored in the vectors. The
20213references used in the definitions of these functions are Bevington's
20214@emph{Data Reduction and Error Analysis for the Physical Sciences},
20215and @emph{Numerical Recipes} by Press, Flannery, Teukolsky and
20216Vetterling.
20217
20218The statistical commands use the @kbd{u} prefix key followed by
20219a shifted letter or other character.
20220
20221@xref{Manipulating Vectors}, for a description of @kbd{V H}
20222(@code{calc-histogram}).
20223
20224@xref{Curve Fitting}, for the @kbd{a F} command for doing
20225least-squares fits to statistical data.
20226
20227@xref{Probability Distribution Functions}, for several common
20228probability distribution functions.
20229
20230@menu
20231* Single-Variable Statistics::
20232* Paired-Sample Statistics::
20233@end menu
20234
20235@node Single-Variable Statistics, Paired-Sample Statistics, Statistical Operations, Statistical Operations
20236@subsection Single-Variable Statistics
20237
20238@noindent
20239These functions do various statistical computations on single
20240vectors. Given a numeric prefix argument, they actually pop
20241@var{n} objects from the stack and combine them into a data
20242vector. Each object may be either a number or a vector; if a
20243vector, any sub-vectors inside it are ``flattened'' as if by
20244@kbd{v a 0}; @pxref{Manipulating Vectors}. By default one object
20245is popped, which (in order to be useful) is usually a vector.
20246
20247If an argument is a variable name, and the value stored in that
20248variable is a vector, then the stored vector is used. This method
20249has the advantage that if your data vector is large, you can avoid
20250the slow process of manipulating it directly on the stack.
20251
20252These functions are left in symbolic form if any of their arguments
20253are not numbers or vectors, e.g., if an argument is a formula, or
20254a non-vector variable. However, formulas embedded within vector
20255arguments are accepted; the result is a symbolic representation
20256of the computation, based on the assumption that the formula does
20257not itself represent a vector. All varieties of numbers such as
20258error forms and interval forms are acceptable.
20259
20260Some of the functions in this section also accept a single error form
20261or interval as an argument. They then describe a property of the
20262normal or uniform (respectively) statistical distribution described
20263by the argument. The arguments are interpreted in the same way as
20264the @var{M} argument of the random number function @kbd{k r}. In
20265particular, an interval with integer limits is considered an integer
20266distribution, so that @samp{[2 .. 6)} is the same as @samp{[2 .. 5]}.
20267An interval with at least one floating-point limit is a continuous
20268distribution: @samp{[2.0 .. 6.0)} is @emph{not} the same as
20269@samp{[2.0 .. 5.0]}!
20270
20271@kindex u #
20272@pindex calc-vector-count
20273@tindex vcount
20274The @kbd{u #} (@code{calc-vector-count}) [@code{vcount}] command
20275computes the number of data values represented by the inputs.
20276For example, @samp{vcount(1, [2, 3], [[4, 5], [], x, y])} returns 7.
20277If the argument is a single vector with no sub-vectors, this
20278simply computes the length of the vector.
20279
20280@kindex u +
20281@kindex u *
20282@pindex calc-vector-sum
20283@pindex calc-vector-prod
20284@tindex vsum
20285@tindex vprod
20286@cindex Summations (statistical)
20287The @kbd{u +} (@code{calc-vector-sum}) [@code{vsum}] command
20288computes the sum of the data values. The @kbd{u *}
20289(@code{calc-vector-prod}) [@code{vprod}] command computes the
20290product of the data values. If the input is a single flat vector,
20291these are the same as @kbd{V R +} and @kbd{V R *}
20292(@pxref{Reducing and Mapping}).
20293
20294@kindex u X
20295@kindex u N
20296@pindex calc-vector-max
20297@pindex calc-vector-min
20298@tindex vmax
20299@tindex vmin
20300The @kbd{u X} (@code{calc-vector-max}) [@code{vmax}] command
20301computes the maximum of the data values, and the @kbd{u N}
20302(@code{calc-vector-min}) [@code{vmin}] command computes the minimum.
20303If the argument is an interval, this finds the minimum or maximum
20304value in the interval. (Note that @samp{vmax([2..6)) = 5} as
20305described above.) If the argument is an error form, this returns
20306plus or minus infinity.
20307
20308@kindex u M
20309@pindex calc-vector-mean
20310@tindex vmean
20311@cindex Mean of data values
20312The @kbd{u M} (@code{calc-vector-mean}) [@code{vmean}] command
20313computes the average (arithmetic mean) of the data values.
20314If the inputs are error forms
20315@texline @math{x \pm \sigma},
20316@infoline @samp{x +/- s},
20317this is the weighted mean of the @expr{x} values with weights
20318@texline @math{1 /\sigma^2}.
20319@infoline @expr{1 / s^2}.
20320@tex
20321\turnoffactive
20322$$ \mu = { \displaystyle \sum { x_i \over \sigma_i^2 } \over
20323 \displaystyle \sum { 1 \over \sigma_i^2 } } $$
20324@end tex
20325If the inputs are not error forms, this is simply the sum of the
20326values divided by the count of the values.
20327
20328Note that a plain number can be considered an error form with
20329error
20330@texline @math{\sigma = 0}.
20331@infoline @expr{s = 0}.
20332If the input to @kbd{u M} is a mixture of
20333plain numbers and error forms, the result is the mean of the
20334plain numbers, ignoring all values with non-zero errors. (By the
20335above definitions it's clear that a plain number effectively
20336has an infinite weight, next to which an error form with a finite
20337weight is completely negligible.)
20338
20339This function also works for distributions (error forms or
20340intervals). The mean of an error form `@var{a} @tfn{+/-} @var{b}' is simply
20341@expr{a}. The mean of an interval is the mean of the minimum
20342and maximum values of the interval.
20343
20344@kindex I u M
20345@pindex calc-vector-mean-error
20346@tindex vmeane
20347The @kbd{I u M} (@code{calc-vector-mean-error}) [@code{vmeane}]
20348command computes the mean of the data points expressed as an
20349error form. This includes the estimated error associated with
20350the mean. If the inputs are error forms, the error is the square
20351root of the reciprocal of the sum of the reciprocals of the squares
20352of the input errors. (I.e., the variance is the reciprocal of the
20353sum of the reciprocals of the variances.)
20354@tex
20355\turnoffactive
20356$$ \sigma_\mu^2 = {1 \over \displaystyle \sum {1 \over \sigma_i^2}} $$
20357@end tex
20358If the inputs are plain
20359numbers, the error is equal to the standard deviation of the values
20360divided by the square root of the number of values. (This works
20361out to be equivalent to calculating the standard deviation and
20362then assuming each value's error is equal to this standard
20363deviation.)
20364@tex
20365\turnoffactive
20366$$ \sigma_\mu^2 = {\sigma^2 \over N} $$
20367@end tex
20368
20369@kindex H u M
20370@pindex calc-vector-median
20371@tindex vmedian
20372@cindex Median of data values
20373The @kbd{H u M} (@code{calc-vector-median}) [@code{vmedian}]
20374command computes the median of the data values. The values are
20375first sorted into numerical order; the median is the middle
20376value after sorting. (If the number of data values is even,
20377the median is taken to be the average of the two middle values.)
20378The median function is different from the other functions in
20379this section in that the arguments must all be real numbers;
20380variables are not accepted even when nested inside vectors.
20381(Otherwise it is not possible to sort the data values.) If
20382any of the input values are error forms, their error parts are
20383ignored.
20384
20385The median function also accepts distributions. For both normal
20386(error form) and uniform (interval) distributions, the median is
20387the same as the mean.
20388
20389@kindex H I u M
20390@pindex calc-vector-harmonic-mean
20391@tindex vhmean
20392@cindex Harmonic mean
20393The @kbd{H I u M} (@code{calc-vector-harmonic-mean}) [@code{vhmean}]
20394command computes the harmonic mean of the data values. This is
20395defined as the reciprocal of the arithmetic mean of the reciprocals
20396of the values.
20397@tex
20398\turnoffactive
20399$$ { N \over \displaystyle \sum {1 \over x_i} } $$
20400@end tex
20401
20402@kindex u G
20403@pindex calc-vector-geometric-mean
20404@tindex vgmean
20405@cindex Geometric mean
20406The @kbd{u G} (@code{calc-vector-geometric-mean}) [@code{vgmean}]
20407command computes the geometric mean of the data values. This
20408is the @var{n}th root of the product of the values. This is also
20409equal to the @code{exp} of the arithmetic mean of the logarithms
20410of the data values.
20411@tex
20412\turnoffactive
20413$$ \exp \left ( \sum { \ln x_i } \right ) =
20414 \left ( \prod { x_i } \right)^{1 / N} $$
20415@end tex
20416
20417@kindex H u G
20418@tindex agmean
20419The @kbd{H u G} [@code{agmean}] command computes the ``arithmetic-geometric
20420mean'' of two numbers taken from the stack. This is computed by
20421replacing the two numbers with their arithmetic mean and geometric
20422mean, then repeating until the two values converge.
20423@tex
20424\turnoffactive
20425$$ a_{i+1} = { a_i + b_i \over 2 } , \qquad b_{i+1} = \sqrt{a_i b_i} $$
20426@end tex
20427
20428@cindex Root-mean-square
20429Another commonly used mean, the RMS (root-mean-square), can be computed
20430for a vector of numbers simply by using the @kbd{A} command.
20431
20432@kindex u S
20433@pindex calc-vector-sdev
20434@tindex vsdev
20435@cindex Standard deviation
20436@cindex Sample statistics
20437The @kbd{u S} (@code{calc-vector-sdev}) [@code{vsdev}] command
20438computes the standard
20439@texline deviation@tie{}@math{\sigma}
20440@infoline deviation
20441of the data values. If the values are error forms, the errors are used
20442as weights just as for @kbd{u M}. This is the @emph{sample} standard
20443deviation, whose value is the square root of the sum of the squares of
20444the differences between the values and the mean of the @expr{N} values,
20445divided by @expr{N-1}.
20446@tex
20447\turnoffactive
20448$$ \sigma^2 = {1 \over N - 1} \sum (x_i - \mu)^2 $$
20449@end tex
20450
20451This function also applies to distributions. The standard deviation
20452of a single error form is simply the error part. The standard deviation
20453of a continuous interval happens to equal the difference between the
20454limits, divided by
20455@texline @math{\sqrt{12}}.
20456@infoline @expr{sqrt(12)}.
20457The standard deviation of an integer interval is the same as the
20458standard deviation of a vector of those integers.
20459
20460@kindex I u S
20461@pindex calc-vector-pop-sdev
20462@tindex vpsdev
20463@cindex Population statistics
20464The @kbd{I u S} (@code{calc-vector-pop-sdev}) [@code{vpsdev}]
20465command computes the @emph{population} standard deviation.
20466It is defined by the same formula as above but dividing
20467by @expr{N} instead of by @expr{N-1}. The population standard
20468deviation is used when the input represents the entire set of
20469data values in the distribution; the sample standard deviation
20470is used when the input represents a sample of the set of all
20471data values, so that the mean computed from the input is itself
20472only an estimate of the true mean.
20473@tex
20474\turnoffactive
20475$$ \sigma^2 = {1 \over N} \sum (x_i - \mu)^2 $$
20476@end tex
20477
20478For error forms and continuous intervals, @code{vpsdev} works
20479exactly like @code{vsdev}. For integer intervals, it computes the
20480population standard deviation of the equivalent vector of integers.
20481
20482@kindex H u S
20483@kindex H I u S
20484@pindex calc-vector-variance
20485@pindex calc-vector-pop-variance
20486@tindex vvar
20487@tindex vpvar
20488@cindex Variance of data values
20489The @kbd{H u S} (@code{calc-vector-variance}) [@code{vvar}] and
20490@kbd{H I u S} (@code{calc-vector-pop-variance}) [@code{vpvar}]
20491commands compute the variance of the data values. The variance
20492is the
20493@texline square@tie{}@math{\sigma^2}
20494@infoline square
20495of the standard deviation, i.e., the sum of the
20496squares of the deviations of the data values from the mean.
20497(This definition also applies when the argument is a distribution.)
20498
20499@ignore
20500@starindex
20501@end ignore
20502@tindex vflat
20503The @code{vflat} algebraic function returns a vector of its
20504arguments, interpreted in the same way as the other functions
20505in this section. For example, @samp{vflat(1, [2, [3, 4]], 5)}
20506returns @samp{[1, 2, 3, 4, 5]}.
20507
20508@node Paired-Sample Statistics, , Single-Variable Statistics, Statistical Operations
20509@subsection Paired-Sample Statistics
20510
20511@noindent
20512The functions in this section take two arguments, which must be
20513vectors of equal size. The vectors are each flattened in the same
20514way as by the single-variable statistical functions. Given a numeric
20515prefix argument of 1, these functions instead take one object from
20516the stack, which must be an
20517@texline @math{N\times2}
20518@infoline Nx2
20519matrix of data values. Once again, variable names can be used in place
20520of actual vectors and matrices.
20521
20522@kindex u C
20523@pindex calc-vector-covariance
20524@tindex vcov
20525@cindex Covariance
20526The @kbd{u C} (@code{calc-vector-covariance}) [@code{vcov}] command
20527computes the sample covariance of two vectors. The covariance
20528of vectors @var{x} and @var{y} is the sum of the products of the
20529differences between the elements of @var{x} and the mean of @var{x}
20530times the differences between the corresponding elements of @var{y}
20531and the mean of @var{y}, all divided by @expr{N-1}. Note that
20532the variance of a vector is just the covariance of the vector
20533with itself. Once again, if the inputs are error forms the
20534errors are used as weight factors. If both @var{x} and @var{y}
20535are composed of error forms, the error for a given data point
20536is taken as the square root of the sum of the squares of the two
20537input errors.
20538@tex
20539\turnoffactive
20540$$ \sigma_{x\!y}^2 = {1 \over N-1} \sum (x_i - \mu_x) (y_i - \mu_y) $$
20541$$ \sigma_{x\!y}^2 =
20542 {\displaystyle {1 \over N-1}
20543 \sum {(x_i - \mu_x) (y_i - \mu_y) \over \sigma_i^2}
20544 \over \displaystyle {1 \over N} \sum {1 \over \sigma_i^2}}
20545$$
20546@end tex
20547
20548@kindex I u C
20549@pindex calc-vector-pop-covariance
20550@tindex vpcov
20551The @kbd{I u C} (@code{calc-vector-pop-covariance}) [@code{vpcov}]
20552command computes the population covariance, which is the same as the
20553sample covariance computed by @kbd{u C} except dividing by @expr{N}
20554instead of @expr{N-1}.
20555
20556@kindex H u C
20557@pindex calc-vector-correlation
20558@tindex vcorr
20559@cindex Correlation coefficient
20560@cindex Linear correlation
20561The @kbd{H u C} (@code{calc-vector-correlation}) [@code{vcorr}]
20562command computes the linear correlation coefficient of two vectors.
20563This is defined by the covariance of the vectors divided by the
20564product of their standard deviations. (There is no difference
20565between sample or population statistics here.)
20566@tex
20567\turnoffactive
20568$$ r_{x\!y} = { \sigma_{x\!y}^2 \over \sigma_x^2 \sigma_y^2 } $$
20569@end tex
20570
20571@node Reducing and Mapping, Vector and Matrix Formats, Statistical Operations, Matrix Functions
20572@section Reducing and Mapping Vectors
20573
20574@noindent
20575The commands in this section allow for more general operations on the
20576elements of vectors.
20577
20578@kindex V A
20579@pindex calc-apply
20580@tindex apply
20581The simplest of these operations is @kbd{V A} (@code{calc-apply})
20582[@code{apply}], which applies a given operator to the elements of a vector.
20583For example, applying the hypothetical function @code{f} to the vector
20584@w{@samp{[1, 2, 3]}} would produce the function call @samp{f(1, 2, 3)}.
20585Applying the @code{+} function to the vector @samp{[a, b]} gives
20586@samp{a + b}. Applying @code{+} to the vector @samp{[a, b, c]} is an
20587error, since the @code{+} function expects exactly two arguments.
20588
20589While @kbd{V A} is useful in some cases, you will usually find that either
20590@kbd{V R} or @kbd{V M}, described below, is closer to what you want.
20591
20592@menu
20593* Specifying Operators::
20594* Mapping::
20595* Reducing::
20596* Nesting and Fixed Points::
20597* Generalized Products::
20598@end menu
20599
20600@node Specifying Operators, Mapping, Reducing and Mapping, Reducing and Mapping
20601@subsection Specifying Operators
20602
20603@noindent
20604Commands in this section (like @kbd{V A}) prompt you to press the key
20605corresponding to the desired operator. Press @kbd{?} for a partial
20606list of the available operators. Generally, an operator is any key or
20607sequence of keys that would normally take one or more arguments from
20608the stack and replace them with a result. For example, @kbd{V A H C}
20609uses the hyperbolic cosine operator, @code{cosh}. (Since @code{cosh}
20610expects one argument, @kbd{V A H C} requires a vector with a single
20611element as its argument.)
20612
20613You can press @kbd{x} at the operator prompt to select any algebraic
20614function by name to use as the operator. This includes functions you
20615have defined yourself using the @kbd{Z F} command. (@xref{Algebraic
20616Definitions}.) If you give a name for which no function has been
20617defined, the result is left in symbolic form, as in @samp{f(1, 2, 3)}.
20618Calc will prompt for the number of arguments the function takes if it
20619can't figure it out on its own (say, because you named a function that
20620is currently undefined). It is also possible to type a digit key before
20621the function name to specify the number of arguments, e.g.,
20622@kbd{V M 3 x f @key{RET}} calls @code{f} with three arguments even if it
20623looks like it ought to have only two. This technique may be necessary
20624if the function allows a variable number of arguments. For example,
20625the @kbd{v e} [@code{vexp}] function accepts two or three arguments;
20626if you want to map with the three-argument version, you will have to
20627type @kbd{V M 3 v e}.
20628
20629It is also possible to apply any formula to a vector by treating that
20630formula as a function. When prompted for the operator to use, press
20631@kbd{'} (the apostrophe) and type your formula as an algebraic entry.
20632You will then be prompted for the argument list, which defaults to a
20633list of all variables that appear in the formula, sorted into alphabetic
20634order. For example, suppose you enter the formula @w{@samp{x + 2y^x}}.
20635The default argument list would be @samp{(x y)}, which means that if
20636this function is applied to the arguments @samp{[3, 10]} the result will
20637be @samp{3 + 2*10^3}. (If you plan to use a certain formula in this
20638way often, you might consider defining it as a function with @kbd{Z F}.)
20639
20640Another way to specify the arguments to the formula you enter is with
20641@kbd{$}, @kbd{$$}, and so on. For example, @kbd{V A ' $$ + 2$^$$}
20642has the same effect as the previous example. The argument list is
20643automatically taken to be @samp{($$ $)}. (The order of the arguments
20644may seem backwards, but it is analogous to the way normal algebraic
20645entry interacts with the stack.)
20646
20647If you press @kbd{$} at the operator prompt, the effect is similar to
20648the apostrophe except that the relevant formula is taken from top-of-stack
20649instead. The actual vector arguments of the @kbd{V A $} or related command
20650then start at the second-to-top stack position. You will still be
20651prompted for an argument list.
20652
20653@cindex Nameless functions
20654@cindex Generic functions
20655A function can be written without a name using the notation @samp{<#1 - #2>},
20656which means ``a function of two arguments that computes the first
20657argument minus the second argument.'' The symbols @samp{#1} and @samp{#2}
20658are placeholders for the arguments. You can use any names for these
20659placeholders if you wish, by including an argument list followed by a
20660colon: @samp{<x, y : x - y>}. When you type @kbd{V A ' $$ + 2$^$$ @key{RET}},
20661Calc builds the nameless function @samp{<#1 + 2 #2^#1>} as the function
20662to map across the vectors. When you type @kbd{V A ' x + 2y^x @key{RET} @key{RET}},
20663Calc builds the nameless function @w{@samp{<x, y : x + 2 y^x>}}. In both
20664cases, Calc also writes the nameless function to the Trail so that you
20665can get it back later if you wish.
20666
20667If there is only one argument, you can write @samp{#} in place of @samp{#1}.
20668(Note that @samp{< >} notation is also used for date forms. Calc tells
20669that @samp{<@var{stuff}>} is a nameless function by the presence of
20670@samp{#} signs inside @var{stuff}, or by the fact that @var{stuff}
20671begins with a list of variables followed by a colon.)
20672
20673You can type a nameless function directly to @kbd{V A '}, or put one on
20674the stack and use it with @w{@kbd{V A $}}. Calc will not prompt for an
20675argument list in this case, since the nameless function specifies the
20676argument list as well as the function itself. In @kbd{V A '}, you can
20677omit the @samp{< >} marks if you use @samp{#} notation for the arguments,
20678so that @kbd{V A ' #1+#2 @key{RET}} is the same as @kbd{V A ' <#1+#2> @key{RET}},
20679which in turn is the same as @kbd{V A ' $$+$ @key{RET}}.
20680
20681@cindex Lambda expressions
20682@ignore
20683@starindex
20684@end ignore
20685@tindex lambda
20686The internal format for @samp{<x, y : x + y>} is @samp{lambda(x, y, x + y)}.
20687(The word @code{lambda} derives from Lisp notation and the theory of
20688functions.) The internal format for @samp{<#1 + #2>} is @samp{lambda(ArgA,
20689ArgB, ArgA + ArgB)}. Note that there is no actual Calc function called
20690@code{lambda}; the whole point is that the @code{lambda} expression is
20691used in its symbolic form, not evaluated for an answer until it is applied
20692to specific arguments by a command like @kbd{V A} or @kbd{V M}.
20693
20694(Actually, @code{lambda} does have one special property: Its arguments
20695are never evaluated; for example, putting @samp{<(2/3) #>} on the stack
20696will not simplify the @samp{2/3} until the nameless function is actually
20697called.)
20698
20699@tindex add
20700@tindex sub
20701@ignore
20702@mindex @idots
20703@end ignore
20704@tindex mul
20705@ignore
20706@mindex @null
20707@end ignore
20708@tindex div
20709@ignore
20710@mindex @null
20711@end ignore
20712@tindex pow
20713@ignore
20714@mindex @null
20715@end ignore
20716@tindex neg
20717@ignore
20718@mindex @null
20719@end ignore
20720@tindex mod
20721@ignore
20722@mindex @null
20723@end ignore
20724@tindex vconcat
20725As usual, commands like @kbd{V A} have algebraic function name equivalents.
20726For example, @kbd{V A k g} with an argument of @samp{v} is equivalent to
20727@samp{apply(gcd, v)}. The first argument specifies the operator name,
20728and is either a variable whose name is the same as the function name,
20729or a nameless function like @samp{<#^3+1>}. Operators that are normally
20730written as algebraic symbols have the names @code{add}, @code{sub},
20731@code{mul}, @code{div}, @code{pow}, @code{neg}, @code{mod}, and
20732@code{vconcat}.
20733
20734@ignore
20735@starindex
20736@end ignore
20737@tindex call
20738The @code{call} function builds a function call out of several arguments:
20739@samp{call(gcd, x, y)} is the same as @samp{apply(gcd, [x, y])}, which
20740in turn is the same as @samp{gcd(x, y)}. The first argument of @code{call},
20741like the other functions described here, may be either a variable naming a
20742function, or a nameless function (@samp{call(<#1+2#2>, x, y)} is the same
20743as @samp{x + 2y}).
20744
20745(Experts will notice that it's not quite proper to use a variable to name
20746a function, since the name @code{gcd} corresponds to the Lisp variable
20747@code{var-gcd} but to the Lisp function @code{calcFunc-gcd}. Calc
20748automatically makes this translation, so you don't have to worry
20749about it.)
20750
20751@node Mapping, Reducing, Specifying Operators, Reducing and Mapping
20752@subsection Mapping
20753
20754@noindent
20755@kindex V M
20756@pindex calc-map
20757@tindex map
20758The @kbd{V M} (@code{calc-map}) [@code{map}] command applies a given
20759operator elementwise to one or more vectors. For example, mapping
20760@code{A} [@code{abs}] produces a vector of the absolute values of the
20761elements in the input vector. Mapping @code{+} pops two vectors from
20762the stack, which must be of equal length, and produces a vector of the
20763pairwise sums of the elements. If either argument is a non-vector, it
20764is duplicated for each element of the other vector. For example,
20765@kbd{[1,2,3] 2 V M ^} squares the elements of the specified vector.
20766With the 2 listed first, it would have computed a vector of powers of
20767two. Mapping a user-defined function pops as many arguments from the
20768stack as the function requires. If you give an undefined name, you will
20769be prompted for the number of arguments to use.
20770
20771If any argument to @kbd{V M} is a matrix, the operator is normally mapped
20772across all elements of the matrix. For example, given the matrix
20773@expr{[[1, -2, 3], [-4, 5, -6]]}, @kbd{V M A} takes six absolute values to
20774produce another
20775@texline @math{3\times2}
20776@infoline 3x2
20777matrix, @expr{[[1, 2, 3], [4, 5, 6]]}.
20778
20779@tindex mapr
20780The command @kbd{V M _} [@code{mapr}] (i.e., type an underscore at the
20781operator prompt) maps by rows instead. For example, @kbd{V M _ A} views
20782the above matrix as a vector of two 3-element row vectors. It produces
20783a new vector which contains the absolute values of those row vectors,
20784namely @expr{[3.74, 8.77]}. (Recall, the absolute value of a vector is
20785defined as the square root of the sum of the squares of the elements.)
20786Some operators accept vectors and return new vectors; for example,
20787@kbd{v v} reverses a vector, so @kbd{V M _ v v} would reverse each row
20788of the matrix to get a new matrix, @expr{[[3, -2, 1], [-6, 5, -4]]}.
20789
20790Sometimes a vector of vectors (representing, say, strings, sets, or lists)
20791happens to look like a matrix. If so, remember to use @kbd{V M _} if you
20792want to map a function across the whole strings or sets rather than across
20793their individual elements.
20794
20795@tindex mapc
20796The command @kbd{V M :} [@code{mapc}] maps by columns. Basically, it
20797transposes the input matrix, maps by rows, and then, if the result is a
20798matrix, transposes again. For example, @kbd{V M : A} takes the absolute
20799values of the three columns of the matrix, treating each as a 2-vector,
20800and @kbd{V M : v v} reverses the columns to get the matrix
20801@expr{[[-4, 5, -6], [1, -2, 3]]}.
20802
20803(The symbols @kbd{_} and @kbd{:} were chosen because they had row-like
20804and column-like appearances, and were not already taken by useful
20805operators. Also, they appear shifted on most keyboards so they are easy
20806to type after @kbd{V M}.)
20807
20808The @kbd{_} and @kbd{:} modifiers have no effect on arguments that are
20809not matrices (so if none of the arguments are matrices, they have no
20810effect at all). If some of the arguments are matrices and others are
20811plain numbers, the plain numbers are held constant for all rows of the
20812matrix (so that @kbd{2 V M _ ^} squares every row of a matrix; squaring
20813a vector takes a dot product of the vector with itself).
20814
20815If some of the arguments are vectors with the same lengths as the
20816rows (for @kbd{V M _}) or columns (for @kbd{V M :}) of the matrix
20817arguments, those vectors are also held constant for every row or
20818column.
20819
20820Sometimes it is useful to specify another mapping command as the operator
20821to use with @kbd{V M}. For example, @kbd{V M _ V A +} applies @kbd{V A +}
20822to each row of the input matrix, which in turn adds the two values on that
20823row. If you give another vector-operator command as the operator for
20824@kbd{V M}, it automatically uses map-by-rows mode if you don't specify
20825otherwise; thus @kbd{V M V A +} is equivalent to @kbd{V M _ V A +}. (If
20826you really want to map-by-elements another mapping command, you can use
20827a triple-nested mapping command: @kbd{V M V M V A +} means to map
20828@kbd{V M V A +} over the rows of the matrix; in turn, @kbd{V A +} is
20829mapped over the elements of each row.)
20830
20831@tindex mapa
20832@tindex mapd
20833Previous versions of Calc had ``map across'' and ``map down'' modes
20834that are now considered obsolete; the old ``map across'' is now simply
20835@kbd{V M V A}, and ``map down'' is now @kbd{V M : V A}. The algebraic
20836functions @code{mapa} and @code{mapd} are still supported, though.
20837Note also that, while the old mapping modes were persistent (once you
20838set the mode, it would apply to later mapping commands until you reset
20839it), the new @kbd{:} and @kbd{_} modifiers apply only to the current
20840mapping command. The default @kbd{V M} always means map-by-elements.
20841
20842@xref{Algebraic Manipulation}, for the @kbd{a M} command, which is like
20843@kbd{V M} but for equations and inequalities instead of vectors.
20844@xref{Storing Variables}, for the @kbd{s m} command which modifies a
20845variable's stored value using a @kbd{V M}-like operator.
20846
20847@node Reducing, Nesting and Fixed Points, Mapping, Reducing and Mapping
20848@subsection Reducing
20849
20850@noindent
20851@kindex V R
20852@pindex calc-reduce
20853@tindex reduce
20854The @kbd{V R} (@code{calc-reduce}) [@code{reduce}] command applies a given
20855binary operator across all the elements of a vector. A binary operator is
20856a function such as @code{+} or @code{max} which takes two arguments. For
20857example, reducing @code{+} over a vector computes the sum of the elements
20858of the vector. Reducing @code{-} computes the first element minus each of
20859the remaining elements. Reducing @code{max} computes the maximum element
20860and so on. In general, reducing @code{f} over the vector @samp{[a, b, c, d]}
20861produces @samp{f(f(f(a, b), c), d)}.
20862
20863@kindex I V R
20864@tindex rreduce
20865The @kbd{I V R} [@code{rreduce}] command is similar to @kbd{V R} except
20866that works from right to left through the vector. For example, plain
20867@kbd{V R -} on the vector @samp{[a, b, c, d]} produces @samp{a - b - c - d}
20868but @kbd{I V R -} on the same vector produces @samp{a - (b - (c - d))},
20869or @samp{a - b + c - d}. This ``alternating sum'' occurs frequently
20870in power series expansions.
20871
20872@kindex V U
20873@tindex accum
20874The @kbd{V U} (@code{calc-accumulate}) [@code{accum}] command does an
20875accumulation operation. Here Calc does the corresponding reduction
20876operation, but instead of producing only the final result, it produces
20877a vector of all the intermediate results. Accumulating @code{+} over
20878the vector @samp{[a, b, c, d]} produces the vector
20879@samp{[a, a + b, a + b + c, a + b + c + d]}.
20880
20881@kindex I V U
20882@tindex raccum
20883The @kbd{I V U} [@code{raccum}] command does a right-to-left accumulation.
20884For example, @kbd{I V U -} on the vector @samp{[a, b, c, d]} produces the
20885vector @samp{[a - b + c - d, b - c + d, c - d, d]}.
20886
20887@tindex reducea
20888@tindex rreducea
20889@tindex reduced
20890@tindex rreduced
20891As for @kbd{V M}, @kbd{V R} normally reduces a matrix elementwise. For
20892example, given the matrix @expr{[[a, b, c], [d, e, f]]}, @kbd{V R +} will
20893compute @expr{a + b + c + d + e + f}. You can type @kbd{V R _} or
20894@kbd{V R :} to modify this behavior. The @kbd{V R _} [@code{reducea}]
20895command reduces ``across'' the matrix; it reduces each row of the matrix
20896as a vector, then collects the results. Thus @kbd{V R _ +} of this
20897matrix would produce @expr{[a + b + c, d + e + f]}. Similarly, @kbd{V R :}
20898[@code{reduced}] reduces down; @kbd{V R : +} would produce @expr{[a + d,
20899b + e, c + f]}.
20900
20901@tindex reducer
20902@tindex rreducer
20903There is a third ``by rows'' mode for reduction that is occasionally
20904useful; @kbd{V R =} [@code{reducer}] simply reduces the operator over
20905the rows of the matrix themselves. Thus @kbd{V R = +} on the above
20906matrix would get the same result as @kbd{V R : +}, since adding two
20907row vectors is equivalent to adding their elements. But @kbd{V R = *}
20908would multiply the two rows (to get a single number, their dot product),
20909while @kbd{V R : *} would produce a vector of the products of the columns.
20910
20911These three matrix reduction modes work with @kbd{V R} and @kbd{I V R},
20912but they are not currently supported with @kbd{V U} or @kbd{I V U}.
20913
20914@tindex reducec
20915@tindex rreducec
20916The obsolete reduce-by-columns function, @code{reducec}, is still
20917supported but there is no way to get it through the @kbd{V R} command.
20918
20919The commands @kbd{C-x * :} and @kbd{C-x * _} are equivalent to typing
20920@kbd{C-x * r} to grab a rectangle of data into Calc, and then typing
20921@kbd{V R : +} or @kbd{V R _ +}, respectively, to sum the columns or
20922rows of the matrix. @xref{Grabbing From Buffers}.
20923
20924@node Nesting and Fixed Points, Generalized Products, Reducing, Reducing and Mapping
20925@subsection Nesting and Fixed Points
20926
20927@noindent
20928@kindex H V R
20929@tindex nest
20930The @kbd{H V R} [@code{nest}] command applies a function to a given
20931argument repeatedly. It takes two values, @samp{a} and @samp{n}, from
20932the stack, where @samp{n} must be an integer. It then applies the
20933function nested @samp{n} times; if the function is @samp{f} and @samp{n}
20934is 3, the result is @samp{f(f(f(a)))}. The number @samp{n} may be
20935negative if Calc knows an inverse for the function @samp{f}; for
20936example, @samp{nest(sin, a, -2)} returns @samp{arcsin(arcsin(a))}.
20937
20938@kindex H V U
20939@tindex anest
20940The @kbd{H V U} [@code{anest}] command is an accumulating version of
20941@code{nest}: It returns a vector of @samp{n+1} values, e.g.,
20942@samp{[a, f(a), f(f(a)), f(f(f(a)))]}. If @samp{n} is negative and
20943@samp{F} is the inverse of @samp{f}, then the result is of the
20944form @samp{[a, F(a), F(F(a)), F(F(F(a)))]}.
20945
20946@kindex H I V R
20947@tindex fixp
20948@cindex Fixed points
20949The @kbd{H I V R} [@code{fixp}] command is like @kbd{H V R}, except
20950that it takes only an @samp{a} value from the stack; the function is
20951applied until it reaches a ``fixed point,'' i.e., until the result
20952no longer changes.
20953
20954@kindex H I V U
20955@tindex afixp
20956The @kbd{H I V U} [@code{afixp}] command is an accumulating @code{fixp}.
20957The first element of the return vector will be the initial value @samp{a};
20958the last element will be the final result that would have been returned
20959by @code{fixp}.
20960
20961For example, 0.739085 is a fixed point of the cosine function (in radians):
20962@samp{cos(0.739085) = 0.739085}. You can find this value by putting, say,
209631.0 on the stack and typing @kbd{H I V U C}. (We use the accumulating
20964version so we can see the intermediate results: @samp{[1, 0.540302, 0.857553,
209650.65329, ...]}. With a precision of six, this command will take 36 steps
20966to converge to 0.739085.)
20967
20968Newton's method for finding roots is a classic example of iteration
20969to a fixed point. To find the square root of five starting with an
20970initial guess, Newton's method would look for a fixed point of the
20971function @samp{(x + 5/x) / 2}. Putting a guess of 1 on the stack
20972and typing @kbd{H I V R ' ($ + 5/$)/2 @key{RET}} quickly yields the result
209732.23607. This is equivalent to using the @kbd{a R} (@code{calc-find-root})
20974command to find a root of the equation @samp{x^2 = 5}.
20975
20976These examples used numbers for @samp{a} values. Calc keeps applying
20977the function until two successive results are equal to within the
20978current precision. For complex numbers, both the real parts and the
20979imaginary parts must be equal to within the current precision. If
20980@samp{a} is a formula (say, a variable name), then the function is
20981applied until two successive results are exactly the same formula.
20982It is up to you to ensure that the function will eventually converge;
20983if it doesn't, you may have to press @kbd{C-g} to stop the Calculator.
20984
20985The algebraic @code{fixp} function takes two optional arguments, @samp{n}
20986and @samp{tol}. The first is the maximum number of steps to be allowed,
20987and must be either an integer or the symbol @samp{inf} (infinity, the
20988default). The second is a convergence tolerance. If a tolerance is
20989specified, all results during the calculation must be numbers, not
20990formulas, and the iteration stops when the magnitude of the difference
20991between two successive results is less than or equal to the tolerance.
20992(This implies that a tolerance of zero iterates until the results are
20993exactly equal.)
20994
20995Putting it all together, @samp{fixp(<(# + A/#)/2>, B, 20, 1e-10)}
20996computes the square root of @samp{A} given the initial guess @samp{B},
20997stopping when the result is correct within the specified tolerance, or
20998when 20 steps have been taken, whichever is sooner.
20999
21000@node Generalized Products, , Nesting and Fixed Points, Reducing and Mapping
21001@subsection Generalized Products
21002
21003@kindex V O
21004@pindex calc-outer-product
21005@tindex outer
21006The @kbd{V O} (@code{calc-outer-product}) [@code{outer}] command applies
21007a given binary operator to all possible pairs of elements from two
21008vectors, to produce a matrix. For example, @kbd{V O *} with @samp{[a, b]}
21009and @samp{[x, y, z]} on the stack produces a multiplication table:
21010@samp{[[a x, a y, a z], [b x, b y, b z]]}. Element @var{r},@var{c} of
21011the result matrix is obtained by applying the operator to element @var{r}
21012of the lefthand vector and element @var{c} of the righthand vector.
21013
21014@kindex V I
21015@pindex calc-inner-product
21016@tindex inner
21017The @kbd{V I} (@code{calc-inner-product}) [@code{inner}] command computes
21018the generalized inner product of two vectors or matrices, given a
21019``multiplicative'' operator and an ``additive'' operator. These can each
21020actually be any binary operators; if they are @samp{*} and @samp{+},
21021respectively, the result is a standard matrix multiplication. Element
21022@var{r},@var{c} of the result matrix is obtained by mapping the
21023multiplicative operator across row @var{r} of the lefthand matrix and
21024column @var{c} of the righthand matrix, and then reducing with the additive
21025operator. Just as for the standard @kbd{*} command, this can also do a
21026vector-matrix or matrix-vector inner product, or a vector-vector
21027generalized dot product.
21028
21029Since @kbd{V I} requires two operators, it prompts twice. In each case,
21030you can use any of the usual methods for entering the operator. If you
21031use @kbd{$} twice to take both operator formulas from the stack, the
21032first (multiplicative) operator is taken from the top of the stack
21033and the second (additive) operator is taken from second-to-top.
21034
21035@node Vector and Matrix Formats, , Reducing and Mapping, Matrix Functions
21036@section Vector and Matrix Display Formats
21037
21038@noindent
21039Commands for controlling vector and matrix display use the @kbd{v} prefix
21040instead of the usual @kbd{d} prefix. But they are display modes; in
21041particular, they are influenced by the @kbd{I} and @kbd{H} prefix keys
21042in the same way (@pxref{Display Modes}). Matrix display is also
21043influenced by the @kbd{d O} (@code{calc-flat-language}) mode;
21044@pxref{Normal Language Modes}.
21045
21046@kindex V <
21047@pindex calc-matrix-left-justify
21048@kindex V =
21049@pindex calc-matrix-center-justify
21050@kindex V >
21051@pindex calc-matrix-right-justify
21052The commands @kbd{v <} (@code{calc-matrix-left-justify}), @kbd{v >}
21053(@code{calc-matrix-right-justify}), and @w{@kbd{v =}}
21054(@code{calc-matrix-center-justify}) control whether matrix elements
21055are justified to the left, right, or center of their columns.
21056
21057@kindex V [
21058@pindex calc-vector-brackets
21059@kindex V @{
21060@pindex calc-vector-braces
21061@kindex V (
21062@pindex calc-vector-parens
21063The @kbd{v [} (@code{calc-vector-brackets}) command turns the square
21064brackets that surround vectors and matrices displayed in the stack on
21065and off. The @kbd{v @{} (@code{calc-vector-braces}) and @kbd{v (}
21066(@code{calc-vector-parens}) commands use curly braces or parentheses,
21067respectively, instead of square brackets. For example, @kbd{v @{} might
21068be used in preparation for yanking a matrix into a buffer running
21069Mathematica. (In fact, the Mathematica language mode uses this mode;
21070@pxref{Mathematica Language Mode}.) Note that, regardless of the
21071display mode, either brackets or braces may be used to enter vectors,
21072and parentheses may never be used for this purpose.
21073
21074@kindex V ]
21075@pindex calc-matrix-brackets
21076The @kbd{v ]} (@code{calc-matrix-brackets}) command controls the
21077``big'' style display of matrices. It prompts for a string of code
21078letters; currently implemented letters are @code{R}, which enables
21079brackets on each row of the matrix; @code{O}, which enables outer
21080brackets in opposite corners of the matrix; and @code{C}, which
21081enables commas or semicolons at the ends of all rows but the last.
21082The default format is @samp{RO}. (Before Calc 2.00, the format
21083was fixed at @samp{ROC}.) Here are some example matrices:
21084
21085@example
21086@group
21087[ [ 123, 0, 0 ] [ [ 123, 0, 0 ],
21088 [ 0, 123, 0 ] [ 0, 123, 0 ],
21089 [ 0, 0, 123 ] ] [ 0, 0, 123 ] ]
21090
21091 RO ROC
21092
21093@end group
21094@end example
21095@noindent
21096@example
21097@group
21098 [ 123, 0, 0 [ 123, 0, 0 ;
21099 0, 123, 0 0, 123, 0 ;
21100 0, 0, 123 ] 0, 0, 123 ]
21101
21102 O OC
21103
21104@end group
21105@end example
21106@noindent
21107@example
21108@group
21109 [ 123, 0, 0 ] 123, 0, 0
21110 [ 0, 123, 0 ] 0, 123, 0
21111 [ 0, 0, 123 ] 0, 0, 123
21112
21113 R @r{blank}
21114@end group
21115@end example
21116
21117@noindent
21118Note that of the formats shown here, @samp{RO}, @samp{ROC}, and
21119@samp{OC} are all recognized as matrices during reading, while
21120the others are useful for display only.
21121
21122@kindex V ,
21123@pindex calc-vector-commas
21124The @kbd{v ,} (@code{calc-vector-commas}) command turns commas on and
21125off in vector and matrix display.
21126
21127In vectors of length one, and in all vectors when commas have been
21128turned off, Calc adds extra parentheses around formulas that might
21129otherwise be ambiguous. For example, @samp{[a b]} could be a vector
21130of the one formula @samp{a b}, or it could be a vector of two
21131variables with commas turned off. Calc will display the former
21132case as @samp{[(a b)]}. You can disable these extra parentheses
21133(to make the output less cluttered at the expense of allowing some
21134ambiguity) by adding the letter @code{P} to the control string you
21135give to @kbd{v ]} (as described above).
21136
21137@kindex V .
21138@pindex calc-full-vectors
21139The @kbd{v .} (@code{calc-full-vectors}) command turns abbreviated
21140display of long vectors on and off. In this mode, vectors of six
21141or more elements, or matrices of six or more rows or columns, will
21142be displayed in an abbreviated form that displays only the first
21143three elements and the last element: @samp{[a, b, c, ..., z]}.
21144When very large vectors are involved this will substantially
21145improve Calc's display speed.
21146
21147@kindex t .
21148@pindex calc-full-trail-vectors
21149The @kbd{t .} (@code{calc-full-trail-vectors}) command controls a
21150similar mode for recording vectors in the Trail. If you turn on
21151this mode, vectors of six or more elements and matrices of six or
21152more rows or columns will be abbreviated when they are put in the
21153Trail. The @kbd{t y} (@code{calc-trail-yank}) command will be
21154unable to recover those vectors. If you are working with very
21155large vectors, this mode will improve the speed of all operations
21156that involve the trail.
21157
21158@kindex V /
21159@pindex calc-break-vectors
21160The @kbd{v /} (@code{calc-break-vectors}) command turns multi-line
21161vector display on and off. Normally, matrices are displayed with one
21162row per line but all other types of vectors are displayed in a single
21163line. This mode causes all vectors, whether matrices or not, to be
21164displayed with a single element per line. Sub-vectors within the
21165vectors will still use the normal linear form.
21166
21167@node Algebra, Units, Matrix Functions, Top
21168@chapter Algebra
21169
21170@noindent
21171This section covers the Calc features that help you work with
21172algebraic formulas. First, the general sub-formula selection
21173mechanism is described; this works in conjunction with any Calc
21174commands. Then, commands for specific algebraic operations are
21175described. Finally, the flexible @dfn{rewrite rule} mechanism
21176is discussed.
21177
21178The algebraic commands use the @kbd{a} key prefix; selection
21179commands use the @kbd{j} (for ``just a letter that wasn't used
21180for anything else'') prefix.
21181
21182@xref{Editing Stack Entries}, to see how to manipulate formulas
21183using regular Emacs editing commands.
21184
21185When doing algebraic work, you may find several of the Calculator's
21186modes to be helpful, including Algebraic Simplification mode (@kbd{m A})
21187or No-Simplification mode (@kbd{m O}),
21188Algebraic entry mode (@kbd{m a}), Fraction mode (@kbd{m f}), and
21189Symbolic mode (@kbd{m s}). @xref{Mode Settings}, for discussions
21190of these modes. You may also wish to select Big display mode (@kbd{d B}).
21191@xref{Normal Language Modes}.
21192
21193@menu
21194* Selecting Subformulas::
21195* Algebraic Manipulation::
21196* Simplifying Formulas::
21197* Polynomials::
21198* Calculus::
21199* Solving Equations::
21200* Numerical Solutions::
21201* Curve Fitting::
21202* Summations::
21203* Logical Operations::
21204* Rewrite Rules::
21205@end menu
21206
21207@node Selecting Subformulas, Algebraic Manipulation, Algebra, Algebra
21208@section Selecting Sub-Formulas
21209
21210@noindent
21211@cindex Selections
21212@cindex Sub-formulas
21213@cindex Parts of formulas
21214When working with an algebraic formula it is often necessary to
21215manipulate a portion of the formula rather than the formula as a
21216whole. Calc allows you to ``select'' a portion of any formula on
21217the stack. Commands which would normally operate on that stack
21218entry will now operate only on the sub-formula, leaving the
21219surrounding part of the stack entry alone.
21220
21221One common non-algebraic use for selection involves vectors. To work
21222on one element of a vector in-place, simply select that element as a
21223``sub-formula'' of the vector.
21224
21225@menu
21226* Making Selections::
21227* Changing Selections::
21228* Displaying Selections::
21229* Operating on Selections::
21230* Rearranging with Selections::
21231@end menu
21232
21233@node Making Selections, Changing Selections, Selecting Subformulas, Selecting Subformulas
21234@subsection Making Selections
21235
21236@noindent
21237@kindex j s
21238@pindex calc-select-here
21239To select a sub-formula, move the Emacs cursor to any character in that
21240sub-formula, and press @w{@kbd{j s}} (@code{calc-select-here}). Calc will
21241highlight the smallest portion of the formula that contains that
21242character. By default the sub-formula is highlighted by blanking out
21243all of the rest of the formula with dots. Selection works in any
21244display mode but is perhaps easiest in Big mode (@kbd{d B}).
21245Suppose you enter the following formula:
21246
21247@smallexample
21248@group
21249 3 ___
21250 (a + b) + V c
212511: ---------------
21252 2 x + 1
21253@end group
21254@end smallexample
21255
21256@noindent
21257(by typing @kbd{' ((a+b)^3 + sqrt(c)) / (2x+1)}). If you move the
21258cursor to the letter @samp{b} and press @w{@kbd{j s}}, the display changes
21259to
21260
21261@smallexample
21262@group
21263 . ...
21264 .. . b. . . .
212651* ...............
21266 . . . .
21267@end group
21268@end smallexample
21269
21270@noindent
21271Every character not part of the sub-formula @samp{b} has been changed
21272to a dot. The @samp{*} next to the line number is to remind you that
21273the formula has a portion of it selected. (In this case, it's very
21274obvious, but it might not always be. If Embedded mode is enabled,
21275the word @samp{Sel} also appears in the mode line because the stack
21276may not be visible. @pxref{Embedded Mode}.)
21277
21278If you had instead placed the cursor on the parenthesis immediately to
21279the right of the @samp{b}, the selection would have been:
21280
21281@smallexample
21282@group
21283 . ...
21284 (a + b) . . .
212851* ...............
21286 . . . .
21287@end group
21288@end smallexample
21289
21290@noindent
21291The portion selected is always large enough to be considered a complete
21292formula all by itself, so selecting the parenthesis selects the whole
21293formula that it encloses. Putting the cursor on the @samp{+} sign
21294would have had the same effect.
21295
21296(Strictly speaking, the Emacs cursor is really the manifestation of
21297the Emacs ``point,'' which is a position @emph{between} two characters
21298in the buffer. So purists would say that Calc selects the smallest
21299sub-formula which contains the character to the right of ``point.'')
21300
21301If you supply a numeric prefix argument @var{n}, the selection is
21302expanded to the @var{n}th enclosing sub-formula. Thus, positioning
21303the cursor on the @samp{b} and typing @kbd{C-u 1 j s} will select
21304@samp{a + b}; typing @kbd{C-u 2 j s} will select @samp{(a + b)^3},
21305and so on.
21306
21307If the cursor is not on any part of the formula, or if you give a
21308numeric prefix that is too large, the entire formula is selected.
21309
21310If the cursor is on the @samp{.} line that marks the top of the stack
21311(i.e., its normal ``rest position''), this command selects the entire
21312formula at stack level 1. Most selection commands similarly operate
21313on the formula at the top of the stack if you haven't positioned the
21314cursor on any stack entry.
21315
21316@kindex j a
21317@pindex calc-select-additional
21318The @kbd{j a} (@code{calc-select-additional}) command enlarges the
21319current selection to encompass the cursor. To select the smallest
21320sub-formula defined by two different points, move to the first and
21321press @kbd{j s}, then move to the other and press @kbd{j a}. This
21322is roughly analogous to using @kbd{C-@@} (@code{set-mark-command}) to
21323select the two ends of a region of text during normal Emacs editing.
21324
21325@kindex j o
21326@pindex calc-select-once
21327The @kbd{j o} (@code{calc-select-once}) command selects a formula in
21328exactly the same way as @kbd{j s}, except that the selection will
21329last only as long as the next command that uses it. For example,
21330@kbd{j o 1 +} is a handy way to add one to the sub-formula indicated
21331by the cursor.
21332
21333(A somewhat more precise definition: The @kbd{j o} command sets a flag
21334such that the next command involving selected stack entries will clear
21335the selections on those stack entries afterwards. All other selection
21336commands except @kbd{j a} and @kbd{j O} clear this flag.)
21337
21338@kindex j S
21339@kindex j O
21340@pindex calc-select-here-maybe
21341@pindex calc-select-once-maybe
21342The @kbd{j S} (@code{calc-select-here-maybe}) and @kbd{j O}
21343(@code{calc-select-once-maybe}) commands are equivalent to @kbd{j s}
21344and @kbd{j o}, respectively, except that if the formula already
21345has a selection they have no effect. This is analogous to the
21346behavior of some commands such as @kbd{j r} (@code{calc-rewrite-selection};
21347@pxref{Selections with Rewrite Rules}) and is mainly intended to be
21348used in keyboard macros that implement your own selection-oriented
21349commands.
21350
21351Selection of sub-formulas normally treats associative terms like
21352@samp{a + b - c + d} and @samp{x * y * z} as single levels of the formula.
21353If you place the cursor anywhere inside @samp{a + b - c + d} except
21354on one of the variable names and use @kbd{j s}, you will select the
21355entire four-term sum.
21356
21357@kindex j b
21358@pindex calc-break-selections
21359The @kbd{j b} (@code{calc-break-selections}) command controls a mode
21360in which the ``deep structure'' of these associative formulas shows
45b778a6
JB
21361through. Calc actually stores the above formulas as
21362@samp{((a + b) - c) + d} and @samp{x * (y * z)}. (Note that for certain
21363obscure reasons, by default Calc treats multiplication as
21364right-associative.) Once you have enabled @kbd{j b} mode, selecting
21365with the cursor on the @samp{-} sign would only select the @samp{a + b -
21366c} portion, which makes sense when the deep structure of the sum is
21367considered. There is no way to select the @samp{b - c + d} portion;
21368although this might initially look like just as legitimate a sub-formula
21369as @samp{a + b - c}, the deep structure shows that it isn't. The @kbd{d
21370U} command can be used to view the deep structure of any formula
21371(@pxref{Normal Language Modes}).
4009494e
GM
21372
21373When @kbd{j b} mode has not been enabled, the deep structure is
21374generally hidden by the selection commands---what you see is what
21375you get.
21376
21377@kindex j u
21378@pindex calc-unselect
21379The @kbd{j u} (@code{calc-unselect}) command unselects the formula
21380that the cursor is on. If there was no selection in the formula,
21381this command has no effect. With a numeric prefix argument, it
21382unselects the @var{n}th stack element rather than using the cursor
21383position.
21384
21385@kindex j c
21386@pindex calc-clear-selections
21387The @kbd{j c} (@code{calc-clear-selections}) command unselects all
21388stack elements.
21389
21390@node Changing Selections, Displaying Selections, Making Selections, Selecting Subformulas
21391@subsection Changing Selections
21392
21393@noindent
21394@kindex j m
21395@pindex calc-select-more
21396Once you have selected a sub-formula, you can expand it using the
21397@w{@kbd{j m}} (@code{calc-select-more}) command. If @samp{a + b} is
21398selected, pressing @w{@kbd{j m}} repeatedly works as follows:
21399
21400@smallexample
21401@group
21402 3 ... 3 ___ 3 ___
21403 (a + b) . . . (a + b) + V c (a + b) + V c
214041* ............... 1* ............... 1* ---------------
21405 . . . . . . . . 2 x + 1
21406@end group
21407@end smallexample
21408
21409@noindent
21410In the last example, the entire formula is selected. This is roughly
21411the same as having no selection at all, but because there are subtle
21412differences the @samp{*} character is still there on the line number.
21413
21414With a numeric prefix argument @var{n}, @kbd{j m} expands @var{n}
21415times (or until the entire formula is selected). Note that @kbd{j s}
21416with argument @var{n} is equivalent to plain @kbd{j s} followed by
21417@kbd{j m} with argument @var{n}. If @w{@kbd{j m}} is used when there
21418is no current selection, it is equivalent to @w{@kbd{j s}}.
21419
21420Even though @kbd{j m} does not explicitly use the location of the
21421cursor within the formula, it nevertheless uses the cursor to determine
21422which stack element to operate on. As usual, @kbd{j m} when the cursor
21423is not on any stack element operates on the top stack element.
21424
21425@kindex j l
21426@pindex calc-select-less
21427The @kbd{j l} (@code{calc-select-less}) command reduces the current
21428selection around the cursor position. That is, it selects the
21429immediate sub-formula of the current selection which contains the
21430cursor, the opposite of @kbd{j m}. If the cursor is not inside the
21431current selection, the command de-selects the formula.
21432
21433@kindex j 1-9
21434@pindex calc-select-part
21435The @kbd{j 1} through @kbd{j 9} (@code{calc-select-part}) commands
21436select the @var{n}th sub-formula of the current selection. They are
21437like @kbd{j l} (@code{calc-select-less}) except they use counting
21438rather than the cursor position to decide which sub-formula to select.
21439For example, if the current selection is @kbd{a + b + c} or
21440@kbd{f(a, b, c)} or @kbd{[a, b, c]}, then @kbd{j 1} selects @samp{a},
21441@kbd{j 2} selects @samp{b}, and @kbd{j 3} selects @samp{c}; in each of
21442these cases, @kbd{j 4} through @kbd{j 9} would be errors.
21443
21444If there is no current selection, @kbd{j 1} through @kbd{j 9} select
21445the @var{n}th top-level sub-formula. (In other words, they act as if
21446the entire stack entry were selected first.) To select the @var{n}th
21447sub-formula where @var{n} is greater than nine, you must instead invoke
21448@w{@kbd{j 1}} with @var{n} as a numeric prefix argument.
21449
21450@kindex j n
21451@kindex j p
21452@pindex calc-select-next
21453@pindex calc-select-previous
21454The @kbd{j n} (@code{calc-select-next}) and @kbd{j p}
21455(@code{calc-select-previous}) commands change the current selection
21456to the next or previous sub-formula at the same level. For example,
21457if @samp{b} is selected in @w{@samp{2 + a*b*c + x}}, then @kbd{j n}
21458selects @samp{c}. Further @kbd{j n} commands would be in error because,
21459even though there is something to the right of @samp{c} (namely, @samp{x}),
21460it is not at the same level; in this case, it is not a term of the
21461same product as @samp{b} and @samp{c}. However, @kbd{j m} (to select
21462the whole product @samp{a*b*c} as a term of the sum) followed by
21463@w{@kbd{j n}} would successfully select the @samp{x}.
21464
21465Similarly, @kbd{j p} moves the selection from the @samp{b} in this
21466sample formula to the @samp{a}. Both commands accept numeric prefix
21467arguments to move several steps at a time.
21468
21469It is interesting to compare Calc's selection commands with the
21470Emacs Info system's commands for navigating through hierarchically
21471organized documentation. Calc's @kbd{j n} command is completely
21472analogous to Info's @kbd{n} command. Likewise, @kbd{j p} maps to
21473@kbd{p}, @kbd{j 2} maps to @kbd{2}, and Info's @kbd{u} is like @kbd{j m}.
21474(Note that @kbd{j u} stands for @code{calc-unselect}, not ``up''.)
21475The Info @kbd{m} command is somewhat similar to Calc's @kbd{j s} and
21476@kbd{j l}; in each case, you can jump directly to a sub-component
21477of the hierarchy simply by pointing to it with the cursor.
21478
21479@node Displaying Selections, Operating on Selections, Changing Selections, Selecting Subformulas
21480@subsection Displaying Selections
21481
21482@noindent
21483@kindex j d
21484@pindex calc-show-selections
21485The @kbd{j d} (@code{calc-show-selections}) command controls how
21486selected sub-formulas are displayed. One of the alternatives is
21487illustrated in the above examples; if we press @kbd{j d} we switch
21488to the other style in which the selected portion itself is obscured
21489by @samp{#} signs:
21490
21491@smallexample
21492@group
21493 3 ... # ___
21494 (a + b) . . . ## # ## + V c
214951* ............... 1* ---------------
21496 . . . . 2 x + 1
21497@end group
21498@end smallexample
21499
21500@node Operating on Selections, Rearranging with Selections, Displaying Selections, Selecting Subformulas
21501@subsection Operating on Selections
21502
21503@noindent
21504Once a selection is made, all Calc commands that manipulate items
21505on the stack will operate on the selected portions of the items
21506instead. (Note that several stack elements may have selections
21507at once, though there can be only one selection at a time in any
21508given stack element.)
21509
21510@kindex j e
21511@pindex calc-enable-selections
21512The @kbd{j e} (@code{calc-enable-selections}) command disables the
21513effect that selections have on Calc commands. The current selections
21514still exist, but Calc commands operate on whole stack elements anyway.
21515This mode can be identified by the fact that the @samp{*} markers on
21516the line numbers are gone, even though selections are visible. To
21517reactivate the selections, press @kbd{j e} again.
21518
21519To extract a sub-formula as a new formula, simply select the
21520sub-formula and press @key{RET}. This normally duplicates the top
21521stack element; here it duplicates only the selected portion of that
21522element.
21523
21524To replace a sub-formula with something different, you can enter the
21525new value onto the stack and press @key{TAB}. This normally exchanges
21526the top two stack elements; here it swaps the value you entered into
21527the selected portion of the formula, returning the old selected
21528portion to the top of the stack.
21529
21530@smallexample
21531@group
21532 3 ... ... ___
21533 (a + b) . . . 17 x y . . . 17 x y + V c
215342* ............... 2* ............. 2: -------------
21535 . . . . . . . . 2 x + 1
21536
21537 3 3
215381: 17 x y 1: (a + b) 1: (a + b)
21539@end group
21540@end smallexample
21541
21542In this example we select a sub-formula of our original example,
21543enter a new formula, @key{TAB} it into place, then deselect to see
21544the complete, edited formula.
21545
21546If you want to swap whole formulas around even though they contain
21547selections, just use @kbd{j e} before and after.
21548
21549@kindex j '
21550@pindex calc-enter-selection
21551The @kbd{j '} (@code{calc-enter-selection}) command is another way
21552to replace a selected sub-formula. This command does an algebraic
21553entry just like the regular @kbd{'} key. When you press @key{RET},
21554the formula you type replaces the original selection. You can use
21555the @samp{$} symbol in the formula to refer to the original
21556selection. If there is no selection in the formula under the cursor,
21557the cursor is used to make a temporary selection for the purposes of
21558the command. Thus, to change a term of a formula, all you have to
21559do is move the Emacs cursor to that term and press @kbd{j '}.
21560
21561@kindex j `
21562@pindex calc-edit-selection
21563The @kbd{j `} (@code{calc-edit-selection}) command is a similar
21564analogue of the @kbd{`} (@code{calc-edit}) command. It edits the
21565selected sub-formula in a separate buffer. If there is no
21566selection, it edits the sub-formula indicated by the cursor.
21567
21568To delete a sub-formula, press @key{DEL}. This generally replaces
21569the sub-formula with the constant zero, but in a few suitable contexts
21570it uses the constant one instead. The @key{DEL} key automatically
21571deselects and re-simplifies the entire formula afterwards. Thus:
21572
21573@smallexample
21574@group
21575 ###
21576 17 x y + # # 17 x y 17 # y 17 y
215771* ------------- 1: ------- 1* ------- 1: -------
21578 2 x + 1 2 x + 1 2 x + 1 2 x + 1
21579@end group
21580@end smallexample
21581
21582In this example, we first delete the @samp{sqrt(c)} term; Calc
21583accomplishes this by replacing @samp{sqrt(c)} with zero and
21584resimplifying. We then delete the @kbd{x} in the numerator;
21585since this is part of a product, Calc replaces it with @samp{1}
21586and resimplifies.
21587
21588If you select an element of a vector and press @key{DEL}, that
21589element is deleted from the vector. If you delete one side of
21590an equation or inequality, only the opposite side remains.
21591
21592@kindex j @key{DEL}
21593@pindex calc-del-selection
21594The @kbd{j @key{DEL}} (@code{calc-del-selection}) command is like
21595@key{DEL} but with the auto-selecting behavior of @kbd{j '} and
21596@kbd{j `}. It deletes the selected portion of the formula
21597indicated by the cursor, or, in the absence of a selection, it
21598deletes the sub-formula indicated by the cursor position.
21599
21600@kindex j @key{RET}
21601@pindex calc-grab-selection
21602(There is also an auto-selecting @kbd{j @key{RET}} (@code{calc-copy-selection})
21603command.)
21604
21605Normal arithmetic operations also apply to sub-formulas. Here we
21606select the denominator, press @kbd{5 -} to subtract five from the
21607denominator, press @kbd{n} to negate the denominator, then
21608press @kbd{Q} to take the square root.
21609
21610@smallexample
21611@group
21612 .. . .. . .. . .. .
216131* ....... 1* ....... 1* ....... 1* ..........
21614 2 x + 1 2 x - 4 4 - 2 x _________
21615 V 4 - 2 x
21616@end group
21617@end smallexample
21618
21619Certain types of operations on selections are not allowed. For
21620example, for an arithmetic function like @kbd{-} no more than one of
21621the arguments may be a selected sub-formula. (As the above example
21622shows, the result of the subtraction is spliced back into the argument
21623which had the selection; if there were more than one selection involved,
21624this would not be well-defined.) If you try to subtract two selections,
21625the command will abort with an error message.
21626
21627Operations on sub-formulas sometimes leave the formula as a whole
21628in an ``un-natural'' state. Consider negating the @samp{2 x} term
21629of our sample formula by selecting it and pressing @kbd{n}
21630(@code{calc-change-sign}).
21631
21632@smallexample
21633@group
21634 .. . .. .
216351* .......... 1* ...........
21636 ......... ..........
21637 . . . 2 x . . . -2 x
21638@end group
21639@end smallexample
21640
21641Unselecting the sub-formula reveals that the minus sign, which would
21642normally have cancelled out with the subtraction automatically, has
21643not been able to do so because the subtraction was not part of the
21644selected portion. Pressing @kbd{=} (@code{calc-evaluate}) or doing
21645any other mathematical operation on the whole formula will cause it
21646to be simplified.
21647
21648@smallexample
21649@group
21650 17 y 17 y
216511: ----------- 1: ----------
21652 __________ _________
21653 V 4 - -2 x V 4 + 2 x
21654@end group
21655@end smallexample
21656
21657@node Rearranging with Selections, , Operating on Selections, Selecting Subformulas
21658@subsection Rearranging Formulas using Selections
21659
21660@noindent
21661@kindex j R
21662@pindex calc-commute-right
21663The @kbd{j R} (@code{calc-commute-right}) command moves the selected
21664sub-formula to the right in its surrounding formula. Generally the
21665selection is one term of a sum or product; the sum or product is
21666rearranged according to the commutative laws of algebra.
21667
21668As with @kbd{j '} and @kbd{j @key{DEL}}, the term under the cursor is used
21669if there is no selection in the current formula. All commands described
21670in this section share this property. In this example, we place the
21671cursor on the @samp{a} and type @kbd{j R}, then repeat.
21672
21673@smallexample
216741: a + b - c 1: b + a - c 1: b - c + a
21675@end smallexample
21676
21677@noindent
21678Note that in the final step above, the @samp{a} is switched with
21679the @samp{c} but the signs are adjusted accordingly. When moving
21680terms of sums and products, @kbd{j R} will never change the
21681mathematical meaning of the formula.
21682
21683The selected term may also be an element of a vector or an argument
21684of a function. The term is exchanged with the one to its right.
21685In this case, the ``meaning'' of the vector or function may of
21686course be drastically changed.
21687
21688@smallexample
216891: [a, b, c] 1: [b, a, c] 1: [b, c, a]
21690
216911: f(a, b, c) 1: f(b, a, c) 1: f(b, c, a)
21692@end smallexample
21693
21694@kindex j L
21695@pindex calc-commute-left
21696The @kbd{j L} (@code{calc-commute-left}) command is like @kbd{j R}
21697except that it swaps the selected term with the one to its left.
21698
21699With numeric prefix arguments, these commands move the selected
21700term several steps at a time. It is an error to try to move a
21701term left or right past the end of its enclosing formula.
21702With numeric prefix arguments of zero, these commands move the
21703selected term as far as possible in the given direction.
21704
21705@kindex j D
21706@pindex calc-sel-distribute
21707The @kbd{j D} (@code{calc-sel-distribute}) command mixes the selected
21708sum or product into the surrounding formula using the distributive
21709law. For example, in @samp{a * (b - c)} with the @samp{b - c}
21710selected, the result is @samp{a b - a c}. This also distributes
21711products or quotients into surrounding powers, and can also do
21712transformations like @samp{exp(a + b)} to @samp{exp(a) exp(b)},
21713where @samp{a + b} is the selected term, and @samp{ln(a ^ b)}
21714to @samp{ln(a) b}, where @samp{a ^ b} is the selected term.
21715
21716For multiple-term sums or products, @kbd{j D} takes off one term
21717at a time: @samp{a * (b + c - d)} goes to @samp{a * (c - d) + a b}
21718with the @samp{c - d} selected so that you can type @kbd{j D}
21719repeatedly to expand completely. The @kbd{j D} command allows a
21720numeric prefix argument which specifies the maximum number of
21721times to expand at once; the default is one time only.
21722
21723@vindex DistribRules
21724The @kbd{j D} command is implemented using rewrite rules.
21725@xref{Selections with Rewrite Rules}. The rules are stored in
21726the Calc variable @code{DistribRules}. A convenient way to view
21727these rules is to use @kbd{s e} (@code{calc-edit-variable}) which
21728displays and edits the stored value of a variable. Press @kbd{C-c C-c}
21729to return from editing mode; be careful not to make any actual changes
21730or else you will affect the behavior of future @kbd{j D} commands!
21731
21732To extend @kbd{j D} to handle new cases, just edit @code{DistribRules}
21733as described above. You can then use the @kbd{s p} command to save
21734this variable's value permanently for future Calc sessions.
21735@xref{Operations on Variables}.
21736
21737@kindex j M
21738@pindex calc-sel-merge
21739@vindex MergeRules
21740The @kbd{j M} (@code{calc-sel-merge}) command is the complement
21741of @kbd{j D}; given @samp{a b - a c} with either @samp{a b} or
21742@samp{a c} selected, the result is @samp{a * (b - c)}. Once
21743again, @kbd{j M} can also merge calls to functions like @code{exp}
21744and @code{ln}; examine the variable @code{MergeRules} to see all
21745the relevant rules.
21746
21747@kindex j C
21748@pindex calc-sel-commute
21749@vindex CommuteRules
21750The @kbd{j C} (@code{calc-sel-commute}) command swaps the arguments
21751of the selected sum, product, or equation. It always behaves as
21752if @kbd{j b} mode were in effect, i.e., the sum @samp{a + b + c} is
21753treated as the nested sums @samp{(a + b) + c} by this command.
21754If you put the cursor on the first @samp{+}, the result is
21755@samp{(b + a) + c}; if you put the cursor on the second @samp{+}, the
21756result is @samp{c + (a + b)} (which the default simplifications
21757will rearrange to @samp{(c + a) + b}). The relevant rules are stored
21758in the variable @code{CommuteRules}.
21759
21760You may need to turn default simplifications off (with the @kbd{m O}
21761command) in order to get the full benefit of @kbd{j C}. For example,
21762commuting @samp{a - b} produces @samp{-b + a}, but the default
21763simplifications will ``simplify'' this right back to @samp{a - b} if
21764you don't turn them off. The same is true of some of the other
21765manipulations described in this section.
21766
21767@kindex j N
21768@pindex calc-sel-negate
21769@vindex NegateRules
21770The @kbd{j N} (@code{calc-sel-negate}) command replaces the selected
21771term with the negative of that term, then adjusts the surrounding
21772formula in order to preserve the meaning. For example, given
21773@samp{exp(a - b)} where @samp{a - b} is selected, the result is
21774@samp{1 / exp(b - a)}. By contrast, selecting a term and using the
21775regular @kbd{n} (@code{calc-change-sign}) command negates the
21776term without adjusting the surroundings, thus changing the meaning
21777of the formula as a whole. The rules variable is @code{NegateRules}.
21778
21779@kindex j &
21780@pindex calc-sel-invert
21781@vindex InvertRules
21782The @kbd{j &} (@code{calc-sel-invert}) command is similar to @kbd{j N}
21783except it takes the reciprocal of the selected term. For example,
21784given @samp{a - ln(b)} with @samp{b} selected, the result is
21785@samp{a + ln(1/b)}. The rules variable is @code{InvertRules}.
21786
21787@kindex j E
21788@pindex calc-sel-jump-equals
21789@vindex JumpRules
21790The @kbd{j E} (@code{calc-sel-jump-equals}) command moves the
21791selected term from one side of an equation to the other. Given
21792@samp{a + b = c + d} with @samp{c} selected, the result is
21793@samp{a + b - c = d}. This command also works if the selected
21794term is part of a @samp{*}, @samp{/}, or @samp{^} formula. The
21795relevant rules variable is @code{JumpRules}.
21796
21797@kindex j I
21798@kindex H j I
21799@pindex calc-sel-isolate
21800The @kbd{j I} (@code{calc-sel-isolate}) command isolates the
21801selected term on its side of an equation. It uses the @kbd{a S}
21802(@code{calc-solve-for}) command to solve the equation, and the
21803Hyperbolic flag affects it in the same way. @xref{Solving Equations}.
21804When it applies, @kbd{j I} is often easier to use than @kbd{j E}.
21805It understands more rules of algebra, and works for inequalities
21806as well as equations.
21807
21808@kindex j *
21809@kindex j /
21810@pindex calc-sel-mult-both-sides
21811@pindex calc-sel-div-both-sides
21812The @kbd{j *} (@code{calc-sel-mult-both-sides}) command prompts for a
21813formula using algebraic entry, then multiplies both sides of the
21814selected quotient or equation by that formula. It simplifies each
21815side with @kbd{a s} (@code{calc-simplify}) before re-forming the
21816quotient or equation. You can suppress this simplification by
21817providing any numeric prefix argument. There is also a @kbd{j /}
21818(@code{calc-sel-div-both-sides}) which is similar to @kbd{j *} but
21819dividing instead of multiplying by the factor you enter.
21820
21821As a special feature, if the numerator of the quotient is 1, then
21822the denominator is expanded at the top level using the distributive
21823law (i.e., using the @kbd{C-u -1 a x} command). Suppose the
21824formula on the stack is @samp{1 / (sqrt(a) + 1)}, and you wish
21825to eliminate the square root in the denominator by multiplying both
21826sides by @samp{sqrt(a) - 1}. Calc's default simplifications would
21827change the result @samp{(sqrt(a) - 1) / (sqrt(a) - 1) (sqrt(a) + 1)}
21828right back to the original form by cancellation; Calc expands the
21829denominator to @samp{sqrt(a) (sqrt(a) - 1) + sqrt(a) - 1} to prevent
21830this. (You would now want to use an @kbd{a x} command to expand
21831the rest of the way, whereupon the denominator would cancel out to
21832the desired form, @samp{a - 1}.) When the numerator is not 1, this
21833initial expansion is not necessary because Calc's default
21834simplifications will not notice the potential cancellation.
21835
21836If the selection is an inequality, @kbd{j *} and @kbd{j /} will
21837accept any factor, but will warn unless they can prove the factor
21838is either positive or negative. (In the latter case the direction
21839of the inequality will be switched appropriately.) @xref{Declarations},
21840for ways to inform Calc that a given variable is positive or
21841negative. If Calc can't tell for sure what the sign of the factor
21842will be, it will assume it is positive and display a warning
21843message.
21844
21845For selections that are not quotients, equations, or inequalities,
21846these commands pull out a multiplicative factor: They divide (or
21847multiply) by the entered formula, simplify, then multiply (or divide)
21848back by the formula.
21849
21850@kindex j +
21851@kindex j -
21852@pindex calc-sel-add-both-sides
21853@pindex calc-sel-sub-both-sides
21854The @kbd{j +} (@code{calc-sel-add-both-sides}) and @kbd{j -}
21855(@code{calc-sel-sub-both-sides}) commands analogously add to or
21856subtract from both sides of an equation or inequality. For other
21857types of selections, they extract an additive factor. A numeric
21858prefix argument suppresses simplification of the intermediate
21859results.
21860
21861@kindex j U
21862@pindex calc-sel-unpack
21863The @kbd{j U} (@code{calc-sel-unpack}) command replaces the
21864selected function call with its argument. For example, given
21865@samp{a + sin(x^2)} with @samp{sin(x^2)} selected, the result
21866is @samp{a + x^2}. (The @samp{x^2} will remain selected; if you
21867wanted to change the @code{sin} to @code{cos}, just press @kbd{C}
21868now to take the cosine of the selected part.)
21869
21870@kindex j v
21871@pindex calc-sel-evaluate
21872The @kbd{j v} (@code{calc-sel-evaluate}) command performs the
21873normal default simplifications on the selected sub-formula.
21874These are the simplifications that are normally done automatically
21875on all results, but which may have been partially inhibited by
21876previous selection-related operations, or turned off altogether
21877by the @kbd{m O} command. This command is just an auto-selecting
21878version of the @w{@kbd{a v}} command (@pxref{Algebraic Manipulation}).
21879
21880With a numeric prefix argument of 2, @kbd{C-u 2 j v} applies
21881the @kbd{a s} (@code{calc-simplify}) command to the selected
21882sub-formula. With a prefix argument of 3 or more, e.g., @kbd{C-u j v}
21883applies the @kbd{a e} (@code{calc-simplify-extended}) command.
21884@xref{Simplifying Formulas}. With a negative prefix argument
21885it simplifies at the top level only, just as with @kbd{a v}.
21886Here the ``top'' level refers to the top level of the selected
21887sub-formula.
21888
21889@kindex j "
21890@pindex calc-sel-expand-formula
21891The @kbd{j "} (@code{calc-sel-expand-formula}) command is to @kbd{a "}
21892(@pxref{Algebraic Manipulation}) what @kbd{j v} is to @kbd{a v}.
21893
21894You can use the @kbd{j r} (@code{calc-rewrite-selection}) command
21895to define other algebraic operations on sub-formulas. @xref{Rewrite Rules}.
21896
21897@node Algebraic Manipulation, Simplifying Formulas, Selecting Subformulas, Algebra
21898@section Algebraic Manipulation
21899
21900@noindent
21901The commands in this section perform general-purpose algebraic
21902manipulations. They work on the whole formula at the top of the
21903stack (unless, of course, you have made a selection in that
21904formula).
21905
21906Many algebra commands prompt for a variable name or formula. If you
21907answer the prompt with a blank line, the variable or formula is taken
21908from top-of-stack, and the normal argument for the command is taken
21909from the second-to-top stack level.
21910
21911@kindex a v
21912@pindex calc-alg-evaluate
21913The @kbd{a v} (@code{calc-alg-evaluate}) command performs the normal
21914default simplifications on a formula; for example, @samp{a - -b} is
21915changed to @samp{a + b}. These simplifications are normally done
21916automatically on all Calc results, so this command is useful only if
21917you have turned default simplifications off with an @kbd{m O}
21918command. @xref{Simplification Modes}.
21919
21920It is often more convenient to type @kbd{=}, which is like @kbd{a v}
21921but which also substitutes stored values for variables in the formula.
21922Use @kbd{a v} if you want the variables to ignore their stored values.
21923
21924If you give a numeric prefix argument of 2 to @kbd{a v}, it simplifies
21925as if in Algebraic Simplification mode. This is equivalent to typing
21926@kbd{a s}; @pxref{Simplifying Formulas}. If you give a numeric prefix
21927of 3 or more, it uses Extended Simplification mode (@kbd{a e}).
21928
21929If you give a negative prefix argument @mathit{-1}, @mathit{-2}, or @mathit{-3},
21930it simplifies in the corresponding mode but only works on the top-level
21931function call of the formula. For example, @samp{(2 + 3) * (2 + 3)} will
21932simplify to @samp{(2 + 3)^2}, without simplifying the sub-formulas
21933@samp{2 + 3}. As another example, typing @kbd{V R +} to sum the vector
21934@samp{[1, 2, 3, 4]} produces the formula @samp{reduce(add, [1, 2, 3, 4])}
21935in No-Simplify mode. Using @kbd{a v} will evaluate this all the way to
2193610; using @kbd{C-u - a v} will evaluate it only to @samp{1 + 2 + 3 + 4}.
21937(@xref{Reducing and Mapping}.)
21938
21939@tindex evalv
21940@tindex evalvn
21941The @kbd{=} command corresponds to the @code{evalv} function, and
21942the related @kbd{N} command, which is like @kbd{=} but temporarily
21943disables Symbolic mode (@kbd{m s}) during the evaluation, corresponds
21944to the @code{evalvn} function. (These commands interpret their prefix
21945arguments differently than @kbd{a v}; @kbd{=} treats the prefix as
21946the number of stack elements to evaluate at once, and @kbd{N} treats
21947it as a temporary different working precision.)
21948
21949The @code{evalvn} function can take an alternate working precision
21950as an optional second argument. This argument can be either an
21951integer, to set the precision absolutely, or a vector containing
21952a single integer, to adjust the precision relative to the current
21953precision. Note that @code{evalvn} with a larger than current
21954precision will do the calculation at this higher precision, but the
21955result will as usual be rounded back down to the current precision
21956afterward. For example, @samp{evalvn(pi - 3.1415)} at a precision
21957of 12 will return @samp{9.265359e-5}; @samp{evalvn(pi - 3.1415, 30)}
21958will return @samp{9.26535897932e-5} (computing a 25-digit result which
21959is then rounded down to 12); and @samp{evalvn(pi - 3.1415, [-2])}
21960will return @samp{9.2654e-5}.
21961
21962@kindex a "
21963@pindex calc-expand-formula
21964The @kbd{a "} (@code{calc-expand-formula}) command expands functions
21965into their defining formulas wherever possible. For example,
21966@samp{deg(x^2)} is changed to @samp{180 x^2 / pi}. Most functions,
21967like @code{sin} and @code{gcd}, are not defined by simple formulas
21968and so are unaffected by this command. One important class of
21969functions which @emph{can} be expanded is the user-defined functions
21970created by the @kbd{Z F} command. @xref{Algebraic Definitions}.
21971Other functions which @kbd{a "} can expand include the probability
21972distribution functions, most of the financial functions, and the
21973hyperbolic and inverse hyperbolic functions. A numeric prefix argument
21974affects @kbd{a "} in the same way as it does @kbd{a v}: A positive
21975argument expands all functions in the formula and then simplifies in
21976various ways; a negative argument expands and simplifies only the
21977top-level function call.
21978
21979@kindex a M
21980@pindex calc-map-equation
21981@tindex mapeq
21982The @kbd{a M} (@code{calc-map-equation}) [@code{mapeq}] command applies
21983a given function or operator to one or more equations. It is analogous
21984to @kbd{V M}, which operates on vectors instead of equations.
21985@pxref{Reducing and Mapping}. For example, @kbd{a M S} changes
21986@samp{x = y+1} to @samp{sin(x) = sin(y+1)}, and @kbd{a M +} with
21987@samp{x = y+1} and @expr{6} on the stack produces @samp{x+6 = y+7}.
21988With two equations on the stack, @kbd{a M +} would add the lefthand
21989sides together and the righthand sides together to get the two
21990respective sides of a new equation.
21991
21992Mapping also works on inequalities. Mapping two similar inequalities
21993produces another inequality of the same type. Mapping an inequality
21994with an equation produces an inequality of the same type. Mapping a
21995@samp{<=} with a @samp{<} or @samp{!=} (not-equal) produces a @samp{<}.
21996If inequalities with opposite direction (e.g., @samp{<} and @samp{>})
21997are mapped, the direction of the second inequality is reversed to
21998match the first: Using @kbd{a M +} on @samp{a < b} and @samp{a > 2}
21999reverses the latter to get @samp{2 < a}, which then allows the
22000combination @samp{a + 2 < b + a}, which the @kbd{a s} command can
22001then simplify to get @samp{2 < b}.
22002
22003Using @kbd{a M *}, @kbd{a M /}, @kbd{a M n}, or @kbd{a M &} to negate
22004or invert an inequality will reverse the direction of the inequality.
22005Other adjustments to inequalities are @emph{not} done automatically;
22006@kbd{a M S} will change @w{@samp{x < y}} to @samp{sin(x) < sin(y)} even
22007though this is not true for all values of the variables.
22008
22009@kindex H a M
22010@tindex mapeqp
22011With the Hyperbolic flag, @kbd{H a M} [@code{mapeqp}] does a plain
22012mapping operation without reversing the direction of any inequalities.
22013Thus, @kbd{H a M &} would change @kbd{x > 2} to @kbd{1/x > 0.5}.
22014(This change is mathematically incorrect, but perhaps you were
22015fixing an inequality which was already incorrect.)
22016
22017@kindex I a M
22018@tindex mapeqr
22019With the Inverse flag, @kbd{I a M} [@code{mapeqr}] always reverses
22020the direction of the inequality. You might use @kbd{I a M C} to
22021change @samp{x < y} to @samp{cos(x) > cos(y)} if you know you are
22022working with small positive angles.
22023
22024@kindex a b
22025@pindex calc-substitute
22026@tindex subst
22027The @kbd{a b} (@code{calc-substitute}) [@code{subst}] command substitutes
22028all occurrences
22029of some variable or sub-expression of an expression with a new
22030sub-expression. For example, substituting @samp{sin(x)} with @samp{cos(y)}
22031in @samp{2 sin(x)^2 + x sin(x) + sin(2 x)} produces
22032@samp{2 cos(y)^2 + x cos(y) + @w{sin(2 x)}}.
22033Note that this is a purely structural substitution; the lone @samp{x} and
22034the @samp{sin(2 x)} stayed the same because they did not look like
22035@samp{sin(x)}. @xref{Rewrite Rules}, for a more general method for
22036doing substitutions.
22037
22038The @kbd{a b} command normally prompts for two formulas, the old
22039one and the new one. If you enter a blank line for the first
22040prompt, all three arguments are taken from the stack (new, then old,
22041then target expression). If you type an old formula but then enter a
22042blank line for the new one, the new formula is taken from top-of-stack
22043and the target from second-to-top. If you answer both prompts, the
22044target is taken from top-of-stack as usual.
22045
22046Note that @kbd{a b} has no understanding of commutativity or
22047associativity. The pattern @samp{x+y} will not match the formula
22048@samp{y+x}. Also, @samp{y+z} will not match inside the formula @samp{x+y+z}
22049because the @samp{+} operator is left-associative, so the ``deep
22050structure'' of that formula is @samp{(x+y) + z}. Use @kbd{d U}
22051(@code{calc-unformatted-language}) mode to see the true structure of
22052a formula. The rewrite rule mechanism, discussed later, does not have
22053these limitations.
22054
22055As an algebraic function, @code{subst} takes three arguments:
22056Target expression, old, new. Note that @code{subst} is always
22057evaluated immediately, even if its arguments are variables, so if
22058you wish to put a call to @code{subst} onto the stack you must
22059turn the default simplifications off first (with @kbd{m O}).
22060
22061@node Simplifying Formulas, Polynomials, Algebraic Manipulation, Algebra
22062@section Simplifying Formulas
22063
22064@noindent
22065@kindex a s
22066@pindex calc-simplify
22067@tindex simplify
22068The @kbd{a s} (@code{calc-simplify}) [@code{simplify}] command applies
22069various algebraic rules to simplify a formula. This includes rules which
22070are not part of the default simplifications because they may be too slow
22071to apply all the time, or may not be desirable all of the time. For
22072example, non-adjacent terms of sums are combined, as in @samp{a + b + 2 a}
22073to @samp{b + 3 a}, and some formulas like @samp{sin(arcsin(x))} are
22074simplified to @samp{x}.
22075
22076The sections below describe all the various kinds of algebraic
22077simplifications Calc provides in full detail. None of Calc's
22078simplification commands are designed to pull rabbits out of hats;
22079they simply apply certain specific rules to put formulas into
22080less redundant or more pleasing forms. Serious algebra in Calc
22081must be done manually, usually with a combination of selections
22082and rewrite rules. @xref{Rearranging with Selections}.
22083@xref{Rewrite Rules}.
22084
22085@xref{Simplification Modes}, for commands to control what level of
22086simplification occurs automatically. Normally only the ``default
22087simplifications'' occur.
22088
22089@menu
22090* Default Simplifications::
22091* Algebraic Simplifications::
22092* Unsafe Simplifications::
22093* Simplification of Units::
22094@end menu
22095
22096@node Default Simplifications, Algebraic Simplifications, Simplifying Formulas, Simplifying Formulas
22097@subsection Default Simplifications
22098
22099@noindent
22100@cindex Default simplifications
22101This section describes the ``default simplifications,'' those which are
22102normally applied to all results. For example, if you enter the variable
22103@expr{x} on the stack twice and push @kbd{+}, Calc's default
22104simplifications automatically change @expr{x + x} to @expr{2 x}.
22105
22106The @kbd{m O} command turns off the default simplifications, so that
22107@expr{x + x} will remain in this form unless you give an explicit
22108``simplify'' command like @kbd{=} or @kbd{a v}. @xref{Algebraic
22109Manipulation}. The @kbd{m D} command turns the default simplifications
22110back on.
22111
22112The most basic default simplification is the evaluation of functions.
22113For example, @expr{2 + 3} is evaluated to @expr{5}, and @expr{@tfn{sqrt}(9)}
22114is evaluated to @expr{3}. Evaluation does not occur if the arguments
22115to a function are somehow of the wrong type @expr{@tfn{tan}([2,3,4])}),
22116range (@expr{@tfn{tan}(90)}), or number (@expr{@tfn{tan}(3,5)}),
22117or if the function name is not recognized (@expr{@tfn{f}(5)}), or if
22118Symbolic mode (@pxref{Symbolic Mode}) prevents evaluation
22119(@expr{@tfn{sqrt}(2)}).
22120
22121Calc simplifies (evaluates) the arguments to a function before it
22122simplifies the function itself. Thus @expr{@tfn{sqrt}(5+4)} is
22123simplified to @expr{@tfn{sqrt}(9)} before the @code{sqrt} function
22124itself is applied. There are very few exceptions to this rule:
22125@code{quote}, @code{lambda}, and @code{condition} (the @code{::}
22126operator) do not evaluate their arguments, @code{if} (the @code{? :}
22127operator) does not evaluate all of its arguments, and @code{evalto}
22128does not evaluate its lefthand argument.
22129
22130Most commands apply the default simplifications to all arguments they
22131take from the stack, perform a particular operation, then simplify
22132the result before pushing it back on the stack. In the common special
22133case of regular arithmetic commands like @kbd{+} and @kbd{Q} [@code{sqrt}],
22134the arguments are simply popped from the stack and collected into a
22135suitable function call, which is then simplified (the arguments being
22136simplified first as part of the process, as described above).
22137
22138The default simplifications are too numerous to describe completely
22139here, but this section will describe the ones that apply to the
22140major arithmetic operators. This list will be rather technical in
22141nature, and will probably be interesting to you only if you are
22142a serious user of Calc's algebra facilities.
22143
22144@tex
22145\bigskip
22146@end tex
22147
22148As well as the simplifications described here, if you have stored
22149any rewrite rules in the variable @code{EvalRules} then these rules
22150will also be applied before any built-in default simplifications.
22151@xref{Automatic Rewrites}, for details.
22152
22153@tex
22154\bigskip
22155@end tex
22156
22157And now, on with the default simplifications:
22158
22159Arithmetic operators like @kbd{+} and @kbd{*} always take two
22160arguments in Calc's internal form. Sums and products of three or
22161more terms are arranged by the associative law of algebra into
22162a left-associative form for sums, @expr{((a + b) + c) + d}, and
45b778a6
JB
22163(by default) a right-associative form for products,
22164@expr{a * (b * (c * d))}. Formulas like @expr{(a + b) + (c + d)} are
22165rearranged to left-associative form, though this rarely matters since
22166Calc's algebra commands are designed to hide the inner structure of sums
22167and products as much as possible. Sums and products in their proper
22168associative form will be written without parentheses in the examples
22169below.
4009494e
GM
22170
22171Sums and products are @emph{not} rearranged according to the
22172commutative law (@expr{a + b} to @expr{b + a}) except in a few
22173special cases described below. Some algebra programs always
22174rearrange terms into a canonical order, which enables them to
22175see that @expr{a b + b a} can be simplified to @expr{2 a b}.
22176Calc assumes you have put the terms into the order you want
22177and generally leaves that order alone, with the consequence
22178that formulas like the above will only be simplified if you
22179explicitly give the @kbd{a s} command. @xref{Algebraic
22180Simplifications}.
22181
22182Differences @expr{a - b} are treated like sums @expr{a + (-b)}
22183for purposes of simplification; one of the default simplifications
22184is to rewrite @expr{a + (-b)} or @expr{(-b) + a}, where @expr{-b}
22185represents a ``negative-looking'' term, into @expr{a - b} form.
22186``Negative-looking'' means negative numbers, negated formulas like
22187@expr{-x}, and products or quotients in which either term is
22188negative-looking.
22189
22190Other simplifications involving negation are @expr{-(-x)} to @expr{x};
22191@expr{-(a b)} or @expr{-(a/b)} where either @expr{a} or @expr{b} is
22192negative-looking, simplified by negating that term, or else where
22193@expr{a} or @expr{b} is any number, by negating that number;
22194@expr{-(a + b)} to @expr{-a - b}, and @expr{-(b - a)} to @expr{a - b}.
22195(This, and rewriting @expr{(-b) + a} to @expr{a - b}, are the only
22196cases where the order of terms in a sum is changed by the default
22197simplifications.)
22198
22199The distributive law is used to simplify sums in some cases:
22200@expr{a x + b x} to @expr{(a + b) x}, where @expr{a} represents
22201a number or an implicit 1 or @mathit{-1} (as in @expr{x} or @expr{-x})
22202and similarly for @expr{b}. Use the @kbd{a c}, @w{@kbd{a f}}, or
22203@kbd{j M} commands to merge sums with non-numeric coefficients
22204using the distributive law.
22205
22206The distributive law is only used for sums of two terms, or
22207for adjacent terms in a larger sum. Thus @expr{a + b + b + c}
22208is simplified to @expr{a + 2 b + c}, but @expr{a + b + c + b}
22209is not simplified. The reason is that comparing all terms of a
22210sum with one another would require time proportional to the
22211square of the number of terms; Calc relegates potentially slow
22212operations like this to commands that have to be invoked
22213explicitly, like @kbd{a s}.
22214
22215Finally, @expr{a + 0} and @expr{0 + a} are simplified to @expr{a}.
22216A consequence of the above rules is that @expr{0 - a} is simplified
22217to @expr{-a}.
22218
22219@tex
22220\bigskip
22221@end tex
22222
22223The products @expr{1 a} and @expr{a 1} are simplified to @expr{a};
22224@expr{(-1) a} and @expr{a (-1)} are simplified to @expr{-a};
22225@expr{0 a} and @expr{a 0} are simplified to @expr{0}, except that
22226in Matrix mode where @expr{a} is not provably scalar the result
22227is the generic zero matrix @samp{idn(0)}, and that if @expr{a} is
22228infinite the result is @samp{nan}.
22229
22230Also, @expr{(-a) b} and @expr{a (-b)} are simplified to @expr{-(a b)},
22231where this occurs for negated formulas but not for regular negative
22232numbers.
22233
22234Products are commuted only to move numbers to the front:
22235@expr{a b 2} is commuted to @expr{2 a b}.
22236
22237The product @expr{a (b + c)} is distributed over the sum only if
22238@expr{a} and at least one of @expr{b} and @expr{c} are numbers:
22239@expr{2 (x + 3)} goes to @expr{2 x + 6}. The formula
22240@expr{(-a) (b - c)}, where @expr{-a} is a negative number, is
22241rewritten to @expr{a (c - b)}.
22242
22243The distributive law of products and powers is used for adjacent
22244terms of the product: @expr{x^a x^b} goes to
22245@texline @math{x^{a+b}}
22246@infoline @expr{x^(a+b)}
22247where @expr{a} is a number, or an implicit 1 (as in @expr{x}),
22248or the implicit one-half of @expr{@tfn{sqrt}(x)}, and similarly for
22249@expr{b}. The result is written using @samp{sqrt} or @samp{1/sqrt}
22250if the sum of the powers is @expr{1/2} or @expr{-1/2}, respectively.
22251If the sum of the powers is zero, the product is simplified to
22252@expr{1} or to @samp{idn(1)} if Matrix mode is enabled.
22253
22254The product of a negative power times anything but another negative
22255power is changed to use division:
22256@texline @math{x^{-2} y}
22257@infoline @expr{x^(-2) y}
22258goes to @expr{y / x^2} unless Matrix mode is
22259in effect and neither @expr{x} nor @expr{y} are scalar (in which
22260case it is considered unsafe to rearrange the order of the terms).
22261
22262Finally, @expr{a (b/c)} is rewritten to @expr{(a b)/c}, and also
22263@expr{(a/b) c} is changed to @expr{(a c)/b} unless in Matrix mode.
22264
22265@tex
22266\bigskip
22267@end tex
22268
22269Simplifications for quotients are analogous to those for products.
22270The quotient @expr{0 / x} is simplified to @expr{0}, with the same
22271exceptions that were noted for @expr{0 x}. Likewise, @expr{x / 1}
22272and @expr{x / (-1)} are simplified to @expr{x} and @expr{-x},
22273respectively.
22274
22275The quotient @expr{x / 0} is left unsimplified or changed to an
22276infinite quantity, as directed by the current infinite mode.
22277@xref{Infinite Mode}.
22278
22279The expression
22280@texline @math{a / b^{-c}}
22281@infoline @expr{a / b^(-c)}
22282is changed to @expr{a b^c}, where @expr{-c} is any negative-looking
22283power. Also, @expr{1 / b^c} is changed to
22284@texline @math{b^{-c}}
22285@infoline @expr{b^(-c)}
22286for any power @expr{c}.
22287
22288Also, @expr{(-a) / b} and @expr{a / (-b)} go to @expr{-(a/b)};
22289@expr{(a/b) / c} goes to @expr{a / (b c)}; and @expr{a / (b/c)}
22290goes to @expr{(a c) / b} unless Matrix mode prevents this
22291rearrangement. Similarly, @expr{a / (b:c)} is simplified to
22292@expr{(c:b) a} for any fraction @expr{b:c}.
22293
22294The distributive law is applied to @expr{(a + b) / c} only if
22295@expr{c} and at least one of @expr{a} and @expr{b} are numbers.
22296Quotients of powers and square roots are distributed just as
22297described for multiplication.
22298
22299Quotients of products cancel only in the leading terms of the
22300numerator and denominator. In other words, @expr{a x b / a y b}
22301is cancelled to @expr{x b / y b} but not to @expr{x / y}. Once
22302again this is because full cancellation can be slow; use @kbd{a s}
22303to cancel all terms of the quotient.
22304
22305Quotients of negative-looking values are simplified according
22306to @expr{(-a) / (-b)} to @expr{a / b}, @expr{(-a) / (b - c)}
22307to @expr{a / (c - b)}, and @expr{(a - b) / (-c)} to @expr{(b - a) / c}.
22308
22309@tex
22310\bigskip
22311@end tex
22312
22313The formula @expr{x^0} is simplified to @expr{1}, or to @samp{idn(1)}
22314in Matrix mode. The formula @expr{0^x} is simplified to @expr{0}
22315unless @expr{x} is a negative number, complex number or zero.
22316If @expr{x} is negative, complex or @expr{0.0}, @expr{0^x} is an
22317infinity or an unsimplified formula according to the current infinite
22318mode. The expression @expr{0^0} is simplified to @expr{1}.
22319
22320Powers of products or quotients @expr{(a b)^c}, @expr{(a/b)^c}
22321are distributed to @expr{a^c b^c}, @expr{a^c / b^c} only if @expr{c}
22322is an integer, or if either @expr{a} or @expr{b} are nonnegative
22323real numbers. Powers of powers @expr{(a^b)^c} are simplified to
22324@texline @math{a^{b c}}
22325@infoline @expr{a^(b c)}
22326only when @expr{c} is an integer and @expr{b c} also
22327evaluates to an integer. Without these restrictions these simplifications
22328would not be safe because of problems with principal values.
22329(In other words,
22330@texline @math{((-3)^{1/2})^2}
22331@infoline @expr{((-3)^1:2)^2}
22332is safe to simplify, but
22333@texline @math{((-3)^2)^{1/2}}
22334@infoline @expr{((-3)^2)^1:2}
22335is not.) @xref{Declarations}, for ways to inform Calc that your
22336variables satisfy these requirements.
22337
22338As a special case of this rule, @expr{@tfn{sqrt}(x)^n} is simplified to
22339@texline @math{x^{n/2}}
22340@infoline @expr{x^(n/2)}
22341only for even integers @expr{n}.
22342
22343If @expr{a} is known to be real, @expr{b} is an even integer, and
22344@expr{c} is a half- or quarter-integer, then @expr{(a^b)^c} is
22345simplified to @expr{@tfn{abs}(a^(b c))}.
22346
22347Also, @expr{(-a)^b} is simplified to @expr{a^b} if @expr{b} is an
22348even integer, or to @expr{-(a^b)} if @expr{b} is an odd integer,
22349for any negative-looking expression @expr{-a}.
22350
22351Square roots @expr{@tfn{sqrt}(x)} generally act like one-half powers
22352@texline @math{x^{1:2}}
22353@infoline @expr{x^1:2}
22354for the purposes of the above-listed simplifications.
22355
22356Also, note that
22357@texline @math{1 / x^{1:2}}
22358@infoline @expr{1 / x^1:2}
22359is changed to
22360@texline @math{x^{-1:2}},
22361@infoline @expr{x^(-1:2)},
22362but @expr{1 / @tfn{sqrt}(x)} is left alone.
22363
22364@tex
22365\bigskip
22366@end tex
22367
22368Generic identity matrices (@pxref{Matrix Mode}) are simplified by the
22369following rules: @expr{@tfn{idn}(a) + b} to @expr{a + b} if @expr{b}
22370is provably scalar, or expanded out if @expr{b} is a matrix;
22371@expr{@tfn{idn}(a) + @tfn{idn}(b)} to @expr{@tfn{idn}(a + b)};
22372@expr{-@tfn{idn}(a)} to @expr{@tfn{idn}(-a)}; @expr{a @tfn{idn}(b)} to
22373@expr{@tfn{idn}(a b)} if @expr{a} is provably scalar, or to @expr{a b}
22374if @expr{a} is provably non-scalar; @expr{@tfn{idn}(a) @tfn{idn}(b)} to
22375@expr{@tfn{idn}(a b)}; analogous simplifications for quotients involving
22376@code{idn}; and @expr{@tfn{idn}(a)^n} to @expr{@tfn{idn}(a^n)} where
22377@expr{n} is an integer.
22378
22379@tex
22380\bigskip
22381@end tex
22382
22383The @code{floor} function and other integer truncation functions
22384vanish if the argument is provably integer-valued, so that
22385@expr{@tfn{floor}(@tfn{round}(x))} simplifies to @expr{@tfn{round}(x)}.
22386Also, combinations of @code{float}, @code{floor} and its friends,
22387and @code{ffloor} and its friends, are simplified in appropriate
22388ways. @xref{Integer Truncation}.
22389
22390The expression @expr{@tfn{abs}(-x)} changes to @expr{@tfn{abs}(x)}.
22391The expression @expr{@tfn{abs}(@tfn{abs}(x))} changes to
22392@expr{@tfn{abs}(x)}; in fact, @expr{@tfn{abs}(x)} changes to @expr{x} or
22393@expr{-x} if @expr{x} is provably nonnegative or nonpositive
22394(@pxref{Declarations}).
22395
22396While most functions do not recognize the variable @code{i} as an
22397imaginary number, the @code{arg} function does handle the two cases
22398@expr{@tfn{arg}(@tfn{i})} and @expr{@tfn{arg}(-@tfn{i})} just for convenience.
22399
22400The expression @expr{@tfn{conj}(@tfn{conj}(x))} simplifies to @expr{x}.
22401Various other expressions involving @code{conj}, @code{re}, and
22402@code{im} are simplified, especially if some of the arguments are
22403provably real or involve the constant @code{i}. For example,
22404@expr{@tfn{conj}(a + b i)} is changed to
22405@expr{@tfn{conj}(a) - @tfn{conj}(b) i}, or to @expr{a - b i} if @expr{a}
22406and @expr{b} are known to be real.
22407
22408Functions like @code{sin} and @code{arctan} generally don't have
22409any default simplifications beyond simply evaluating the functions
22410for suitable numeric arguments and infinity. The @kbd{a s} command
22411described in the next section does provide some simplifications for
22412these functions, though.
22413
22414One important simplification that does occur is that
22415@expr{@tfn{ln}(@tfn{e})} is simplified to 1, and @expr{@tfn{ln}(@tfn{e}^x)} is
22416simplified to @expr{x} for any @expr{x}. This occurs even if you have
22417stored a different value in the Calc variable @samp{e}; but this would
22418be a bad idea in any case if you were also using natural logarithms!
22419
22420Among the logical functions, @tfn{!(@var{a} <= @var{b})} changes to
22421@tfn{@var{a} > @var{b}} and so on. Equations and inequalities where both sides
22422are either negative-looking or zero are simplified by negating both sides
22423and reversing the inequality. While it might seem reasonable to simplify
22424@expr{!!x} to @expr{x}, this would not be valid in general because
22425@expr{!!2} is 1, not 2.
22426
22427Most other Calc functions have few if any default simplifications
22428defined, aside of course from evaluation when the arguments are
22429suitable numbers.
22430
22431@node Algebraic Simplifications, Unsafe Simplifications, Default Simplifications, Simplifying Formulas
22432@subsection Algebraic Simplifications
22433
22434@noindent
22435@cindex Algebraic simplifications
22436The @kbd{a s} command makes simplifications that may be too slow to
22437do all the time, or that may not be desirable all of the time.
22438If you find these simplifications are worthwhile, you can type
22439@kbd{m A} to have Calc apply them automatically.
22440
22441This section describes all simplifications that are performed by
22442the @kbd{a s} command. Note that these occur in addition to the
22443default simplifications; even if the default simplifications have
22444been turned off by an @kbd{m O} command, @kbd{a s} will turn them
22445back on temporarily while it simplifies the formula.
22446
22447There is a variable, @code{AlgSimpRules}, in which you can put rewrites
22448to be applied by @kbd{a s}. Its use is analogous to @code{EvalRules},
22449but without the special restrictions. Basically, the simplifier does
22450@samp{@w{a r} AlgSimpRules} with an infinite repeat count on the whole
22451expression being simplified, then it traverses the expression applying
22452the built-in rules described below. If the result is different from
22453the original expression, the process repeats with the default
22454simplifications (including @code{EvalRules}), then @code{AlgSimpRules},
22455then the built-in simplifications, and so on.
22456
22457@tex
22458\bigskip
22459@end tex
22460
22461Sums are simplified in two ways. Constant terms are commuted to the
22462end of the sum, so that @expr{a + 2 + b} changes to @expr{a + b + 2}.
22463The only exception is that a constant will not be commuted away
22464from the first position of a difference, i.e., @expr{2 - x} is not
22465commuted to @expr{-x + 2}.
22466
22467Also, terms of sums are combined by the distributive law, as in
22468@expr{x + y + 2 x} to @expr{y + 3 x}. This always occurs for
22469adjacent terms, but @kbd{a s} compares all pairs of terms including
22470non-adjacent ones.
22471
22472@tex
22473\bigskip
22474@end tex
22475
22476Products are sorted into a canonical order using the commutative
22477law. For example, @expr{b c a} is commuted to @expr{a b c}.
22478This allows easier comparison of products; for example, the default
22479simplifications will not change @expr{x y + y x} to @expr{2 x y},
22480but @kbd{a s} will; it first rewrites the sum to @expr{x y + x y},
22481and then the default simplifications are able to recognize a sum
22482of identical terms.
22483
22484The canonical ordering used to sort terms of products has the
22485property that real-valued numbers, interval forms and infinities
22486come first, and are sorted into increasing order. The @kbd{V S}
22487command uses the same ordering when sorting a vector.
22488
22489Sorting of terms of products is inhibited when Matrix mode is
22490turned on; in this case, Calc will never exchange the order of
22491two terms unless it knows at least one of the terms is a scalar.
22492
22493Products of powers are distributed by comparing all pairs of
22494terms, using the same method that the default simplifications
22495use for adjacent terms of products.
22496
22497Even though sums are not sorted, the commutative law is still
22498taken into account when terms of a product are being compared.
22499Thus @expr{(x + y) (y + x)} will be simplified to @expr{(x + y)^2}.
22500A subtle point is that @expr{(x - y) (y - x)} will @emph{not}
22501be simplified to @expr{-(x - y)^2}; Calc does not notice that
22502one term can be written as a constant times the other, even if
22503that constant is @mathit{-1}.
22504
22505A fraction times any expression, @expr{(a:b) x}, is changed to
22506a quotient involving integers: @expr{a x / b}. This is not
22507done for floating-point numbers like @expr{0.5}, however. This
22508is one reason why you may find it convenient to turn Fraction mode
22509on while doing algebra; @pxref{Fraction Mode}.
22510
22511@tex
22512\bigskip
22513@end tex
22514
22515Quotients are simplified by comparing all terms in the numerator
22516with all terms in the denominator for possible cancellation using
22517the distributive law. For example, @expr{a x^2 b / c x^3 d} will
22518cancel @expr{x^2} from the top and bottom to get @expr{a b / c x d}.
22519(The terms in the denominator will then be rearranged to @expr{c d x}
22520as described above.) If there is any common integer or fractional
22521factor in the numerator and denominator, it is cancelled out;
22522for example, @expr{(4 x + 6) / 8 x} simplifies to @expr{(2 x + 3) / 4 x}.
22523
22524Non-constant common factors are not found even by @kbd{a s}. To
22525cancel the factor @expr{a} in @expr{(a x + a) / a^2} you could first
22526use @kbd{j M} on the product @expr{a x} to Merge the numerator to
22527@expr{a (1+x)}, which can then be simplified successfully.
22528
22529@tex
22530\bigskip
22531@end tex
22532
22533Integer powers of the variable @code{i} are simplified according
22534to the identity @expr{i^2 = -1}. If you store a new value other
22535than the complex number @expr{(0,1)} in @code{i}, this simplification
22536will no longer occur. This is done by @kbd{a s} instead of by default
22537in case someone (unwisely) uses the name @code{i} for a variable
22538unrelated to complex numbers; it would be unfortunate if Calc
22539quietly and automatically changed this formula for reasons the
22540user might not have been thinking of.
22541
22542Square roots of integer or rational arguments are simplified in
22543several ways. (Note that these will be left unevaluated only in
22544Symbolic mode.) First, square integer or rational factors are
22545pulled out so that @expr{@tfn{sqrt}(8)} is rewritten as
22546@texline @math{2\,@tfn{sqrt}(2)}.
22547@infoline @expr{2 sqrt(2)}.
22548Conceptually speaking this implies factoring the argument into primes
22549and moving pairs of primes out of the square root, but for reasons of
22550efficiency Calc only looks for primes up to 29.
22551
22552Square roots in the denominator of a quotient are moved to the
22553numerator: @expr{1 / @tfn{sqrt}(3)} changes to @expr{@tfn{sqrt}(3) / 3}.
22554The same effect occurs for the square root of a fraction:
22555@expr{@tfn{sqrt}(2:3)} changes to @expr{@tfn{sqrt}(6) / 3}.
22556
22557@tex
22558\bigskip
22559@end tex
22560
22561The @code{%} (modulo) operator is simplified in several ways
22562when the modulus @expr{M} is a positive real number. First, if
22563the argument is of the form @expr{x + n} for some real number
22564@expr{n}, then @expr{n} is itself reduced modulo @expr{M}. For
22565example, @samp{(x - 23) % 10} is simplified to @samp{(x + 7) % 10}.
22566
22567If the argument is multiplied by a constant, and this constant
22568has a common integer divisor with the modulus, then this factor is
22569cancelled out. For example, @samp{12 x % 15} is changed to
22570@samp{3 (4 x % 5)} by factoring out 3. Also, @samp{(12 x + 1) % 15}
22571is changed to @samp{3 ((4 x + 1:3) % 5)}. While these forms may
22572not seem ``simpler,'' they allow Calc to discover useful information
22573about modulo forms in the presence of declarations.
22574
22575If the modulus is 1, then Calc can use @code{int} declarations to
22576evaluate the expression. For example, the idiom @samp{x % 2} is
22577often used to check whether a number is odd or even. As described
22578above, @w{@samp{2 n % 2}} and @samp{(2 n + 1) % 2} are simplified to
22579@samp{2 (n % 1)} and @samp{2 ((n + 1:2) % 1)}, respectively; Calc
22580can simplify these to 0 and 1 (respectively) if @code{n} has been
22581declared to be an integer.
22582
22583@tex
22584\bigskip
22585@end tex
22586
22587Trigonometric functions are simplified in several ways. Whenever a
22588products of two trigonometric functions can be replaced by a single
22589function, the replacement is made; for example,
22590@expr{@tfn{tan}(x) @tfn{cos}(x)} is simplified to @expr{@tfn{sin}(x)}.
22591Reciprocals of trigonometric functions are replaced by their reciprocal
22592function; for example, @expr{1/@tfn{sec}(x)} is simplified to
22593@expr{@tfn{cos}(x)}. The corresponding simplifications for the
22594hyperbolic functions are also handled.
22595
22596Trigonometric functions of their inverse functions are
22597simplified. The expression @expr{@tfn{sin}(@tfn{arcsin}(x))} is
22598simplified to @expr{x}, and similarly for @code{cos} and @code{tan}.
22599Trigonometric functions of inverses of different trigonometric
22600functions can also be simplified, as in @expr{@tfn{sin}(@tfn{arccos}(x))}
22601to @expr{@tfn{sqrt}(1 - x^2)}.
22602
22603If the argument to @code{sin} is negative-looking, it is simplified to
22604@expr{-@tfn{sin}(x)}, and similarly for @code{cos} and @code{tan}.
22605Finally, certain special values of the argument are recognized;
22606@pxref{Trigonometric and Hyperbolic Functions}.
22607
22608Hyperbolic functions of their inverses and of negative-looking
22609arguments are also handled, as are exponentials of inverse
22610hyperbolic functions.
22611
22612No simplifications for inverse trigonometric and hyperbolic
22613functions are known, except for negative arguments of @code{arcsin},
22614@code{arctan}, @code{arcsinh}, and @code{arctanh}. Note that
22615@expr{@tfn{arcsin}(@tfn{sin}(x))} can @emph{not} safely change to
22616@expr{x}, since this only correct within an integer multiple of
22617@texline @math{2 \pi}
22618@infoline @expr{2 pi}
22619radians or 360 degrees. However, @expr{@tfn{arcsinh}(@tfn{sinh}(x))} is
22620simplified to @expr{x} if @expr{x} is known to be real.
22621
22622Several simplifications that apply to logarithms and exponentials
22623are that @expr{@tfn{exp}(@tfn{ln}(x))},
22624@texline @tfn{e}@math{^{\ln(x)}},
22625@infoline @expr{e^@tfn{ln}(x)},
22626and
22627@texline @math{10^{{\rm log10}(x)}}
22628@infoline @expr{10^@tfn{log10}(x)}
22629all reduce to @expr{x}. Also, @expr{@tfn{ln}(@tfn{exp}(x))}, etc., can
22630reduce to @expr{x} if @expr{x} is provably real. The form
22631@expr{@tfn{exp}(x)^y} is simplified to @expr{@tfn{exp}(x y)}. If @expr{x}
22632is a suitable multiple of
22633@texline @math{\pi i}
22634@infoline @expr{pi i}
22635(as described above for the trigonometric functions), then
22636@expr{@tfn{exp}(x)} or @expr{e^x} will be expanded. Finally,
22637@expr{@tfn{ln}(x)} is simplified to a form involving @code{pi} and
22638@code{i} where @expr{x} is provably negative, positive imaginary, or
22639negative imaginary.
22640
22641The error functions @code{erf} and @code{erfc} are simplified when
22642their arguments are negative-looking or are calls to the @code{conj}
22643function.
22644
22645@tex
22646\bigskip
22647@end tex
22648
22649Equations and inequalities are simplified by cancelling factors
22650of products, quotients, or sums on both sides. Inequalities
22651change sign if a negative multiplicative factor is cancelled.
22652Non-constant multiplicative factors as in @expr{a b = a c} are
22653cancelled from equations only if they are provably nonzero (generally
22654because they were declared so; @pxref{Declarations}). Factors
22655are cancelled from inequalities only if they are nonzero and their
22656sign is known.
22657
22658Simplification also replaces an equation or inequality with
226591 or 0 (``true'' or ``false'') if it can through the use of
22660declarations. If @expr{x} is declared to be an integer greater
22661than 5, then @expr{x < 3}, @expr{x = 3}, and @expr{x = 7.5} are
22662all simplified to 0, but @expr{x > 3} is simplified to 1.
22663By a similar analysis, @expr{abs(x) >= 0} is simplified to 1,
22664as is @expr{x^2 >= 0} if @expr{x} is known to be real.
22665
22666@node Unsafe Simplifications, Simplification of Units, Algebraic Simplifications, Simplifying Formulas
22667@subsection ``Unsafe'' Simplifications
22668
22669@noindent
22670@cindex Unsafe simplifications
22671@cindex Extended simplification
22672@kindex a e
22673@pindex calc-simplify-extended
22674@ignore
22675@mindex esimpl@idots
22676@end ignore
22677@tindex esimplify
22678The @kbd{a e} (@code{calc-simplify-extended}) [@code{esimplify}] command
22679is like @kbd{a s}
22680except that it applies some additional simplifications which are not
22681``safe'' in all cases. Use this only if you know the values in your
22682formula lie in the restricted ranges for which these simplifications
22683are valid. The symbolic integrator uses @kbd{a e};
22684one effect of this is that the integrator's results must be used with
22685caution. Where an integral table will often attach conditions like
22686``for positive @expr{a} only,'' Calc (like most other symbolic
22687integration programs) will simply produce an unqualified result.
22688
22689Because @kbd{a e}'s simplifications are unsafe, it is sometimes better
22690to type @kbd{C-u -3 a v}, which does extended simplification only
22691on the top level of the formula without affecting the sub-formulas.
22692In fact, @kbd{C-u -3 j v} allows you to target extended simplification
22693to any specific part of a formula.
22694
22695The variable @code{ExtSimpRules} contains rewrites to be applied by
22696the @kbd{a e} command. These are applied in addition to
22697@code{EvalRules} and @code{AlgSimpRules}. (The @kbd{a r AlgSimpRules}
22698step described above is simply followed by an @kbd{a r ExtSimpRules} step.)
22699
22700Following is a complete list of ``unsafe'' simplifications performed
22701by @kbd{a e}.
22702
22703@tex
22704\bigskip
22705@end tex
22706
22707Inverse trigonometric or hyperbolic functions, called with their
22708corresponding non-inverse functions as arguments, are simplified
22709by @kbd{a e}. For example, @expr{@tfn{arcsin}(@tfn{sin}(x))} changes
22710to @expr{x}. Also, @expr{@tfn{arcsin}(@tfn{cos}(x))} and
22711@expr{@tfn{arccos}(@tfn{sin}(x))} both change to @expr{@tfn{pi}/2 - x}.
22712These simplifications are unsafe because they are valid only for
22713values of @expr{x} in a certain range; outside that range, values
22714are folded down to the 360-degree range that the inverse trigonometric
22715functions always produce.
22716
22717Powers of powers @expr{(x^a)^b} are simplified to
22718@texline @math{x^{a b}}
22719@infoline @expr{x^(a b)}
22720for all @expr{a} and @expr{b}. These results will be valid only
22721in a restricted range of @expr{x}; for example, in
22722@texline @math{(x^2)^{1:2}}
22723@infoline @expr{(x^2)^1:2}
22724the powers cancel to get @expr{x}, which is valid for positive values
22725of @expr{x} but not for negative or complex values.
22726
22727Similarly, @expr{@tfn{sqrt}(x^a)} and @expr{@tfn{sqrt}(x)^a} are both
22728simplified (possibly unsafely) to
22729@texline @math{x^{a/2}}.
22730@infoline @expr{x^(a/2)}.
22731
22732Forms like @expr{@tfn{sqrt}(1 - sin(x)^2)} are simplified to, e.g.,
22733@expr{@tfn{cos}(x)}. Calc has identities of this sort for @code{sin},
22734@code{cos}, @code{tan}, @code{sinh}, and @code{cosh}.
22735
22736Arguments of square roots are partially factored to look for
22737squared terms that can be extracted. For example,
22738@expr{@tfn{sqrt}(a^2 b^3 + a^3 b^2)} simplifies to
22739@expr{a b @tfn{sqrt}(a+b)}.
22740
22741The simplifications of @expr{@tfn{ln}(@tfn{exp}(x))},
22742@expr{@tfn{ln}(@tfn{e}^x)}, and @expr{@tfn{log10}(10^x)} to @expr{x} are also
22743unsafe because of problems with principal values (although these
22744simplifications are safe if @expr{x} is known to be real).
22745
22746Common factors are cancelled from products on both sides of an
22747equation, even if those factors may be zero: @expr{a x / b x}
22748to @expr{a / b}. Such factors are never cancelled from
22749inequalities: Even @kbd{a e} is not bold enough to reduce
22750@expr{a x < b x} to @expr{a < b} (or @expr{a > b}, depending
22751on whether you believe @expr{x} is positive or negative).
22752The @kbd{a M /} command can be used to divide a factor out of
22753both sides of an inequality.
22754
22755@node Simplification of Units, , Unsafe Simplifications, Simplifying Formulas
22756@subsection Simplification of Units
22757
22758@noindent
22759The simplifications described in this section are applied by the
22760@kbd{u s} (@code{calc-simplify-units}) command. These are in addition
22761to the regular @kbd{a s} (but not @kbd{a e}) simplifications described
22762earlier. @xref{Basic Operations on Units}.
22763
22764The variable @code{UnitSimpRules} contains rewrites to be applied by
22765the @kbd{u s} command. These are applied in addition to @code{EvalRules}
22766and @code{AlgSimpRules}.
22767
22768Scalar mode is automatically put into effect when simplifying units.
22769@xref{Matrix Mode}.
22770
22771Sums @expr{a + b} involving units are simplified by extracting the
22772units of @expr{a} as if by the @kbd{u x} command (call the result
22773@expr{u_a}), then simplifying the expression @expr{b / u_a}
22774using @kbd{u b} and @kbd{u s}. If the result has units then the sum
22775is inconsistent and is left alone. Otherwise, it is rewritten
22776in terms of the units @expr{u_a}.
22777
22778If units auto-ranging mode is enabled, products or quotients in
22779which the first argument is a number which is out of range for the
22780leading unit are modified accordingly.
22781
22782When cancelling and combining units in products and quotients,
22783Calc accounts for unit names that differ only in the prefix letter.
22784For example, @samp{2 km m} is simplified to @samp{2000 m^2}.
22785However, compatible but different units like @code{ft} and @code{in}
22786are not combined in this way.
22787
22788Quotients @expr{a / b} are simplified in three additional ways. First,
22789if @expr{b} is a number or a product beginning with a number, Calc
22790computes the reciprocal of this number and moves it to the numerator.
22791
22792Second, for each pair of unit names from the numerator and denominator
22793of a quotient, if the units are compatible (e.g., they are both
22794units of area) then they are replaced by the ratio between those
22795units. For example, in @samp{3 s in N / kg cm} the units
22796@samp{in / cm} will be replaced by @expr{2.54}.
22797
22798Third, if the units in the quotient exactly cancel out, so that
22799a @kbd{u b} command on the quotient would produce a dimensionless
22800number for an answer, then the quotient simplifies to that number.
22801
22802For powers and square roots, the ``unsafe'' simplifications
22803@expr{(a b)^c} to @expr{a^c b^c}, @expr{(a/b)^c} to @expr{a^c / b^c},
22804and @expr{(a^b)^c} to
22805@texline @math{a^{b c}}
22806@infoline @expr{a^(b c)}
22807are done if the powers are real numbers. (These are safe in the context
22808of units because all numbers involved can reasonably be assumed to be
22809real.)
22810
22811Also, if a unit name is raised to a fractional power, and the
22812base units in that unit name all occur to powers which are a
22813multiple of the denominator of the power, then the unit name
22814is expanded out into its base units, which can then be simplified
22815according to the previous paragraph. For example, @samp{acre^1.5}
22816is simplified by noting that @expr{1.5 = 3:2}, that @samp{acre}
22817is defined in terms of @samp{m^2}, and that the 2 in the power of
22818@code{m} is a multiple of 2 in @expr{3:2}. Thus, @code{acre^1.5} is
22819replaced by approximately
22820@texline @math{(4046 m^2)^{1.5}}
22821@infoline @expr{(4046 m^2)^1.5},
22822which is then changed to
22823@texline @math{4046^{1.5} \, (m^2)^{1.5}},
22824@infoline @expr{4046^1.5 (m^2)^1.5},
22825then to @expr{257440 m^3}.
22826
22827The functions @code{float}, @code{frac}, @code{clean}, @code{abs},
22828as well as @code{floor} and the other integer truncation functions,
22829applied to unit names or products or quotients involving units, are
22830simplified. For example, @samp{round(1.6 in)} is changed to
22831@samp{round(1.6) round(in)}; the lefthand term evaluates to 2,
22832and the righthand term simplifies to @code{in}.
22833
22834The functions @code{sin}, @code{cos}, and @code{tan} with arguments
22835that have angular units like @code{rad} or @code{arcmin} are
22836simplified by converting to base units (radians), then evaluating
22837with the angular mode temporarily set to radians.
22838
22839@node Polynomials, Calculus, Simplifying Formulas, Algebra
22840@section Polynomials
22841
22842A @dfn{polynomial} is a sum of terms which are coefficients times
22843various powers of a ``base'' variable. For example, @expr{2 x^2 + 3 x - 4}
22844is a polynomial in @expr{x}. Some formulas can be considered
22845polynomials in several different variables: @expr{1 + 2 x + 3 y + 4 x y^2}
22846is a polynomial in both @expr{x} and @expr{y}. Polynomial coefficients
22847are often numbers, but they may in general be any formulas not
22848involving the base variable.
22849
22850@kindex a f
22851@pindex calc-factor
22852@tindex factor
22853The @kbd{a f} (@code{calc-factor}) [@code{factor}] command factors a
22854polynomial into a product of terms. For example, the polynomial
22855@expr{x^3 + 2 x^2 + x} is factored into @samp{x*(x+1)^2}. As another
22856example, @expr{a c + b d + b c + a d} is factored into the product
22857@expr{(a + b) (c + d)}.
22858
22859Calc currently has three algorithms for factoring. Formulas which are
22860linear in several variables, such as the second example above, are
22861merged according to the distributive law. Formulas which are
22862polynomials in a single variable, with constant integer or fractional
22863coefficients, are factored into irreducible linear and/or quadratic
22864terms. The first example above factors into three linear terms
22865(@expr{x}, @expr{x+1}, and @expr{x+1} again). Finally, formulas
22866which do not fit the above criteria are handled by the algebraic
22867rewrite mechanism.
22868
22869Calc's polynomial factorization algorithm works by using the general
22870root-finding command (@w{@kbd{a P}}) to solve for the roots of the
22871polynomial. It then looks for roots which are rational numbers
22872or complex-conjugate pairs, and converts these into linear and
22873quadratic terms, respectively. Because it uses floating-point
22874arithmetic, it may be unable to find terms that involve large
22875integers (whose number of digits approaches the current precision).
22876Also, irreducible factors of degree higher than quadratic are not
22877found, and polynomials in more than one variable are not treated.
22878(A more robust factorization algorithm may be included in a future
22879version of Calc.)
22880
22881@vindex FactorRules
22882@ignore
22883@starindex
22884@end ignore
22885@tindex thecoefs
22886@ignore
22887@starindex
22888@end ignore
22889@ignore
22890@mindex @idots
22891@end ignore
22892@tindex thefactors
22893The rewrite-based factorization method uses rules stored in the variable
22894@code{FactorRules}. @xref{Rewrite Rules}, for a discussion of the
22895operation of rewrite rules. The default @code{FactorRules} are able
22896to factor quadratic forms symbolically into two linear terms,
22897@expr{(a x + b) (c x + d)}. You can edit these rules to include other
22898cases if you wish. To use the rules, Calc builds the formula
22899@samp{thecoefs(x, [a, b, c, ...])} where @code{x} is the polynomial
22900base variable and @code{a}, @code{b}, etc., are polynomial coefficients
22901(which may be numbers or formulas). The constant term is written first,
22902i.e., in the @code{a} position. When the rules complete, they should have
22903changed the formula into the form @samp{thefactors(x, [f1, f2, f3, ...])}
22904where each @code{fi} should be a factored term, e.g., @samp{x - ai}.
22905Calc then multiplies these terms together to get the complete
22906factored form of the polynomial. If the rules do not change the
22907@code{thecoefs} call to a @code{thefactors} call, @kbd{a f} leaves the
22908polynomial alone on the assumption that it is unfactorable. (Note that
22909the function names @code{thecoefs} and @code{thefactors} are used only
22910as placeholders; there are no actual Calc functions by those names.)
22911
22912@kindex H a f
22913@tindex factors
22914The @kbd{H a f} [@code{factors}] command also factors a polynomial,
22915but it returns a list of factors instead of an expression which is the
22916product of the factors. Each factor is represented by a sub-vector
22917of the factor, and the power with which it appears. For example,
22918@expr{x^5 + x^4 - 33 x^3 + 63 x^2} factors to @expr{(x + 7) x^2 (x - 3)^2}
22919in @kbd{a f}, or to @expr{[ [x, 2], [x+7, 1], [x-3, 2] ]} in @kbd{H a f}.
22920If there is an overall numeric factor, it always comes first in the list.
22921The functions @code{factor} and @code{factors} allow a second argument
22922when written in algebraic form; @samp{factor(x,v)} factors @expr{x} with
22923respect to the specific variable @expr{v}. The default is to factor with
22924respect to all the variables that appear in @expr{x}.
22925
22926@kindex a c
22927@pindex calc-collect
22928@tindex collect
22929The @kbd{a c} (@code{calc-collect}) [@code{collect}] command rearranges a
22930formula as a
22931polynomial in a given variable, ordered in decreasing powers of that
22932variable. For example, given @expr{1 + 2 x + 3 y + 4 x y^2} on
22933the stack, @kbd{a c x} would produce @expr{(2 + 4 y^2) x + (1 + 3 y)},
22934and @kbd{a c y} would produce @expr{(4 x) y^2 + 3 y + (1 + 2 x)}.
22935The polynomial will be expanded out using the distributive law as
22936necessary: Collecting @expr{x} in @expr{(x - 1)^3} produces
22937@expr{x^3 - 3 x^2 + 3 x - 1}. Terms not involving @expr{x} will
22938not be expanded.
22939
22940The ``variable'' you specify at the prompt can actually be any
22941expression: @kbd{a c ln(x+1)} will collect together all terms multiplied
22942by @samp{ln(x+1)} or integer powers thereof. If @samp{x} also appears
22943in the formula in a context other than @samp{ln(x+1)}, @kbd{a c} will
22944treat those occurrences as unrelated to @samp{ln(x+1)}, i.e., as constants.
22945
22946@kindex a x
22947@pindex calc-expand
22948@tindex expand
22949The @kbd{a x} (@code{calc-expand}) [@code{expand}] command expands an
22950expression by applying the distributive law everywhere. It applies to
22951products, quotients, and powers involving sums. By default, it fully
22952distributes all parts of the expression. With a numeric prefix argument,
22953the distributive law is applied only the specified number of times, then
22954the partially expanded expression is left on the stack.
22955
22956The @kbd{a x} and @kbd{j D} commands are somewhat redundant. Use
22957@kbd{a x} if you want to expand all products of sums in your formula.
22958Use @kbd{j D} if you want to expand a particular specified term of
22959the formula. There is an exactly analogous correspondence between
22960@kbd{a f} and @kbd{j M}. (The @kbd{j D} and @kbd{j M} commands
22961also know many other kinds of expansions, such as
22962@samp{exp(a + b) = exp(a) exp(b)}, which @kbd{a x} and @kbd{a f}
22963do not do.)
22964
22965Calc's automatic simplifications will sometimes reverse a partial
22966expansion. For example, the first step in expanding @expr{(x+1)^3} is
22967to write @expr{(x+1) (x+1)^2}. If @kbd{a x} stops there and tries
22968to put this formula onto the stack, though, Calc will automatically
22969simplify it back to @expr{(x+1)^3} form. The solution is to turn
22970simplification off first (@pxref{Simplification Modes}), or to run
22971@kbd{a x} without a numeric prefix argument so that it expands all
22972the way in one step.
22973
22974@kindex a a
22975@pindex calc-apart
22976@tindex apart
22977The @kbd{a a} (@code{calc-apart}) [@code{apart}] command expands a
22978rational function by partial fractions. A rational function is the
22979quotient of two polynomials; @code{apart} pulls this apart into a
22980sum of rational functions with simple denominators. In algebraic
22981notation, the @code{apart} function allows a second argument that
22982specifies which variable to use as the ``base''; by default, Calc
22983chooses the base variable automatically.
22984
22985@kindex a n
22986@pindex calc-normalize-rat
22987@tindex nrat
22988The @kbd{a n} (@code{calc-normalize-rat}) [@code{nrat}] command
22989attempts to arrange a formula into a quotient of two polynomials.
22990For example, given @expr{1 + (a + b/c) / d}, the result would be
22991@expr{(b + a c + c d) / c d}. The quotient is reduced, so that
22992@kbd{a n} will simplify @expr{(x^2 + 2x + 1) / (x^2 - 1)} by dividing
22993out the common factor @expr{x + 1}, yielding @expr{(x + 1) / (x - 1)}.
22994
22995@kindex a \
22996@pindex calc-poly-div
22997@tindex pdiv
22998The @kbd{a \} (@code{calc-poly-div}) [@code{pdiv}] command divides
22999two polynomials @expr{u} and @expr{v}, yielding a new polynomial
23000@expr{q}. If several variables occur in the inputs, the inputs are
23001considered multivariate polynomials. (Calc divides by the variable
23002with the largest power in @expr{u} first, or, in the case of equal
23003powers, chooses the variables in alphabetical order.) For example,
23004dividing @expr{x^2 + 3 x + 2} by @expr{x + 2} yields @expr{x + 1}.
23005The remainder from the division, if any, is reported at the bottom
23006of the screen and is also placed in the Trail along with the quotient.
23007
23008Using @code{pdiv} in algebraic notation, you can specify the particular
23009variable to be used as the base: @code{pdiv(@var{a},@var{b},@var{x})}.
23010If @code{pdiv} is given only two arguments (as is always the case with
23011the @kbd{a \} command), then it does a multivariate division as outlined
23012above.
23013
23014@kindex a %
23015@pindex calc-poly-rem
23016@tindex prem
23017The @kbd{a %} (@code{calc-poly-rem}) [@code{prem}] command divides
23018two polynomials and keeps the remainder @expr{r}. The quotient
23019@expr{q} is discarded. For any formulas @expr{a} and @expr{b}, the
23020results of @kbd{a \} and @kbd{a %} satisfy @expr{a = q b + r}.
23021(This is analogous to plain @kbd{\} and @kbd{%}, which compute the
23022integer quotient and remainder from dividing two numbers.)
23023
23024@kindex a /
23025@kindex H a /
23026@pindex calc-poly-div-rem
23027@tindex pdivrem
23028@tindex pdivide
23029The @kbd{a /} (@code{calc-poly-div-rem}) [@code{pdivrem}] command
23030divides two polynomials and reports both the quotient and the
23031remainder as a vector @expr{[q, r]}. The @kbd{H a /} [@code{pdivide}]
23032command divides two polynomials and constructs the formula
23033@expr{q + r/b} on the stack. (Naturally if the remainder is zero,
23034this will immediately simplify to @expr{q}.)
23035
23036@kindex a g
23037@pindex calc-poly-gcd
23038@tindex pgcd
23039The @kbd{a g} (@code{calc-poly-gcd}) [@code{pgcd}] command computes
23040the greatest common divisor of two polynomials. (The GCD actually
23041is unique only to within a constant multiplier; Calc attempts to
23042choose a GCD which will be unsurprising.) For example, the @kbd{a n}
23043command uses @kbd{a g} to take the GCD of the numerator and denominator
23044of a quotient, then divides each by the result using @kbd{a \}. (The
23045definition of GCD ensures that this division can take place without
23046leaving a remainder.)
23047
23048While the polynomials used in operations like @kbd{a /} and @kbd{a g}
23049often have integer coefficients, this is not required. Calc can also
23050deal with polynomials over the rationals or floating-point reals.
23051Polynomials with modulo-form coefficients are also useful in many
23052applications; if you enter @samp{(x^2 + 3 x - 1) mod 5}, Calc
23053automatically transforms this into a polynomial over the field of
23054integers mod 5: @samp{(1 mod 5) x^2 + (3 mod 5) x + (4 mod 5)}.
23055
23056Congratulations and thanks go to Ove Ewerlid
23057(@code{ewerlid@@mizar.DoCS.UU.SE}), who contributed many of the
23058polynomial routines used in the above commands.
23059
23060@xref{Decomposing Polynomials}, for several useful functions for
23061extracting the individual coefficients of a polynomial.
23062
23063@node Calculus, Solving Equations, Polynomials, Algebra
23064@section Calculus
23065
23066@noindent
23067The following calculus commands do not automatically simplify their
23068inputs or outputs using @code{calc-simplify}. You may find it helps
23069to do this by hand by typing @kbd{a s} or @kbd{a e}. It may also help
23070to use @kbd{a x} and/or @kbd{a c} to arrange a result in the most
23071readable way.
23072
23073@menu
23074* Differentiation::
23075* Integration::
23076* Customizing the Integrator::
23077* Numerical Integration::
23078* Taylor Series::
23079@end menu
23080
23081@node Differentiation, Integration, Calculus, Calculus
23082@subsection Differentiation
23083
23084@noindent
23085@kindex a d
23086@kindex H a d
23087@pindex calc-derivative
23088@tindex deriv
23089@tindex tderiv
23090The @kbd{a d} (@code{calc-derivative}) [@code{deriv}] command computes
23091the derivative of the expression on the top of the stack with respect to
23092some variable, which it will prompt you to enter. Normally, variables
23093in the formula other than the specified differentiation variable are
23094considered constant, i.e., @samp{deriv(y,x)} is reduced to zero. With
23095the Hyperbolic flag, the @code{tderiv} (total derivative) operation is used
23096instead, in which derivatives of variables are not reduced to zero
23097unless those variables are known to be ``constant,'' i.e., independent
23098of any other variables. (The built-in special variables like @code{pi}
23099are considered constant, as are variables that have been declared
23100@code{const}; @pxref{Declarations}.)
23101
23102With a numeric prefix argument @var{n}, this command computes the
23103@var{n}th derivative.
23104
23105When working with trigonometric functions, it is best to switch to
23106Radians mode first (with @w{@kbd{m r}}). The derivative of @samp{sin(x)}
23107in degrees is @samp{(pi/180) cos(x)}, probably not the expected
23108answer!
23109
23110If you use the @code{deriv} function directly in an algebraic formula,
23111you can write @samp{deriv(f,x,x0)} which represents the derivative
23112of @expr{f} with respect to @expr{x}, evaluated at the point
23113@texline @math{x=x_0}.
23114@infoline @expr{x=x0}.
23115
23116If the formula being differentiated contains functions which Calc does
23117not know, the derivatives of those functions are produced by adding
23118primes (apostrophe characters). For example, @samp{deriv(f(2x), x)}
23119produces @samp{2 f'(2 x)}, where the function @code{f'} represents the
23120derivative of @code{f}.
23121
23122For functions you have defined with the @kbd{Z F} command, Calc expands
23123the functions according to their defining formulas unless you have
23124also defined @code{f'} suitably. For example, suppose we define
23125@samp{sinc(x) = sin(x)/x} using @kbd{Z F}. If we then differentiate
23126the formula @samp{sinc(2 x)}, the formula will be expanded to
23127@samp{sin(2 x) / (2 x)} and differentiated. However, if we also
23128define @samp{sinc'(x) = dsinc(x)}, say, then Calc will write the
23129result as @samp{2 dsinc(2 x)}. @xref{Algebraic Definitions}.
23130
23131For multi-argument functions @samp{f(x,y,z)}, the derivative with respect
23132to the first argument is written @samp{f'(x,y,z)}; derivatives with
23133respect to the other arguments are @samp{f'2(x,y,z)} and @samp{f'3(x,y,z)}.
23134Various higher-order derivatives can be formed in the obvious way, e.g.,
23135@samp{f'@var{}'(x)} (the second derivative of @code{f}) or
23136@samp{f'@var{}'2'3(x,y,z)} (@code{f} differentiated with respect to each
23137argument once).
23138
23139@node Integration, Customizing the Integrator, Differentiation, Calculus
23140@subsection Integration
23141
23142@noindent
23143@kindex a i
23144@pindex calc-integral
23145@tindex integ
23146The @kbd{a i} (@code{calc-integral}) [@code{integ}] command computes the
23147indefinite integral of the expression on the top of the stack with
23148respect to a prompted-for variable. The integrator is not guaranteed to
23149work for all integrable functions, but it is able to integrate several
23150large classes of formulas. In particular, any polynomial or rational
23151function (a polynomial divided by a polynomial) is acceptable.
23152(Rational functions don't have to be in explicit quotient form, however;
23153@texline @math{x/(1+x^{-2})}
23154@infoline @expr{x/(1+x^-2)}
23155is not strictly a quotient of polynomials, but it is equivalent to
23156@expr{x^3/(x^2+1)}, which is.) Also, square roots of terms involving
23157@expr{x} and @expr{x^2} may appear in rational functions being
23158integrated. Finally, rational functions involving trigonometric or
23159hyperbolic functions can be integrated.
23160
23161With an argument (@kbd{C-u a i}), this command will compute the definite
23162integral of the expression on top of the stack. In this case, the
23163command will again prompt for an integration variable, then prompt for a
23164lower limit and an upper limit.
23165
23166@ifnottex
23167If you use the @code{integ} function directly in an algebraic formula,
23168you can also write @samp{integ(f,x,v)} which expresses the resulting
23169indefinite integral in terms of variable @code{v} instead of @code{x}.
23170With four arguments, @samp{integ(f(x),x,a,b)} represents a definite
23171integral from @code{a} to @code{b}.
23172@end ifnottex
23173@tex
23174If you use the @code{integ} function directly in an algebraic formula,
23175you can also write @samp{integ(f,x,v)} which expresses the resulting
23176indefinite integral in terms of variable @code{v} instead of @code{x}.
23177With four arguments, @samp{integ(f(x),x,a,b)} represents a definite
23178integral $\int_a^b f(x) \, dx$.
23179@end tex
23180
23181Please note that the current implementation of Calc's integrator sometimes
23182produces results that are significantly more complex than they need to
23183be. For example, the integral Calc finds for
23184@texline @math{1/(x+\sqrt{x^2+1})}
23185@infoline @expr{1/(x+sqrt(x^2+1))}
23186is several times more complicated than the answer Mathematica
23187returns for the same input, although the two forms are numerically
23188equivalent. Also, any indefinite integral should be considered to have
23189an arbitrary constant of integration added to it, although Calc does not
23190write an explicit constant of integration in its result. For example,
23191Calc's solution for
23192@texline @math{1/(1+\tan x)}
23193@infoline @expr{1/(1+tan(x))}
23194differs from the solution given in the @emph{CRC Math Tables} by a
23195constant factor of
23196@texline @math{\pi i / 2}
23197@infoline @expr{pi i / 2},
23198due to a different choice of constant of integration.
23199
23200The Calculator remembers all the integrals it has done. If conditions
23201change in a way that would invalidate the old integrals, say, a switch
23202from Degrees to Radians mode, then they will be thrown out. If you
23203suspect this is not happening when it should, use the
23204@code{calc-flush-caches} command; @pxref{Caches}.
23205
23206@vindex IntegLimit
23207Calc normally will pursue integration by substitution or integration by
23208parts up to 3 nested times before abandoning an approach as fruitless.
23209If the integrator is taking too long, you can lower this limit by storing
23210a number (like 2) in the variable @code{IntegLimit}. (The @kbd{s I}
23211command is a convenient way to edit @code{IntegLimit}.) If this variable
23212has no stored value or does not contain a nonnegative integer, a limit
23213of 3 is used. The lower this limit is, the greater the chance that Calc
23214will be unable to integrate a function it could otherwise handle. Raising
23215this limit allows the Calculator to solve more integrals, though the time
23216it takes may grow exponentially. You can monitor the integrator's actions
23217by creating an Emacs buffer called @code{*Trace*}. If such a buffer
23218exists, the @kbd{a i} command will write a log of its actions there.
23219
23220If you want to manipulate integrals in a purely symbolic way, you can
23221set the integration nesting limit to 0 to prevent all but fast
23222table-lookup solutions of integrals. You might then wish to define
23223rewrite rules for integration by parts, various kinds of substitutions,
23224and so on. @xref{Rewrite Rules}.
23225
23226@node Customizing the Integrator, Numerical Integration, Integration, Calculus
23227@subsection Customizing the Integrator
23228
23229@noindent
23230@vindex IntegRules
23231Calc has two built-in rewrite rules called @code{IntegRules} and
23232@code{IntegAfterRules} which you can edit to define new integration
23233methods. @xref{Rewrite Rules}. At each step of the integration process,
23234Calc wraps the current integrand in a call to the fictitious function
23235@samp{integtry(@var{expr},@var{var})}, where @var{expr} is the
23236integrand and @var{var} is the integration variable. If your rules
23237rewrite this to be a plain formula (not a call to @code{integtry}), then
23238Calc will use this formula as the integral of @var{expr}. For example,
23239the rule @samp{integtry(mysin(x),x) := -mycos(x)} would define a rule to
23240integrate a function @code{mysin} that acts like the sine function.
23241Then, putting @samp{4 mysin(2y+1)} on the stack and typing @kbd{a i y}
23242will produce the integral @samp{-2 mycos(2y+1)}. Note that Calc has
23243automatically made various transformations on the integral to allow it
23244to use your rule; integral tables generally give rules for
23245@samp{mysin(a x + b)}, but you don't need to use this much generality
23246in your @code{IntegRules}.
23247
23248@cindex Exponential integral Ei(x)
23249@ignore
23250@starindex
23251@end ignore
23252@tindex Ei
23253As a more serious example, the expression @samp{exp(x)/x} cannot be
23254integrated in terms of the standard functions, so the ``exponential
23255integral'' function
23256@texline @math{{\rm Ei}(x)}
23257@infoline @expr{Ei(x)}
23258was invented to describe it.
23259We can get Calc to do this integral in terms of a made-up @code{Ei}
23260function by adding the rule @samp{[integtry(exp(x)/x, x) := Ei(x)]}
23261to @code{IntegRules}. Now entering @samp{exp(2x)/x} on the stack
23262and typing @kbd{a i x} yields @samp{Ei(2 x)}. This new rule will
23263work with Calc's various built-in integration methods (such as
23264integration by substitution) to solve a variety of other problems
23265involving @code{Ei}: For example, now Calc will also be able to
23266integrate @samp{exp(exp(x))} and @samp{ln(ln(x))} (to get @samp{Ei(exp(x))}
23267and @samp{x ln(ln(x)) - Ei(ln(x))}, respectively).
23268
23269Your rule may do further integration by calling @code{integ}. For
23270example, @samp{integtry(twice(u),x) := twice(integ(u))} allows Calc
23271to integrate @samp{twice(sin(x))} to get @samp{twice(-cos(x))}.
23272Note that @code{integ} was called with only one argument. This notation
23273is allowed only within @code{IntegRules}; it means ``integrate this
23274with respect to the same integration variable.'' If Calc is unable
23275to integrate @code{u}, the integration that invoked @code{IntegRules}
23276also fails. Thus integrating @samp{twice(f(x))} fails, returning the
23277unevaluated integral @samp{integ(twice(f(x)), x)}. It is still valid
23278to call @code{integ} with two or more arguments, however; in this case,
23279if @code{u} is not integrable, @code{twice} itself will still be
23280integrated: If the above rule is changed to @samp{... := twice(integ(u,x))},
23281then integrating @samp{twice(f(x))} will yield @samp{twice(integ(f(x),x))}.
23282
23283If a rule instead produces the formula @samp{integsubst(@var{sexpr},
23284@var{svar})}, either replacing the top-level @code{integtry} call or
23285nested anywhere inside the expression, then Calc will apply the
23286substitution @samp{@var{u} = @var{sexpr}(@var{svar})} to try to
23287integrate the original @var{expr}. For example, the rule
23288@samp{sqrt(a) := integsubst(sqrt(x),x)} says that if Calc ever finds
23289a square root in the integrand, it should attempt the substitution
23290@samp{u = sqrt(x)}. (This particular rule is unnecessary because
23291Calc always tries ``obvious'' substitutions where @var{sexpr} actually
23292appears in the integrand.) The variable @var{svar} may be the same
23293as the @var{var} that appeared in the call to @code{integtry}, but
23294it need not be.
23295
23296When integrating according to an @code{integsubst}, Calc uses the
23297equation solver to find the inverse of @var{sexpr} (if the integrand
23298refers to @var{var} anywhere except in subexpressions that exactly
23299match @var{sexpr}). It uses the differentiator to find the derivative
23300of @var{sexpr} and/or its inverse (it has two methods that use one
23301derivative or the other). You can also specify these items by adding
23302extra arguments to the @code{integsubst} your rules construct; the
23303general form is @samp{integsubst(@var{sexpr}, @var{svar}, @var{sinv},
23304@var{sprime})}, where @var{sinv} is the inverse of @var{sexpr} (still
23305written as a function of @var{svar}), and @var{sprime} is the
23306derivative of @var{sexpr} with respect to @var{svar}. If you don't
23307specify these things, and Calc is not able to work them out on its
23308own with the information it knows, then your substitution rule will
23309work only in very specific, simple cases.
23310
23311Calc applies @code{IntegRules} as if by @kbd{C-u 1 a r IntegRules};
23312in other words, Calc stops rewriting as soon as any rule in your rule
23313set succeeds. (If it weren't for this, the @samp{integsubst(sqrt(x),x)}
23314example above would keep on adding layers of @code{integsubst} calls
23315forever!)
23316
23317@vindex IntegSimpRules
23318Another set of rules, stored in @code{IntegSimpRules}, are applied
23319every time the integrator uses @kbd{a s} to simplify an intermediate
23320result. For example, putting the rule @samp{twice(x) := 2 x} into
23321@code{IntegSimpRules} would tell Calc to convert the @code{twice}
23322function into a form it knows whenever integration is attempted.
23323
23324One more way to influence the integrator is to define a function with
23325the @kbd{Z F} command (@pxref{Algebraic Definitions}). Calc's
23326integrator automatically expands such functions according to their
23327defining formulas, even if you originally asked for the function to
23328be left unevaluated for symbolic arguments. (Certain other Calc
23329systems, such as the differentiator and the equation solver, also
23330do this.)
23331
23332@vindex IntegAfterRules
23333Sometimes Calc is able to find a solution to your integral, but it
23334expresses the result in a way that is unnecessarily complicated. If
23335this happens, you can either use @code{integsubst} as described
23336above to try to hint at a more direct path to the desired result, or
23337you can use @code{IntegAfterRules}. This is an extra rule set that
23338runs after the main integrator returns its result; basically, Calc does
23339an @kbd{a r IntegAfterRules} on the result before showing it to you.
23340(It also does an @kbd{a s}, without @code{IntegSimpRules}, after that
23341to further simplify the result.) For example, Calc's integrator
23342sometimes produces expressions of the form @samp{ln(1+x) - ln(1-x)};
23343the default @code{IntegAfterRules} rewrite this into the more readable
23344form @samp{2 arctanh(x)}. Note that, unlike @code{IntegRules},
23345@code{IntegSimpRules} and @code{IntegAfterRules} are applied any number
23346of times until no further changes are possible. Rewriting by
23347@code{IntegAfterRules} occurs only after the main integrator has
23348finished, not at every step as for @code{IntegRules} and
23349@code{IntegSimpRules}.
23350
23351@node Numerical Integration, Taylor Series, Customizing the Integrator, Calculus
23352@subsection Numerical Integration
23353
23354@noindent
23355@kindex a I
23356@pindex calc-num-integral
23357@tindex ninteg
23358If you want a purely numerical answer to an integration problem, you can
23359use the @kbd{a I} (@code{calc-num-integral}) [@code{ninteg}] command. This
23360command prompts for an integration variable, a lower limit, and an
23361upper limit. Except for the integration variable, all other variables
23362that appear in the integrand formula must have stored values. (A stored
23363value, if any, for the integration variable itself is ignored.)
23364
23365Numerical integration works by evaluating your formula at many points in
23366the specified interval. Calc uses an ``open Romberg'' method; this means
23367that it does not evaluate the formula actually at the endpoints (so that
23368it is safe to integrate @samp{sin(x)/x} from zero, for example). Also,
23369the Romberg method works especially well when the function being
23370integrated is fairly smooth. If the function is not smooth, Calc will
23371have to evaluate it at quite a few points before it can accurately
23372determine the value of the integral.
23373
23374Integration is much faster when the current precision is small. It is
23375best to set the precision to the smallest acceptable number of digits
23376before you use @kbd{a I}. If Calc appears to be taking too long, press
23377@kbd{C-g} to halt it and try a lower precision. If Calc still appears
23378to need hundreds of evaluations, check to make sure your function is
23379well-behaved in the specified interval.
23380
23381It is possible for the lower integration limit to be @samp{-inf} (minus
23382infinity). Likewise, the upper limit may be plus infinity. Calc
23383internally transforms the integral into an equivalent one with finite
23384limits. However, integration to or across singularities is not supported:
23385The integral of @samp{1/sqrt(x)} from 0 to 1 exists (it can be found
23386by Calc's symbolic integrator, for example), but @kbd{a I} will fail
23387because the integrand goes to infinity at one of the endpoints.
23388
23389@node Taylor Series, , Numerical Integration, Calculus
23390@subsection Taylor Series
23391
23392@noindent
23393@kindex a t
23394@pindex calc-taylor
23395@tindex taylor
23396The @kbd{a t} (@code{calc-taylor}) [@code{taylor}] command computes a
23397power series expansion or Taylor series of a function. You specify the
23398variable and the desired number of terms. You may give an expression of
23399the form @samp{@var{var} = @var{a}} or @samp{@var{var} - @var{a}} instead
23400of just a variable to produce a Taylor expansion about the point @var{a}.
23401You may specify the number of terms with a numeric prefix argument;
23402otherwise the command will prompt you for the number of terms. Note that
23403many series expansions have coefficients of zero for some terms, so you
23404may appear to get fewer terms than you asked for.
23405
23406If the @kbd{a i} command is unable to find a symbolic integral for a
23407function, you can get an approximation by integrating the function's
23408Taylor series.
23409
23410@node Solving Equations, Numerical Solutions, Calculus, Algebra
23411@section Solving Equations
23412
23413@noindent
23414@kindex a S
23415@pindex calc-solve-for
23416@tindex solve
23417@cindex Equations, solving
23418@cindex Solving equations
23419The @kbd{a S} (@code{calc-solve-for}) [@code{solve}] command rearranges
23420an equation to solve for a specific variable. An equation is an
23421expression of the form @expr{L = R}. For example, the command @kbd{a S x}
23422will rearrange @expr{y = 3x + 6} to the form, @expr{x = y/3 - 2}. If the
23423input is not an equation, it is treated like an equation of the
23424form @expr{X = 0}.
23425
23426This command also works for inequalities, as in @expr{y < 3x + 6}.
23427Some inequalities cannot be solved where the analogous equation could
23428be; for example, solving
23429@texline @math{a < b \, c}
23430@infoline @expr{a < b c}
23431for @expr{b} is impossible
23432without knowing the sign of @expr{c}. In this case, @kbd{a S} will
23433produce the result
23434@texline @math{b \mathbin{\hbox{\code{!=}}} a/c}
23435@infoline @expr{b != a/c}
23436(using the not-equal-to operator) to signify that the direction of the
23437inequality is now unknown. The inequality
23438@texline @math{a \le b \, c}
23439@infoline @expr{a <= b c}
23440is not even partially solved. @xref{Declarations}, for a way to tell
23441Calc that the signs of the variables in a formula are in fact known.
23442
23443Two useful commands for working with the result of @kbd{a S} are
23444@kbd{a .} (@pxref{Logical Operations}), which converts @expr{x = y/3 - 2}
23445to @expr{y/3 - 2}, and @kbd{s l} (@pxref{Let Command}) which evaluates
23446another formula with @expr{x} set equal to @expr{y/3 - 2}.
23447
23448@menu
23449* Multiple Solutions::
23450* Solving Systems of Equations::
23451* Decomposing Polynomials::
23452@end menu
23453
23454@node Multiple Solutions, Solving Systems of Equations, Solving Equations, Solving Equations
23455@subsection Multiple Solutions
23456
23457@noindent
23458@kindex H a S
23459@tindex fsolve
23460Some equations have more than one solution. The Hyperbolic flag
23461(@code{H a S}) [@code{fsolve}] tells the solver to report the fully
23462general family of solutions. It will invent variables @code{n1},
23463@code{n2}, @dots{}, which represent independent arbitrary integers, and
23464@code{s1}, @code{s2}, @dots{}, which represent independent arbitrary
23465signs (either @mathit{+1} or @mathit{-1}). If you don't use the Hyperbolic
23466flag, Calc will use zero in place of all arbitrary integers, and plus
23467one in place of all arbitrary signs. Note that variables like @code{n1}
23468and @code{s1} are not given any special interpretation in Calc except by
23469the equation solver itself. As usual, you can use the @w{@kbd{s l}}
23470(@code{calc-let}) command to obtain solutions for various actual values
23471of these variables.
23472
23473For example, @kbd{' x^2 = y @key{RET} H a S x @key{RET}} solves to
23474get @samp{x = s1 sqrt(y)}, indicating that the two solutions to the
23475equation are @samp{sqrt(y)} and @samp{-sqrt(y)}. Another way to
23476think about it is that the square-root operation is really a
23477two-valued function; since every Calc function must return a
23478single result, @code{sqrt} chooses to return the positive result.
23479Then @kbd{H a S} doctors this result using @code{s1} to indicate
23480the full set of possible values of the mathematical square-root.
23481
23482There is a similar phenomenon going the other direction: Suppose
23483we solve @samp{sqrt(y) = x} for @code{y}. Calc squares both sides
23484to get @samp{y = x^2}. This is correct, except that it introduces
23485some dubious solutions. Consider solving @samp{sqrt(y) = -3}:
23486Calc will report @expr{y = 9} as a valid solution, which is true
23487in the mathematical sense of square-root, but false (there is no
23488solution) for the actual Calc positive-valued @code{sqrt}. This
23489happens for both @kbd{a S} and @kbd{H a S}.
23490
23491@cindex @code{GenCount} variable
23492@vindex GenCount
23493@ignore
23494@starindex
23495@end ignore
23496@tindex an
23497@ignore
23498@starindex
23499@end ignore
23500@tindex as
23501If you store a positive integer in the Calc variable @code{GenCount},
23502then Calc will generate formulas of the form @samp{as(@var{n})} for
23503arbitrary signs, and @samp{an(@var{n})} for arbitrary integers,
23504where @var{n} represents successive values taken by incrementing
23505@code{GenCount} by one. While the normal arbitrary sign and
23506integer symbols start over at @code{s1} and @code{n1} with each
23507new Calc command, the @code{GenCount} approach will give each
23508arbitrary value a name that is unique throughout the entire Calc
23509session. Also, the arbitrary values are function calls instead
23510of variables, which is advantageous in some cases. For example,
23511you can make a rewrite rule that recognizes all arbitrary signs
23512using a pattern like @samp{as(n)}. The @kbd{s l} command only works
23513on variables, but you can use the @kbd{a b} (@code{calc-substitute})
23514command to substitute actual values for function calls like @samp{as(3)}.
23515
23516The @kbd{s G} (@code{calc-edit-GenCount}) command is a convenient
23517way to create or edit this variable. Press @kbd{C-c C-c} to finish.
23518
23519If you have not stored a value in @code{GenCount}, or if the value
23520in that variable is not a positive integer, the regular
23521@code{s1}/@code{n1} notation is used.
23522
23523@kindex I a S
23524@kindex H I a S
23525@tindex finv
23526@tindex ffinv
23527With the Inverse flag, @kbd{I a S} [@code{finv}] treats the expression
23528on top of the stack as a function of the specified variable and solves
23529to find the inverse function, written in terms of the same variable.
23530For example, @kbd{I a S x} inverts @expr{2x + 6} to @expr{x/2 - 3}.
23531You can use both Inverse and Hyperbolic [@code{ffinv}] to obtain a
23532fully general inverse, as described above.
23533
23534@kindex a P
23535@pindex calc-poly-roots
23536@tindex roots
23537Some equations, specifically polynomials, have a known, finite number
23538of solutions. The @kbd{a P} (@code{calc-poly-roots}) [@code{roots}]
23539command uses @kbd{H a S} to solve an equation in general form, then, for
23540all arbitrary-sign variables like @code{s1}, and all arbitrary-integer
23541variables like @code{n1} for which @code{n1} only usefully varies over
23542a finite range, it expands these variables out to all their possible
23543values. The results are collected into a vector, which is returned.
23544For example, @samp{roots(x^4 = 1, x)} returns the four solutions
23545@samp{[1, -1, (0, 1), (0, -1)]}. Generally an @var{n}th degree
23546polynomial will always have @var{n} roots on the complex plane.
23547(If you have given a @code{real} declaration for the solution
23548variable, then only the real-valued solutions, if any, will be
23549reported; @pxref{Declarations}.)
23550
23551Note that because @kbd{a P} uses @kbd{H a S}, it is able to deliver
23552symbolic solutions if the polynomial has symbolic coefficients. Also
23553note that Calc's solver is not able to get exact symbolic solutions
23554to all polynomials. Polynomials containing powers up to @expr{x^4}
23555can always be solved exactly; polynomials of higher degree sometimes
23556can be: @expr{x^6 + x^3 + 1} is converted to @expr{(x^3)^2 + (x^3) + 1},
23557which can be solved for @expr{x^3} using the quadratic equation, and then
23558for @expr{x} by taking cube roots. But in many cases, like
23559@expr{x^6 + x + 1}, Calc does not know how to rewrite the polynomial
23560into a form it can solve. The @kbd{a P} command can still deliver a
23561list of numerical roots, however, provided that Symbolic mode (@kbd{m s})
23562is not turned on. (If you work with Symbolic mode on, recall that the
23563@kbd{N} (@code{calc-eval-num}) key is a handy way to reevaluate the
23564formula on the stack with Symbolic mode temporarily off.) Naturally,
23565@kbd{a P} can only provide numerical roots if the polynomial coefficients
23566are all numbers (real or complex).
23567
23568@node Solving Systems of Equations, Decomposing Polynomials, Multiple Solutions, Solving Equations
23569@subsection Solving Systems of Equations
23570
23571@noindent
23572@cindex Systems of equations, symbolic
23573You can also use the commands described above to solve systems of
23574simultaneous equations. Just create a vector of equations, then
23575specify a vector of variables for which to solve. (You can omit
23576the surrounding brackets when entering the vector of variables
23577at the prompt.)
23578
23579For example, putting @samp{[x + y = a, x - y = b]} on the stack
23580and typing @kbd{a S x,y @key{RET}} produces the vector of solutions
23581@samp{[x = a - (a-b)/2, y = (a-b)/2]}. The result vector will
23582have the same length as the variables vector, and the variables
23583will be listed in the same order there. Note that the solutions
23584are not always simplified as far as possible; the solution for
23585@expr{x} here could be improved by an application of the @kbd{a n}
23586command.
23587
23588Calc's algorithm works by trying to eliminate one variable at a
23589time by solving one of the equations for that variable and then
23590substituting into the other equations. Calc will try all the
23591possibilities, but you can speed things up by noting that Calc
23592first tries to eliminate the first variable with the first
23593equation, then the second variable with the second equation,
23594and so on. It also helps to put the simpler (e.g., more linear)
23595equations toward the front of the list. Calc's algorithm will
23596solve any system of linear equations, and also many kinds of
23597nonlinear systems.
23598
23599@ignore
23600@starindex
23601@end ignore
23602@tindex elim
23603Normally there will be as many variables as equations. If you
23604give fewer variables than equations (an ``over-determined'' system
23605of equations), Calc will find a partial solution. For example,
23606typing @kbd{a S y @key{RET}} with the above system of equations
23607would produce @samp{[y = a - x]}. There are now several ways to
23608express this solution in terms of the original variables; Calc uses
23609the first one that it finds. You can control the choice by adding
23610variable specifiers of the form @samp{elim(@var{v})} to the
23611variables list. This says that @var{v} should be eliminated from
23612the equations; the variable will not appear at all in the solution.
23613For example, typing @kbd{a S y,elim(x)} would yield
23614@samp{[y = a - (b+a)/2]}.
23615
23616If the variables list contains only @code{elim} specifiers,
23617Calc simply eliminates those variables from the equations
23618and then returns the resulting set of equations. For example,
23619@kbd{a S elim(x)} produces @samp{[a - 2 y = b]}. Every variable
23620eliminated will reduce the number of equations in the system
23621by one.
23622
23623Again, @kbd{a S} gives you one solution to the system of
23624equations. If there are several solutions, you can use @kbd{H a S}
23625to get a general family of solutions, or, if there is a finite
23626number of solutions, you can use @kbd{a P} to get a list. (In
23627the latter case, the result will take the form of a matrix where
23628the rows are different solutions and the columns correspond to the
23629variables you requested.)
23630
23631Another way to deal with certain kinds of overdetermined systems of
23632equations is the @kbd{a F} command, which does least-squares fitting
23633to satisfy the equations. @xref{Curve Fitting}.
23634
23635@node Decomposing Polynomials, , Solving Systems of Equations, Solving Equations
23636@subsection Decomposing Polynomials
23637
23638@noindent
23639@ignore
23640@starindex
23641@end ignore
23642@tindex poly
23643The @code{poly} function takes a polynomial and a variable as
23644arguments, and returns a vector of polynomial coefficients (constant
23645coefficient first). For example, @samp{poly(x^3 + 2 x, x)} returns
23646@expr{[0, 2, 0, 1]}. If the input is not a polynomial in @expr{x},
23647the call to @code{poly} is left in symbolic form. If the input does
23648not involve the variable @expr{x}, the input is returned in a list
23649of length one, representing a polynomial with only a constant
23650coefficient. The call @samp{poly(x, x)} returns the vector @expr{[0, 1]}.
23651The last element of the returned vector is guaranteed to be nonzero;
23652note that @samp{poly(0, x)} returns the empty vector @expr{[]}.
23653Note also that @expr{x} may actually be any formula; for example,
23654@samp{poly(sin(x)^2 - sin(x) + 3, sin(x))} returns @expr{[3, -1, 1]}.
23655
23656@cindex Coefficients of polynomial
23657@cindex Degree of polynomial
23658To get the @expr{x^k} coefficient of polynomial @expr{p}, use
23659@samp{poly(p, x)_(k+1)}. To get the degree of polynomial @expr{p},
23660use @samp{vlen(poly(p, x)) - 1}. For example, @samp{poly((x+1)^4, x)}
23661returns @samp{[1, 4, 6, 4, 1]}, so @samp{poly((x+1)^4, x)_(2+1)}
23662gives the @expr{x^2} coefficient of this polynomial, 6.
23663
23664@ignore
23665@starindex
23666@end ignore
23667@tindex gpoly
23668One important feature of the solver is its ability to recognize
23669formulas which are ``essentially'' polynomials. This ability is
23670made available to the user through the @code{gpoly} function, which
23671is used just like @code{poly}: @samp{gpoly(@var{expr}, @var{var})}.
23672If @var{expr} is a polynomial in some term which includes @var{var}, then
23673this function will return a vector @samp{[@var{x}, @var{c}, @var{a}]}
23674where @var{x} is the term that depends on @var{var}, @var{c} is a
23675vector of polynomial coefficients (like the one returned by @code{poly}),
23676and @var{a} is a multiplier which is usually 1. Basically,
23677@samp{@var{expr} = @var{a}*(@var{c}_1 + @var{c}_2 @var{x} +
23678@var{c}_3 @var{x}^2 + ...)}. The last element of @var{c} is
23679guaranteed to be non-zero, and @var{c} will not equal @samp{[1]}
23680(i.e., the trivial decomposition @var{expr} = @var{x} is not
23681considered a polynomial). One side effect is that @samp{gpoly(x, x)}
23682and @samp{gpoly(6, x)}, both of which might be expected to recognize
23683their arguments as polynomials, will not because the decomposition
23684is considered trivial.
23685
23686For example, @samp{gpoly((x-2)^2, x)} returns @samp{[x, [4, -4, 1], 1]},
23687since the expanded form of this polynomial is @expr{4 - 4 x + x^2}.
23688
23689The term @var{x} may itself be a polynomial in @var{var}. This is
23690done to reduce the size of the @var{c} vector. For example,
23691@samp{gpoly(x^4 + x^2 - 1, x)} returns @samp{[x^2, [-1, 1, 1], 1]},
23692since a quadratic polynomial in @expr{x^2} is easier to solve than
23693a quartic polynomial in @expr{x}.
23694
23695A few more examples of the kinds of polynomials @code{gpoly} can
23696discover:
23697
23698@smallexample
23699sin(x) - 1 [sin(x), [-1, 1], 1]
23700x + 1/x - 1 [x, [1, -1, 1], 1/x]
23701x + 1/x [x^2, [1, 1], 1/x]
23702x^3 + 2 x [x^2, [2, 1], x]
23703x + x^2:3 + sqrt(x) [x^1:6, [1, 1, 0, 1], x^1:2]
23704x^(2a) + 2 x^a + 5 [x^a, [5, 2, 1], 1]
23705(exp(-x) + exp(x)) / 2 [e^(2 x), [0.5, 0.5], e^-x]
23706@end smallexample
23707
23708The @code{poly} and @code{gpoly} functions accept a third integer argument
23709which specifies the largest degree of polynomial that is acceptable.
23710If this is @expr{n}, then only @var{c} vectors of length @expr{n+1}
23711or less will be returned. Otherwise, the @code{poly} or @code{gpoly}
23712call will remain in symbolic form. For example, the equation solver
23713can handle quartics and smaller polynomials, so it calls
23714@samp{gpoly(@var{expr}, @var{var}, 4)} to discover whether @var{expr}
23715can be treated by its linear, quadratic, cubic, or quartic formulas.
23716
23717@ignore
23718@starindex
23719@end ignore
23720@tindex pdeg
23721The @code{pdeg} function computes the degree of a polynomial;
23722@samp{pdeg(p,x)} is the highest power of @code{x} that appears in
23723@code{p}. This is the same as @samp{vlen(poly(p,x))-1}, but is
23724much more efficient. If @code{p} is constant with respect to @code{x},
23725then @samp{pdeg(p,x) = 0}. If @code{p} is not a polynomial in @code{x}
23726(e.g., @samp{pdeg(2 cos(x), x)}, the function remains unevaluated.
23727It is possible to omit the second argument @code{x}, in which case
23728@samp{pdeg(p)} returns the highest total degree of any term of the
23729polynomial, counting all variables that appear in @code{p}. Note
23730that @code{pdeg(c) = pdeg(c,x) = 0} for any nonzero constant @code{c};
23731the degree of the constant zero is considered to be @code{-inf}
23732(minus infinity).
23733
23734@ignore
23735@starindex
23736@end ignore
23737@tindex plead
23738The @code{plead} function finds the leading term of a polynomial.
23739Thus @samp{plead(p,x)} is equivalent to @samp{poly(p,x)_vlen(poly(p,x))},
23740though again more efficient. In particular, @samp{plead((2x+1)^10, x)}
23741returns 1024 without expanding out the list of coefficients. The
23742value of @code{plead(p,x)} will be zero only if @expr{p = 0}.
23743
23744@ignore
23745@starindex
23746@end ignore
23747@tindex pcont
23748The @code{pcont} function finds the @dfn{content} of a polynomial. This
23749is the greatest common divisor of all the coefficients of the polynomial.
23750With two arguments, @code{pcont(p,x)} effectively uses @samp{poly(p,x)}
23751to get a list of coefficients, then uses @code{pgcd} (the polynomial
23752GCD function) to combine these into an answer. For example,
23753@samp{pcont(4 x y^2 + 6 x^2 y, x)} is @samp{2 y}. The content is
23754basically the ``biggest'' polynomial that can be divided into @code{p}
23755exactly. The sign of the content is the same as the sign of the leading
23756coefficient.
23757
23758With only one argument, @samp{pcont(p)} computes the numerical
23759content of the polynomial, i.e., the @code{gcd} of the numerical
23760coefficients of all the terms in the formula. Note that @code{gcd}
23761is defined on rational numbers as well as integers; it computes
23762the @code{gcd} of the numerators and the @code{lcm} of the
23763denominators. Thus @samp{pcont(4:3 x y^2 + 6 x^2 y)} returns 2:3.
23764Dividing the polynomial by this number will clear all the
23765denominators, as well as dividing by any common content in the
23766numerators. The numerical content of a polynomial is negative only
23767if all the coefficients in the polynomial are negative.
23768
23769@ignore
23770@starindex
23771@end ignore
23772@tindex pprim
23773The @code{pprim} function finds the @dfn{primitive part} of a
23774polynomial, which is simply the polynomial divided (using @code{pdiv}
23775if necessary) by its content. If the input polynomial has rational
23776coefficients, the result will have integer coefficients in simplest
23777terms.
23778
23779@node Numerical Solutions, Curve Fitting, Solving Equations, Algebra
23780@section Numerical Solutions
23781
23782@noindent
23783Not all equations can be solved symbolically. The commands in this
23784section use numerical algorithms that can find a solution to a specific
23785instance of an equation to any desired accuracy. Note that the
23786numerical commands are slower than their algebraic cousins; it is a
23787good idea to try @kbd{a S} before resorting to these commands.
23788
23789(@xref{Curve Fitting}, for some other, more specialized, operations
23790on numerical data.)
23791
23792@menu
23793* Root Finding::
23794* Minimization::
23795* Numerical Systems of Equations::
23796@end menu
23797
23798@node Root Finding, Minimization, Numerical Solutions, Numerical Solutions
23799@subsection Root Finding
23800
23801@noindent
23802@kindex a R
23803@pindex calc-find-root
23804@tindex root
23805@cindex Newton's method
23806@cindex Roots of equations
23807@cindex Numerical root-finding
23808The @kbd{a R} (@code{calc-find-root}) [@code{root}] command finds a
23809numerical solution (or @dfn{root}) of an equation. (This command treats
23810inequalities the same as equations. If the input is any other kind
23811of formula, it is interpreted as an equation of the form @expr{X = 0}.)
23812
23813The @kbd{a R} command requires an initial guess on the top of the
23814stack, and a formula in the second-to-top position. It prompts for a
23815solution variable, which must appear in the formula. All other variables
23816that appear in the formula must have assigned values, i.e., when
23817a value is assigned to the solution variable and the formula is
23818evaluated with @kbd{=}, it should evaluate to a number. Any assigned
23819value for the solution variable itself is ignored and unaffected by
23820this command.
23821
23822When the command completes, the initial guess is replaced on the stack
23823by a vector of two numbers: The value of the solution variable that
23824solves the equation, and the difference between the lefthand and
23825righthand sides of the equation at that value. Ordinarily, the second
23826number will be zero or very nearly zero. (Note that Calc uses a
23827slightly higher precision while finding the root, and thus the second
23828number may be slightly different from the value you would compute from
23829the equation yourself.)
23830
23831The @kbd{v h} (@code{calc-head}) command is a handy way to extract
23832the first element of the result vector, discarding the error term.
23833
23834The initial guess can be a real number, in which case Calc searches
23835for a real solution near that number, or a complex number, in which
23836case Calc searches the whole complex plane near that number for a
23837solution, or it can be an interval form which restricts the search
23838to real numbers inside that interval.
23839
23840Calc tries to use @kbd{a d} to take the derivative of the equation.
23841If this succeeds, it uses Newton's method. If the equation is not
23842differentiable Calc uses a bisection method. (If Newton's method
23843appears to be going astray, Calc switches over to bisection if it
23844can, or otherwise gives up. In this case it may help to try again
23845with a slightly different initial guess.) If the initial guess is a
23846complex number, the function must be differentiable.
23847
23848If the formula (or the difference between the sides of an equation)
23849is negative at one end of the interval you specify and positive at
23850the other end, the root finder is guaranteed to find a root.
23851Otherwise, Calc subdivides the interval into small parts looking for
23852positive and negative values to bracket the root. When your guess is
23853an interval, Calc will not look outside that interval for a root.
23854
23855@kindex H a R
23856@tindex wroot
23857The @kbd{H a R} [@code{wroot}] command is similar to @kbd{a R}, except
23858that if the initial guess is an interval for which the function has
23859the same sign at both ends, then rather than subdividing the interval
23860Calc attempts to widen it to enclose a root. Use this mode if
23861you are not sure if the function has a root in your interval.
23862
23863If the function is not differentiable, and you give a simple number
23864instead of an interval as your initial guess, Calc uses this widening
23865process even if you did not type the Hyperbolic flag. (If the function
23866@emph{is} differentiable, Calc uses Newton's method which does not
23867require a bounding interval in order to work.)
23868
23869If Calc leaves the @code{root} or @code{wroot} function in symbolic
23870form on the stack, it will normally display an explanation for why
23871no root was found. If you miss this explanation, press @kbd{w}
23872(@code{calc-why}) to get it back.
23873
23874@node Minimization, Numerical Systems of Equations, Root Finding, Numerical Solutions
23875@subsection Minimization
23876
23877@noindent
23878@kindex a N
23879@kindex H a N
23880@kindex a X
23881@kindex H a X
23882@pindex calc-find-minimum
23883@pindex calc-find-maximum
23884@tindex minimize
23885@tindex maximize
23886@cindex Minimization, numerical
23887The @kbd{a N} (@code{calc-find-minimum}) [@code{minimize}] command
23888finds a minimum value for a formula. It is very similar in operation
23889to @kbd{a R} (@code{calc-find-root}): You give the formula and an initial
23890guess on the stack, and are prompted for the name of a variable. The guess
23891may be either a number near the desired minimum, or an interval enclosing
23892the desired minimum. The function returns a vector containing the
23893value of the variable which minimizes the formula's value, along
23894with the minimum value itself.
23895
23896Note that this command looks for a @emph{local} minimum. Many functions
23897have more than one minimum; some, like
23898@texline @math{x \sin x},
23899@infoline @expr{x sin(x)},
23900have infinitely many. In fact, there is no easy way to define the
23901``global'' minimum of
23902@texline @math{x \sin x}
23903@infoline @expr{x sin(x)}
23904but Calc can still locate any particular local minimum
23905for you. Calc basically goes downhill from the initial guess until it
23906finds a point at which the function's value is greater both to the left
23907and to the right. Calc does not use derivatives when minimizing a function.
23908
23909If your initial guess is an interval and it looks like the minimum
23910occurs at one or the other endpoint of the interval, Calc will return
23911that endpoint only if that endpoint is closed; thus, minimizing @expr{17 x}
23912over @expr{[2..3]} will return @expr{[2, 38]}, but minimizing over
23913@expr{(2..3]} would report no minimum found. In general, you should
23914use closed intervals to find literally the minimum value in that
23915range of @expr{x}, or open intervals to find the local minimum, if
23916any, that happens to lie in that range.
23917
23918Most functions are smooth and flat near their minimum values. Because
23919of this flatness, if the current precision is, say, 12 digits, the
23920variable can only be determined meaningfully to about six digits. Thus
23921you should set the precision to twice as many digits as you need in your
23922answer.
23923
23924@ignore
23925@mindex wmin@idots
23926@end ignore
23927@tindex wminimize
23928@ignore
23929@mindex wmax@idots
23930@end ignore
23931@tindex wmaximize
23932The @kbd{H a N} [@code{wminimize}] command, analogously to @kbd{H a R},
23933expands the guess interval to enclose a minimum rather than requiring
23934that the minimum lie inside the interval you supply.
23935
23936The @kbd{a X} (@code{calc-find-maximum}) [@code{maximize}] and
23937@kbd{H a X} [@code{wmaximize}] commands effectively minimize the
23938negative of the formula you supply.
23939
23940The formula must evaluate to a real number at all points inside the
23941interval (or near the initial guess if the guess is a number). If
23942the initial guess is a complex number the variable will be minimized
23943over the complex numbers; if it is real or an interval it will
23944be minimized over the reals.
23945
23946@node Numerical Systems of Equations, , Minimization, Numerical Solutions
23947@subsection Systems of Equations
23948
23949@noindent
23950@cindex Systems of equations, numerical
23951The @kbd{a R} command can also solve systems of equations. In this
23952case, the equation should instead be a vector of equations, the
23953guess should instead be a vector of numbers (intervals are not
23954supported), and the variable should be a vector of variables. You
23955can omit the brackets while entering the list of variables. Each
23956equation must be differentiable by each variable for this mode to
23957work. The result will be a vector of two vectors: The variable
23958values that solved the system of equations, and the differences
23959between the sides of the equations with those variable values.
23960There must be the same number of equations as variables. Since
23961only plain numbers are allowed as guesses, the Hyperbolic flag has
23962no effect when solving a system of equations.
23963
23964It is also possible to minimize over many variables with @kbd{a N}
23965(or maximize with @kbd{a X}). Once again the variable name should
23966be replaced by a vector of variables, and the initial guess should
23967be an equal-sized vector of initial guesses. But, unlike the case of
23968multidimensional @kbd{a R}, the formula being minimized should
23969still be a single formula, @emph{not} a vector. Beware that
23970multidimensional minimization is currently @emph{very} slow.
23971
23972@node Curve Fitting, Summations, Numerical Solutions, Algebra
23973@section Curve Fitting
23974
23975@noindent
23976The @kbd{a F} command fits a set of data to a @dfn{model formula},
23977such as @expr{y = m x + b} where @expr{m} and @expr{b} are parameters
23978to be determined. For a typical set of measured data there will be
23979no single @expr{m} and @expr{b} that exactly fit the data; in this
23980case, Calc chooses values of the parameters that provide the closest
23981possible fit. The model formula can be entered in various ways after
23982the key sequence @kbd{a F} is pressed.
23983
23984If the letter @kbd{P} is pressed after @kbd{a F} but before the model
23985description is entered, the data as well as the model formula will be
23986plotted after the formula is determined. This will be indicated by a
23987``P'' in the minibuffer after the help message.
23988
23989@menu
23990* Linear Fits::
23991* Polynomial and Multilinear Fits::
23992* Error Estimates for Fits::
23993* Standard Nonlinear Models::
23994* Curve Fitting Details::
23995* Interpolation::
23996@end menu
23997
23998@node Linear Fits, Polynomial and Multilinear Fits, Curve Fitting, Curve Fitting
23999@subsection Linear Fits
24000
24001@noindent
24002@kindex a F
24003@pindex calc-curve-fit
24004@tindex fit
24005@cindex Linear regression
24006@cindex Least-squares fits
24007The @kbd{a F} (@code{calc-curve-fit}) [@code{fit}] command attempts
24008to fit a set of data (@expr{x} and @expr{y} vectors of numbers) to a
24009straight line, polynomial, or other function of @expr{x}. For the
24010moment we will consider only the case of fitting to a line, and we
24011will ignore the issue of whether or not the model was in fact a good
24012fit for the data.
24013
24014In a standard linear least-squares fit, we have a set of @expr{(x,y)}
24015data points that we wish to fit to the model @expr{y = m x + b}
24016by adjusting the parameters @expr{m} and @expr{b} to make the @expr{y}
24017values calculated from the formula be as close as possible to the actual
24018@expr{y} values in the data set. (In a polynomial fit, the model is
24019instead, say, @expr{y = a x^3 + b x^2 + c x + d}. In a multilinear fit,
24020we have data points of the form @expr{(x_1,x_2,x_3,y)} and our model is
24021@expr{y = a x_1 + b x_2 + c x_3 + d}. These will be discussed later.)
24022
24023In the model formula, variables like @expr{x} and @expr{x_2} are called
24024the @dfn{independent variables}, and @expr{y} is the @dfn{dependent
24025variable}. Variables like @expr{m}, @expr{a}, and @expr{b} are called
24026the @dfn{parameters} of the model.
24027
24028The @kbd{a F} command takes the data set to be fitted from the stack.
24029By default, it expects the data in the form of a matrix. For example,
24030for a linear or polynomial fit, this would be a
24031@texline @math{2\times N}
24032@infoline 2xN
24033matrix where the first row is a list of @expr{x} values and the second
24034row has the corresponding @expr{y} values. For the multilinear fit
24035shown above, the matrix would have four rows (@expr{x_1}, @expr{x_2},
24036@expr{x_3}, and @expr{y}, respectively).
24037
24038If you happen to have an
24039@texline @math{N\times2}
24040@infoline Nx2
24041matrix instead of a
24042@texline @math{2\times N}
24043@infoline 2xN
24044matrix, just press @kbd{v t} first to transpose the matrix.
24045
24046After you type @kbd{a F}, Calc prompts you to select a model. For a
24047linear fit, press the digit @kbd{1}.
24048
24049Calc then prompts for you to name the variables. By default it chooses
24050high letters like @expr{x} and @expr{y} for independent variables and
24051low letters like @expr{a} and @expr{b} for parameters. (The dependent
24052variable doesn't need a name.) The two kinds of variables are separated
24053by a semicolon. Since you generally care more about the names of the
24054independent variables than of the parameters, Calc also allows you to
24055name only those and let the parameters use default names.
24056
24057For example, suppose the data matrix
24058
24059@ifnottex
24060@example
24061@group
24062[ [ 1, 2, 3, 4, 5 ]
24063 [ 5, 7, 9, 11, 13 ] ]
24064@end group
24065@end example
24066@end ifnottex
24067@tex
24068\turnoffactive
24069\turnoffactive
24070\beforedisplay
24071$$ \pmatrix{ 1 & 2 & 3 & 4 & 5 \cr
24072 5 & 7 & 9 & 11 & 13 }
24073$$
24074\afterdisplay
24075@end tex
24076
24077@noindent
24078is on the stack and we wish to do a simple linear fit. Type
24079@kbd{a F}, then @kbd{1} for the model, then @key{RET} to use
24080the default names. The result will be the formula @expr{3. + 2. x}
24081on the stack. Calc has created the model expression @kbd{a + b x},
24082then found the optimal values of @expr{a} and @expr{b} to fit the
24083data. (In this case, it was able to find an exact fit.) Calc then
24084substituted those values for @expr{a} and @expr{b} in the model
24085formula.
24086
24087The @kbd{a F} command puts two entries in the trail. One is, as
24088always, a copy of the result that went to the stack; the other is
24089a vector of the actual parameter values, written as equations:
24090@expr{[a = 3, b = 2]}, in case you'd rather read them in a list
24091than pick them out of the formula. (You can type @kbd{t y}
24092to move this vector to the stack; see @ref{Trail Commands}.
24093
24094Specifying a different independent variable name will affect the
24095resulting formula: @kbd{a F 1 k @key{RET}} produces @kbd{3 + 2 k}.
24096Changing the parameter names (say, @kbd{a F 1 k;b,m @key{RET}}) will affect
24097the equations that go into the trail.
24098
24099@tex
24100\bigskip
24101@end tex
24102
24103To see what happens when the fit is not exact, we could change
24104the number 13 in the data matrix to 14 and try the fit again.
24105The result is:
24106
24107@example
241082.6 + 2.2 x
24109@end example
24110
24111Evaluating this formula, say with @kbd{v x 5 @key{RET} @key{TAB} V M $ @key{RET}}, shows
24112a reasonably close match to the y-values in the data.
24113
24114@example
24115[4.8, 7., 9.2, 11.4, 13.6]
24116@end example
24117
24118Since there is no line which passes through all the @var{n} data points,
24119Calc has chosen a line that best approximates the data points using
24120the method of least squares. The idea is to define the @dfn{chi-square}
24121error measure
24122
24123@ifnottex
24124@example
24125chi^2 = sum((y_i - (a + b x_i))^2, i, 1, N)
24126@end example
24127@end ifnottex
24128@tex
24129\turnoffactive
24130\beforedisplay
24131$$ \chi^2 = \sum_{i=1}^N (y_i - (a + b x_i))^2 $$
24132\afterdisplay
24133@end tex
24134
24135@noindent
24136which is clearly zero if @expr{a + b x} exactly fits all data points,
24137and increases as various @expr{a + b x_i} values fail to match the
24138corresponding @expr{y_i} values. There are several reasons why the
24139summand is squared, one of them being to ensure that
24140@texline @math{\chi^2 \ge 0}.
24141@infoline @expr{chi^2 >= 0}.
24142Least-squares fitting simply chooses the values of @expr{a} and @expr{b}
24143for which the error
24144@texline @math{\chi^2}
24145@infoline @expr{chi^2}
24146is as small as possible.
24147
24148Other kinds of models do the same thing but with a different model
24149formula in place of @expr{a + b x_i}.
24150
24151@tex
24152\bigskip
24153@end tex
24154
24155A numeric prefix argument causes the @kbd{a F} command to take the
24156data in some other form than one big matrix. A positive argument @var{n}
24157will take @var{N} items from the stack, corresponding to the @var{n} rows
24158of a data matrix. In the linear case, @var{n} must be 2 since there
24159is always one independent variable and one dependent variable.
24160
24161A prefix of zero or plain @kbd{C-u} is a compromise; Calc takes two
24162items from the stack, an @var{n}-row matrix of @expr{x} values, and a
24163vector of @expr{y} values. If there is only one independent variable,
24164the @expr{x} values can be either a one-row matrix or a plain vector,
24165in which case the @kbd{C-u} prefix is the same as a @w{@kbd{C-u 2}} prefix.
24166
24167@node Polynomial and Multilinear Fits, Error Estimates for Fits, Linear Fits, Curve Fitting
24168@subsection Polynomial and Multilinear Fits
24169
24170@noindent
24171To fit the data to higher-order polynomials, just type one of the
24172digits @kbd{2} through @kbd{9} when prompted for a model. For example,
24173we could fit the original data matrix from the previous section
24174(with 13, not 14) to a parabola instead of a line by typing
24175@kbd{a F 2 @key{RET}}.
24176
24177@example
241782.00000000001 x - 1.5e-12 x^2 + 2.99999999999
24179@end example
24180
24181Note that since the constant and linear terms are enough to fit the
24182data exactly, it's no surprise that Calc chose a tiny contribution
24183for @expr{x^2}. (The fact that it's not exactly zero is due only
24184to roundoff error. Since our data are exact integers, we could get
24185an exact answer by typing @kbd{m f} first to get Fraction mode.
24186Then the @expr{x^2} term would vanish altogether. Usually, though,
24187the data being fitted will be approximate floats so Fraction mode
24188won't help.)
24189
24190Doing the @kbd{a F 2} fit on the data set with 14 instead of 13
24191gives a much larger @expr{x^2} contribution, as Calc bends the
24192line slightly to improve the fit.
24193
24194@example
241950.142857142855 x^2 + 1.34285714287 x + 3.59999999998
24196@end example
24197
24198An important result from the theory of polynomial fitting is that it
24199is always possible to fit @var{n} data points exactly using a polynomial
24200of degree @mathit{@var{n}-1}, sometimes called an @dfn{interpolating polynomial}.
24201Using the modified (14) data matrix, a model number of 4 gives
24202a polynomial that exactly matches all five data points:
24203
24204@example
242050.04167 x^4 - 0.4167 x^3 + 1.458 x^2 - 0.08333 x + 4.
24206@end example
24207
24208The actual coefficients we get with a precision of 12, like
24209@expr{0.0416666663588}, clearly suffer from loss of precision.
24210It is a good idea to increase the working precision to several
24211digits beyond what you need when you do a fitting operation.
24212Or, if your data are exact, use Fraction mode to get exact
24213results.
24214
24215You can type @kbd{i} instead of a digit at the model prompt to fit
24216the data exactly to a polynomial. This just counts the number of
24217columns of the data matrix to choose the degree of the polynomial
24218automatically.
24219
24220Fitting data ``exactly'' to high-degree polynomials is not always
24221a good idea, though. High-degree polynomials have a tendency to
24222wiggle uncontrollably in between the fitting data points. Also,
24223if the exact-fit polynomial is going to be used to interpolate or
24224extrapolate the data, it is numerically better to use the @kbd{a p}
24225command described below. @xref{Interpolation}.
24226
24227@tex
24228\bigskip
24229@end tex
24230
24231Another generalization of the linear model is to assume the
24232@expr{y} values are a sum of linear contributions from several
24233@expr{x} values. This is a @dfn{multilinear} fit, and it is also
24234selected by the @kbd{1} digit key. (Calc decides whether the fit
24235is linear or multilinear by counting the rows in the data matrix.)
24236
24237Given the data matrix,
24238
24239@example
24240@group
24241[ [ 1, 2, 3, 4, 5 ]
24242 [ 7, 2, 3, 5, 2 ]
24243 [ 14.5, 15, 18.5, 22.5, 24 ] ]
24244@end group
24245@end example
24246
24247@noindent
24248the command @kbd{a F 1 @key{RET}} will call the first row @expr{x} and the
24249second row @expr{y}, and will fit the values in the third row to the
24250model @expr{a + b x + c y}.
24251
24252@example
242538. + 3. x + 0.5 y
24254@end example
24255
24256Calc can do multilinear fits with any number of independent variables
24257(i.e., with any number of data rows).
24258
24259@tex
24260\bigskip
24261@end tex
24262
24263Yet another variation is @dfn{homogeneous} linear models, in which
24264the constant term is known to be zero. In the linear case, this
24265means the model formula is simply @expr{a x}; in the multilinear
24266case, the model might be @expr{a x + b y + c z}; and in the polynomial
24267case, the model could be @expr{a x + b x^2 + c x^3}. You can get
24268a homogeneous linear or multilinear model by pressing the letter
24269@kbd{h} followed by a regular model key, like @kbd{1} or @kbd{2}.
24270This will be indicated by an ``h'' in the minibuffer after the help
24271message.
24272
24273It is certainly possible to have other constrained linear models,
24274like @expr{2.3 + a x} or @expr{a - 4 x}. While there is no single
24275key to select models like these, a later section shows how to enter
24276any desired model by hand. In the first case, for example, you
24277would enter @kbd{a F ' 2.3 + a x}.
24278
24279Another class of models that will work but must be entered by hand
24280are multinomial fits, e.g., @expr{a + b x + c y + d x^2 + e y^2 + f x y}.
24281
24282@node Error Estimates for Fits, Standard Nonlinear Models, Polynomial and Multilinear Fits, Curve Fitting
24283@subsection Error Estimates for Fits
24284
24285@noindent
24286@kindex H a F
24287@tindex efit
24288With the Hyperbolic flag, @kbd{H a F} [@code{efit}] performs the same
24289fitting operation as @kbd{a F}, but reports the coefficients as error
24290forms instead of plain numbers. Fitting our two data matrices (first
24291with 13, then with 14) to a line with @kbd{H a F} gives the results,
24292
24293@example
242943. + 2. x
242952.6 +/- 0.382970843103 + 2.2 +/- 0.115470053838 x
24296@end example
24297
24298In the first case the estimated errors are zero because the linear
24299fit is perfect. In the second case, the errors are nonzero but
24300moderately small, because the data are still very close to linear.
24301
24302It is also possible for the @emph{input} to a fitting operation to
24303contain error forms. The data values must either all include errors
24304or all be plain numbers. Error forms can go anywhere but generally
24305go on the numbers in the last row of the data matrix. If the last
24306row contains error forms
24307@texline `@var{y_i}@w{ @tfn{+/-} }@math{\sigma_i}',
24308@infoline `@var{y_i}@w{ @tfn{+/-} }@var{sigma_i}',
24309then the
24310@texline @math{\chi^2}
24311@infoline @expr{chi^2}
24312statistic is now,
24313
24314@ifnottex
24315@example
24316chi^2 = sum(((y_i - (a + b x_i)) / sigma_i)^2, i, 1, N)
24317@end example
24318@end ifnottex
24319@tex
24320\turnoffactive
24321\beforedisplay
24322$$ \chi^2 = \sum_{i=1}^N \left(y_i - (a + b x_i) \over \sigma_i\right)^2 $$
24323\afterdisplay
24324@end tex
24325
24326@noindent
24327so that data points with larger error estimates contribute less to
24328the fitting operation.
24329
24330If there are error forms on other rows of the data matrix, all the
24331errors for a given data point are combined; the square root of the
24332sum of the squares of the errors forms the
24333@texline @math{\sigma_i}
24334@infoline @expr{sigma_i}
24335used for the data point.
24336
24337Both @kbd{a F} and @kbd{H a F} can accept error forms in the input
24338matrix, although if you are concerned about error analysis you will
24339probably use @kbd{H a F} so that the output also contains error
24340estimates.
24341
24342If the input contains error forms but all the
24343@texline @math{\sigma_i}
24344@infoline @expr{sigma_i}
24345values are the same, it is easy to see that the resulting fitted model
24346will be the same as if the input did not have error forms at all
24347@texline (@math{\chi^2}
24348@infoline (@expr{chi^2}
24349is simply scaled uniformly by
24350@texline @math{1 / \sigma^2},
24351@infoline @expr{1 / sigma^2},
24352which doesn't affect where it has a minimum). But there @emph{will} be
24353a difference in the estimated errors of the coefficients reported by
24354@kbd{H a F}.
24355
24356Consult any text on statistical modeling of data for a discussion
24357of where these error estimates come from and how they should be
24358interpreted.
24359
24360@tex
24361\bigskip
24362@end tex
24363
24364@kindex I a F
24365@tindex xfit
24366With the Inverse flag, @kbd{I a F} [@code{xfit}] produces even more
24367information. The result is a vector of six items:
24368
24369@enumerate
24370@item
24371The model formula with error forms for its coefficients or
24372parameters. This is the result that @kbd{H a F} would have
24373produced.
24374
24375@item
24376A vector of ``raw'' parameter values for the model. These are the
24377polynomial coefficients or other parameters as plain numbers, in the
24378same order as the parameters appeared in the final prompt of the
24379@kbd{I a F} command. For polynomials of degree @expr{d}, this vector
24380will have length @expr{M = d+1} with the constant term first.
24381
24382@item
24383The covariance matrix @expr{C} computed from the fit. This is
24384an @var{m}x@var{m} symmetric matrix; the diagonal elements
24385@texline @math{C_{jj}}
24386@infoline @expr{C_j_j}
24387are the variances
24388@texline @math{\sigma_j^2}
24389@infoline @expr{sigma_j^2}
24390of the parameters. The other elements are covariances
24391@texline @math{\sigma_{ij}^2}
24392@infoline @expr{sigma_i_j^2}
24393that describe the correlation between pairs of parameters. (A related
24394set of numbers, the @dfn{linear correlation coefficients}
24395@texline @math{r_{ij}},
24396@infoline @expr{r_i_j},
24397are defined as
24398@texline @math{\sigma_{ij}^2 / \sigma_i \, \sigma_j}.)
24399@infoline @expr{sigma_i_j^2 / sigma_i sigma_j}.)
24400
24401@item
24402A vector of @expr{M} ``parameter filter'' functions whose
24403meanings are described below. If no filters are necessary this
24404will instead be an empty vector; this is always the case for the
24405polynomial and multilinear fits described so far.
24406
24407@item
24408The value of
24409@texline @math{\chi^2}
24410@infoline @expr{chi^2}
24411for the fit, calculated by the formulas shown above. This gives a
24412measure of the quality of the fit; statisticians consider
24413@texline @math{\chi^2 \approx N - M}
24414@infoline @expr{chi^2 = N - M}
24415to indicate a moderately good fit (where again @expr{N} is the number of
24416data points and @expr{M} is the number of parameters).
24417
24418@item
24419A measure of goodness of fit expressed as a probability @expr{Q}.
24420This is computed from the @code{utpc} probability distribution
24421function using
24422@texline @math{\chi^2}
24423@infoline @expr{chi^2}
24424with @expr{N - M} degrees of freedom. A
24425value of 0.5 implies a good fit; some texts recommend that often
24426@expr{Q = 0.1} or even 0.001 can signify an acceptable fit. In
24427particular,
24428@texline @math{\chi^2}
24429@infoline @expr{chi^2}
24430statistics assume the errors in your inputs
24431follow a normal (Gaussian) distribution; if they don't, you may
24432have to accept smaller values of @expr{Q}.
24433
24434The @expr{Q} value is computed only if the input included error
24435estimates. Otherwise, Calc will report the symbol @code{nan}
24436for @expr{Q}. The reason is that in this case the
24437@texline @math{\chi^2}
24438@infoline @expr{chi^2}
24439value has effectively been used to estimate the original errors
24440in the input, and thus there is no redundant information left
24441over to use for a confidence test.
24442@end enumerate
24443
24444@node Standard Nonlinear Models, Curve Fitting Details, Error Estimates for Fits, Curve Fitting
24445@subsection Standard Nonlinear Models
24446
24447@noindent
24448The @kbd{a F} command also accepts other kinds of models besides
24449lines and polynomials. Some common models have quick single-key
24450abbreviations; others must be entered by hand as algebraic formulas.
24451
24452Here is a complete list of the standard models recognized by @kbd{a F}:
24453
24454@table @kbd
24455@item 1
24456Linear or multilinear. @mathit{a + b x + c y + d z}.
24457@item 2-9
24458Polynomials. @mathit{a + b x + c x^2 + d x^3}.
24459@item e
24460Exponential. @mathit{a} @tfn{exp}@mathit{(b x)} @tfn{exp}@mathit{(c y)}.
24461@item E
24462Base-10 exponential. @mathit{a} @tfn{10^}@mathit{(b x)} @tfn{10^}@mathit{(c y)}.
24463@item x
24464Exponential (alternate notation). @tfn{exp}@mathit{(a + b x + c y)}.
24465@item X
24466Base-10 exponential (alternate). @tfn{10^}@mathit{(a + b x + c y)}.
24467@item l
24468Logarithmic. @mathit{a + b} @tfn{ln}@mathit{(x) + c} @tfn{ln}@mathit{(y)}.
24469@item L
24470Base-10 logarithmic. @mathit{a + b} @tfn{log10}@mathit{(x) + c} @tfn{log10}@mathit{(y)}.
24471@item ^
24472General exponential. @mathit{a b^x c^y}.
24473@item p
24474Power law. @mathit{a x^b y^c}.
24475@item q
24476Quadratic. @mathit{a + b (x-c)^2 + d (x-e)^2}.
24477@item g
24478Gaussian.
24479@texline @math{{a \over b \sqrt{2 \pi}} \exp\left( -{1 \over 2} \left( x - c \over b \right)^2 \right)}.
24480@infoline @mathit{(a / b sqrt(2 pi)) exp(-0.5*((x-c)/b)^2)}.
24481@item s
24482Logistic @emph{s} curve.
24483@texline @math{a/(1+e^{b(x-c)})}.
24484@infoline @mathit{a/(1 + exp(b (x - c)))}.
24485@item b
24486Logistic bell curve.
24487@texline @math{ae^{b(x-c)}/(1+e^{b(x-c)})^2}.
24488@infoline @mathit{a exp(b (x - c))/(1 + exp(b (x - c)))^2}.
24489@item o
24490Hubbert linearization.
24491@texline @math{{y \over x} = a(1-x/b)}.
24492@infoline @mathit{(y/x) = a (1 - x/b)}.
24493@end table
24494
24495All of these models are used in the usual way; just press the appropriate
24496letter at the model prompt, and choose variable names if you wish. The
24497result will be a formula as shown in the above table, with the best-fit
24498values of the parameters substituted. (You may find it easier to read
24499the parameter values from the vector that is placed in the trail.)
24500
24501All models except Gaussian, logistics, Hubbert and polynomials can
24502generalize as shown to any number of independent variables. Also, all
24503the built-in models except for the logistic and Hubbert curves have an
24504additive or multiplicative parameter shown as @expr{a} in the above table
24505which can be replaced by zero or one, as appropriate, by typing @kbd{h}
24506before the model key.
24507
24508Note that many of these models are essentially equivalent, but express
24509the parameters slightly differently. For example, @expr{a b^x} and
24510the other two exponential models are all algebraic rearrangements of
24511each other. Also, the ``quadratic'' model is just a degree-2 polynomial
24512with the parameters expressed differently. Use whichever form best
24513matches the problem.
24514
24515The HP-28/48 calculators support four different models for curve
24516fitting, called @code{LIN}, @code{LOG}, @code{EXP}, and @code{PWR}.
24517These correspond to Calc models @samp{a + b x}, @samp{a + b ln(x)},
24518@samp{a exp(b x)}, and @samp{a x^b}, respectively. In each case,
24519@expr{a} is what the HP-48 identifies as the ``intercept,'' and
24520@expr{b} is what it calls the ``slope.''
24521
24522@tex
24523\bigskip
24524@end tex
24525
24526If the model you want doesn't appear on this list, press @kbd{'}
24527(the apostrophe key) at the model prompt to enter any algebraic
24528formula, such as @kbd{m x - b}, as the model. (Not all models
24529will work, though---see the next section for details.)
24530
24531The model can also be an equation like @expr{y = m x + b}.
24532In this case, Calc thinks of all the rows of the data matrix on
24533equal terms; this model effectively has two parameters
24534(@expr{m} and @expr{b}) and two independent variables (@expr{x}
24535and @expr{y}), with no ``dependent'' variables. Model equations
24536do not need to take this @expr{y =} form. For example, the
24537implicit line equation @expr{a x + b y = 1} works fine as a
24538model.
24539
24540When you enter a model, Calc makes an alphabetical list of all
24541the variables that appear in the model. These are used for the
24542default parameters, independent variables, and dependent variable
24543(in that order). If you enter a plain formula (not an equation),
24544Calc assumes the dependent variable does not appear in the formula
24545and thus does not need a name.
24546
24547For example, if the model formula has the variables @expr{a,mu,sigma,t,x},
24548and the data matrix has three rows (meaning two independent variables),
24549Calc will use @expr{a,mu,sigma} as the default parameters, and the
24550data rows will be named @expr{t} and @expr{x}, respectively. If you
24551enter an equation instead of a plain formula, Calc will use @expr{a,mu}
24552as the parameters, and @expr{sigma,t,x} as the three independent
24553variables.
24554
24555You can, of course, override these choices by entering something
24556different at the prompt. If you leave some variables out of the list,
24557those variables must have stored values and those stored values will
24558be used as constants in the model. (Stored values for the parameters
24559and independent variables are ignored by the @kbd{a F} command.)
24560If you list only independent variables, all the remaining variables
24561in the model formula will become parameters.
24562
24563If there are @kbd{$} signs in the model you type, they will stand
24564for parameters and all other variables (in alphabetical order)
24565will be independent. Use @kbd{$} for one parameter, @kbd{$$} for
24566another, and so on. Thus @kbd{$ x + $$} is another way to describe
24567a linear model.
24568
24569If you type a @kbd{$} instead of @kbd{'} at the model prompt itself,
24570Calc will take the model formula from the stack. (The data must then
24571appear at the second stack level.) The same conventions are used to
24572choose which variables in the formula are independent by default and
24573which are parameters.
24574
24575Models taken from the stack can also be expressed as vectors of
24576two or three elements, @expr{[@var{model}, @var{vars}]} or
24577@expr{[@var{model}, @var{vars}, @var{params}]}. Each of @var{vars}
24578and @var{params} may be either a variable or a vector of variables.
24579(If @var{params} is omitted, all variables in @var{model} except
24580those listed as @var{vars} are parameters.)
24581
24582When you enter a model manually with @kbd{'}, Calc puts a 3-vector
24583describing the model in the trail so you can get it back if you wish.
24584
24585@tex
24586\bigskip
24587@end tex
24588
24589@vindex Model1
24590@vindex Model2
24591Finally, you can store a model in one of the Calc variables
24592@code{Model1} or @code{Model2}, then use this model by typing
24593@kbd{a F u} or @kbd{a F U} (respectively). The value stored in
24594the variable can be any of the formats that @kbd{a F $} would
24595accept for a model on the stack.
24596
24597@tex
24598\bigskip
24599@end tex
24600
24601Calc uses the principal values of inverse functions like @code{ln}
24602and @code{arcsin} when doing fits. For example, when you enter
24603the model @samp{y = sin(a t + b)} Calc actually uses the easier
24604form @samp{arcsin(y) = a t + b}. The @code{arcsin} function always
24605returns results in the range from @mathit{-90} to 90 degrees (or the
24606equivalent range in radians). Suppose you had data that you
24607believed to represent roughly three oscillations of a sine wave,
24608so that the argument of the sine might go from zero to
24609@texline @math{3\times360}
24610@infoline @mathit{3*360}
24611degrees.
24612The above model would appear to be a good way to determine the
24613true frequency and phase of the sine wave, but in practice it
24614would fail utterly. The righthand side of the actual model
24615@samp{arcsin(y) = a t + b} will grow smoothly with @expr{t}, but
24616the lefthand side will bounce back and forth between @mathit{-90} and 90.
24617No values of @expr{a} and @expr{b} can make the two sides match,
24618even approximately.
24619
24620There is no good solution to this problem at present. You could
24621restrict your data to small enough ranges so that the above problem
24622doesn't occur (i.e., not straddling any peaks in the sine wave).
24623Or, in this case, you could use a totally different method such as
24624Fourier analysis, which is beyond the scope of the @kbd{a F} command.
24625(Unfortunately, Calc does not currently have any facilities for
24626taking Fourier and related transforms.)
24627
24628@node Curve Fitting Details, Interpolation, Standard Nonlinear Models, Curve Fitting
24629@subsection Curve Fitting Details
24630
24631@noindent
24632Calc's internal least-squares fitter can only handle multilinear
24633models. More precisely, it can handle any model of the form
24634@expr{a f(x,y,z) + b g(x,y,z) + c h(x,y,z)}, where @expr{a,b,c}
24635are the parameters and @expr{x,y,z} are the independent variables
24636(of course there can be any number of each, not just three).
24637
24638In a simple multilinear or polynomial fit, it is easy to see how
24639to convert the model into this form. For example, if the model
24640is @expr{a + b x + c x^2}, then @expr{f(x) = 1}, @expr{g(x) = x},
24641and @expr{h(x) = x^2} are suitable functions.
24642
24643For most other models, Calc uses a variety of algebraic manipulations
24644to try to put the problem into the form
24645
24646@smallexample
24647Y(x,y,z) = A(a,b,c) F(x,y,z) + B(a,b,c) G(x,y,z) + C(a,b,c) H(x,y,z)
24648@end smallexample
24649
24650@noindent
24651where @expr{Y,A,B,C,F,G,H} are arbitrary functions. It computes
24652@expr{Y}, @expr{F}, @expr{G}, and @expr{H} for all the data points,
24653does a standard linear fit to find the values of @expr{A}, @expr{B},
24654and @expr{C}, then uses the equation solver to solve for @expr{a,b,c}
24655in terms of @expr{A,B,C}.
24656
24657A remarkable number of models can be cast into this general form.
24658We'll look at two examples here to see how it works. The power-law
24659model @expr{y = a x^b} with two independent variables and two parameters
24660can be rewritten as follows:
24661
24662@example
24663y = a x^b
24664y = a exp(b ln(x))
24665y = exp(ln(a) + b ln(x))
24666ln(y) = ln(a) + b ln(x)
24667@end example
24668
24669@noindent
24670which matches the desired form with
24671@texline @math{Y = \ln(y)},
24672@infoline @expr{Y = ln(y)},
24673@texline @math{A = \ln(a)},
24674@infoline @expr{A = ln(a)},
24675@expr{F = 1}, @expr{B = b}, and
24676@texline @math{G = \ln(x)}.
24677@infoline @expr{G = ln(x)}.
24678Calc thus computes the logarithms of your @expr{y} and @expr{x} values,
24679does a linear fit for @expr{A} and @expr{B}, then solves to get
24680@texline @math{a = \exp(A)}
24681@infoline @expr{a = exp(A)}
24682and @expr{b = B}.
24683
24684Another interesting example is the ``quadratic'' model, which can
24685be handled by expanding according to the distributive law.
24686
24687@example
24688y = a + b*(x - c)^2
24689y = a + b c^2 - 2 b c x + b x^2
24690@end example
24691
24692@noindent
24693which matches with @expr{Y = y}, @expr{A = a + b c^2}, @expr{F = 1},
24694@expr{B = -2 b c}, @expr{G = x} (the @mathit{-2} factor could just as easily
24695have been put into @expr{G} instead of @expr{B}), @expr{C = b}, and
24696@expr{H = x^2}.
24697
24698The Gaussian model looks quite complicated, but a closer examination
24699shows that it's actually similar to the quadratic model but with an
24700exponential that can be brought to the top and moved into @expr{Y}.
24701
24702The logistic models cannot be put into general linear form. For these
24703models, and the Hubbert linearization, Calc computes a rough
24704approximation for the parameters, then uses the Levenberg-Marquardt
24705iterative method to refine the approximations.
24706
24707Another model that cannot be put into general linear
24708form is a Gaussian with a constant background added on, i.e.,
24709@expr{d} + the regular Gaussian formula. If you have a model like
24710this, your best bet is to replace enough of your parameters with
24711constants to make the model linearizable, then adjust the constants
24712manually by doing a series of fits. You can compare the fits by
24713graphing them, by examining the goodness-of-fit measures returned by
24714@kbd{I a F}, or by some other method suitable to your application.
24715Note that some models can be linearized in several ways. The
24716Gaussian-plus-@var{d} model can be linearized by setting @expr{d}
24717(the background) to a constant, or by setting @expr{b} (the standard
24718deviation) and @expr{c} (the mean) to constants.
24719
24720To fit a model with constants substituted for some parameters, just
24721store suitable values in those parameter variables, then omit them
24722from the list of parameters when you answer the variables prompt.
24723
24724@tex
24725\bigskip
24726@end tex
24727
24728A last desperate step would be to use the general-purpose
24729@code{minimize} function rather than @code{fit}. After all, both
24730functions solve the problem of minimizing an expression (the
24731@texline @math{\chi^2}
24732@infoline @expr{chi^2}
24733sum) by adjusting certain parameters in the expression. The @kbd{a F}
24734command is able to use a vastly more efficient algorithm due to its
24735special knowledge about linear chi-square sums, but the @kbd{a N}
24736command can do the same thing by brute force.
24737
24738A compromise would be to pick out a few parameters without which the
24739fit is linearizable, and use @code{minimize} on a call to @code{fit}
24740which efficiently takes care of the rest of the parameters. The thing
24741to be minimized would be the value of
24742@texline @math{\chi^2}
24743@infoline @expr{chi^2}
24744returned as the fifth result of the @code{xfit} function:
24745
24746@smallexample
24747minimize(xfit(gaus(a,b,c,d,x), x, [a,b,c], data)_5, d, guess)
24748@end smallexample
24749
24750@noindent
24751where @code{gaus} represents the Gaussian model with background,
24752@code{data} represents the data matrix, and @code{guess} represents
24753the initial guess for @expr{d} that @code{minimize} requires.
24754This operation will only be, shall we say, extraordinarily slow
24755rather than astronomically slow (as would be the case if @code{minimize}
24756were used by itself to solve the problem).
24757
24758@tex
24759\bigskip
24760@end tex
24761
24762The @kbd{I a F} [@code{xfit}] command is somewhat trickier when
24763nonlinear models are used. The second item in the result is the
24764vector of ``raw'' parameters @expr{A}, @expr{B}, @expr{C}. The
24765covariance matrix is written in terms of those raw parameters.
24766The fifth item is a vector of @dfn{filter} expressions. This
24767is the empty vector @samp{[]} if the raw parameters were the same
24768as the requested parameters, i.e., if @expr{A = a}, @expr{B = b},
24769and so on (which is always true if the model is already linear
24770in the parameters as written, e.g., for polynomial fits). If the
24771parameters had to be rearranged, the fifth item is instead a vector
24772of one formula per parameter in the original model. The raw
24773parameters are expressed in these ``filter'' formulas as
24774@samp{fitdummy(1)} for @expr{A}, @samp{fitdummy(2)} for @expr{B},
24775and so on.
24776
24777When Calc needs to modify the model to return the result, it replaces
24778@samp{fitdummy(1)} in all the filters with the first item in the raw
24779parameters list, and so on for the other raw parameters, then
24780evaluates the resulting filter formulas to get the actual parameter
24781values to be substituted into the original model. In the case of
24782@kbd{H a F} and @kbd{I a F} where the parameters must be error forms,
24783Calc uses the square roots of the diagonal entries of the covariance
24784matrix as error values for the raw parameters, then lets Calc's
24785standard error-form arithmetic take it from there.
24786
24787If you use @kbd{I a F} with a nonlinear model, be sure to remember
24788that the covariance matrix is in terms of the raw parameters,
24789@emph{not} the actual requested parameters. It's up to you to
24790figure out how to interpret the covariances in the presence of
24791nontrivial filter functions.
24792
24793Things are also complicated when the input contains error forms.
24794Suppose there are three independent and dependent variables, @expr{x},
24795@expr{y}, and @expr{z}, one or more of which are error forms in the
24796data. Calc combines all the error values by taking the square root
24797of the sum of the squares of the errors. It then changes @expr{x}
24798and @expr{y} to be plain numbers, and makes @expr{z} into an error
24799form with this combined error. The @expr{Y(x,y,z)} part of the
24800linearized model is evaluated, and the result should be an error
24801form. The error part of that result is used for
24802@texline @math{\sigma_i}
24803@infoline @expr{sigma_i}
24804for the data point. If for some reason @expr{Y(x,y,z)} does not return
24805an error form, the combined error from @expr{z} is used directly for
24806@texline @math{\sigma_i}.
24807@infoline @expr{sigma_i}.
24808Finally, @expr{z} is also stripped of its error
24809for use in computing @expr{F(x,y,z)}, @expr{G(x,y,z)} and so on;
24810the righthand side of the linearized model is computed in regular
24811arithmetic with no error forms.
24812
24813(While these rules may seem complicated, they are designed to do
24814the most reasonable thing in the typical case that @expr{Y(x,y,z)}
24815depends only on the dependent variable @expr{z}, and in fact is
24816often simply equal to @expr{z}. For common cases like polynomials
24817and multilinear models, the combined error is simply used as the
24818@texline @math{\sigma}
24819@infoline @expr{sigma}
24820for the data point with no further ado.)
24821
24822@tex
24823\bigskip
24824@end tex
24825
24826@vindex FitRules
24827It may be the case that the model you wish to use is linearizable,
24828but Calc's built-in rules are unable to figure it out. Calc uses
24829its algebraic rewrite mechanism to linearize a model. The rewrite
24830rules are kept in the variable @code{FitRules}. You can edit this
24831variable using the @kbd{s e FitRules} command; in fact, there is
24832a special @kbd{s F} command just for editing @code{FitRules}.
24833@xref{Operations on Variables}.
24834
24835@xref{Rewrite Rules}, for a discussion of rewrite rules.
24836
24837@ignore
24838@starindex
24839@end ignore
24840@tindex fitvar
24841@ignore
24842@starindex
24843@end ignore
24844@ignore
24845@mindex @idots
24846@end ignore
24847@tindex fitparam
24848@ignore
24849@starindex
24850@end ignore
24851@ignore
24852@mindex @null
24853@end ignore
24854@tindex fitmodel
24855@ignore
24856@starindex
24857@end ignore
24858@ignore
24859@mindex @null
24860@end ignore
24861@tindex fitsystem
24862@ignore
24863@starindex
24864@end ignore
24865@ignore
24866@mindex @null
24867@end ignore
24868@tindex fitdummy
24869Calc uses @code{FitRules} as follows. First, it converts the model
24870to an equation if necessary and encloses the model equation in a
24871call to the function @code{fitmodel} (which is not actually a defined
24872function in Calc; it is only used as a placeholder by the rewrite rules).
24873Parameter variables are renamed to function calls @samp{fitparam(1)},
24874@samp{fitparam(2)}, and so on, and independent variables are renamed
24875to @samp{fitvar(1)}, @samp{fitvar(2)}, etc. The dependent variable
24876is the highest-numbered @code{fitvar}. For example, the power law
24877model @expr{a x^b} is converted to @expr{y = a x^b}, then to
24878
24879@smallexample
24880@group
24881fitmodel(fitvar(2) = fitparam(1) fitvar(1)^fitparam(2))
24882@end group
24883@end smallexample
24884
24885Calc then applies the rewrites as if by @samp{C-u 0 a r FitRules}.
24886(The zero prefix means that rewriting should continue until no further
24887changes are possible.)
24888
24889When rewriting is complete, the @code{fitmodel} call should have
24890been replaced by a @code{fitsystem} call that looks like this:
24891
24892@example
24893fitsystem(@var{Y}, @var{FGH}, @var{abc})
24894@end example
24895
24896@noindent
24897where @var{Y} is a formula that describes the function @expr{Y(x,y,z)},
24898@var{FGH} is the vector of formulas @expr{[F(x,y,z), G(x,y,z), H(x,y,z)]},
24899and @var{abc} is the vector of parameter filters which refer to the
24900raw parameters as @samp{fitdummy(1)} for @expr{A}, @samp{fitdummy(2)}
24901for @expr{B}, etc. While the number of raw parameters (the length of
24902the @var{FGH} vector) is usually the same as the number of original
24903parameters (the length of the @var{abc} vector), this is not required.
24904
24905The power law model eventually boils down to
24906
24907@smallexample
24908@group
24909fitsystem(ln(fitvar(2)),
24910 [1, ln(fitvar(1))],
24911 [exp(fitdummy(1)), fitdummy(2)])
24912@end group
24913@end smallexample
24914
24915The actual implementation of @code{FitRules} is complicated; it
24916proceeds in four phases. First, common rearrangements are done
24917to try to bring linear terms together and to isolate functions like
24918@code{exp} and @code{ln} either all the way ``out'' (so that they
24919can be put into @var{Y}) or all the way ``in'' (so that they can
24920be put into @var{abc} or @var{FGH}). In particular, all
24921non-constant powers are converted to logs-and-exponentials form,
24922and the distributive law is used to expand products of sums.
24923Quotients are rewritten to use the @samp{fitinv} function, where
24924@samp{fitinv(x)} represents @expr{1/x} while the @code{FitRules}
24925are operating. (The use of @code{fitinv} makes recognition of
24926linear-looking forms easier.) If you modify @code{FitRules}, you
24927will probably only need to modify the rules for this phase.
24928
24929Phase two, whose rules can actually also apply during phases one
24930and three, first rewrites @code{fitmodel} to a two-argument
24931form @samp{fitmodel(@var{Y}, @var{model})}, where @var{Y} is
24932initially zero and @var{model} has been changed from @expr{a=b}
24933to @expr{a-b} form. It then tries to peel off invertible functions
24934from the outside of @var{model} and put them into @var{Y} instead,
24935calling the equation solver to invert the functions. Finally, when
24936this is no longer possible, the @code{fitmodel} is changed to a
24937four-argument @code{fitsystem}, where the fourth argument is
24938@var{model} and the @var{FGH} and @var{abc} vectors are initially
24939empty. (The last vector is really @var{ABC}, corresponding to
24940raw parameters, for now.)
24941
24942Phase three converts a sum of items in the @var{model} to a sum
24943of @samp{fitpart(@var{a}, @var{b}, @var{c})} terms which represent
24944terms @samp{@var{a}*@var{b}*@var{c}} of the sum, where @var{a}
24945is all factors that do not involve any variables, @var{b} is all
24946factors that involve only parameters, and @var{c} is the factors
24947that involve only independent variables. (If this decomposition
24948is not possible, the rule set will not complete and Calc will
24949complain that the model is too complex.) Then @code{fitpart}s
24950with equal @var{b} or @var{c} components are merged back together
24951using the distributive law in order to minimize the number of
24952raw parameters needed.
24953
24954Phase four moves the @code{fitpart} terms into the @var{FGH} and
24955@var{ABC} vectors. Also, some of the algebraic expansions that
24956were done in phase 1 are undone now to make the formulas more
24957computationally efficient. Finally, it calls the solver one more
24958time to convert the @var{ABC} vector to an @var{abc} vector, and
24959removes the fourth @var{model} argument (which by now will be zero)
24960to obtain the three-argument @code{fitsystem} that the linear
24961least-squares solver wants to see.
24962
24963@ignore
24964@starindex
24965@end ignore
24966@ignore
24967@mindex hasfit@idots
24968@end ignore
24969@tindex hasfitparams
24970@ignore
24971@starindex
24972@end ignore
24973@ignore
24974@mindex @null
24975@end ignore
24976@tindex hasfitvars
24977Two functions which are useful in connection with @code{FitRules}
24978are @samp{hasfitparams(x)} and @samp{hasfitvars(x)}, which check
24979whether @expr{x} refers to any parameters or independent variables,
24980respectively. Specifically, these functions return ``true'' if the
24981argument contains any @code{fitparam} (or @code{fitvar}) function
24982calls, and ``false'' otherwise. (Recall that ``true'' means a
24983nonzero number, and ``false'' means zero. The actual nonzero number
24984returned is the largest @var{n} from all the @samp{fitparam(@var{n})}s
24985or @samp{fitvar(@var{n})}s, respectively, that appear in the formula.)
24986
24987@tex
24988\bigskip
24989@end tex
24990
24991The @code{fit} function in algebraic notation normally takes four
24992arguments, @samp{fit(@var{model}, @var{vars}, @var{params}, @var{data})},
24993where @var{model} is the model formula as it would be typed after
24994@kbd{a F '}, @var{vars} is the independent variable or a vector of
24995independent variables, @var{params} likewise gives the parameter(s),
24996and @var{data} is the data matrix. Note that the length of @var{vars}
24997must be equal to the number of rows in @var{data} if @var{model} is
24998an equation, or one less than the number of rows if @var{model} is
24999a plain formula. (Actually, a name for the dependent variable is
25000allowed but will be ignored in the plain-formula case.)
25001
25002If @var{params} is omitted, the parameters are all variables in
25003@var{model} except those that appear in @var{vars}. If @var{vars}
25004is also omitted, Calc sorts all the variables that appear in
25005@var{model} alphabetically and uses the higher ones for @var{vars}
25006and the lower ones for @var{params}.
25007
25008Alternatively, @samp{fit(@var{modelvec}, @var{data})} is allowed
25009where @var{modelvec} is a 2- or 3-vector describing the model
25010and variables, as discussed previously.
25011
25012If Calc is unable to do the fit, the @code{fit} function is left
25013in symbolic form, ordinarily with an explanatory message. The
25014message will be ``Model expression is too complex'' if the
25015linearizer was unable to put the model into the required form.
25016
25017The @code{efit} (corresponding to @kbd{H a F}) and @code{xfit}
25018(for @kbd{I a F}) functions are completely analogous.
25019
25020@node Interpolation, , Curve Fitting Details, Curve Fitting
25021@subsection Polynomial Interpolation
25022
25023@kindex a p
25024@pindex calc-poly-interp
25025@tindex polint
25026The @kbd{a p} (@code{calc-poly-interp}) [@code{polint}] command does
25027a polynomial interpolation at a particular @expr{x} value. It takes
25028two arguments from the stack: A data matrix of the sort used by
25029@kbd{a F}, and a single number which represents the desired @expr{x}
25030value. Calc effectively does an exact polynomial fit as if by @kbd{a F i},
25031then substitutes the @expr{x} value into the result in order to get an
25032approximate @expr{y} value based on the fit. (Calc does not actually
25033use @kbd{a F i}, however; it uses a direct method which is both more
25034efficient and more numerically stable.)
25035
25036The result of @kbd{a p} is actually a vector of two values: The @expr{y}
25037value approximation, and an error measure @expr{dy} that reflects Calc's
25038estimation of the probable error of the approximation at that value of
25039@expr{x}. If the input @expr{x} is equal to any of the @expr{x} values
25040in the data matrix, the output @expr{y} will be the corresponding @expr{y}
25041value from the matrix, and the output @expr{dy} will be exactly zero.
25042
25043A prefix argument of 2 causes @kbd{a p} to take separate x- and
25044y-vectors from the stack instead of one data matrix.
25045
25046If @expr{x} is a vector of numbers, @kbd{a p} will return a matrix of
25047interpolated results for each of those @expr{x} values. (The matrix will
25048have two columns, the @expr{y} values and the @expr{dy} values.)
25049If @expr{x} is a formula instead of a number, the @code{polint} function
25050remains in symbolic form; use the @kbd{a "} command to expand it out to
25051a formula that describes the fit in symbolic terms.
25052
25053In all cases, the @kbd{a p} command leaves the data vectors or matrix
25054on the stack. Only the @expr{x} value is replaced by the result.
25055
25056@kindex H a p
25057@tindex ratint
25058The @kbd{H a p} [@code{ratint}] command does a rational function
25059interpolation. It is used exactly like @kbd{a p}, except that it
25060uses as its model the quotient of two polynomials. If there are
25061@expr{N} data points, the numerator and denominator polynomials will
25062each have degree @expr{N/2} (if @expr{N} is odd, the denominator will
25063have degree one higher than the numerator).
25064
25065Rational approximations have the advantage that they can accurately
25066describe functions that have poles (points at which the function's value
25067goes to infinity, so that the denominator polynomial of the approximation
25068goes to zero). If @expr{x} corresponds to a pole of the fitted rational
25069function, then the result will be a division by zero. If Infinite mode
25070is enabled, the result will be @samp{[uinf, uinf]}.
25071
25072There is no way to get the actual coefficients of the rational function
25073used by @kbd{H a p}. (The algorithm never generates these coefficients
25074explicitly, and quotients of polynomials are beyond @w{@kbd{a F}}'s
25075capabilities to fit.)
25076
25077@node Summations, Logical Operations, Curve Fitting, Algebra
25078@section Summations
25079
25080@noindent
25081@cindex Summation of a series
25082@kindex a +
25083@pindex calc-summation
25084@tindex sum
25085The @kbd{a +} (@code{calc-summation}) [@code{sum}] command computes
25086the sum of a formula over a certain range of index values. The formula
25087is taken from the top of the stack; the command prompts for the
25088name of the summation index variable, the lower limit of the
25089sum (any formula), and the upper limit of the sum. If you
25090enter a blank line at any of these prompts, that prompt and
25091any later ones are answered by reading additional elements from
25092the stack. Thus, @kbd{' k^2 @key{RET} ' k @key{RET} 1 @key{RET} 5 @key{RET} a + @key{RET}}
25093produces the result 55.
25094@tex
25095\turnoffactive
25096$$ \sum_{k=1}^5 k^2 = 55 $$
25097@end tex
25098
25099The choice of index variable is arbitrary, but it's best not to
25100use a variable with a stored value. In particular, while
25101@code{i} is often a favorite index variable, it should be avoided
25102in Calc because @code{i} has the imaginary constant @expr{(0, 1)}
25103as a value. If you pressed @kbd{=} on a sum over @code{i}, it would
25104be changed to a nonsensical sum over the ``variable'' @expr{(0, 1)}!
25105If you really want to use @code{i} as an index variable, use
25106@w{@kbd{s u i @key{RET}}} first to ``unstore'' this variable.
25107(@xref{Storing Variables}.)
25108
25109A numeric prefix argument steps the index by that amount rather
25110than by one. Thus @kbd{' a_k @key{RET} C-u -2 a + k @key{RET} 10 @key{RET} 0 @key{RET}}
25111yields @samp{a_10 + a_8 + a_6 + a_4 + a_2 + a_0}. A prefix
25112argument of plain @kbd{C-u} causes @kbd{a +} to prompt for the
25113step value, in which case you can enter any formula or enter
25114a blank line to take the step value from the stack. With the
25115@kbd{C-u} prefix, @kbd{a +} can take up to five arguments from
25116the stack: The formula, the variable, the lower limit, the
25117upper limit, and (at the top of the stack), the step value.
25118
25119Calc knows how to do certain sums in closed form. For example,
25120@samp{sum(6 k^2, k, 1, n) = @w{2 n^3} + 3 n^2 + n}. In particular,
25121this is possible if the formula being summed is polynomial or
25122exponential in the index variable. Sums of logarithms are
25123transformed into logarithms of products. Sums of trigonometric
25124and hyperbolic functions are transformed to sums of exponentials
25125and then done in closed form. Also, of course, sums in which the
25126lower and upper limits are both numbers can always be evaluated
25127just by grinding them out, although Calc will use closed forms
25128whenever it can for the sake of efficiency.
25129
25130The notation for sums in algebraic formulas is
25131@samp{sum(@var{expr}, @var{var}, @var{low}, @var{high}, @var{step})}.
25132If @var{step} is omitted, it defaults to one. If @var{high} is
25133omitted, @var{low} is actually the upper limit and the lower limit
25134is one. If @var{low} is also omitted, the limits are @samp{-inf}
25135and @samp{inf}, respectively.
25136
25137Infinite sums can sometimes be evaluated: @samp{sum(.5^k, k, 1, inf)}
25138returns @expr{1}. This is done by evaluating the sum in closed
25139form (to @samp{1. - 0.5^n} in this case), then evaluating this
25140formula with @code{n} set to @code{inf}. Calc's usual rules
25141for ``infinite'' arithmetic can find the answer from there. If
25142infinite arithmetic yields a @samp{nan}, or if the sum cannot be
25143solved in closed form, Calc leaves the @code{sum} function in
25144symbolic form. @xref{Infinities}.
25145
25146As a special feature, if the limits are infinite (or omitted, as
25147described above) but the formula includes vectors subscripted by
25148expressions that involve the iteration variable, Calc narrows
25149the limits to include only the range of integers which result in
25150valid subscripts for the vector. For example, the sum
25151@samp{sum(k [a,b,c,d,e,f,g]_(2k),k)} evaluates to @samp{b + 2 d + 3 f}.
25152
25153The limits of a sum do not need to be integers. For example,
25154@samp{sum(a_k, k, 0, 2 n, n)} produces @samp{a_0 + a_n + a_(2 n)}.
25155Calc computes the number of iterations using the formula
25156@samp{1 + (@var{high} - @var{low}) / @var{step}}, which must,
25157after simplification as if by @kbd{a s}, evaluate to an integer.
25158
25159If the number of iterations according to the above formula does
25160not come out to an integer, the sum is invalid and will be left
25161in symbolic form. However, closed forms are still supplied, and
25162you are on your honor not to misuse the resulting formulas by
25163substituting mismatched bounds into them. For example,
25164@samp{sum(k, k, 1, 10, 2)} is invalid, but Calc will go ahead and
25165evaluate the closed form solution for the limits 1 and 10 to get
25166the rather dubious answer, 29.25.
25167
25168If the lower limit is greater than the upper limit (assuming a
25169positive step size), the result is generally zero. However,
25170Calc only guarantees a zero result when the upper limit is
25171exactly one step less than the lower limit, i.e., if the number
25172of iterations is @mathit{-1}. Thus @samp{sum(f(k), k, n, n-1)} is zero
25173but the sum from @samp{n} to @samp{n-2} may report a nonzero value
25174if Calc used a closed form solution.
25175
25176Calc's logical predicates like @expr{a < b} return 1 for ``true''
25177and 0 for ``false.'' @xref{Logical Operations}. This can be
25178used to advantage for building conditional sums. For example,
25179@samp{sum(prime(k)*k^2, k, 1, 20)} is the sum of the squares of all
25180prime numbers from 1 to 20; the @code{prime} predicate returns 1 if
25181its argument is prime and 0 otherwise. You can read this expression
25182as ``the sum of @expr{k^2}, where @expr{k} is prime.'' Indeed,
25183@samp{sum(prime(k)*k^2, k)} would represent the sum of @emph{all} primes
25184squared, since the limits default to plus and minus infinity, but
25185there are no such sums that Calc's built-in rules can do in
25186closed form.
25187
25188As another example, @samp{sum((k != k_0) * f(k), k, 1, n)} is the
25189sum of @expr{f(k)} for all @expr{k} from 1 to @expr{n}, excluding
25190one value @expr{k_0}. Slightly more tricky is the summand
25191@samp{(k != k_0) / (k - k_0)}, which is an attempt to describe
25192the sum of all @expr{1/(k-k_0)} except at @expr{k = k_0}, where
25193this would be a division by zero. But at @expr{k = k_0}, this
25194formula works out to the indeterminate form @expr{0 / 0}, which
25195Calc will not assume is zero. Better would be to use
25196@samp{(k != k_0) ? 1/(k-k_0) : 0}; the @samp{? :} operator does
25197an ``if-then-else'' test: This expression says, ``if
25198@texline @math{k \ne k_0},
25199@infoline @expr{k != k_0},
25200then @expr{1/(k-k_0)}, else zero.'' Now the formula @expr{1/(k-k_0)}
25201will not even be evaluated by Calc when @expr{k = k_0}.
25202
25203@cindex Alternating sums
25204@kindex a -
25205@pindex calc-alt-summation
25206@tindex asum
25207The @kbd{a -} (@code{calc-alt-summation}) [@code{asum}] command
25208computes an alternating sum. Successive terms of the sequence
25209are given alternating signs, with the first term (corresponding
25210to the lower index value) being positive. Alternating sums
25211are converted to normal sums with an extra term of the form
25212@samp{(-1)^(k-@var{low})}. This formula is adjusted appropriately
25213if the step value is other than one. For example, the Taylor
25214series for the sine function is @samp{asum(x^k / k!, k, 1, inf, 2)}.
25215(Calc cannot evaluate this infinite series, but it can approximate
25216it if you replace @code{inf} with any particular odd number.)
25217Calc converts this series to a regular sum with a step of one,
25218namely @samp{sum((-1)^k x^(2k+1) / (2k+1)!, k, 0, inf)}.
25219
25220@cindex Product of a sequence
25221@kindex a *
25222@pindex calc-product
25223@tindex prod
25224The @kbd{a *} (@code{calc-product}) [@code{prod}] command is
25225the analogous way to take a product of many terms. Calc also knows
25226some closed forms for products, such as @samp{prod(k, k, 1, n) = n!}.
25227Conditional products can be written @samp{prod(k^prime(k), k, 1, n)}
25228or @samp{prod(prime(k) ? k : 1, k, 1, n)}.
25229
25230@kindex a T
25231@pindex calc-tabulate
25232@tindex table
25233The @kbd{a T} (@code{calc-tabulate}) [@code{table}] command
25234evaluates a formula at a series of iterated index values, just
25235like @code{sum} and @code{prod}, but its result is simply a
25236vector of the results. For example, @samp{table(a_i, i, 1, 7, 2)}
25237produces @samp{[a_1, a_3, a_5, a_7]}.
25238
25239@node Logical Operations, Rewrite Rules, Summations, Algebra
25240@section Logical Operations
25241
25242@noindent
25243The following commands and algebraic functions return true/false values,
25244where 1 represents ``true'' and 0 represents ``false.'' In cases where
25245a truth value is required (such as for the condition part of a rewrite
25246rule, or as the condition for a @w{@kbd{Z [ Z ]}} control structure), any
25247nonzero value is accepted to mean ``true.'' (Specifically, anything
25248for which @code{dnonzero} returns 1 is ``true,'' and anything for
25249which @code{dnonzero} returns 0 or cannot decide is assumed ``false.''
25250Note that this means that @w{@kbd{Z [ Z ]}} will execute the ``then''
25251portion if its condition is provably true, but it will execute the
25252``else'' portion for any condition like @expr{a = b} that is not
25253provably true, even if it might be true. Algebraic functions that
25254have conditions as arguments, like @code{? :} and @code{&&}, remain
25255unevaluated if the condition is neither provably true nor provably
25256false. @xref{Declarations}.)
25257
25258@kindex a =
25259@pindex calc-equal-to
25260@tindex eq
25261@tindex =
25262@tindex ==
25263The @kbd{a =} (@code{calc-equal-to}) command, or @samp{eq(a,b)} function
25264(which can also be written @samp{a = b} or @samp{a == b} in an algebraic
25265formula) is true if @expr{a} and @expr{b} are equal, either because they
25266are identical expressions, or because they are numbers which are
25267numerically equal. (Thus the integer 1 is considered equal to the float
252681.0.) If the equality of @expr{a} and @expr{b} cannot be determined,
25269the comparison is left in symbolic form. Note that as a command, this
25270operation pops two values from the stack and pushes back either a 1 or
25271a 0, or a formula @samp{a = b} if the values' equality cannot be determined.
25272
25273Many Calc commands use @samp{=} formulas to represent @dfn{equations}.
25274For example, the @kbd{a S} (@code{calc-solve-for}) command rearranges
25275an equation to solve for a given variable. The @kbd{a M}
25276(@code{calc-map-equation}) command can be used to apply any
25277function to both sides of an equation; for example, @kbd{2 a M *}
25278multiplies both sides of the equation by two. Note that just
25279@kbd{2 *} would not do the same thing; it would produce the formula
25280@samp{2 (a = b)} which represents 2 if the equality is true or
25281zero if not.
25282
25283The @code{eq} function with more than two arguments (e.g., @kbd{C-u 3 a =}
25284or @samp{a = b = c}) tests if all of its arguments are equal. In
25285algebraic notation, the @samp{=} operator is unusual in that it is
25286neither left- nor right-associative: @samp{a = b = c} is not the
25287same as @samp{(a = b) = c} or @samp{a = (b = c)} (which each compare
25288one variable with the 1 or 0 that results from comparing two other
25289variables).
25290
25291@kindex a #
25292@pindex calc-not-equal-to
25293@tindex neq
25294@tindex !=
25295The @kbd{a #} (@code{calc-not-equal-to}) command, or @samp{neq(a,b)} or
25296@samp{a != b} function, is true if @expr{a} and @expr{b} are not equal.
25297This also works with more than two arguments; @samp{a != b != c != d}
25298tests that all four of @expr{a}, @expr{b}, @expr{c}, and @expr{d} are
25299distinct numbers.
25300
25301@kindex a <
25302@tindex lt
25303@ignore
25304@mindex @idots
25305@end ignore
25306@kindex a >
25307@ignore
25308@mindex @null
25309@end ignore
25310@kindex a [
25311@ignore
25312@mindex @null
25313@end ignore
25314@kindex a ]
25315@pindex calc-less-than
25316@pindex calc-greater-than
25317@pindex calc-less-equal
25318@pindex calc-greater-equal
25319@ignore
25320@mindex @null
25321@end ignore
25322@tindex gt
25323@ignore
25324@mindex @null
25325@end ignore
25326@tindex leq
25327@ignore
25328@mindex @null
25329@end ignore
25330@tindex geq
25331@ignore
25332@mindex @null
25333@end ignore
25334@tindex <
25335@ignore
25336@mindex @null
25337@end ignore
25338@tindex >
25339@ignore
25340@mindex @null
25341@end ignore
25342@tindex <=
25343@ignore
25344@mindex @null
25345@end ignore
25346@tindex >=
25347The @kbd{a <} (@code{calc-less-than}) [@samp{lt(a,b)} or @samp{a < b}]
25348operation is true if @expr{a} is less than @expr{b}. Similar functions
25349are @kbd{a >} (@code{calc-greater-than}) [@samp{gt(a,b)} or @samp{a > b}],
25350@kbd{a [} (@code{calc-less-equal}) [@samp{leq(a,b)} or @samp{a <= b}], and
25351@kbd{a ]} (@code{calc-greater-equal}) [@samp{geq(a,b)} or @samp{a >= b}].
25352
25353While the inequality functions like @code{lt} do not accept more
25354than two arguments, the syntax @w{@samp{a <= b < c}} is translated to an
25355equivalent expression involving intervals: @samp{b in [a .. c)}.
25356(See the description of @code{in} below.) All four combinations
25357of @samp{<} and @samp{<=} are allowed, or any of the four combinations
25358of @samp{>} and @samp{>=}. Four-argument constructions like
25359@samp{a < b < c < d}, and mixtures like @w{@samp{a < b = c}} that
25360involve both equalities and inequalities, are not allowed.
25361
25362@kindex a .
25363@pindex calc-remove-equal
25364@tindex rmeq
25365The @kbd{a .} (@code{calc-remove-equal}) [@code{rmeq}] command extracts
25366the righthand side of the equation or inequality on the top of the
25367stack. It also works elementwise on vectors. For example, if
25368@samp{[x = 2.34, y = z / 2]} is on the stack, then @kbd{a .} produces
25369@samp{[2.34, z / 2]}. As a special case, if the righthand side is a
25370variable and the lefthand side is a number (as in @samp{2.34 = x}), then
25371Calc keeps the lefthand side instead. Finally, this command works with
25372assignments @samp{x := 2.34} as well as equations, always taking the
25373righthand side, and for @samp{=>} (evaluates-to) operators, always
25374taking the lefthand side.
25375
25376@kindex a &
25377@pindex calc-logical-and
25378@tindex land
25379@tindex &&
25380The @kbd{a &} (@code{calc-logical-and}) [@samp{land(a,b)} or @samp{a && b}]
25381function is true if both of its arguments are true, i.e., are
25382non-zero numbers. In this case, the result will be either @expr{a} or
25383@expr{b}, chosen arbitrarily. If either argument is zero, the result is
25384zero. Otherwise, the formula is left in symbolic form.
25385
25386@kindex a |
25387@pindex calc-logical-or
25388@tindex lor
25389@tindex ||
25390The @kbd{a |} (@code{calc-logical-or}) [@samp{lor(a,b)} or @samp{a || b}]
25391function is true if either or both of its arguments are true (nonzero).
25392The result is whichever argument was nonzero, choosing arbitrarily if both
25393are nonzero. If both @expr{a} and @expr{b} are zero, the result is
25394zero.
25395
25396@kindex a !
25397@pindex calc-logical-not
25398@tindex lnot
25399@tindex !
25400The @kbd{a !} (@code{calc-logical-not}) [@samp{lnot(a)} or @samp{!@: a}]
25401function is true if @expr{a} is false (zero), or false if @expr{a} is
25402true (nonzero). It is left in symbolic form if @expr{a} is not a
25403number.
25404
25405@kindex a :
25406@pindex calc-logical-if
25407@tindex if
25408@ignore
25409@mindex ? :
25410@end ignore
25411@tindex ?
25412@ignore
25413@mindex @null
25414@end ignore
25415@tindex :
25416@cindex Arguments, not evaluated
25417The @kbd{a :} (@code{calc-logical-if}) [@samp{if(a,b,c)} or @samp{a ? b :@: c}]
25418function is equal to either @expr{b} or @expr{c} if @expr{a} is a nonzero
25419number or zero, respectively. If @expr{a} is not a number, the test is
25420left in symbolic form and neither @expr{b} nor @expr{c} is evaluated in
25421any way. In algebraic formulas, this is one of the few Calc functions
25422whose arguments are not automatically evaluated when the function itself
25423is evaluated. The others are @code{lambda}, @code{quote}, and
25424@code{condition}.
25425
25426One minor surprise to watch out for is that the formula @samp{a?3:4}
25427will not work because the @samp{3:4} is parsed as a fraction instead of
25428as three separate symbols. Type something like @samp{a ? 3 : 4} or
25429@samp{a?(3):4} instead.
25430
25431As a special case, if @expr{a} evaluates to a vector, then both @expr{b}
25432and @expr{c} are evaluated; the result is a vector of the same length
25433as @expr{a} whose elements are chosen from corresponding elements of
25434@expr{b} and @expr{c} according to whether each element of @expr{a}
25435is zero or nonzero. Each of @expr{b} and @expr{c} must be either a
25436vector of the same length as @expr{a}, or a non-vector which is matched
25437with all elements of @expr{a}.
25438
25439@kindex a @{
25440@pindex calc-in-set
25441@tindex in
25442The @kbd{a @{} (@code{calc-in-set}) [@samp{in(a,b)}] function is true if
25443the number @expr{a} is in the set of numbers represented by @expr{b}.
25444If @expr{b} is an interval form, @expr{a} must be one of the values
25445encompassed by the interval. If @expr{b} is a vector, @expr{a} must be
25446equal to one of the elements of the vector. (If any vector elements are
25447intervals, @expr{a} must be in any of the intervals.) If @expr{b} is a
25448plain number, @expr{a} must be numerically equal to @expr{b}.
25449@xref{Set Operations}, for a group of commands that manipulate sets
25450of this sort.
25451
25452@ignore
25453@starindex
25454@end ignore
25455@tindex typeof
25456The @samp{typeof(a)} function produces an integer or variable which
25457characterizes @expr{a}. If @expr{a} is a number, vector, or variable,
25458the result will be one of the following numbers:
25459
25460@example
25461 1 Integer
25462 2 Fraction
25463 3 Floating-point number
25464 4 HMS form
25465 5 Rectangular complex number
25466 6 Polar complex number
25467 7 Error form
25468 8 Interval form
25469 9 Modulo form
2547010 Date-only form
2547111 Date/time form
2547212 Infinity (inf, uinf, or nan)
25473100 Variable
25474101 Vector (but not a matrix)
25475102 Matrix
25476@end example
25477
25478Otherwise, @expr{a} is a formula, and the result is a variable which
25479represents the name of the top-level function call.
25480
25481@ignore
25482@starindex
25483@end ignore
25484@tindex integer
25485@ignore
25486@starindex
25487@end ignore
25488@tindex real
25489@ignore
25490@starindex
25491@end ignore
25492@tindex constant
25493The @samp{integer(a)} function returns true if @expr{a} is an integer.
25494The @samp{real(a)} function
25495is true if @expr{a} is a real number, either integer, fraction, or
25496float. The @samp{constant(a)} function returns true if @expr{a} is
25497any of the objects for which @code{typeof} would produce an integer
25498code result except for variables, and provided that the components of
25499an object like a vector or error form are themselves constant.
25500Note that infinities do not satisfy any of these tests, nor do
25501special constants like @code{pi} and @code{e}.
25502
25503@xref{Declarations}, for a set of similar functions that recognize
25504formulas as well as actual numbers. For example, @samp{dint(floor(x))}
25505is true because @samp{floor(x)} is provably integer-valued, but
25506@samp{integer(floor(x))} does not because @samp{floor(x)} is not
25507literally an integer constant.
25508
25509@ignore
25510@starindex
25511@end ignore
25512@tindex refers
25513The @samp{refers(a,b)} function is true if the variable (or sub-expression)
25514@expr{b} appears in @expr{a}, or false otherwise. Unlike the other
25515tests described here, this function returns a definite ``no'' answer
25516even if its arguments are still in symbolic form. The only case where
25517@code{refers} will be left unevaluated is if @expr{a} is a plain
25518variable (different from @expr{b}).
25519
25520@ignore
25521@starindex
25522@end ignore
25523@tindex negative
25524The @samp{negative(a)} function returns true if @expr{a} ``looks'' negative,
25525because it is a negative number, because it is of the form @expr{-x},
25526or because it is a product or quotient with a term that looks negative.
25527This is most useful in rewrite rules. Beware that @samp{negative(a)}
25528evaluates to 1 or 0 for @emph{any} argument @expr{a}, so it can only
25529be stored in a formula if the default simplifications are turned off
25530first with @kbd{m O} (or if it appears in an unevaluated context such
25531as a rewrite rule condition).
25532
25533@ignore
25534@starindex
25535@end ignore
25536@tindex variable
25537The @samp{variable(a)} function is true if @expr{a} is a variable,
25538or false if not. If @expr{a} is a function call, this test is left
25539in symbolic form. Built-in variables like @code{pi} and @code{inf}
25540are considered variables like any others by this test.
25541
25542@ignore
25543@starindex
25544@end ignore
25545@tindex nonvar
25546The @samp{nonvar(a)} function is true if @expr{a} is a non-variable.
25547If its argument is a variable it is left unsimplified; it never
25548actually returns zero. However, since Calc's condition-testing
25549commands consider ``false'' anything not provably true, this is
25550often good enough.
25551
25552@ignore
25553@starindex
25554@end ignore
25555@tindex lin
25556@ignore
25557@starindex
25558@end ignore
25559@tindex linnt
25560@ignore
25561@starindex
25562@end ignore
25563@tindex islin
25564@ignore
25565@starindex
25566@end ignore
25567@tindex islinnt
25568@cindex Linearity testing
25569The functions @code{lin}, @code{linnt}, @code{islin}, and @code{islinnt}
25570check if an expression is ``linear,'' i.e., can be written in the form
25571@expr{a + b x} for some constants @expr{a} and @expr{b}, and some
25572variable or subformula @expr{x}. The function @samp{islin(f,x)} checks
25573if formula @expr{f} is linear in @expr{x}, returning 1 if so. For
25574example, @samp{islin(x,x)}, @samp{islin(-x,x)}, @samp{islin(3,x)}, and
25575@samp{islin(x y / 3 - 2, x)} all return 1. The @samp{lin(f,x)} function
25576is similar, except that instead of returning 1 it returns the vector
25577@expr{[a, b, x]}. For the above examples, this vector would be
25578@expr{[0, 1, x]}, @expr{[0, -1, x]}, @expr{[3, 0, x]}, and
25579@expr{[-2, y/3, x]}, respectively. Both @code{lin} and @code{islin}
25580generally remain unevaluated for expressions which are not linear,
25581e.g., @samp{lin(2 x^2, x)} and @samp{lin(sin(x), x)}. The second
25582argument can also be a formula; @samp{islin(2 + 3 sin(x), sin(x))}
25583returns true.
25584
25585The @code{linnt} and @code{islinnt} functions perform a similar check,
25586but require a ``non-trivial'' linear form, which means that the
25587@expr{b} coefficient must be non-zero. For example, @samp{lin(2,x)}
25588returns @expr{[2, 0, x]} and @samp{lin(y,x)} returns @expr{[y, 0, x]},
25589but @samp{linnt(2,x)} and @samp{linnt(y,x)} are left unevaluated
25590(in other words, these formulas are considered to be only ``trivially''
25591linear in @expr{x}).
25592
25593All four linearity-testing functions allow you to omit the second
25594argument, in which case the input may be linear in any non-constant
25595formula. Here, the @expr{a=0}, @expr{b=1} case is also considered
25596trivial, and only constant values for @expr{a} and @expr{b} are
25597recognized. Thus, @samp{lin(2 x y)} returns @expr{[0, 2, x y]},
25598@samp{lin(2 - x y)} returns @expr{[2, -1, x y]}, and @samp{lin(x y)}
25599returns @expr{[0, 1, x y]}. The @code{linnt} function would allow the
25600first two cases but not the third. Also, neither @code{lin} nor
25601@code{linnt} accept plain constants as linear in the one-argument
25602case: @samp{islin(2,x)} is true, but @samp{islin(2)} is false.
25603
25604@ignore
25605@starindex
25606@end ignore
25607@tindex istrue
25608The @samp{istrue(a)} function returns 1 if @expr{a} is a nonzero
25609number or provably nonzero formula, or 0 if @expr{a} is anything else.
25610Calls to @code{istrue} can only be manipulated if @kbd{m O} mode is
25611used to make sure they are not evaluated prematurely. (Note that
25612declarations are used when deciding whether a formula is true;
25613@code{istrue} returns 1 when @code{dnonzero} would return 1, and
25614it returns 0 when @code{dnonzero} would return 0 or leave itself
25615in symbolic form.)
25616
25617@node Rewrite Rules, , Logical Operations, Algebra
25618@section Rewrite Rules
25619
25620@noindent
25621@cindex Rewrite rules
25622@cindex Transformations
25623@cindex Pattern matching
25624@kindex a r
25625@pindex calc-rewrite
25626@tindex rewrite
25627The @kbd{a r} (@code{calc-rewrite}) [@code{rewrite}] command makes
25628substitutions in a formula according to a specified pattern or patterns
25629known as @dfn{rewrite rules}. Whereas @kbd{a b} (@code{calc-substitute})
25630matches literally, so that substituting @samp{sin(x)} with @samp{cos(x)}
25631matches only the @code{sin} function applied to the variable @code{x},
25632rewrite rules match general kinds of formulas; rewriting using the rule
25633@samp{sin(x) := cos(x)} matches @code{sin} of any argument and replaces
25634it with @code{cos} of that same argument. The only significance of the
25635name @code{x} is that the same name is used on both sides of the rule.
25636
25637Rewrite rules rearrange formulas already in Calc's memory.
25638@xref{Syntax Tables}, to read about @dfn{syntax rules}, which are
25639similar to algebraic rewrite rules but operate when new algebraic
25640entries are being parsed, converting strings of characters into
25641Calc formulas.
25642
25643@menu
25644* Entering Rewrite Rules::
25645* Basic Rewrite Rules::
25646* Conditional Rewrite Rules::
25647* Algebraic Properties of Rewrite Rules::
25648* Other Features of Rewrite Rules::
25649* Composing Patterns in Rewrite Rules::
25650* Nested Formulas with Rewrite Rules::
25651* Multi-Phase Rewrite Rules::
25652* Selections with Rewrite Rules::
25653* Matching Commands::
25654* Automatic Rewrites::
25655* Debugging Rewrites::
25656* Examples of Rewrite Rules::
25657@end menu
25658
25659@node Entering Rewrite Rules, Basic Rewrite Rules, Rewrite Rules, Rewrite Rules
25660@subsection Entering Rewrite Rules
25661
25662@noindent
25663Rewrite rules normally use the ``assignment'' operator
25664@samp{@var{old} := @var{new}}.
25665This operator is equivalent to the function call @samp{assign(old, new)}.
25666The @code{assign} function is undefined by itself in Calc, so an
25667assignment formula such as a rewrite rule will be left alone by ordinary
25668Calc commands. But certain commands, like the rewrite system, interpret
25669assignments in special ways.
25670
25671For example, the rule @samp{sin(x)^2 := 1-cos(x)^2} says to replace
25672every occurrence of the sine of something, squared, with one minus the
25673square of the cosine of that same thing. All by itself as a formula
25674on the stack it does nothing, but when given to the @kbd{a r} command
25675it turns that command into a sine-squared-to-cosine-squared converter.
25676
25677To specify a set of rules to be applied all at once, make a vector of
25678rules.
25679
25680When @kbd{a r} prompts you to enter the rewrite rules, you can answer
25681in several ways:
25682
25683@enumerate
25684@item
25685With a rule: @kbd{f(x) := g(x) @key{RET}}.
25686@item
25687With a vector of rules: @kbd{[f1(x) := g1(x), f2(x) := g2(x)] @key{RET}}.
25688(You can omit the enclosing square brackets if you wish.)
25689@item
25690With the name of a variable that contains the rule or rules vector:
25691@kbd{myrules @key{RET}}.
25692@item
25693With any formula except a rule, a vector, or a variable name; this
25694will be interpreted as the @var{old} half of a rewrite rule,
25695and you will be prompted a second time for the @var{new} half:
25696@kbd{f(x) @key{RET} g(x) @key{RET}}.
25697@item
25698With a blank line, in which case the rule, rules vector, or variable
25699will be taken from the top of the stack (and the formula to be
25700rewritten will come from the second-to-top position).
25701@end enumerate
25702
25703If you enter the rules directly (as opposed to using rules stored
25704in a variable), those rules will be put into the Trail so that you
25705can retrieve them later. @xref{Trail Commands}.
25706
25707It is most convenient to store rules you use often in a variable and
25708invoke them by giving the variable name. The @kbd{s e}
25709(@code{calc-edit-variable}) command is an easy way to create or edit a
25710rule set stored in a variable. You may also wish to use @kbd{s p}
25711(@code{calc-permanent-variable}) to save your rules permanently;
25712@pxref{Operations on Variables}.
25713
25714Rewrite rules are compiled into a special internal form for faster
25715matching. If you enter a rule set directly it must be recompiled
25716every time. If you store the rules in a variable and refer to them
25717through that variable, they will be compiled once and saved away
25718along with the variable for later reference. This is another good
25719reason to store your rules in a variable.
25720
25721Calc also accepts an obsolete notation for rules, as vectors
25722@samp{[@var{old}, @var{new}]}. But because it is easily confused with a
25723vector of two rules, the use of this notation is no longer recommended.
25724
25725@node Basic Rewrite Rules, Conditional Rewrite Rules, Entering Rewrite Rules, Rewrite Rules
25726@subsection Basic Rewrite Rules
25727
25728@noindent
25729To match a particular formula @expr{x} with a particular rewrite rule
25730@samp{@var{old} := @var{new}}, Calc compares the structure of @expr{x} with
25731the structure of @var{old}. Variables that appear in @var{old} are
25732treated as @dfn{meta-variables}; the corresponding positions in @expr{x}
25733may contain any sub-formulas. For example, the pattern @samp{f(x,y)}
25734would match the expression @samp{f(12, a+1)} with the meta-variable
25735@samp{x} corresponding to 12 and with @samp{y} corresponding to
25736@samp{a+1}. However, this pattern would not match @samp{f(12)} or
25737@samp{g(12, a+1)}, since there is no assignment of the meta-variables
25738that will make the pattern match these expressions. Notice that if
25739the pattern is a single meta-variable, it will match any expression.
25740
25741If a given meta-variable appears more than once in @var{old}, the
25742corresponding sub-formulas of @expr{x} must be identical. Thus
25743the pattern @samp{f(x,x)} would match @samp{f(12, 12)} and
25744@samp{f(a+1, a+1)} but not @samp{f(12, a+1)} or @samp{f(a+b, b+a)}.
25745(@xref{Conditional Rewrite Rules}, for a way to match the latter.)
25746
25747Things other than variables must match exactly between the pattern
25748and the target formula. To match a particular variable exactly, use
25749the pseudo-function @samp{quote(v)} in the pattern. For example, the
25750pattern @samp{x+quote(y)} matches @samp{x+y}, @samp{2+y}, or
25751@samp{sin(a)+y}.
25752
25753The special variable names @samp{e}, @samp{pi}, @samp{i}, @samp{phi},
25754@samp{gamma}, @samp{inf}, @samp{uinf}, and @samp{nan} always match
25755literally. Thus the pattern @samp{sin(d + e + f)} acts exactly like
25756@samp{sin(d + quote(e) + f)}.
25757
25758If the @var{old} pattern is found to match a given formula, that
25759formula is replaced by @var{new}, where any occurrences in @var{new}
25760of meta-variables from the pattern are replaced with the sub-formulas
25761that they matched. Thus, applying the rule @samp{f(x,y) := g(y+x,x)}
25762to @samp{f(12, a+1)} would produce @samp{g(a+13, 12)}.
25763
25764The normal @kbd{a r} command applies rewrite rules over and over
25765throughout the target formula until no further changes are possible
25766(up to a limit of 100 times). Use @kbd{C-u 1 a r} to make only one
25767change at a time.
25768
25769@node Conditional Rewrite Rules, Algebraic Properties of Rewrite Rules, Basic Rewrite Rules, Rewrite Rules
25770@subsection Conditional Rewrite Rules
25771
25772@noindent
25773A rewrite rule can also be @dfn{conditional}, written in the form
25774@samp{@var{old} := @var{new} :: @var{cond}}. (There is also the obsolete
25775form @samp{[@var{old}, @var{new}, @var{cond}]}.) If a @var{cond} part
25776is present in the
25777rule, this is an additional condition that must be satisfied before
25778the rule is accepted. Once @var{old} has been successfully matched
25779to the target expression, @var{cond} is evaluated (with all the
25780meta-variables substituted for the values they matched) and simplified
25781with @kbd{a s} (@code{calc-simplify}). If the result is a nonzero
25782number or any other object known to be nonzero (@pxref{Declarations}),
25783the rule is accepted. If the result is zero or if it is a symbolic
25784formula that is not known to be nonzero, the rule is rejected.
25785@xref{Logical Operations}, for a number of functions that return
257861 or 0 according to the results of various tests.
25787
25788For example, the formula @samp{n > 0} simplifies to 1 or 0 if @expr{n}
25789is replaced by a positive or nonpositive number, respectively (or if
25790@expr{n} has been declared to be positive or nonpositive). Thus,
25791the rule @samp{f(x,y) := g(y+x,x) :: x+y > 0} would apply to
25792@samp{f(0, 4)} but not to @samp{f(-3, 2)} or @samp{f(12, a+1)}
25793(assuming no outstanding declarations for @expr{a}). In the case of
25794@samp{f(-3, 2)}, the condition can be shown not to be satisfied; in
25795the case of @samp{f(12, a+1)}, the condition merely cannot be shown
25796to be satisfied, but that is enough to reject the rule.
25797
25798While Calc will use declarations to reason about variables in the
25799formula being rewritten, declarations do not apply to meta-variables.
25800For example, the rule @samp{f(a) := g(a+1)} will match for any values
25801of @samp{a}, such as complex numbers, vectors, or formulas, even if
25802@samp{a} has been declared to be real or scalar. If you want the
25803meta-variable @samp{a} to match only literal real numbers, use
25804@samp{f(a) := g(a+1) :: real(a)}. If you want @samp{a} to match only
25805reals and formulas which are provably real, use @samp{dreal(a)} as
25806the condition.
25807
25808The @samp{::} operator is a shorthand for the @code{condition}
25809function; @samp{@var{old} := @var{new} :: @var{cond}} is equivalent to
25810the formula @samp{condition(assign(@var{old}, @var{new}), @var{cond})}.
25811
25812If you have several conditions, you can use @samp{... :: c1 :: c2 :: c3}
25813or @samp{... :: c1 && c2 && c3}. The two are entirely equivalent.
25814
25815It is also possible to embed conditions inside the pattern:
25816@samp{f(x :: x>0, y) := g(y+x, x)}. This is purely a notational
25817convenience, though; where a condition appears in a rule has no
25818effect on when it is tested. The rewrite-rule compiler automatically
25819decides when it is best to test each condition while a rule is being
25820matched.
25821
25822Certain conditions are handled as special cases by the rewrite rule
25823system and are tested very efficiently: Where @expr{x} is any
25824meta-variable, these conditions are @samp{integer(x)}, @samp{real(x)},
25825@samp{constant(x)}, @samp{negative(x)}, @samp{x >= y} where @expr{y}
25826is either a constant or another meta-variable and @samp{>=} may be
25827replaced by any of the six relational operators, and @samp{x % a = b}
25828where @expr{a} and @expr{b} are constants. Other conditions, like
25829@samp{x >= y+1} or @samp{dreal(x)}, will be less efficient to check
25830since Calc must bring the whole evaluator and simplifier into play.
25831
25832An interesting property of @samp{::} is that neither of its arguments
25833will be touched by Calc's default simplifications. This is important
25834because conditions often are expressions that cannot safely be
25835evaluated early. For example, the @code{typeof} function never
25836remains in symbolic form; entering @samp{typeof(a)} will put the
25837number 100 (the type code for variables like @samp{a}) on the stack.
25838But putting the condition @samp{... :: typeof(a) = 6} on the stack
25839is safe since @samp{::} prevents the @code{typeof} from being
25840evaluated until the condition is actually used by the rewrite system.
25841
25842Since @samp{::} protects its lefthand side, too, you can use a dummy
25843condition to protect a rule that must itself not evaluate early.
25844For example, it's not safe to put @samp{a(f,x) := apply(f, [x])} on
25845the stack because it will immediately evaluate to @samp{a(f,x) := f(x)},
25846where the meta-variable-ness of @code{f} on the righthand side has been
25847lost. But @samp{a(f,x) := apply(f, [x]) :: 1} is safe, and of course
25848the condition @samp{1} is always true (nonzero) so it has no effect on
25849the functioning of the rule. (The rewrite compiler will ensure that
25850it doesn't even impact the speed of matching the rule.)
25851
25852@node Algebraic Properties of Rewrite Rules, Other Features of Rewrite Rules, Conditional Rewrite Rules, Rewrite Rules
25853@subsection Algebraic Properties of Rewrite Rules
25854
25855@noindent
25856The rewrite mechanism understands the algebraic properties of functions
25857like @samp{+} and @samp{*}. In particular, pattern matching takes
25858the associativity and commutativity of the following functions into
25859account:
25860
25861@smallexample
25862+ - * = != && || and or xor vint vunion vxor gcd lcm max min beta
25863@end smallexample
25864
25865For example, the rewrite rule:
25866
25867@example
25868a x + b x := (a + b) x
25869@end example
25870
25871@noindent
25872will match formulas of the form,
25873
25874@example
25875a x + b x, x a + x b, a x + x b, x a + b x
25876@end example
25877
25878Rewrites also understand the relationship between the @samp{+} and @samp{-}
25879operators. The above rewrite rule will also match the formulas,
25880
25881@example
25882a x - b x, x a - x b, a x - x b, x a - b x
25883@end example
25884
25885@noindent
25886by matching @samp{b} in the pattern to @samp{-b} from the formula.
25887
25888Applied to a sum of many terms like @samp{r + a x + s + b x + t}, this
25889pattern will check all pairs of terms for possible matches. The rewrite
25890will take whichever suitable pair it discovers first.
25891
25892In general, a pattern using an associative operator like @samp{a + b}
25893will try @var{2 n} different ways to match a sum of @var{n} terms
25894like @samp{x + y + z - w}. First, @samp{a} is matched against each
25895of @samp{x}, @samp{y}, @samp{z}, and @samp{-w} in turn, with @samp{b}
25896being matched to the remainders @samp{y + z - w}, @samp{x + z - w}, etc.
25897If none of these succeed, then @samp{b} is matched against each of the
25898four terms with @samp{a} matching the remainder. Half-and-half matches,
25899like @samp{(x + y) + (z - w)}, are not tried.
25900
25901Note that @samp{*} is not commutative when applied to matrices, but
25902rewrite rules pretend that it is. If you type @kbd{m v} to enable
25903Matrix mode (@pxref{Matrix Mode}), rewrite rules will match @samp{*}
25904literally, ignoring its usual commutativity property. (In the
25905current implementation, the associativity also vanishes---it is as
25906if the pattern had been enclosed in a @code{plain} marker; see below.)
25907If you are applying rewrites to formulas with matrices, it's best to
25908enable Matrix mode first to prevent algebraically incorrect rewrites
25909from occurring.
25910
25911The pattern @samp{-x} will actually match any expression. For example,
25912the rule
25913
25914@example
25915f(-x) := -f(x)
25916@end example
25917
25918@noindent
25919will rewrite @samp{f(a)} to @samp{-f(-a)}. To avoid this, either use
25920a @code{plain} marker as described below, or add a @samp{negative(x)}
25921condition. The @code{negative} function is true if its argument
25922``looks'' negative, for example, because it is a negative number or
25923because it is a formula like @samp{-x}. The new rule using this
25924condition is:
25925
25926@example
25927f(x) := -f(-x) :: negative(x) @r{or, equivalently,}
25928f(-x) := -f(x) :: negative(-x)
25929@end example
25930
25931In the same way, the pattern @samp{x - y} will match the sum @samp{a + b}
25932by matching @samp{y} to @samp{-b}.
25933
25934The pattern @samp{a b} will also match the formula @samp{x/y} if
25935@samp{y} is a number. Thus the rule @samp{a x + @w{b x} := (a+b) x}
25936will also convert @samp{a x + x / 2} to @samp{(a + 0.5) x} (or
25937@samp{(a + 1:2) x}, depending on the current fraction mode).
25938
25939Calc will @emph{not} take other liberties with @samp{*}, @samp{/}, and
25940@samp{^}. For example, the pattern @samp{f(a b)} will not match
25941@samp{f(x^2)}, and @samp{f(a + b)} will not match @samp{f(2 x)}, even
25942though conceivably these patterns could match with @samp{a = b = x}.
25943Nor will @samp{f(a b)} match @samp{f(x / y)} if @samp{y} is not a
25944constant, even though it could be considered to match with @samp{a = x}
25945and @samp{b = 1/y}. The reasons are partly for efficiency, and partly
25946because while few mathematical operations are substantively different
25947for addition and subtraction, often it is preferable to treat the cases
25948of multiplication, division, and integer powers separately.
25949
25950Even more subtle is the rule set
25951
25952@example
25953[ f(a) + f(b) := f(a + b), -f(a) := f(-a) ]
25954@end example
25955
25956@noindent
25957attempting to match @samp{f(x) - f(y)}. You might think that Calc
25958will view this subtraction as @samp{f(x) + (-f(y))} and then apply
25959the above two rules in turn, but actually this will not work because
25960Calc only does this when considering rules for @samp{+} (like the
25961first rule in this set). So it will see first that @samp{f(x) + (-f(y))}
25962does not match @samp{f(a) + f(b)} for any assignments of the
25963meta-variables, and then it will see that @samp{f(x) - f(y)} does
25964not match @samp{-f(a)} for any assignment of @samp{a}. Because Calc
25965tries only one rule at a time, it will not be able to rewrite
25966@samp{f(x) - f(y)} with this rule set. An explicit @samp{f(a) - f(b)}
25967rule will have to be added.
25968
25969Another thing patterns will @emph{not} do is break up complex numbers.
25970The pattern @samp{myconj(a + @w{b i)} := a - b i} will work for formulas
25971involving the special constant @samp{i} (such as @samp{3 - 4 i}), but
25972it will not match actual complex numbers like @samp{(3, -4)}. A version
25973of the above rule for complex numbers would be
25974
25975@example
25976myconj(a) := re(a) - im(a) (0,1) :: im(a) != 0
25977@end example
25978
25979@noindent
25980(Because the @code{re} and @code{im} functions understand the properties
25981of the special constant @samp{i}, this rule will also work for
25982@samp{3 - 4 i}. In fact, this particular rule would probably be better
25983without the @samp{im(a) != 0} condition, since if @samp{im(a) = 0} the
25984righthand side of the rule will still give the correct answer for the
25985conjugate of a real number.)
25986
25987It is also possible to specify optional arguments in patterns. The rule
25988
25989@example
25990opt(a) x + opt(b) (x^opt(c) + opt(d)) := f(a, b, c, d)
25991@end example
25992
25993@noindent
25994will match the formula
25995
25996@example
259975 (x^2 - 4) + 3 x
25998@end example
25999
26000@noindent
26001in a fairly straightforward manner, but it will also match reduced
26002formulas like
26003
26004@example
26005x + x^2, 2(x + 1) - x, x + x
26006@end example
26007
26008@noindent
26009producing, respectively,
26010
26011@example
26012f(1, 1, 2, 0), f(-1, 2, 1, 1), f(1, 1, 1, 0)
26013@end example
26014
26015(The latter two formulas can be entered only if default simplifications
26016have been turned off with @kbd{m O}.)
26017
26018The default value for a term of a sum is zero. The default value
26019for a part of a product, for a power, or for the denominator of a
26020quotient, is one. Also, @samp{-x} matches the pattern @samp{opt(a) b}
26021with @samp{a = -1}.
26022
26023In particular, the distributive-law rule can be refined to
26024
26025@example
26026opt(a) x + opt(b) x := (a + b) x
26027@end example
26028
26029@noindent
26030so that it will convert, e.g., @samp{a x - x}, to @samp{(a - 1) x}.
26031
26032The pattern @samp{opt(a) + opt(b) x} matches almost any formulas which
26033are linear in @samp{x}. You can also use the @code{lin} and @code{islin}
26034functions with rewrite conditions to test for this; @pxref{Logical
26035Operations}. These functions are not as convenient to use in rewrite
26036rules, but they recognize more kinds of formulas as linear:
26037@samp{x/z} is considered linear with @expr{b = 1/z} by @code{lin},
26038but it will not match the above pattern because that pattern calls
26039for a multiplication, not a division.
26040
26041As another example, the obvious rule to replace @samp{sin(x)^2 + cos(x)^2}
26042by 1,
26043
26044@example
26045sin(x)^2 + cos(x)^2 := 1
26046@end example
26047
26048@noindent
26049misses many cases because the sine and cosine may both be multiplied by
26050an equal factor. Here's a more successful rule:
26051
26052@example
26053opt(a) sin(x)^2 + opt(a) cos(x)^2 := a
26054@end example
26055
26056Note that this rule will @emph{not} match @samp{sin(x)^2 + 6 cos(x)^2}
26057because one @expr{a} would have ``matched'' 1 while the other matched 6.
26058
26059Calc automatically converts a rule like
26060
26061@example
26062f(x-1, x) := g(x)
26063@end example
26064
26065@noindent
26066into the form
26067
26068@example
26069f(temp, x) := g(x) :: temp = x-1
26070@end example
26071
26072@noindent
26073(where @code{temp} stands for a new, invented meta-variable that
26074doesn't actually have a name). This modified rule will successfully
26075match @samp{f(6, 7)}, binding @samp{temp} and @samp{x} to 6 and 7,
26076respectively, then verifying that they differ by one even though
26077@samp{6} does not superficially look like @samp{x-1}.
26078
26079However, Calc does not solve equations to interpret a rule. The
26080following rule,
26081
26082@example
26083f(x-1, x+1) := g(x)
26084@end example
26085
26086@noindent
26087will not work. That is, it will match @samp{f(a - 1 + b, a + 1 + b)}
26088but not @samp{f(6, 8)}. Calc always interprets at least one occurrence
26089of a variable by literal matching. If the variable appears ``isolated''
26090then Calc is smart enough to use it for literal matching. But in this
26091last example, Calc is forced to rewrite the rule to @samp{f(x-1, temp)
26092:= g(x) :: temp = x+1} where the @samp{x-1} term must correspond to an
26093actual ``something-minus-one'' in the target formula.
26094
26095A successful way to write this would be @samp{f(x, x+2) := g(x+1)}.
26096You could make this resemble the original form more closely by using
26097@code{let} notation, which is described in the next section:
26098
26099@example
26100f(xm1, x+1) := g(x) :: let(x := xm1+1)
26101@end example
26102
26103Calc does this rewriting or ``conditionalizing'' for any sub-pattern
26104which involves only the functions in the following list, operating
26105only on constants and meta-variables which have already been matched
26106elsewhere in the pattern. When matching a function call, Calc is
26107careful to match arguments which are plain variables before arguments
26108which are calls to any of the functions below, so that a pattern like
26109@samp{f(x-1, x)} can be conditionalized even though the isolated
26110@samp{x} comes after the @samp{x-1}.
26111
26112@smallexample
26113+ - * / \ % ^ abs sign round rounde roundu trunc floor ceil
26114max min re im conj arg
26115@end smallexample
26116
26117You can suppress all of the special treatments described in this
26118section by surrounding a function call with a @code{plain} marker.
26119This marker causes the function call which is its argument to be
26120matched literally, without regard to commutativity, associativity,
26121negation, or conditionalization. When you use @code{plain}, the
26122``deep structure'' of the formula being matched can show through.
26123For example,
26124
26125@example
26126plain(a - a b) := f(a, b)
26127@end example
26128
26129@noindent
26130will match only literal subtractions. However, the @code{plain}
26131marker does not affect its arguments' arguments. In this case,
26132commutativity and associativity is still considered while matching
26133the @w{@samp{a b}} sub-pattern, so the whole pattern will match
26134@samp{x - y x} as well as @samp{x - x y}. We could go still
26135further and use
26136
26137@example
26138plain(a - plain(a b)) := f(a, b)
26139@end example
26140
26141@noindent
26142which would do a completely strict match for the pattern.
26143
26144By contrast, the @code{quote} marker means that not only the
26145function name but also the arguments must be literally the same.
26146The above pattern will match @samp{x - x y} but
26147
26148@example
26149quote(a - a b) := f(a, b)
26150@end example
26151
26152@noindent
26153will match only the single formula @samp{a - a b}. Also,
26154
26155@example
26156quote(a - quote(a b)) := f(a, b)
26157@end example
26158
26159@noindent
26160will match only @samp{a - quote(a b)}---probably not the desired
26161effect!
26162
26163A certain amount of algebra is also done when substituting the
26164meta-variables on the righthand side of a rule. For example,
26165in the rule
26166
26167@example
26168a + f(b) := f(a + b)
26169@end example
26170
26171@noindent
26172matching @samp{f(x) - y} would produce @samp{f((-y) + x)} if
26173taken literally, but the rewrite mechanism will simplify the
26174righthand side to @samp{f(x - y)} automatically. (Of course,
26175the default simplifications would do this anyway, so this
26176special simplification is only noticeable if you have turned the
26177default simplifications off.) This rewriting is done only when
26178a meta-variable expands to a ``negative-looking'' expression.
26179If this simplification is not desirable, you can use a @code{plain}
26180marker on the righthand side:
26181
26182@example
26183a + f(b) := f(plain(a + b))
26184@end example
26185
26186@noindent
26187In this example, we are still allowing the pattern-matcher to
26188use all the algebra it can muster, but the righthand side will
26189always simplify to a literal addition like @samp{f((-y) + x)}.
26190
26191@node Other Features of Rewrite Rules, Composing Patterns in Rewrite Rules, Algebraic Properties of Rewrite Rules, Rewrite Rules
26192@subsection Other Features of Rewrite Rules
26193
26194@noindent
26195Certain ``function names'' serve as markers in rewrite rules.
26196Here is a complete list of these markers. First are listed the
26197markers that work inside a pattern; then come the markers that
26198work in the righthand side of a rule.
26199
26200@ignore
26201@starindex
26202@end ignore
26203@tindex import
26204One kind of marker, @samp{import(x)}, takes the place of a whole
26205rule. Here @expr{x} is the name of a variable containing another
26206rule set; those rules are ``spliced into'' the rule set that
26207imports them. For example, if @samp{[f(a+b) := f(a) + f(b),
26208f(a b) := a f(b) :: real(a)]} is stored in variable @samp{linearF},
26209then the rule set @samp{[f(0) := 0, import(linearF)]} will apply
26210all three rules. It is possible to modify the imported rules
26211slightly: @samp{import(x, v1, x1, v2, x2, @dots{})} imports
26212the rule set @expr{x} with all occurrences of
26213@texline @math{v_1},
26214@infoline @expr{v1},
26215as either a variable name or a function name, replaced with
26216@texline @math{x_1}
26217@infoline @expr{x1}
26218and so on. (If
26219@texline @math{v_1}
26220@infoline @expr{v1}
26221is used as a function name, then
26222@texline @math{x_1}
26223@infoline @expr{x1}
26224must be either a function name itself or a @w{@samp{< >}} nameless
26225function; @pxref{Specifying Operators}.) For example, @samp{[g(0) := 0,
26226import(linearF, f, g)]} applies the linearity rules to the function
26227@samp{g} instead of @samp{f}. Imports can be nested, but the
26228import-with-renaming feature may fail to rename sub-imports properly.
26229
26230The special functions allowed in patterns are:
26231
26232@table @samp
26233@item quote(x)
26234@ignore
26235@starindex
26236@end ignore
26237@tindex quote
26238This pattern matches exactly @expr{x}; variable names in @expr{x} are
26239not interpreted as meta-variables. The only flexibility is that
26240numbers are compared for numeric equality, so that the pattern
26241@samp{f(quote(12))} will match both @samp{f(12)} and @samp{f(12.0)}.
26242(Numbers are always treated this way by the rewrite mechanism:
26243The rule @samp{f(x,x) := g(x)} will match @samp{f(12, 12.0)}.
26244The rewrite may produce either @samp{g(12)} or @samp{g(12.0)}
26245as a result in this case.)
26246
26247@item plain(x)
26248@ignore
26249@starindex
26250@end ignore
26251@tindex plain
26252Here @expr{x} must be a function call @samp{f(x1,x2,@dots{})}. This
26253pattern matches a call to function @expr{f} with the specified
26254argument patterns. No special knowledge of the properties of the
26255function @expr{f} is used in this case; @samp{+} is not commutative or
26256associative. Unlike @code{quote}, the arguments @samp{x1,x2,@dots{}}
26257are treated as patterns. If you wish them to be treated ``plainly''
26258as well, you must enclose them with more @code{plain} markers:
26259@samp{plain(plain(@w{-a}) + plain(b c))}.
26260
26261@item opt(x,def)
26262@ignore
26263@starindex
26264@end ignore
26265@tindex opt
26266Here @expr{x} must be a variable name. This must appear as an
26267argument to a function or an element of a vector; it specifies that
26268the argument or element is optional.
26269As an argument to @samp{+}, @samp{-}, @samp{*}, @samp{&&}, or @samp{||},
26270or as the second argument to @samp{/} or @samp{^}, the value @var{def}
26271may be omitted. The pattern @samp{x + opt(y)} matches a sum by
26272binding one summand to @expr{x} and the other to @expr{y}, and it
26273matches anything else by binding the whole expression to @expr{x} and
26274zero to @expr{y}. The other operators above work similarly.
26275
26276For general miscellaneous functions, the default value @code{def}
26277must be specified. Optional arguments are dropped starting with
26278the rightmost one during matching. For example, the pattern
26279@samp{f(opt(a,0), b, opt(c,b))} will match @samp{f(b)}, @samp{f(a,b)},
26280or @samp{f(a,b,c)}. Default values of zero and @expr{b} are
26281supplied in this example for the omitted arguments. Note that
26282the literal variable @expr{b} will be the default in the latter
26283case, @emph{not} the value that matched the meta-variable @expr{b}.
26284In other words, the default @var{def} is effectively quoted.
26285
26286@item condition(x,c)
26287@ignore
26288@starindex
26289@end ignore
26290@tindex condition
26291@tindex ::
26292This matches the pattern @expr{x}, with the attached condition
26293@expr{c}. It is the same as @samp{x :: c}.
26294
26295@item pand(x,y)
26296@ignore
26297@starindex
26298@end ignore
26299@tindex pand
26300@tindex &&&
26301This matches anything that matches both pattern @expr{x} and
26302pattern @expr{y}. It is the same as @samp{x &&& y}.
26303@pxref{Composing Patterns in Rewrite Rules}.
26304
26305@item por(x,y)
26306@ignore
26307@starindex
26308@end ignore
26309@tindex por
26310@tindex |||
26311This matches anything that matches either pattern @expr{x} or
26312pattern @expr{y}. It is the same as @w{@samp{x ||| y}}.
26313
26314@item pnot(x)
26315@ignore
26316@starindex
26317@end ignore
26318@tindex pnot
26319@tindex !!!
26320This matches anything that does not match pattern @expr{x}.
26321It is the same as @samp{!!! x}.
26322
26323@item cons(h,t)
26324@ignore
26325@mindex cons
26326@end ignore
26327@tindex cons (rewrites)
26328This matches any vector of one or more elements. The first
26329element is matched to @expr{h}; a vector of the remaining
26330elements is matched to @expr{t}. Note that vectors of fixed
26331length can also be matched as actual vectors: The rule
26332@samp{cons(a,cons(b,[])) := cons(a+b,[])} is equivalent
26333to the rule @samp{[a,b] := [a+b]}.
26334
26335@item rcons(t,h)
26336@ignore
26337@mindex rcons
26338@end ignore
26339@tindex rcons (rewrites)
26340This is like @code{cons}, except that the @emph{last} element
26341is matched to @expr{h}, with the remaining elements matched
26342to @expr{t}.
26343
26344@item apply(f,args)
26345@ignore
26346@mindex apply
26347@end ignore
26348@tindex apply (rewrites)
26349This matches any function call. The name of the function, in
26350the form of a variable, is matched to @expr{f}. The arguments
26351of the function, as a vector of zero or more objects, are
26352matched to @samp{args}. Constants, variables, and vectors
26353do @emph{not} match an @code{apply} pattern. For example,
26354@samp{apply(f,x)} matches any function call, @samp{apply(quote(f),x)}
26355matches any call to the function @samp{f}, @samp{apply(f,[a,b])}
26356matches any function call with exactly two arguments, and
26357@samp{apply(quote(f), cons(a,cons(b,x)))} matches any call
26358to the function @samp{f} with two or more arguments. Another
26359way to implement the latter, if the rest of the rule does not
26360need to refer to the first two arguments of @samp{f} by name,
26361would be @samp{apply(quote(f), x :: vlen(x) >= 2)}.
26362Here's a more interesting sample use of @code{apply}:
26363
26364@example
26365apply(f,[x+n]) := n + apply(f,[x])
26366 :: in(f, [floor,ceil,round,trunc]) :: integer(n)
26367@end example
26368
26369Note, however, that this will be slower to match than a rule
26370set with four separate rules. The reason is that Calc sorts
26371the rules of a rule set according to top-level function name;
26372if the top-level function is @code{apply}, Calc must try the
26373rule for every single formula and sub-formula. If the top-level
26374function in the pattern is, say, @code{floor}, then Calc invokes
26375the rule only for sub-formulas which are calls to @code{floor}.
26376
26377Formulas normally written with operators like @code{+} are still
26378considered function calls: @code{apply(f,x)} matches @samp{a+b}
26379with @samp{f = add}, @samp{x = [a,b]}.
26380
26381You must use @code{apply} for meta-variables with function names
26382on both sides of a rewrite rule: @samp{apply(f, [x]) := f(x+1)}
26383is @emph{not} correct, because it rewrites @samp{spam(6)} into
26384@samp{f(7)}. The righthand side should be @samp{apply(f, [x+1])}.
26385Also note that you will have to use No-Simplify mode (@kbd{m O})
26386when entering this rule so that the @code{apply} isn't
26387evaluated immediately to get the new rule @samp{f(x) := f(x+1)}.
26388Or, use @kbd{s e} to enter the rule without going through the stack,
26389or enter the rule as @samp{apply(f, [x]) := apply(f, [x+1]) @w{:: 1}}.
26390@xref{Conditional Rewrite Rules}.
26391
26392@item select(x)
26393@ignore
26394@starindex
26395@end ignore
26396@tindex select
26397This is used for applying rules to formulas with selections;
26398@pxref{Selections with Rewrite Rules}.
26399@end table
26400
26401Special functions for the righthand sides of rules are:
26402
26403@table @samp
26404@item quote(x)
26405The notation @samp{quote(x)} is changed to @samp{x} when the
26406righthand side is used. As far as the rewrite rule is concerned,
26407@code{quote} is invisible. However, @code{quote} has the special
26408property in Calc that its argument is not evaluated. Thus,
26409while it will not work to put the rule @samp{t(a) := typeof(a)}
26410on the stack because @samp{typeof(a)} is evaluated immediately
26411to produce @samp{t(a) := 100}, you can use @code{quote} to
26412protect the righthand side: @samp{t(a) := quote(typeof(a))}.
26413(@xref{Conditional Rewrite Rules}, for another trick for
26414protecting rules from evaluation.)
26415
26416@item plain(x)
26417Special properties of and simplifications for the function call
26418@expr{x} are not used. One interesting case where @code{plain}
26419is useful is the rule, @samp{q(x) := quote(x)}, trying to expand a
26420shorthand notation for the @code{quote} function. This rule will
26421not work as shown; instead of replacing @samp{q(foo)} with
26422@samp{quote(foo)}, it will replace it with @samp{foo}! The correct
26423rule would be @samp{q(x) := plain(quote(x))}.
26424
26425@item cons(h,t)
26426Where @expr{t} is a vector, this is converted into an expanded
26427vector during rewrite processing. Note that @code{cons} is a regular
26428Calc function which normally does this anyway; the only way @code{cons}
26429is treated specially by rewrites is that @code{cons} on the righthand
26430side of a rule will be evaluated even if default simplifications
26431have been turned off.
26432
26433@item rcons(t,h)
26434Analogous to @code{cons} except putting @expr{h} at the @emph{end} of
26435the vector @expr{t}.
26436
26437@item apply(f,args)
26438Where @expr{f} is a variable and @var{args} is a vector, this
26439is converted to a function call. Once again, note that @code{apply}
26440is also a regular Calc function.
26441
26442@item eval(x)
26443@ignore
26444@starindex
26445@end ignore
26446@tindex eval
26447The formula @expr{x} is handled in the usual way, then the
26448default simplifications are applied to it even if they have
26449been turned off normally. This allows you to treat any function
26450similarly to the way @code{cons} and @code{apply} are always
26451treated. However, there is a slight difference: @samp{cons(2+3, [])}
26452with default simplifications off will be converted to @samp{[2+3]},
26453whereas @samp{eval(cons(2+3, []))} will be converted to @samp{[5]}.
26454
26455@item evalsimp(x)
26456@ignore
26457@starindex
26458@end ignore
26459@tindex evalsimp
26460The formula @expr{x} has meta-variables substituted in the usual
26461way, then algebraically simplified as if by the @kbd{a s} command.
26462
26463@item evalextsimp(x)
26464@ignore
26465@starindex
26466@end ignore
26467@tindex evalextsimp
26468The formula @expr{x} has meta-variables substituted in the normal
26469way, then ``extendedly'' simplified as if by the @kbd{a e} command.
26470
26471@item select(x)
26472@xref{Selections with Rewrite Rules}.
26473@end table
26474
26475There are also some special functions you can use in conditions.
26476
26477@table @samp
26478@item let(v := x)
26479@ignore
26480@starindex
26481@end ignore
26482@tindex let
26483The expression @expr{x} is evaluated with meta-variables substituted.
26484The @kbd{a s} command's simplifications are @emph{not} applied by
26485default, but @expr{x} can include calls to @code{evalsimp} or
26486@code{evalextsimp} as described above to invoke higher levels
26487of simplification. The
26488result of @expr{x} is then bound to the meta-variable @expr{v}. As
26489usual, if this meta-variable has already been matched to something
26490else the two values must be equal; if the meta-variable is new then
26491it is bound to the result of the expression. This variable can then
26492appear in later conditions, and on the righthand side of the rule.
26493In fact, @expr{v} may be any pattern in which case the result of
26494evaluating @expr{x} is matched to that pattern, binding any
26495meta-variables that appear in that pattern. Note that @code{let}
26496can only appear by itself as a condition, or as one term of an
26497@samp{&&} which is a whole condition: It cannot be inside
26498an @samp{||} term or otherwise buried.
26499
26500The alternate, equivalent form @samp{let(v, x)} is also recognized.
26501Note that the use of @samp{:=} by @code{let}, while still being
26502assignment-like in character, is unrelated to the use of @samp{:=}
26503in the main part of a rewrite rule.
26504
26505As an example, @samp{f(a) := g(ia) :: let(ia := 1/a) :: constant(ia)}
26506replaces @samp{f(a)} with @samp{g} of the inverse of @samp{a}, if
26507that inverse exists and is constant. For example, if @samp{a} is a
26508singular matrix the operation @samp{1/a} is left unsimplified and
26509@samp{constant(ia)} fails, but if @samp{a} is an invertible matrix
26510then the rule succeeds. Without @code{let} there would be no way
26511to express this rule that didn't have to invert the matrix twice.
26512Note that, because the meta-variable @samp{ia} is otherwise unbound
26513in this rule, the @code{let} condition itself always ``succeeds''
26514because no matter what @samp{1/a} evaluates to, it can successfully
26515be bound to @code{ia}.
26516
26517Here's another example, for integrating cosines of linear
26518terms: @samp{myint(cos(y),x) := sin(y)/b :: let([a,b,x] := lin(y,x))}.
26519The @code{lin} function returns a 3-vector if its argument is linear,
26520or leaves itself unevaluated if not. But an unevaluated @code{lin}
26521call will not match the 3-vector on the lefthand side of the @code{let},
26522so this @code{let} both verifies that @code{y} is linear, and binds
26523the coefficients @code{a} and @code{b} for use elsewhere in the rule.
26524(It would have been possible to use @samp{sin(a x + b)/b} for the
26525righthand side instead, but using @samp{sin(y)/b} avoids gratuitous
26526rearrangement of the argument of the sine.)
26527
26528@ignore
26529@starindex
26530@end ignore
26531@tindex ierf
26532Similarly, here is a rule that implements an inverse-@code{erf}
26533function. It uses @code{root} to search for a solution. If
26534@code{root} succeeds, it will return a vector of two numbers
26535where the first number is the desired solution. If no solution
26536is found, @code{root} remains in symbolic form. So we use
26537@code{let} to check that the result was indeed a vector.
26538
26539@example
26540ierf(x) := y :: let([y,z] := root(erf(a) = x, a, .5))
26541@end example
26542
26543@item matches(v,p)
26544The meta-variable @var{v}, which must already have been matched
26545to something elsewhere in the rule, is compared against pattern
26546@var{p}. Since @code{matches} is a standard Calc function, it
26547can appear anywhere in a condition. But if it appears alone or
26548as a term of a top-level @samp{&&}, then you get the special
26549extra feature that meta-variables which are bound to things
26550inside @var{p} can be used elsewhere in the surrounding rewrite
26551rule.
26552
26553The only real difference between @samp{let(p := v)} and
26554@samp{matches(v, p)} is that the former evaluates @samp{v} using
26555the default simplifications, while the latter does not.
26556
26557@item remember
26558@vindex remember
26559This is actually a variable, not a function. If @code{remember}
26560appears as a condition in a rule, then when that rule succeeds
26561the original expression and rewritten expression are added to the
26562front of the rule set that contained the rule. If the rule set
26563was not stored in a variable, @code{remember} is ignored. The
26564lefthand side is enclosed in @code{quote} in the added rule if it
26565contains any variables.
26566
26567For example, the rule @samp{f(n) := n f(n-1) :: remember} applied
26568to @samp{f(7)} will add the rule @samp{f(7) := 7 f(6)} to the front
26569of the rule set. The rule set @code{EvalRules} works slightly
26570differently: There, the evaluation of @samp{f(6)} will complete before
26571the result is added to the rule set, in this case as @samp{f(7) := 5040}.
26572Thus @code{remember} is most useful inside @code{EvalRules}.
26573
26574It is up to you to ensure that the optimization performed by
26575@code{remember} is safe. For example, the rule @samp{foo(n) := n
26576:: evalv(eatfoo) > 0 :: remember} is a bad idea (@code{evalv} is
26577the function equivalent of the @kbd{=} command); if the variable
26578@code{eatfoo} ever contains 1, rules like @samp{foo(7) := 7} will
26579be added to the rule set and will continue to operate even if
26580@code{eatfoo} is later changed to 0.
26581
26582@item remember(c)
26583@ignore
26584@starindex
26585@end ignore
26586@tindex remember
26587Remember the match as described above, but only if condition @expr{c}
26588is true. For example, @samp{remember(n % 4 = 0)} in the above factorial
26589rule remembers only every fourth result. Note that @samp{remember(1)}
26590is equivalent to @samp{remember}, and @samp{remember(0)} has no effect.
26591@end table
26592
26593@node Composing Patterns in Rewrite Rules, Nested Formulas with Rewrite Rules, Other Features of Rewrite Rules, Rewrite Rules
26594@subsection Composing Patterns in Rewrite Rules
26595
26596@noindent
26597There are three operators, @samp{&&&}, @samp{|||}, and @samp{!!!},
26598that combine rewrite patterns to make larger patterns. The
26599combinations are ``and,'' ``or,'' and ``not,'' respectively, and
26600these operators are the pattern equivalents of @samp{&&}, @samp{||}
26601and @samp{!} (which operate on zero-or-nonzero logical values).
26602
26603Note that @samp{&&&}, @samp{|||}, and @samp{!!!} are left in symbolic
26604form by all regular Calc features; they have special meaning only in
26605the context of rewrite rule patterns.
26606
26607The pattern @samp{@var{p1} &&& @var{p2}} matches anything that
26608matches both @var{p1} and @var{p2}. One especially useful case is
26609when one of @var{p1} or @var{p2} is a meta-variable. For example,
26610here is a rule that operates on error forms:
26611
26612@example
26613f(x &&& a +/- b, x) := g(x)
26614@end example
26615
26616This does the same thing, but is arguably simpler than, the rule
26617
26618@example
26619f(a +/- b, a +/- b) := g(a +/- b)
26620@end example
26621
26622@ignore
26623@starindex
26624@end ignore
26625@tindex ends
26626Here's another interesting example:
26627
26628@example
26629ends(cons(a, x) &&& rcons(y, b)) := [a, b]
26630@end example
26631
26632@noindent
26633which effectively clips out the middle of a vector leaving just
26634the first and last elements. This rule will change a one-element
26635vector @samp{[a]} to @samp{[a, a]}. The similar rule
26636
26637@example
26638ends(cons(a, rcons(y, b))) := [a, b]
26639@end example
26640
26641@noindent
26642would do the same thing except that it would fail to match a
26643one-element vector.
26644
26645@tex
26646\bigskip
26647@end tex
26648
26649The pattern @samp{@var{p1} ||| @var{p2}} matches anything that
26650matches either @var{p1} or @var{p2}. Calc first tries matching
26651against @var{p1}; if that fails, it goes on to try @var{p2}.
26652
26653@ignore
26654@starindex
26655@end ignore
26656@tindex curve
26657A simple example of @samp{|||} is
26658
26659@example
26660curve(inf ||| -inf) := 0
26661@end example
26662
26663@noindent
26664which converts both @samp{curve(inf)} and @samp{curve(-inf)} to zero.
26665
26666Here is a larger example:
26667
26668@example
26669log(a, b) ||| (ln(a) :: let(b := e)) := mylog(a, b)
26670@end example
26671
26672This matches both generalized and natural logarithms in a single rule.
26673Note that the @samp{::} term must be enclosed in parentheses because
26674that operator has lower precedence than @samp{|||} or @samp{:=}.
26675
26676(In practice this rule would probably include a third alternative,
26677omitted here for brevity, to take care of @code{log10}.)
26678
26679While Calc generally treats interior conditions exactly the same as
26680conditions on the outside of a rule, it does guarantee that if all the
26681variables in the condition are special names like @code{e}, or already
26682bound in the pattern to which the condition is attached (say, if
26683@samp{a} had appeared in this condition), then Calc will process this
26684condition right after matching the pattern to the left of the @samp{::}.
26685Thus, we know that @samp{b} will be bound to @samp{e} only if the
26686@code{ln} branch of the @samp{|||} was taken.
26687
26688Note that this rule was careful to bind the same set of meta-variables
26689on both sides of the @samp{|||}. Calc does not check this, but if
26690you bind a certain meta-variable only in one branch and then use that
26691meta-variable elsewhere in the rule, results are unpredictable:
26692
26693@example
26694f(a,b) ||| g(b) := h(a,b)
26695@end example
26696
26697Here if the pattern matches @samp{g(17)}, Calc makes no promises about
26698the value that will be substituted for @samp{a} on the righthand side.
26699
26700@tex
26701\bigskip
26702@end tex
26703
26704The pattern @samp{!!! @var{pat}} matches anything that does not
26705match @var{pat}. Any meta-variables that are bound while matching
26706@var{pat} remain unbound outside of @var{pat}.
26707
26708For example,
26709
26710@example
26711f(x &&& !!! a +/- b, !!![]) := g(x)
26712@end example
26713
26714@noindent
26715converts @code{f} whose first argument is anything @emph{except} an
26716error form, and whose second argument is not the empty vector, into
26717a similar call to @code{g} (but without the second argument).
26718
26719If we know that the second argument will be a vector (empty or not),
26720then an equivalent rule would be:
26721
26722@example
26723f(x, y) := g(x) :: typeof(x) != 7 :: vlen(y) > 0
26724@end example
26725
26726@noindent
26727where of course 7 is the @code{typeof} code for error forms.
26728Another final condition, that works for any kind of @samp{y},
26729would be @samp{!istrue(y == [])}. (The @code{istrue} function
26730returns an explicit 0 if its argument was left in symbolic form;
26731plain @samp{!(y == [])} or @samp{y != []} would not work to replace
26732@samp{!!![]} since these would be left unsimplified, and thus cause
26733the rule to fail, if @samp{y} was something like a variable name.)
26734
26735It is possible for a @samp{!!!} to refer to meta-variables bound
26736elsewhere in the pattern. For example,
26737
26738@example
26739f(a, !!!a) := g(a)
26740@end example
26741
26742@noindent
26743matches any call to @code{f} with different arguments, changing
26744this to @code{g} with only the first argument.
26745
26746If a function call is to be matched and one of the argument patterns
26747contains a @samp{!!!} somewhere inside it, that argument will be
26748matched last. Thus
26749
26750@example
26751f(!!!a, a) := g(a)
26752@end example
26753
26754@noindent
26755will be careful to bind @samp{a} to the second argument of @code{f}
26756before testing the first argument. If Calc had tried to match the
26757first argument of @code{f} first, the results would have been
26758disastrous: since @code{a} was unbound so far, the pattern @samp{a}
26759would have matched anything at all, and the pattern @samp{!!!a}
26760therefore would @emph{not} have matched anything at all!
26761
26762@node Nested Formulas with Rewrite Rules, Multi-Phase Rewrite Rules, Composing Patterns in Rewrite Rules, Rewrite Rules
26763@subsection Nested Formulas with Rewrite Rules
26764
26765@noindent
26766When @kbd{a r} (@code{calc-rewrite}) is used, it takes an expression from
26767the top of the stack and attempts to match any of the specified rules
26768to any part of the expression, starting with the whole expression
26769and then, if that fails, trying deeper and deeper sub-expressions.
26770For each part of the expression, the rules are tried in the order
26771they appear in the rules vector. The first rule to match the first
26772sub-expression wins; it replaces the matched sub-expression according
26773to the @var{new} part of the rule.
26774
26775Often, the rule set will match and change the formula several times.
26776The top-level formula is first matched and substituted repeatedly until
26777it no longer matches the pattern; then, sub-formulas are tried, and
26778so on. Once every part of the formula has gotten its chance, the
26779rewrite mechanism starts over again with the top-level formula
26780(in case a substitution of one of its arguments has caused it again
26781to match). This continues until no further matches can be made
26782anywhere in the formula.
26783
26784It is possible for a rule set to get into an infinite loop. The
26785most obvious case, replacing a formula with itself, is not a problem
26786because a rule is not considered to ``succeed'' unless the righthand
26787side actually comes out to something different than the original
26788formula or sub-formula that was matched. But if you accidentally
26789had both @samp{ln(a b) := ln(a) + ln(b)} and the reverse
26790@samp{ln(a) + ln(b) := ln(a b)} in your rule set, Calc would
26791run forever switching a formula back and forth between the two
26792forms.
26793
26794To avoid disaster, Calc normally stops after 100 changes have been
26795made to the formula. This will be enough for most multiple rewrites,
26796but it will keep an endless loop of rewrites from locking up the
26797computer forever. (On most systems, you can also type @kbd{C-g} to
26798halt any Emacs command prematurely.)
26799
26800To change this limit, give a positive numeric prefix argument.
26801In particular, @kbd{M-1 a r} applies only one rewrite at a time,
26802useful when you are first testing your rule (or just if repeated
26803rewriting is not what is called for by your application).
26804
26805@ignore
26806@starindex
26807@end ignore
26808@ignore
26809@mindex iter@idots
26810@end ignore
26811@tindex iterations
26812You can also put a ``function call'' @samp{iterations(@var{n})}
26813in place of a rule anywhere in your rules vector (but usually at
26814the top). Then, @var{n} will be used instead of 100 as the default
26815number of iterations for this rule set. You can use
26816@samp{iterations(inf)} if you want no iteration limit by default.
26817A prefix argument will override the @code{iterations} limit in the
26818rule set.
26819
26820@example
26821[ iterations(1),
26822 f(x) := f(x+1) ]
26823@end example
26824
26825More precisely, the limit controls the number of ``iterations,''
26826where each iteration is a successful matching of a rule pattern whose
26827righthand side, after substituting meta-variables and applying the
26828default simplifications, is different from the original sub-formula
26829that was matched.
26830
26831A prefix argument of zero sets the limit to infinity. Use with caution!
26832
26833Given a negative numeric prefix argument, @kbd{a r} will match and
26834substitute the top-level expression up to that many times, but
26835will not attempt to match the rules to any sub-expressions.
26836
26837In a formula, @code{rewrite(@var{expr}, @var{rules}, @var{n})}
26838does a rewriting operation. Here @var{expr} is the expression
26839being rewritten, @var{rules} is the rule, vector of rules, or
26840variable containing the rules, and @var{n} is the optional
26841iteration limit, which may be a positive integer, a negative
26842integer, or @samp{inf} or @samp{-inf}. If @var{n} is omitted
26843the @code{iterations} value from the rule set is used; if both
26844are omitted, 100 is used.
26845
26846@node Multi-Phase Rewrite Rules, Selections with Rewrite Rules, Nested Formulas with Rewrite Rules, Rewrite Rules
26847@subsection Multi-Phase Rewrite Rules
26848
26849@noindent
26850It is possible to separate a rewrite rule set into several @dfn{phases}.
26851During each phase, certain rules will be enabled while certain others
26852will be disabled. A @dfn{phase schedule} controls the order in which
26853phases occur during the rewriting process.
26854
26855@ignore
26856@starindex
26857@end ignore
26858@tindex phase
26859@vindex all
26860If a call to the marker function @code{phase} appears in the rules
26861vector in place of a rule, all rules following that point will be
26862members of the phase(s) identified in the arguments to @code{phase}.
26863Phases are given integer numbers. The markers @samp{phase()} and
26864@samp{phase(all)} both mean the following rules belong to all phases;
26865this is the default at the start of the rule set.
26866
26867If you do not explicitly schedule the phases, Calc sorts all phase
26868numbers that appear in the rule set and executes the phases in
26869ascending order. For example, the rule set
26870
26871@example
26872@group
26873[ f0(x) := g0(x),
26874 phase(1),
26875 f1(x) := g1(x),
26876 phase(2),
26877 f2(x) := g2(x),
26878 phase(3),
26879 f3(x) := g3(x),
26880 phase(1,2),
26881 f4(x) := g4(x) ]
26882@end group
26883@end example
26884
26885@noindent
26886has three phases, 1 through 3. Phase 1 consists of the @code{f0},
26887@code{f1}, and @code{f4} rules (in that order). Phase 2 consists of
26888@code{f0}, @code{f2}, and @code{f4}. Phase 3 consists of @code{f0}
26889and @code{f3}.
26890
26891When Calc rewrites a formula using this rule set, it first rewrites
26892the formula using only the phase 1 rules until no further changes are
26893possible. Then it switches to the phase 2 rule set and continues
26894until no further changes occur, then finally rewrites with phase 3.
26895When no more phase 3 rules apply, rewriting finishes. (This is
26896assuming @kbd{a r} with a large enough prefix argument to allow the
26897rewriting to run to completion; the sequence just described stops
26898early if the number of iterations specified in the prefix argument,
26899100 by default, is reached.)
26900
26901During each phase, Calc descends through the nested levels of the
26902formula as described previously. (@xref{Nested Formulas with Rewrite
26903Rules}.) Rewriting starts at the top of the formula, then works its
26904way down to the parts, then goes back to the top and works down again.
26905The phase 2 rules do not begin until no phase 1 rules apply anywhere
26906in the formula.
26907
26908@ignore
26909@starindex
26910@end ignore
26911@tindex schedule
26912A @code{schedule} marker appearing in the rule set (anywhere, but
26913conventionally at the top) changes the default schedule of phases.
26914In the simplest case, @code{schedule} has a sequence of phase numbers
26915for arguments; each phase number is invoked in turn until the
26916arguments to @code{schedule} are exhausted. Thus adding
26917@samp{schedule(3,2,1)} at the top of the above rule set would
26918reverse the order of the phases; @samp{schedule(1,2,3)} would have
26919no effect since this is the default schedule; and @samp{schedule(1,2,1,3)}
26920would give phase 1 a second chance after phase 2 has completed, before
26921moving on to phase 3.
26922
26923Any argument to @code{schedule} can instead be a vector of phase
26924numbers (or even of sub-vectors). Then the sub-sequence of phases
26925described by the vector are tried repeatedly until no change occurs
26926in any phase in the sequence. For example, @samp{schedule([1, 2], 3)}
26927tries phase 1, then phase 2, then, if either phase made any changes
26928to the formula, repeats these two phases until they can make no
26929further progress. Finally, it goes on to phase 3 for finishing
26930touches.
26931
26932Also, items in @code{schedule} can be variable names as well as
26933numbers. A variable name is interpreted as the name of a function
26934to call on the whole formula. For example, @samp{schedule(1, simplify)}
26935says to apply the phase-1 rules (presumably, all of them), then to
26936call @code{simplify} which is the function name equivalent of @kbd{a s}.
26937Likewise, @samp{schedule([1, simplify])} says to alternate between
26938phase 1 and @kbd{a s} until no further changes occur.
26939
26940Phases can be used purely to improve efficiency; if it is known that
26941a certain group of rules will apply only at the beginning of rewriting,
26942and a certain other group will apply only at the end, then rewriting
26943will be faster if these groups are identified as separate phases.
26944Once the phase 1 rules are done, Calc can put them aside and no longer
26945spend any time on them while it works on phase 2.
26946
26947There are also some problems that can only be solved with several
26948rewrite phases. For a real-world example of a multi-phase rule set,
26949examine the set @code{FitRules}, which is used by the curve-fitting
26950command to convert a model expression to linear form.
26951@xref{Curve Fitting Details}. This set is divided into four phases.
26952The first phase rewrites certain kinds of expressions to be more
26953easily linearizable, but less computationally efficient. After the
26954linear components have been picked out, the final phase includes the
26955opposite rewrites to put each component back into an efficient form.
26956If both sets of rules were included in one big phase, Calc could get
26957into an infinite loop going back and forth between the two forms.
26958
26959Elsewhere in @code{FitRules}, the components are first isolated,
26960then recombined where possible to reduce the complexity of the linear
26961fit, then finally packaged one component at a time into vectors.
26962If the packaging rules were allowed to begin before the recombining
26963rules were finished, some components might be put away into vectors
26964before they had a chance to recombine. By putting these rules in
26965two separate phases, this problem is neatly avoided.
26966
26967@node Selections with Rewrite Rules, Matching Commands, Multi-Phase Rewrite Rules, Rewrite Rules
26968@subsection Selections with Rewrite Rules
26969
26970@noindent
26971If a sub-formula of the current formula is selected (as by @kbd{j s};
26972@pxref{Selecting Subformulas}), the @kbd{a r} (@code{calc-rewrite})
26973command applies only to that sub-formula. Together with a negative
26974prefix argument, you can use this fact to apply a rewrite to one
26975specific part of a formula without affecting any other parts.
26976
26977@kindex j r
26978@pindex calc-rewrite-selection
26979The @kbd{j r} (@code{calc-rewrite-selection}) command allows more
26980sophisticated operations on selections. This command prompts for
26981the rules in the same way as @kbd{a r}, but it then applies those
26982rules to the whole formula in question even though a sub-formula
26983of it has been selected. However, the selected sub-formula will
26984first have been surrounded by a @samp{select( )} function call.
26985(Calc's evaluator does not understand the function name @code{select};
26986this is only a tag used by the @kbd{j r} command.)
26987
26988For example, suppose the formula on the stack is @samp{2 (a + b)^2}
26989and the sub-formula @samp{a + b} is selected. This formula will
26990be rewritten to @samp{2 select(a + b)^2} and then the rewrite
26991rules will be applied in the usual way. The rewrite rules can
26992include references to @code{select} to tell where in the pattern
26993the selected sub-formula should appear.
26994
26995If there is still exactly one @samp{select( )} function call in
26996the formula after rewriting is done, it indicates which part of
26997the formula should be selected afterwards. Otherwise, the
26998formula will be unselected.
26999
27000You can make @kbd{j r} act much like @kbd{a r} by enclosing both parts
27001of the rewrite rule with @samp{select()}. However, @kbd{j r}
27002allows you to use the current selection in more flexible ways.
27003Suppose you wished to make a rule which removed the exponent from
27004the selected term; the rule @samp{select(a)^x := select(a)} would
27005work. In the above example, it would rewrite @samp{2 select(a + b)^2}
27006to @samp{2 select(a + b)}. This would then be returned to the
27007stack as @samp{2 (a + b)} with the @samp{a + b} selected.
27008
27009The @kbd{j r} command uses one iteration by default, unlike
27010@kbd{a r} which defaults to 100 iterations. A numeric prefix
27011argument affects @kbd{j r} in the same way as @kbd{a r}.
27012@xref{Nested Formulas with Rewrite Rules}.
27013
27014As with other selection commands, @kbd{j r} operates on the stack
27015entry that contains the cursor. (If the cursor is on the top-of-stack
27016@samp{.} marker, it works as if the cursor were on the formula
27017at stack level 1.)
27018
27019If you don't specify a set of rules, the rules are taken from the
27020top of the stack, just as with @kbd{a r}. In this case, the
27021cursor must indicate stack entry 2 or above as the formula to be
27022rewritten (otherwise the same formula would be used as both the
27023target and the rewrite rules).
27024
27025If the indicated formula has no selection, the cursor position within
27026the formula temporarily selects a sub-formula for the purposes of this
27027command. If the cursor is not on any sub-formula (e.g., it is in
27028the line-number area to the left of the formula), the @samp{select( )}
27029markers are ignored by the rewrite mechanism and the rules are allowed
27030to apply anywhere in the formula.
27031
27032As a special feature, the normal @kbd{a r} command also ignores
27033@samp{select( )} calls in rewrite rules. For example, if you used the
27034above rule @samp{select(a)^x := select(a)} with @kbd{a r}, it would apply
27035the rule as if it were @samp{a^x := a}. Thus, you can write general
27036purpose rules with @samp{select( )} hints inside them so that they
27037will ``do the right thing'' in both @kbd{a r} and @kbd{j r},
27038both with and without selections.
27039
27040@node Matching Commands, Automatic Rewrites, Selections with Rewrite Rules, Rewrite Rules
27041@subsection Matching Commands
27042
27043@noindent
27044@kindex a m
27045@pindex calc-match
27046@tindex match
27047The @kbd{a m} (@code{calc-match}) [@code{match}] function takes a
27048vector of formulas and a rewrite-rule-style pattern, and produces
27049a vector of all formulas which match the pattern. The command
27050prompts you to enter the pattern; as for @kbd{a r}, you can enter
27051a single pattern (i.e., a formula with meta-variables), or a
27052vector of patterns, or a variable which contains patterns, or
27053you can give a blank response in which case the patterns are taken
27054from the top of the stack. The pattern set will be compiled once
27055and saved if it is stored in a variable. If there are several
27056patterns in the set, vector elements are kept if they match any
27057of the patterns.
27058
27059For example, @samp{match(a+b, [x, x+y, x-y, 7, x+y+z])}
27060will return @samp{[x+y, x-y, x+y+z]}.
27061
27062The @code{import} mechanism is not available for pattern sets.
27063
27064The @kbd{a m} command can also be used to extract all vector elements
27065which satisfy any condition: The pattern @samp{x :: x>0} will select
27066all the positive vector elements.
27067
27068@kindex I a m
27069@tindex matchnot
27070With the Inverse flag [@code{matchnot}], this command extracts all
27071vector elements which do @emph{not} match the given pattern.
27072
27073@ignore
27074@starindex
27075@end ignore
27076@tindex matches
27077There is also a function @samp{matches(@var{x}, @var{p})} which
27078evaluates to 1 if expression @var{x} matches pattern @var{p}, or
27079to 0 otherwise. This is sometimes useful for including into the
27080conditional clauses of other rewrite rules.
27081
27082@ignore
27083@starindex
27084@end ignore
27085@tindex vmatches
27086The function @code{vmatches} is just like @code{matches}, except
27087that if the match succeeds it returns a vector of assignments to
27088the meta-variables instead of the number 1. For example,
27089@samp{vmatches(f(1,2), f(a,b))} returns @samp{[a := 1, b := 2]}.
27090If the match fails, the function returns the number 0.
27091
27092@node Automatic Rewrites, Debugging Rewrites, Matching Commands, Rewrite Rules
27093@subsection Automatic Rewrites
27094
27095@noindent
27096@cindex @code{EvalRules} variable
27097@vindex EvalRules
27098It is possible to get Calc to apply a set of rewrite rules on all
27099results, effectively adding to the built-in set of default
27100simplifications. To do this, simply store your rule set in the
27101variable @code{EvalRules}. There is a convenient @kbd{s E} command
27102for editing @code{EvalRules}; @pxref{Operations on Variables}.
27103
27104For example, suppose you want @samp{sin(a + b)} to be expanded out
27105to @samp{sin(b) cos(a) + cos(b) sin(a)} wherever it appears, and
27106similarly for @samp{cos(a + b)}. The corresponding rewrite rule
27107set would be,
27108
27109@smallexample
27110@group
27111[ sin(a + b) := cos(a) sin(b) + sin(a) cos(b),
27112 cos(a + b) := cos(a) cos(b) - sin(a) sin(b) ]
27113@end group
27114@end smallexample
27115
27116To apply these manually, you could put them in a variable called
27117@code{trigexp} and then use @kbd{a r trigexp} every time you wanted
27118to expand trig functions. But if instead you store them in the
27119variable @code{EvalRules}, they will automatically be applied to all
27120sines and cosines of sums. Then, with @samp{2 x} and @samp{45} on
27121the stack, typing @kbd{+ S} will (assuming Degrees mode) result in
27122@samp{0.7071 sin(2 x) + 0.7071 cos(2 x)} automatically.
27123
27124As each level of a formula is evaluated, the rules from
27125@code{EvalRules} are applied before the default simplifications.
27126Rewriting continues until no further @code{EvalRules} apply.
27127Note that this is different from the usual order of application of
27128rewrite rules: @code{EvalRules} works from the bottom up, simplifying
27129the arguments to a function before the function itself, while @kbd{a r}
27130applies rules from the top down.
27131
27132Because the @code{EvalRules} are tried first, you can use them to
27133override the normal behavior of any built-in Calc function.
27134
27135It is important not to write a rule that will get into an infinite
27136loop. For example, the rule set @samp{[f(0) := 1, f(n) := n f(n-1)]}
27137appears to be a good definition of a factorial function, but it is
27138unsafe. Imagine what happens if @samp{f(2.5)} is simplified. Calc
27139will continue to subtract 1 from this argument forever without reaching
27140zero. A safer second rule would be @samp{f(n) := n f(n-1) :: n>0}.
27141Another dangerous rule is @samp{g(x, y) := g(y, x)}. Rewriting
27142@samp{g(2, 4)}, this would bounce back and forth between that and
27143@samp{g(4, 2)} forever. If an infinite loop in @code{EvalRules}
27144occurs, Emacs will eventually stop with a ``Computation got stuck
27145or ran too long'' message.
27146
27147Another subtle difference between @code{EvalRules} and regular rewrites
27148concerns rules that rewrite a formula into an identical formula. For
27149example, @samp{f(n) := f(floor(n))} ``fails to match'' when @expr{n} is
27150already an integer. But in @code{EvalRules} this case is detected only
27151if the righthand side literally becomes the original formula before any
27152further simplification. This means that @samp{f(n) := f(floor(n))} will
27153get into an infinite loop if it occurs in @code{EvalRules}. Calc will
27154replace @samp{f(6)} with @samp{f(floor(6))}, which is different from
27155@samp{f(6)}, so it will consider the rule to have matched and will
27156continue simplifying that formula; first the argument is simplified
27157to get @samp{f(6)}, then the rule matches again to get @samp{f(floor(6))}
27158again, ad infinitum. A much safer rule would check its argument first,
27159say, with @samp{f(n) := f(floor(n)) :: !dint(n)}.
27160
27161(What really happens is that the rewrite mechanism substitutes the
27162meta-variables in the righthand side of a rule, compares to see if the
27163result is the same as the original formula and fails if so, then uses
27164the default simplifications to simplify the result and compares again
27165(and again fails if the formula has simplified back to its original
27166form). The only special wrinkle for the @code{EvalRules} is that the
27167same rules will come back into play when the default simplifications
27168are used. What Calc wants to do is build @samp{f(floor(6))}, see that
27169this is different from the original formula, simplify to @samp{f(6)},
27170see that this is the same as the original formula, and thus halt the
27171rewriting. But while simplifying, @samp{f(6)} will again trigger
27172the same @code{EvalRules} rule and Calc will get into a loop inside
27173the rewrite mechanism itself.)
27174
27175The @code{phase}, @code{schedule}, and @code{iterations} markers do
27176not work in @code{EvalRules}. If the rule set is divided into phases,
27177only the phase 1 rules are applied, and the schedule is ignored.
27178The rules are always repeated as many times as possible.
27179
27180The @code{EvalRules} are applied to all function calls in a formula,
27181but not to numbers (and other number-like objects like error forms),
27182nor to vectors or individual variable names. (Though they will apply
27183to @emph{components} of vectors and error forms when appropriate.) You
27184might try to make a variable @code{phihat} which automatically expands
27185to its definition without the need to press @kbd{=} by writing the
27186rule @samp{quote(phihat) := (1-sqrt(5))/2}, but unfortunately this rule
27187will not work as part of @code{EvalRules}.
27188
27189Finally, another limitation is that Calc sometimes calls its built-in
27190functions directly rather than going through the default simplifications.
27191When it does this, @code{EvalRules} will not be able to override those
27192functions. For example, when you take the absolute value of the complex
27193number @expr{(2, 3)}, Calc computes @samp{sqrt(2*2 + 3*3)} by calling
27194the multiplication, addition, and square root functions directly rather
27195than applying the default simplifications to this formula. So an
27196@code{EvalRules} rule that (perversely) rewrites @samp{sqrt(13) := 6}
27197would not apply. (However, if you put Calc into Symbolic mode so that
27198@samp{sqrt(13)} will be left in symbolic form by the built-in square
27199root function, your rule will be able to apply. But if the complex
27200number were @expr{(3,4)}, so that @samp{sqrt(25)} must be calculated,
27201then Symbolic mode will not help because @samp{sqrt(25)} can be
27202evaluated exactly to 5.)
27203
27204One subtle restriction that normally only manifests itself with
27205@code{EvalRules} is that while a given rewrite rule is in the process
27206of being checked, that same rule cannot be recursively applied. Calc
27207effectively removes the rule from its rule set while checking the rule,
27208then puts it back once the match succeeds or fails. (The technical
27209reason for this is that compiled pattern programs are not reentrant.)
27210For example, consider the rule @samp{foo(x) := x :: foo(x/2) > 0}
27211attempting to match @samp{foo(8)}. This rule will be inactive while
27212the condition @samp{foo(4) > 0} is checked, even though it might be
27213an integral part of evaluating that condition. Note that this is not
27214a problem for the more usual recursive type of rule, such as
27215@samp{foo(x) := foo(x/2)}, because there the rule has succeeded and
27216been reactivated by the time the righthand side is evaluated.
27217
27218If @code{EvalRules} has no stored value (its default state), or if
27219anything but a vector is stored in it, then it is ignored.
27220
27221Even though Calc's rewrite mechanism is designed to compare rewrite
27222rules to formulas as quickly as possible, storing rules in
27223@code{EvalRules} may make Calc run substantially slower. This is
27224particularly true of rules where the top-level call is a commonly used
27225function, or is not fixed. The rule @samp{f(n) := n f(n-1) :: n>0} will
27226only activate the rewrite mechanism for calls to the function @code{f},
27227but @samp{lg(n) + lg(m) := lg(n m)} will check every @samp{+} operator.
27228
27229@smallexample
27230apply(f, [a*b]) := apply(f, [a]) + apply(f, [b]) :: in(f, [ln, log10])
27231@end smallexample
27232
27233@noindent
27234may seem more ``efficient'' than two separate rules for @code{ln} and
27235@code{log10}, but actually it is vastly less efficient because rules
27236with @code{apply} as the top-level pattern must be tested against
27237@emph{every} function call that is simplified.
27238
27239@cindex @code{AlgSimpRules} variable
27240@vindex AlgSimpRules
27241Suppose you want @samp{sin(a + b)} to be expanded out not all the time,
27242but only when @kbd{a s} is used to simplify the formula. The variable
27243@code{AlgSimpRules} holds rules for this purpose. The @kbd{a s} command
27244will apply @code{EvalRules} and @code{AlgSimpRules} to the formula, as
27245well as all of its built-in simplifications.
27246
27247Most of the special limitations for @code{EvalRules} don't apply to
27248@code{AlgSimpRules}. Calc simply does an @kbd{a r AlgSimpRules}
27249command with an infinite repeat count as the first step of @kbd{a s}.
27250It then applies its own built-in simplifications throughout the
27251formula, and then repeats these two steps (along with applying the
27252default simplifications) until no further changes are possible.
27253
27254@cindex @code{ExtSimpRules} variable
27255@cindex @code{UnitSimpRules} variable
27256@vindex ExtSimpRules
27257@vindex UnitSimpRules
27258There are also @code{ExtSimpRules} and @code{UnitSimpRules} variables
27259that are used by @kbd{a e} and @kbd{u s}, respectively; these commands
27260also apply @code{EvalRules} and @code{AlgSimpRules}. The variable
27261@code{IntegSimpRules} contains simplification rules that are used
27262only during integration by @kbd{a i}.
27263
27264@node Debugging Rewrites, Examples of Rewrite Rules, Automatic Rewrites, Rewrite Rules
27265@subsection Debugging Rewrites
27266
27267@noindent
27268If a buffer named @samp{*Trace*} exists, the rewrite mechanism will
27269record some useful information there as it operates. The original
27270formula is written there, as is the result of each successful rewrite,
27271and the final result of the rewriting. All phase changes are also
27272noted.
27273
27274Calc always appends to @samp{*Trace*}. You must empty this buffer
27275yourself periodically if it is in danger of growing unwieldy.
27276
27277Note that the rewriting mechanism is substantially slower when the
27278@samp{*Trace*} buffer exists, even if the buffer is not visible on
27279the screen. Once you are done, you will probably want to kill this
27280buffer (with @kbd{C-x k *Trace* @key{RET}}). If you leave it in
27281existence and forget about it, all your future rewrite commands will
27282be needlessly slow.
27283
27284@node Examples of Rewrite Rules, , Debugging Rewrites, Rewrite Rules
27285@subsection Examples of Rewrite Rules
27286
27287@noindent
27288Returning to the example of substituting the pattern
27289@samp{sin(x)^2 + cos(x)^2} with 1, we saw that the rule
27290@samp{opt(a) sin(x)^2 + opt(a) cos(x)^2 := a} does a good job of
27291finding suitable cases. Another solution would be to use the rule
27292@samp{cos(x)^2 := 1 - sin(x)^2}, followed by algebraic simplification
27293if necessary. This rule will be the most effective way to do the job,
27294but at the expense of making some changes that you might not desire.
27295
27296Another algebraic rewrite rule is @samp{exp(x+y) := exp(x) exp(y)}.
27297To make this work with the @w{@kbd{j r}} command so that it can be
27298easily targeted to a particular exponential in a large formula,
27299you might wish to write the rule as @samp{select(exp(x+y)) :=
27300select(exp(x) exp(y))}. The @samp{select} markers will be
27301ignored by the regular @kbd{a r} command
27302(@pxref{Selections with Rewrite Rules}).
27303
27304A surprisingly useful rewrite rule is @samp{a/(b-c) := a*(b+c)/(b^2-c^2)}.
27305This will simplify the formula whenever @expr{b} and/or @expr{c} can
27306be made simpler by squaring. For example, applying this rule to
27307@samp{2 / (sqrt(2) + 3)} yields @samp{6:7 - 2:7 sqrt(2)} (assuming
27308Symbolic mode has been enabled to keep the square root from being
27309evaluated to a floating-point approximation). This rule is also
27310useful when working with symbolic complex numbers, e.g.,
27311@samp{(a + b i) / (c + d i)}.
27312
27313As another example, we could define our own ``triangular numbers'' function
27314with the rules @samp{[tri(0) := 0, tri(n) := n + tri(n-1) :: n>0]}. Enter
27315this vector and store it in a variable: @kbd{@w{s t} trirules}. Now, given
27316a suitable formula like @samp{tri(5)} on the stack, type @samp{a r trirules}
27317to apply these rules repeatedly. After six applications, @kbd{a r} will
27318stop with 15 on the stack. Once these rules are debugged, it would probably
27319be most useful to add them to @code{EvalRules} so that Calc will evaluate
27320the new @code{tri} function automatically. We could then use @kbd{Z K} on
27321the keyboard macro @kbd{' tri($) @key{RET}} to make a command that applies
27322@code{tri} to the value on the top of the stack. @xref{Programming}.
27323
27324@cindex Quaternions
27325The following rule set, contributed by
27326@texline Fran\c cois
27327@infoline Francois
27328Pinard, implements @dfn{quaternions}, a generalization of the concept of
27329complex numbers. Quaternions have four components, and are here
27330represented by function calls @samp{quat(@var{w}, [@var{x}, @var{y},
27331@var{z}])} with ``real part'' @var{w} and the three ``imaginary'' parts
27332collected into a vector. Various arithmetical operations on quaternions
27333are supported. To use these rules, either add them to @code{EvalRules},
27334or create a command based on @kbd{a r} for simplifying quaternion
27335formulas. A convenient way to enter quaternions would be a command
27336defined by a keyboard macro containing: @kbd{' quat($$$$, [$$$, $$, $])
27337@key{RET}}.
27338
27339@smallexample
27340[ quat(w, x, y, z) := quat(w, [x, y, z]),
27341 quat(w, [0, 0, 0]) := w,
27342 abs(quat(w, v)) := hypot(w, v),
27343 -quat(w, v) := quat(-w, -v),
27344 r + quat(w, v) := quat(r + w, v) :: real(r),
27345 r - quat(w, v) := quat(r - w, -v) :: real(r),
27346 quat(w1, v1) + quat(w2, v2) := quat(w1 + w2, v1 + v2),
27347 r * quat(w, v) := quat(r * w, r * v) :: real(r),
27348 plain(quat(w1, v1) * quat(w2, v2))
27349 := quat(w1 * w2 - v1 * v2, w1 * v2 + w2 * v1 + cross(v1, v2)),
27350 quat(w1, v1) / r := quat(w1 / r, v1 / r) :: real(r),
27351 z / quat(w, v) := z * quatinv(quat(w, v)),
27352 quatinv(quat(w, v)) := quat(w, -v) / (w^2 + v^2),
27353 quatsqr(quat(w, v)) := quat(w^2 - v^2, 2 * w * v),
27354 quat(w, v)^k := quatsqr(quat(w, v)^(k / 2))
27355 :: integer(k) :: k > 0 :: k % 2 = 0,
27356 quat(w, v)^k := quatsqr(quat(w, v)^((k - 1) / 2)) * quat(w, v)
27357 :: integer(k) :: k > 2,
27358 quat(w, v)^-k := quatinv(quat(w, v)^k) :: integer(k) :: k > 0 ]
27359@end smallexample
27360
27361Quaternions, like matrices, have non-commutative multiplication.
27362In other words, @expr{q1 * q2 = q2 * q1} is not necessarily true if
27363@expr{q1} and @expr{q2} are @code{quat} forms. The @samp{quat*quat}
27364rule above uses @code{plain} to prevent Calc from rearranging the
27365product. It may also be wise to add the line @samp{[quat(), matrix]}
27366to the @code{Decls} matrix, to ensure that Calc's other algebraic
27367operations will not rearrange a quaternion product. @xref{Declarations}.
27368
27369These rules also accept a four-argument @code{quat} form, converting
27370it to the preferred form in the first rule. If you would rather see
27371results in the four-argument form, just append the two items
27372@samp{phase(2), quat(w, [x, y, z]) := quat(w, x, y, z)} to the end
27373of the rule set. (But remember that multi-phase rule sets don't work
27374in @code{EvalRules}.)
27375
27376@node Units, Store and Recall, Algebra, Top
27377@chapter Operating on Units
27378
27379@noindent
27380One special interpretation of algebraic formulas is as numbers with units.
27381For example, the formula @samp{5 m / s^2} can be read ``five meters
27382per second squared.'' The commands in this chapter help you
27383manipulate units expressions in this form. Units-related commands
27384begin with the @kbd{u} prefix key.
27385
27386@menu
27387* Basic Operations on Units::
27388* The Units Table::
27389* Predefined Units::
27390* User-Defined Units::
27391@end menu
27392
27393@node Basic Operations on Units, The Units Table, Units, Units
27394@section Basic Operations on Units
27395
27396@noindent
27397A @dfn{units expression} is a formula which is basically a number
27398multiplied and/or divided by one or more @dfn{unit names}, which may
27399optionally be raised to integer powers. Actually, the value part need not
27400be a number; any product or quotient involving unit names is a units
27401expression. Many of the units commands will also accept any formula,
27402where the command applies to all units expressions which appear in the
27403formula.
27404
27405A unit name is a variable whose name appears in the @dfn{unit table},
27406or a variable whose name is a prefix character like @samp{k} (for ``kilo'')
27407or @samp{u} (for ``micro'') followed by a name in the unit table.
27408A substantial table of built-in units is provided with Calc;
27409@pxref{Predefined Units}. You can also define your own unit names;
27410@pxref{User-Defined Units}.
27411
27412Note that if the value part of a units expression is exactly @samp{1},
27413it will be removed by the Calculator's automatic algebra routines: The
27414formula @samp{1 mm} is ``simplified'' to @samp{mm}. This is only a
27415display anomaly, however; @samp{mm} will work just fine as a
27416representation of one millimeter.
27417
27418You may find that Algebraic mode (@pxref{Algebraic Entry}) makes working
27419with units expressions easier. Otherwise, you will have to remember
27420to hit the apostrophe key every time you wish to enter units.
27421
27422@kindex u s
27423@pindex calc-simplify-units
27424@ignore
27425@mindex usimpl@idots
27426@end ignore
27427@tindex usimplify
27428The @kbd{u s} (@code{calc-simplify-units}) [@code{usimplify}] command
27429simplifies a units
27430expression. It uses @kbd{a s} (@code{calc-simplify}) to simplify the
27431expression first as a regular algebraic formula; it then looks for
27432features that can be further simplified by converting one object's units
27433to be compatible with another's. For example, @samp{5 m + 23 mm} will
27434simplify to @samp{5.023 m}. When different but compatible units are
27435added, the righthand term's units are converted to match those of the
27436lefthand term. @xref{Simplification Modes}, for a way to have this done
27437automatically at all times.
27438
27439Units simplification also handles quotients of two units with the same
27440dimensionality, as in @w{@samp{2 in s/L cm}} to @samp{5.08 s/L}; fractional
27441powers of unit expressions, as in @samp{sqrt(9 mm^2)} to @samp{3 mm} and
27442@samp{sqrt(9 acre)} to a quantity in meters; and @code{floor},
27443@code{ceil}, @code{round}, @code{rounde}, @code{roundu}, @code{trunc},
27444@code{float}, @code{frac}, @code{abs}, and @code{clean}
27445applied to units expressions, in which case
27446the operation in question is applied only to the numeric part of the
27447expression. Finally, trigonometric functions of quantities with units
27448of angle are evaluated, regardless of the current angular mode.
27449
27450@kindex u c
27451@pindex calc-convert-units
27452The @kbd{u c} (@code{calc-convert-units}) command converts a units
27453expression to new, compatible units. For example, given the units
27454expression @samp{55 mph}, typing @kbd{u c m/s @key{RET}} produces
27455@samp{24.5872 m/s}. If you have previously converted a units expression
27456with the same type of units (in this case, distance over time), you will
27457be offered the previous choice of new units as a default. Continuing
27458the above example, entering the units expression @samp{100 km/hr} and
27459typing @kbd{u c @key{RET}} (without specifying new units) produces
27460@samp{27.7777777778 m/s}.
27461
27462While many of Calc's conversion factors are exact, some are necessarily
27463approximate. If Calc is in fraction mode (@pxref{Fraction Mode}), then
27464unit conversions will try to give exact, rational conversions, but it
27465isn't always possible. Given @samp{55 mph} in fraction mode, typing
27466@kbd{u c m/s @key{RET}} produces @samp{15367:625 m/s}, for example,
27467while typing @kbd{u c au/yr @key{RET}} produces
27468@samp{5.18665819999e-3 au/yr}.
27469
27470If the units you request are inconsistent with the original units, the
27471number will be converted into your units times whatever ``remainder''
27472units are left over. For example, converting @samp{55 mph} into acres
27473produces @samp{6.08e-3 acre / m s}. (Recall that multiplication binds
27474more strongly than division in Calc formulas, so the units here are
27475acres per meter-second.) Remainder units are expressed in terms of
27476``fundamental'' units like @samp{m} and @samp{s}, regardless of the
27477input units.
27478
27479One special exception is that if you specify a single unit name, and
27480a compatible unit appears somewhere in the units expression, then
27481that compatible unit will be converted to the new unit and the
27482remaining units in the expression will be left alone. For example,
27483given the input @samp{980 cm/s^2}, the command @kbd{u c ms} will
27484change the @samp{s} to @samp{ms} to get @samp{9.8e-4 cm/ms^2}.
27485The ``remainder unit'' @samp{cm} is left alone rather than being
27486changed to the base unit @samp{m}.
27487
27488You can use explicit unit conversion instead of the @kbd{u s} command
27489to gain more control over the units of the result of an expression.
27490For example, given @samp{5 m + 23 mm}, you can type @kbd{u c m} or
27491@kbd{u c mm} to express the result in either meters or millimeters.
27492(For that matter, you could type @kbd{u c fath} to express the result
27493in fathoms, if you preferred!)
27494
27495In place of a specific set of units, you can also enter one of the
27496units system names @code{si}, @code{mks} (equivalent), or @code{cgs}.
27497For example, @kbd{u c si @key{RET}} converts the expression into
27498International System of Units (SI) base units. Also, @kbd{u c base}
27499converts to Calc's base units, which are the same as @code{si} units
27500except that @code{base} uses @samp{g} as the fundamental unit of mass
27501whereas @code{si} uses @samp{kg}.
27502
27503@cindex Composite units
27504The @kbd{u c} command also accepts @dfn{composite units}, which
27505are expressed as the sum of several compatible unit names. For
27506example, converting @samp{30.5 in} to units @samp{mi+ft+in} (miles,
27507feet, and inches) produces @samp{2 ft + 6.5 in}. Calc first
27508sorts the unit names into order of decreasing relative size.
27509It then accounts for as much of the input quantity as it can
27510using an integer number times the largest unit, then moves on
27511to the next smaller unit, and so on. Only the smallest unit
27512may have a non-integer amount attached in the result. A few
27513standard unit names exist for common combinations, such as
27514@code{mfi} for @samp{mi+ft+in}, and @code{tpo} for @samp{ton+lb+oz}.
27515Composite units are expanded as if by @kbd{a x}, so that
27516@samp{(ft+in)/hr} is first converted to @samp{ft/hr+in/hr}.
27517
27518If the value on the stack does not contain any units, @kbd{u c} will
27519prompt first for the old units which this value should be considered
27520to have, then for the new units. Assuming the old and new units you
27521give are consistent with each other, the result also will not contain
285f0d3a
JB
27522any units. For example, @kbd{@w{u c} cm @key{RET} in @key{RET}}
27523converts the number 2 on the stack to 5.08.
4009494e
GM
27524
27525@kindex u b
27526@pindex calc-base-units
27527The @kbd{u b} (@code{calc-base-units}) command is shorthand for
27528@kbd{u c base}; it converts the units expression on the top of the
27529stack into @code{base} units. If @kbd{u s} does not simplify a
27530units expression as far as you would like, try @kbd{u b}.
27531
27532The @kbd{u c} and @kbd{u b} commands treat temperature units (like
27533@samp{degC} and @samp{K}) as relative temperatures. For example,
27534@kbd{u c} converts @samp{10 degC} to @samp{18 degF}: A change of 10
27535degrees Celsius corresponds to a change of 18 degrees Fahrenheit.
27536
27537@kindex u t
27538@pindex calc-convert-temperature
27539@cindex Temperature conversion
27540The @kbd{u t} (@code{calc-convert-temperature}) command converts
27541absolute temperatures. The value on the stack must be a simple units
27542expression with units of temperature only. This command would convert
27543@samp{10 degC} to @samp{50 degF}, the equivalent temperature on the
27544Fahrenheit scale.
27545
27546@kindex u r
27547@pindex calc-remove-units
27548@kindex u x
27549@pindex calc-extract-units
27550The @kbd{u r} (@code{calc-remove-units}) command removes units from the
27551formula at the top of the stack. The @kbd{u x}
27552(@code{calc-extract-units}) command extracts only the units portion of a
27553formula. These commands essentially replace every term of the formula
27554that does or doesn't (respectively) look like a unit name by the
27555constant 1, then resimplify the formula.
27556
27557@kindex u a
27558@pindex calc-autorange-units
27559The @kbd{u a} (@code{calc-autorange-units}) command turns on and off a
27560mode in which unit prefixes like @code{k} (``kilo'') are automatically
27561applied to keep the numeric part of a units expression in a reasonable
27562range. This mode affects @kbd{u s} and all units conversion commands
27563except @kbd{u b}. For example, with autoranging on, @samp{12345 Hz}
27564will be simplified to @samp{12.345 kHz}. Autoranging is useful for
27565some kinds of units (like @code{Hz} and @code{m}), but is probably
27566undesirable for non-metric units like @code{ft} and @code{tbsp}.
27567(Composite units are more appropriate for those; see above.)
27568
27569Autoranging always applies the prefix to the leftmost unit name.
27570Calc chooses the largest prefix that causes the number to be greater
27571than or equal to 1.0. Thus an increasing sequence of adjusted times
27572would be @samp{1 ms, 10 ms, 100 ms, 1 s, 10 s, 100 s, 1 ks}.
27573Generally the rule of thumb is that the number will be adjusted
27574to be in the interval @samp{[1 .. 1000)}, although there are several
27575exceptions to this rule. First, if the unit has a power then this
27576is not possible; @samp{0.1 s^2} simplifies to @samp{100000 ms^2}.
27577Second, the ``centi-'' prefix is allowed to form @code{cm} (centimeters),
27578but will not apply to other units. The ``deci-,'' ``deka-,'' and
27579``hecto-'' prefixes are never used. Thus the allowable interval is
27580@samp{[1 .. 10)} for millimeters and @samp{[1 .. 100)} for centimeters.
27581Finally, a prefix will not be added to a unit if the resulting name
27582is also the actual name of another unit; @samp{1e-15 t} would normally
27583be considered a ``femto-ton,'' but it is written as @samp{1000 at}
27584(1000 atto-tons) instead because @code{ft} would be confused with feet.
27585
27586@node The Units Table, Predefined Units, Basic Operations on Units, Units
27587@section The Units Table
27588
27589@noindent
27590@kindex u v
27591@pindex calc-enter-units-table
27592The @kbd{u v} (@code{calc-enter-units-table}) command displays the units table
27593in another buffer called @code{*Units Table*}. Each entry in this table
27594gives the unit name as it would appear in an expression, the definition
27595of the unit in terms of simpler units, and a full name or description of
27596the unit. Fundamental units are defined as themselves; these are the
27597units produced by the @kbd{u b} command. The fundamental units are
27598meters, seconds, grams, kelvins, amperes, candelas, moles, radians,
27599and steradians.
27600
27601The Units Table buffer also displays the Unit Prefix Table. Note that
27602two prefixes, ``kilo'' and ``hecto,'' accept either upper- or lower-case
27603prefix letters. @samp{Meg} is also accepted as a synonym for the @samp{M}
27604prefix. Whenever a unit name can be interpreted as either a built-in name
27605or a prefix followed by another built-in name, the former interpretation
27606wins. For example, @samp{2 pt} means two pints, not two pico-tons.
27607
27608The Units Table buffer, once created, is not rebuilt unless you define
27609new units. To force the buffer to be rebuilt, give any numeric prefix
27610argument to @kbd{u v}.
27611
27612@kindex u V
27613@pindex calc-view-units-table
27614The @kbd{u V} (@code{calc-view-units-table}) command is like @kbd{u v} except
27615that the cursor is not moved into the Units Table buffer. You can
27616type @kbd{u V} again to remove the Units Table from the display. To
27617return from the Units Table buffer after a @kbd{u v}, type @kbd{C-x * c}
27618again or use the regular Emacs @w{@kbd{C-x o}} (@code{other-window})
27619command. You can also kill the buffer with @kbd{C-x k} if you wish;
27620the actual units table is safely stored inside the Calculator.
27621
27622@kindex u g
27623@pindex calc-get-unit-definition
27624The @kbd{u g} (@code{calc-get-unit-definition}) command retrieves a unit's
27625defining expression and pushes it onto the Calculator stack. For example,
27626@kbd{u g in} will produce the expression @samp{2.54 cm}. This is the
27627same definition for the unit that would appear in the Units Table buffer.
27628Note that this command works only for actual unit names; @kbd{u g km}
27629will report that no such unit exists, for example, because @code{km} is
27630really the unit @code{m} with a @code{k} (``kilo'') prefix. To see a
27631definition of a unit in terms of base units, it is easier to push the
27632unit name on the stack and then reduce it to base units with @kbd{u b}.
27633
27634@kindex u e
27635@pindex calc-explain-units
27636The @kbd{u e} (@code{calc-explain-units}) command displays an English
27637description of the units of the expression on the stack. For example,
27638for the expression @samp{62 km^2 g / s^2 mol K}, the description is
27639``Square-Kilometer Gram per (Second-squared Mole Degree-Kelvin).'' This
27640command uses the English descriptions that appear in the righthand
27641column of the Units Table.
27642
27643@node Predefined Units, User-Defined Units, The Units Table, Units
27644@section Predefined Units
27645
27646@noindent
285f0d3a
JB
27647The definitions of many units have changed over the years. For example,
27648the meter was originally defined in 1791 as one ten-millionth of the
27649distance from the equator to the north pole. In order to be more
27650precise, the definition was adjusted several times, and now a meter is
27651defined as the distance that light will travel in a vacuum in
276521/299792458 of a second; consequently, the speed of light in a
27653vacuum is exactly 299792458 m/s. Many other units have been
27654redefined in terms of fundamental physical processes; a second, for
27655example, is currently defined as 9192631770 periods of a certain
27656radiation related to the cesium-133 atom. The only SI unit that is not
27657based on a fundamental physical process (although there are efforts to
27658change this) is the kilogram, which was originally defined as the mass
27659of one liter of water, but is now defined as the mass of the
27660International Prototype Kilogram (IPK), a cylinder of platinum-iridium
27661kept at the Bureau International des Poids et Mesures in S@`evres,
27662France. (There are several copies of the IPK throughout the world.)
27663The British imperial units, once defined in terms of physical objects,
27664were redefined in 1963 in terms of SI units. The US customary units,
27665which were the same as British units until the British imperial system
27666was created in 1824, were also defined in terms of the SI units in 1893.
27667Because of these redefinitions, conversions between metric, British
27668Imperial, and US customary units can often be done precisely.
27669
4009494e
GM
27670Since the exact definitions of many kinds of units have evolved over the
27671years, and since certain countries sometimes have local differences in
27672their definitions, it is a good idea to examine Calc's definition of a
27673unit before depending on its exact value. For example, there are three
27674different units for gallons, corresponding to the US (@code{gal}),
27675Canadian (@code{galC}), and British (@code{galUK}) definitions. Also,
27676note that @code{oz} is a standard ounce of mass, @code{ozt} is a Troy
27677ounce, and @code{ozfl} is a fluid ounce.
27678
27679The temperature units corresponding to degrees Kelvin and Centigrade
27680(Celsius) are the same in this table, since most units commands treat
27681temperatures as being relative. The @code{calc-convert-temperature}
27682command has special rules for handling the different absolute magnitudes
27683of the various temperature scales.
27684
27685The unit of volume ``liters'' can be referred to by either the lower-case
27686@code{l} or the upper-case @code{L}.
27687
27688The unit @code{A} stands for Amperes; the name @code{Ang} is used
27689@tex
27690for \AA ngstroms.
27691@end tex
27692@ifnottex
27693for Angstroms.
27694@end ifnottex
27695
27696The unit @code{pt} stands for pints; the name @code{point} stands for
27697a typographical point, defined by @samp{72 point = 1 in}. This is
27698slightly different than the point defined by the American Typefounder's
27699Association in 1886, but the point used by Calc has become standard
27700largely due to its use by the PostScript page description language.
27701There is also @code{texpt}, which stands for a printer's point as
27702defined by the @TeX{} typesetting system: @samp{72.27 texpt = 1 in}.
27703Other units used by @TeX{} are available; they are @code{texpc} (a pica),
27704@code{texbp} (a ``big point'', equal to a standard point which is larger
27705than the point used by @TeX{}), @code{texdd} (a Didot point),
27706@code{texcc} (a Cicero) and @code{texsp} (a scaled @TeX{} point,
27707all dimensions representable in @TeX{} are multiples of this value).
27708
27709The unit @code{e} stands for the elementary (electron) unit of charge;
27710because algebra command could mistake this for the special constant
27711@expr{e}, Calc provides the alternate unit name @code{ech} which is
27712preferable to @code{e}.
27713
27714The name @code{g} stands for one gram of mass; there is also @code{gf},
27715one gram of force. (Likewise for @kbd{lb}, pounds, and @kbd{lbf}.)
27716Meanwhile, one ``@expr{g}'' of acceleration is denoted @code{ga}.
27717
27718The unit @code{ton} is a U.S. ton of @samp{2000 lb}, and @code{t} is
27719a metric ton of @samp{1000 kg}.
27720
27721The names @code{s} (or @code{sec}) and @code{min} refer to units of
27722time; @code{arcsec} and @code{arcmin} are units of angle.
27723
27724Some ``units'' are really physical constants; for example, @code{c}
27725represents the speed of light, and @code{h} represents Planck's
27726constant. You can use these just like other units: converting
27727@samp{.5 c} to @samp{m/s} expresses one-half the speed of light in
27728meters per second. You can also use this merely as a handy reference;
27729the @kbd{u g} command gets the definition of one of these constants
27730in its normal terms, and @kbd{u b} expresses the definition in base
27731units.
27732
27733Two units, @code{pi} and @code{alpha} (the fine structure constant,
27734approximately @mathit{1/137}) are dimensionless. The units simplification
27735commands simply treat these names as equivalent to their corresponding
27736values. However you can, for example, use @kbd{u c} to convert a pure
27737number into multiples of the fine structure constant, or @kbd{u b} to
27738convert this back into a pure number. (When @kbd{u c} prompts for the
27739``old units,'' just enter a blank line to signify that the value
27740really is unitless.)
27741
27742@c Describe angular units, luminosity vs. steradians problem.
27743
27744@node User-Defined Units, , Predefined Units, Units
27745@section User-Defined Units
27746
27747@noindent
27748Calc provides ways to get quick access to your selected ``favorite''
27749units, as well as ways to define your own new units.
27750
27751@kindex u 0-9
27752@pindex calc-quick-units
27753@vindex Units
27754@cindex @code{Units} variable
27755@cindex Quick units
27756To select your favorite units, store a vector of unit names or
27757expressions in the Calc variable @code{Units}. The @kbd{u 1}
27758through @kbd{u 9} commands (@code{calc-quick-units}) provide access
27759to these units. If the value on the top of the stack is a plain
27760number (with no units attached), then @kbd{u 1} gives it the
27761specified units. (Basically, it multiplies the number by the
27762first item in the @code{Units} vector.) If the number on the
27763stack @emph{does} have units, then @kbd{u 1} converts that number
27764to the new units. For example, suppose the vector @samp{[in, ft]}
27765is stored in @code{Units}. Then @kbd{30 u 1} will create the
27766expression @samp{30 in}, and @kbd{u 2} will convert that expression
27767to @samp{2.5 ft}.
27768
27769The @kbd{u 0} command accesses the tenth element of @code{Units}.
27770Only ten quick units may be defined at a time. If the @code{Units}
27771variable has no stored value (the default), or if its value is not
27772a vector, then the quick-units commands will not function. The
27773@kbd{s U} command is a convenient way to edit the @code{Units}
27774variable; @pxref{Operations on Variables}.
27775
27776@kindex u d
27777@pindex calc-define-unit
27778@cindex User-defined units
27779The @kbd{u d} (@code{calc-define-unit}) command records the units
27780expression on the top of the stack as the definition for a new,
27781user-defined unit. For example, putting @samp{16.5 ft} on the stack and
27782typing @kbd{u d rod} defines the new unit @samp{rod} to be equivalent to
2778316.5 feet. The unit conversion and simplification commands will now
27784treat @code{rod} just like any other unit of length. You will also be
27785prompted for an optional English description of the unit, which will
27786appear in the Units Table.
27787
27788@kindex u u
27789@pindex calc-undefine-unit
27790The @kbd{u u} (@code{calc-undefine-unit}) command removes a user-defined
27791unit. It is not possible to remove one of the predefined units,
27792however.
27793
27794If you define a unit with an existing unit name, your new definition
27795will replace the original definition of that unit. If the unit was a
27796predefined unit, the old definition will not be replaced, only
27797``shadowed.'' The built-in definition will reappear if you later use
27798@kbd{u u} to remove the shadowing definition.
27799
27800To create a new fundamental unit, use either 1 or the unit name itself
27801as the defining expression. Otherwise the expression can involve any
27802other units that you like (except for composite units like @samp{mfi}).
27803You can create a new composite unit with a sum of other units as the
27804defining expression. The next unit operation like @kbd{u c} or @kbd{u v}
27805will rebuild the internal unit table incorporating your modifications.
27806Note that erroneous definitions (such as two units defined in terms of
27807each other) will not be detected until the unit table is next rebuilt;
27808@kbd{u v} is a convenient way to force this to happen.
27809
27810Temperature units are treated specially inside the Calculator; it is not
27811possible to create user-defined temperature units.
27812
27813@kindex u p
27814@pindex calc-permanent-units
27815@cindex Calc init file, user-defined units
27816The @kbd{u p} (@code{calc-permanent-units}) command stores the user-defined
27817units in your Calc init file (the file given by the variable
27818@code{calc-settings-file}, typically @file{~/.calc.el}), so that the
27819units will still be available in subsequent Emacs sessions. If there
27820was already a set of user-defined units in your Calc init file, it
27821is replaced by the new set. (@xref{General Mode Commands}, for a way to
27822tell Calc to use a different file for the Calc init file.)
27823
27824@node Store and Recall, Graphics, Units, Top
27825@chapter Storing and Recalling
27826
27827@noindent
27828Calculator variables are really just Lisp variables that contain numbers
27829or formulas in a form that Calc can understand. The commands in this
27830section allow you to manipulate variables conveniently. Commands related
27831to variables use the @kbd{s} prefix key.
27832
27833@menu
27834* Storing Variables::
27835* Recalling Variables::
27836* Operations on Variables::
27837* Let Command::
27838* Evaluates-To Operator::
27839@end menu
27840
27841@node Storing Variables, Recalling Variables, Store and Recall, Store and Recall
27842@section Storing Variables
27843
27844@noindent
27845@kindex s s
27846@pindex calc-store
27847@cindex Storing variables
27848@cindex Quick variables
27849@vindex q0
27850@vindex q9
27851The @kbd{s s} (@code{calc-store}) command stores the value at the top of
27852the stack into a specified variable. It prompts you to enter the
27853name of the variable. If you press a single digit, the value is stored
27854immediately in one of the ``quick'' variables @code{q0} through
27855@code{q9}. Or you can enter any variable name.
27856
27857@kindex s t
27858@pindex calc-store-into
27859The @kbd{s s} command leaves the stored value on the stack. There is
27860also an @kbd{s t} (@code{calc-store-into}) command, which removes a
27861value from the stack and stores it in a variable.
27862
27863If the top of stack value is an equation @samp{a = 7} or assignment
27864@samp{a := 7} with a variable on the lefthand side, then Calc will
27865assign that variable with that value by default, i.e., if you type
27866@kbd{s s @key{RET}} or @kbd{s t @key{RET}}. In this example, the
27867value 7 would be stored in the variable @samp{a}. (If you do type
27868a variable name at the prompt, the top-of-stack value is stored in
27869its entirety, even if it is an equation: @samp{s s b @key{RET}}
27870with @samp{a := 7} on the stack stores @samp{a := 7} in @code{b}.)
27871
27872In fact, the top of stack value can be a vector of equations or
27873assignments with different variables on their lefthand sides; the
27874default will be to store all the variables with their corresponding
27875righthand sides simultaneously.
27876
27877It is also possible to type an equation or assignment directly at
27878the prompt for the @kbd{s s} or @kbd{s t} command: @kbd{s s foo = 7}.
27879In this case the expression to the right of the @kbd{=} or @kbd{:=}
27880symbol is evaluated as if by the @kbd{=} command, and that value is
27881stored in the variable. No value is taken from the stack; @kbd{s s}
27882and @kbd{s t} are equivalent when used in this way.
27883
27884@kindex s 0-9
27885@kindex t 0-9
27886The prefix keys @kbd{s} and @kbd{t} may be followed immediately by a
27887digit; @kbd{s 9} is equivalent to @kbd{s s 9}, and @kbd{t 9} is
27888equivalent to @kbd{s t 9}. (The @kbd{t} prefix is otherwise used
27889for trail and time/date commands.)
27890
27891@kindex s +
27892@kindex s -
27893@ignore
27894@mindex @idots
27895@end ignore
27896@kindex s *
27897@ignore
27898@mindex @null
27899@end ignore
27900@kindex s /
27901@ignore
27902@mindex @null
27903@end ignore
27904@kindex s ^
27905@ignore
27906@mindex @null
27907@end ignore
27908@kindex s |
27909@ignore
27910@mindex @null
27911@end ignore
27912@kindex s n
27913@ignore
27914@mindex @null
27915@end ignore
27916@kindex s &
27917@ignore
27918@mindex @null
27919@end ignore
27920@kindex s [
27921@ignore
27922@mindex @null
27923@end ignore
27924@kindex s ]
27925@pindex calc-store-plus
27926@pindex calc-store-minus
27927@pindex calc-store-times
27928@pindex calc-store-div
27929@pindex calc-store-power
27930@pindex calc-store-concat
27931@pindex calc-store-neg
27932@pindex calc-store-inv
27933@pindex calc-store-decr
27934@pindex calc-store-incr
27935There are also several ``arithmetic store'' commands. For example,
27936@kbd{s +} removes a value from the stack and adds it to the specified
27937variable. The other arithmetic stores are @kbd{s -}, @kbd{s *}, @kbd{s /},
27938@kbd{s ^}, and @w{@kbd{s |}} (vector concatenation), plus @kbd{s n} and
27939@kbd{s &} which negate or invert the value in a variable, and @w{@kbd{s [}}
27940and @kbd{s ]} which decrease or increase a variable by one.
27941
27942All the arithmetic stores accept the Inverse prefix to reverse the
27943order of the operands. If @expr{v} represents the contents of the
27944variable, and @expr{a} is the value drawn from the stack, then regular
27945@w{@kbd{s -}} assigns
27946@texline @math{v \coloneq v - a},
27947@infoline @expr{v := v - a},
27948but @kbd{I s -} assigns
27949@texline @math{v \coloneq a - v}.
27950@infoline @expr{v := a - v}.
27951While @kbd{I s *} might seem pointless, it is
27952useful if matrix multiplication is involved. Actually, all the
27953arithmetic stores use formulas designed to behave usefully both
27954forwards and backwards:
27955
27956@example
27957@group
27958s + v := v + a v := a + v
27959s - v := v - a v := a - v
27960s * v := v * a v := a * v
27961s / v := v / a v := a / v
27962s ^ v := v ^ a v := a ^ v
27963s | v := v | a v := a | v
27964s n v := v / (-1) v := (-1) / v
27965s & v := v ^ (-1) v := (-1) ^ v
27966s [ v := v - 1 v := 1 - v
27967s ] v := v - (-1) v := (-1) - v
27968@end group
27969@end example
27970
27971In the last four cases, a numeric prefix argument will be used in
27972place of the number one. (For example, @kbd{M-2 s ]} increases
27973a variable by 2, and @kbd{M-2 I s ]} replaces a variable by
27974minus-two minus the variable.
27975
27976The first six arithmetic stores can also be typed @kbd{s t +}, @kbd{s t -},
27977etc. The commands @kbd{s s +}, @kbd{s s -}, and so on are analogous
27978arithmetic stores that don't remove the value @expr{a} from the stack.
27979
27980All arithmetic stores report the new value of the variable in the
27981Trail for your information. They signal an error if the variable
27982previously had no stored value. If default simplifications have been
27983turned off, the arithmetic stores temporarily turn them on for numeric
27984arguments only (i.e., they temporarily do an @kbd{m N} command).
27985@xref{Simplification Modes}. Large vectors put in the trail by
27986these commands always use abbreviated (@kbd{t .}) mode.
27987
27988@kindex s m
27989@pindex calc-store-map
27990The @kbd{s m} command is a general way to adjust a variable's value
27991using any Calc function. It is a ``mapping'' command analogous to
27992@kbd{V M}, @kbd{V R}, etc. @xref{Reducing and Mapping}, to see
27993how to specify a function for a mapping command. Basically,
27994all you do is type the Calc command key that would invoke that
27995function normally. For example, @kbd{s m n} applies the @kbd{n}
27996key to negate the contents of the variable, so @kbd{s m n} is
27997equivalent to @kbd{s n}. Also, @kbd{s m Q} takes the square root
27998of the value stored in a variable, @kbd{s m v v} uses @kbd{v v} to
27999reverse the vector stored in the variable, and @kbd{s m H I S}
28000takes the hyperbolic arcsine of the variable contents.
28001
28002If the mapping function takes two or more arguments, the additional
28003arguments are taken from the stack; the old value of the variable
28004is provided as the first argument. Thus @kbd{s m -} with @expr{a}
28005on the stack computes @expr{v - a}, just like @kbd{s -}. With the
28006Inverse prefix, the variable's original value becomes the @emph{last}
28007argument instead of the first. Thus @kbd{I s m -} is also
28008equivalent to @kbd{I s -}.
28009
28010@kindex s x
28011@pindex calc-store-exchange
28012The @kbd{s x} (@code{calc-store-exchange}) command exchanges the value
28013of a variable with the value on the top of the stack. Naturally, the
28014variable must already have a stored value for this to work.
28015
28016You can type an equation or assignment at the @kbd{s x} prompt. The
28017command @kbd{s x a=6} takes no values from the stack; instead, it
28018pushes the old value of @samp{a} on the stack and stores @samp{a = 6}.
28019
28020@kindex s u
28021@pindex calc-unstore
28022@cindex Void variables
28023@cindex Un-storing variables
28024Until you store something in them, most variables are ``void,'' that is,
28025they contain no value at all. If they appear in an algebraic formula
28026they will be left alone even if you press @kbd{=} (@code{calc-evaluate}).
28027The @kbd{s u} (@code{calc-unstore}) command returns a variable to the
28028void state.
28029
28030@kindex s c
28031@pindex calc-copy-variable
28032The @kbd{s c} (@code{calc-copy-variable}) command copies the stored
28033value of one variable to another. One way it differs from a simple
28034@kbd{s r} followed by an @kbd{s t} (aside from saving keystrokes) is
28035that the value never goes on the stack and thus is never rounded,
28036evaluated, or simplified in any way; it is not even rounded down to the
28037current precision.
28038
28039The only variables with predefined values are the ``special constants''
28040@code{pi}, @code{e}, @code{i}, @code{phi}, and @code{gamma}. You are free
28041to unstore these variables or to store new values into them if you like,
28042although some of the algebraic-manipulation functions may assume these
28043variables represent their standard values. Calc displays a warning if
28044you change the value of one of these variables, or of one of the other
28045special variables @code{inf}, @code{uinf}, and @code{nan} (which are
28046normally void).
28047
28048Note that @code{pi} doesn't actually have 3.14159265359 stored in it,
28049but rather a special magic value that evaluates to @cpi{} at the current
28050precision. Likewise @code{e}, @code{i}, and @code{phi} evaluate
28051according to the current precision or polar mode. If you recall a value
28052from @code{pi} and store it back, this magic property will be lost. The
28053magic property is preserved, however, when a variable is copied with
28054@kbd{s c}.
28055
28056@kindex s k
28057@pindex calc-copy-special-constant
28058If one of the ``special constants'' is redefined (or undefined) so that
28059it no longer has its magic property, the property can be restored with
28060@kbd{s k} (@code{calc-copy-special-constant}). This command will prompt
28061for a special constant and a variable to store it in, and so a special
28062constant can be stored in any variable. Here, the special constant that
28063you enter doesn't depend on the value of the corresponding variable;
28064@code{pi} will represent 3.14159@dots{} regardless of what is currently
28065stored in the Calc variable @code{pi}. If one of the other special
28066variables, @code{inf}, @code{uinf} or @code{nan}, is given a value, its
28067original behavior can be restored by voiding it with @kbd{s u}.
28068
28069@node Recalling Variables, Operations on Variables, Storing Variables, Store and Recall
28070@section Recalling Variables
28071
28072@noindent
28073@kindex s r
28074@pindex calc-recall
28075@cindex Recalling variables
28076The most straightforward way to extract the stored value from a variable
28077is to use the @kbd{s r} (@code{calc-recall}) command. This command prompts
28078for a variable name (similarly to @code{calc-store}), looks up the value
28079of the specified variable, and pushes that value onto the stack. It is
28080an error to try to recall a void variable.
28081
28082It is also possible to recall the value from a variable by evaluating a
28083formula containing that variable. For example, @kbd{' a @key{RET} =} is
28084the same as @kbd{s r a @key{RET}} except that if the variable is void, the
28085former will simply leave the formula @samp{a} on the stack whereas the
28086latter will produce an error message.
28087
28088@kindex r 0-9
28089The @kbd{r} prefix may be followed by a digit, so that @kbd{r 9} is
28090equivalent to @kbd{s r 9}. (The @kbd{r} prefix is otherwise unused
28091in the current version of Calc.)
28092
28093@node Operations on Variables, Let Command, Recalling Variables, Store and Recall
28094@section Other Operations on Variables
28095
28096@noindent
28097@kindex s e
28098@pindex calc-edit-variable
28099The @kbd{s e} (@code{calc-edit-variable}) command edits the stored
28100value of a variable without ever putting that value on the stack
28101or simplifying or evaluating the value. It prompts for the name of
28102the variable to edit. If the variable has no stored value, the
28103editing buffer will start out empty. If the editing buffer is
28104empty when you press @kbd{C-c C-c} to finish, the variable will
28105be made void. @xref{Editing Stack Entries}, for a general
28106description of editing.
28107
28108The @kbd{s e} command is especially useful for creating and editing
28109rewrite rules which are stored in variables. Sometimes these rules
28110contain formulas which must not be evaluated until the rules are
28111actually used. (For example, they may refer to @samp{deriv(x,y)},
28112where @code{x} will someday become some expression involving @code{y};
28113if you let Calc evaluate the rule while you are defining it, Calc will
28114replace @samp{deriv(x,y)} with 0 because the formula @code{x} does
28115not itself refer to @code{y}.) By contrast, recalling the variable,
28116editing with @kbd{`}, and storing will evaluate the variable's value
28117as a side effect of putting the value on the stack.
28118
28119@kindex s A
28120@kindex s D
28121@ignore
28122@mindex @idots
28123@end ignore
28124@kindex s E
28125@ignore
28126@mindex @null
28127@end ignore
28128@kindex s F
28129@ignore
28130@mindex @null
28131@end ignore
28132@kindex s G
28133@ignore
28134@mindex @null
28135@end ignore
28136@kindex s H
28137@ignore
28138@mindex @null
28139@end ignore
28140@kindex s I
28141@ignore
28142@mindex @null
28143@end ignore
28144@kindex s L
28145@ignore
28146@mindex @null
28147@end ignore
28148@kindex s P
28149@ignore
28150@mindex @null
28151@end ignore
28152@kindex s R
28153@ignore
28154@mindex @null
28155@end ignore
28156@kindex s T
28157@ignore
28158@mindex @null
28159@end ignore
28160@kindex s U
28161@ignore
28162@mindex @null
28163@end ignore
28164@kindex s X
28165@pindex calc-store-AlgSimpRules
28166@pindex calc-store-Decls
28167@pindex calc-store-EvalRules
28168@pindex calc-store-FitRules
28169@pindex calc-store-GenCount
28170@pindex calc-store-Holidays
28171@pindex calc-store-IntegLimit
28172@pindex calc-store-LineStyles
28173@pindex calc-store-PointStyles
28174@pindex calc-store-PlotRejects
28175@pindex calc-store-TimeZone
28176@pindex calc-store-Units
28177@pindex calc-store-ExtSimpRules
28178There are several special-purpose variable-editing commands that
28179use the @kbd{s} prefix followed by a shifted letter:
28180
28181@table @kbd
28182@item s A
28183Edit @code{AlgSimpRules}. @xref{Algebraic Simplifications}.
28184@item s D
28185Edit @code{Decls}. @xref{Declarations}.
28186@item s E
28187Edit @code{EvalRules}. @xref{Default Simplifications}.
28188@item s F
28189Edit @code{FitRules}. @xref{Curve Fitting}.
28190@item s G
28191Edit @code{GenCount}. @xref{Solving Equations}.
28192@item s H
28193Edit @code{Holidays}. @xref{Business Days}.
28194@item s I
28195Edit @code{IntegLimit}. @xref{Calculus}.
28196@item s L
28197Edit @code{LineStyles}. @xref{Graphics}.
28198@item s P
28199Edit @code{PointStyles}. @xref{Graphics}.
28200@item s R
28201Edit @code{PlotRejects}. @xref{Graphics}.
28202@item s T
28203Edit @code{TimeZone}. @xref{Time Zones}.
28204@item s U
28205Edit @code{Units}. @xref{User-Defined Units}.
28206@item s X
28207Edit @code{ExtSimpRules}. @xref{Unsafe Simplifications}.
28208@end table
28209
28210These commands are just versions of @kbd{s e} that use fixed variable
28211names rather than prompting for the variable name.
28212
28213@kindex s p
28214@pindex calc-permanent-variable
28215@cindex Storing variables
28216@cindex Permanent variables
28217@cindex Calc init file, variables
28218The @kbd{s p} (@code{calc-permanent-variable}) command saves a
28219variable's value permanently in your Calc init file (the file given by
28220the variable @code{calc-settings-file}, typically @file{~/.calc.el}), so
28221that its value will still be available in future Emacs sessions. You
28222can re-execute @w{@kbd{s p}} later on to update the saved value, but the
28223only way to remove a saved variable is to edit your calc init file
28224by hand. (@xref{General Mode Commands}, for a way to tell Calc to
28225use a different file for the Calc init file.)
28226
28227If you do not specify the name of a variable to save (i.e.,
28228@kbd{s p @key{RET}}), all Calc variables with defined values
28229are saved except for the special constants @code{pi}, @code{e},
28230@code{i}, @code{phi}, and @code{gamma}; the variables @code{TimeZone}
28231and @code{PlotRejects};
28232@code{FitRules}, @code{DistribRules}, and other built-in rewrite
28233rules; and @code{PlotData@var{n}} variables generated
28234by the graphics commands. (You can still save these variables by
28235explicitly naming them in an @kbd{s p} command.)
28236
28237@kindex s i
28238@pindex calc-insert-variables
28239The @kbd{s i} (@code{calc-insert-variables}) command writes
28240the values of all Calc variables into a specified buffer.
28241The variables are written with the prefix @code{var-} in the form of
28242Lisp @code{setq} commands
28243which store the values in string form. You can place these commands
28244in your Calc init file (or @file{.emacs}) if you wish, though in this case it
28245would be easier to use @kbd{s p @key{RET}}. (Note that @kbd{s i}
28246omits the same set of variables as @w{@kbd{s p @key{RET}}}; the difference
28247is that @kbd{s i} will store the variables in any buffer, and it also
28248stores in a more human-readable format.)
28249
28250@node Let Command, Evaluates-To Operator, Operations on Variables, Store and Recall
28251@section The Let Command
28252
28253@noindent
28254@kindex s l
28255@pindex calc-let
28256@cindex Variables, temporary assignment
28257@cindex Temporary assignment to variables
28258If you have an expression like @samp{a+b^2} on the stack and you wish to
28259compute its value where @expr{b=3}, you can simply store 3 in @expr{b} and
28260then press @kbd{=} to reevaluate the formula. This has the side-effect
28261of leaving the stored value of 3 in @expr{b} for future operations.
28262
28263The @kbd{s l} (@code{calc-let}) command evaluates a formula under a
28264@emph{temporary} assignment of a variable. It stores the value on the
28265top of the stack into the specified variable, then evaluates the
28266second-to-top stack entry, then restores the original value (or lack of one)
28267in the variable. Thus after @kbd{'@w{ }a+b^2 @key{RET} 3 s l b @key{RET}},
28268the stack will contain the formula @samp{a + 9}. The subsequent command
28269@kbd{@w{5 s l a} @key{RET}} will replace this formula with the number 14.
28270The variables @samp{a} and @samp{b} are not permanently affected in any way
28271by these commands.
28272
28273The value on the top of the stack may be an equation or assignment, or
28274a vector of equations or assignments, in which case the default will be
28275analogous to the case of @kbd{s t @key{RET}}. @xref{Storing Variables}.
28276
28277Also, you can answer the variable-name prompt with an equation or
28278assignment: @kbd{s l b=3 @key{RET}} is the same as storing 3 on the stack
28279and typing @kbd{s l b @key{RET}}.
28280
28281The @kbd{a b} (@code{calc-substitute}) command is another way to substitute
28282a variable with a value in a formula. It does an actual substitution
28283rather than temporarily assigning the variable and evaluating. For
28284example, letting @expr{n=2} in @samp{f(n pi)} with @kbd{a b} will
28285produce @samp{f(2 pi)}, whereas @kbd{s l} would give @samp{f(6.28)}
28286since the evaluation step will also evaluate @code{pi}.
28287
28288@node Evaluates-To Operator, , Let Command, Store and Recall
28289@section The Evaluates-To Operator
28290
28291@noindent
28292@tindex evalto
28293@tindex =>
28294@cindex Evaluates-to operator
28295@cindex @samp{=>} operator
28296The special algebraic symbol @samp{=>} is known as the @dfn{evaluates-to
28297operator}. (It will show up as an @code{evalto} function call in
28298other language modes like Pascal and La@TeX{}.) This is a binary
28299operator, that is, it has a lefthand and a righthand argument,
28300although it can be entered with the righthand argument omitted.
28301
28302A formula like @samp{@var{a} => @var{b}} is evaluated by Calc as
28303follows: First, @var{a} is not simplified or modified in any
28304way. The previous value of argument @var{b} is thrown away; the
28305formula @var{a} is then copied and evaluated as if by the @kbd{=}
28306command according to all current modes and stored variable values,
28307and the result is installed as the new value of @var{b}.
28308
28309For example, suppose you enter the algebraic formula @samp{2 + 3 => 17}.
28310The number 17 is ignored, and the lefthand argument is left in its
28311unevaluated form; the result is the formula @samp{2 + 3 => 5}.
28312
28313@kindex s =
28314@pindex calc-evalto
28315You can enter an @samp{=>} formula either directly using algebraic
28316entry (in which case the righthand side may be omitted since it is
28317going to be replaced right away anyhow), or by using the @kbd{s =}
28318(@code{calc-evalto}) command, which takes @var{a} from the stack
28319and replaces it with @samp{@var{a} => @var{b}}.
28320
28321Calc keeps track of all @samp{=>} operators on the stack, and
28322recomputes them whenever anything changes that might affect their
28323values, i.e., a mode setting or variable value. This occurs only
28324if the @samp{=>} operator is at the top level of the formula, or
28325if it is part of a top-level vector. In other words, pushing
28326@samp{2 + (a => 17)} will change the 17 to the actual value of
28327@samp{a} when you enter the formula, but the result will not be
28328dynamically updated when @samp{a} is changed later because the
28329@samp{=>} operator is buried inside a sum. However, a vector
28330of @samp{=>} operators will be recomputed, since it is convenient
28331to push a vector like @samp{[a =>, b =>, c =>]} on the stack to
28332make a concise display of all the variables in your problem.
28333(Another way to do this would be to use @samp{[a, b, c] =>},
28334which provides a slightly different format of display. You
28335can use whichever you find easiest to read.)
28336
28337@kindex m C
28338@pindex calc-auto-recompute
28339The @kbd{m C} (@code{calc-auto-recompute}) command allows you to
28340turn this automatic recomputation on or off. If you turn
28341recomputation off, you must explicitly recompute an @samp{=>}
28342operator on the stack in one of the usual ways, such as by
28343pressing @kbd{=}. Turning recomputation off temporarily can save
28344a lot of time if you will be changing several modes or variables
28345before you look at the @samp{=>} entries again.
28346
28347Most commands are not especially useful with @samp{=>} operators
28348as arguments. For example, given @samp{x + 2 => 17}, it won't
28349work to type @kbd{1 +} to get @samp{x + 3 => 18}. If you want
28350to operate on the lefthand side of the @samp{=>} operator on
28351the top of the stack, type @kbd{j 1} (that's the digit ``one'')
28352to select the lefthand side, execute your commands, then type
28353@kbd{j u} to unselect.
28354
28355All current modes apply when an @samp{=>} operator is computed,
28356including the current simplification mode. Recall that the
28357formula @samp{x + y + x} is not handled by Calc's default
28358simplifications, but the @kbd{a s} command will reduce it to
28359the simpler form @samp{y + 2 x}. You can also type @kbd{m A}
28360to enable an Algebraic Simplification mode in which the
28361equivalent of @kbd{a s} is used on all of Calc's results.
28362If you enter @samp{x + y + x =>} normally, the result will
28363be @samp{x + y + x => x + y + x}. If you change to
28364Algebraic Simplification mode, the result will be
28365@samp{x + y + x => y + 2 x}. However, just pressing @kbd{a s}
28366once will have no effect on @samp{x + y + x => x + y + x},
28367because the righthand side depends only on the lefthand side
28368and the current mode settings, and the lefthand side is not
28369affected by commands like @kbd{a s}.
28370
28371The ``let'' command (@kbd{s l}) has an interesting interaction
28372with the @samp{=>} operator. The @kbd{s l} command evaluates the
28373second-to-top stack entry with the top stack entry supplying
28374a temporary value for a given variable. As you might expect,
28375if that stack entry is an @samp{=>} operator its righthand
28376side will temporarily show this value for the variable. In
28377fact, all @samp{=>}s on the stack will be updated if they refer
28378to that variable. But this change is temporary in the sense
28379that the next command that causes Calc to look at those stack
28380entries will make them revert to the old variable value.
28381
28382@smallexample
28383@group
283842: a => a 2: a => 17 2: a => a
283851: a + 1 => a + 1 1: a + 1 => 18 1: a + 1 => a + 1
28386 . . .
28387
28388 17 s l a @key{RET} p 8 @key{RET}
28389@end group
28390@end smallexample
28391
28392Here the @kbd{p 8} command changes the current precision,
28393thus causing the @samp{=>} forms to be recomputed after the
28394influence of the ``let'' is gone. The @kbd{d @key{SPC}} command
28395(@code{calc-refresh}) is a handy way to force the @samp{=>}
28396operators on the stack to be recomputed without any other
28397side effects.
28398
28399@kindex s :
28400@pindex calc-assign
28401@tindex assign
28402@tindex :=
28403Embedded mode also uses @samp{=>} operators. In Embedded mode,
28404the lefthand side of an @samp{=>} operator can refer to variables
28405assigned elsewhere in the file by @samp{:=} operators. The
28406assignment operator @samp{a := 17} does not actually do anything
28407by itself. But Embedded mode recognizes it and marks it as a sort
28408of file-local definition of the variable. You can enter @samp{:=}
28409operators in Algebraic mode, or by using the @kbd{s :}
28410(@code{calc-assign}) [@code{assign}] command which takes a variable
28411and value from the stack and replaces them with an assignment.
28412
28413@xref{TeX and LaTeX Language Modes}, for the way @samp{=>} appears in
28414@TeX{} language output. The @dfn{eqn} mode gives similar
28415treatment to @samp{=>}.
28416
28417@node Graphics, Kill and Yank, Store and Recall, Top
28418@chapter Graphics
28419
28420@noindent
28421The commands for graphing data begin with the @kbd{g} prefix key. Calc
28422uses GNUPLOT 2.0 or later to do graphics. These commands will only work
28423if GNUPLOT is available on your system. (While GNUPLOT sounds like
28424a relative of GNU Emacs, it is actually completely unrelated.
28425However, it is free software. It can be obtained from
28426@samp{http://www.gnuplot.info}.)
28427
28428@vindex calc-gnuplot-name
28429If you have GNUPLOT installed on your system but Calc is unable to
28430find it, you may need to set the @code{calc-gnuplot-name} variable
28431in your Calc init file or @file{.emacs}. You may also need to set some Lisp
28432variables to show Calc how to run GNUPLOT on your system; these
28433are described under @kbd{g D} and @kbd{g O} below. If you are
28434using the X window system, Calc will configure GNUPLOT for you
28435automatically. If you have GNUPLOT 3.0 or later and you are not using X,
28436Calc will configure GNUPLOT to display graphs using simple character
28437graphics that will work on any terminal.
28438
28439@menu
28440* Basic Graphics::
28441* Three Dimensional Graphics::
28442* Managing Curves::
28443* Graphics Options::
28444* Devices::
28445@end menu
28446
28447@node Basic Graphics, Three Dimensional Graphics, Graphics, Graphics
28448@section Basic Graphics
28449
28450@noindent
28451@kindex g f
28452@pindex calc-graph-fast
28453The easiest graphics command is @kbd{g f} (@code{calc-graph-fast}).
28454This command takes two vectors of equal length from the stack.
28455The vector at the top of the stack represents the ``y'' values of
28456the various data points. The vector in the second-to-top position
28457represents the corresponding ``x'' values. This command runs
28458GNUPLOT (if it has not already been started by previous graphing
28459commands) and displays the set of data points. The points will
28460be connected by lines, and there will also be some kind of symbol
28461to indicate the points themselves.
28462
28463The ``x'' entry may instead be an interval form, in which case suitable
28464``x'' values are interpolated between the minimum and maximum values of
28465the interval (whether the interval is open or closed is ignored).
28466
28467The ``x'' entry may also be a number, in which case Calc uses the
28468sequence of ``x'' values @expr{x}, @expr{x+1}, @expr{x+2}, etc.
28469(Generally the number 0 or 1 would be used for @expr{x} in this case.)
28470
28471The ``y'' entry may be any formula instead of a vector. Calc effectively
28472uses @kbd{N} (@code{calc-eval-num}) to evaluate variables in the formula;
28473the result of this must be a formula in a single (unassigned) variable.
28474The formula is plotted with this variable taking on the various ``x''
28475values. Graphs of formulas by default use lines without symbols at the
28476computed data points. Note that if neither ``x'' nor ``y'' is a vector,
28477Calc guesses at a reasonable number of data points to use. See the
28478@kbd{g N} command below. (The ``x'' values must be either a vector
28479or an interval if ``y'' is a formula.)
28480
28481@ignore
28482@starindex
28483@end ignore
28484@tindex xy
28485If ``y'' is (or evaluates to) a formula of the form
28486@samp{xy(@var{x}, @var{y})} then the result is a
28487parametric plot. The two arguments of the fictitious @code{xy} function
28488are used as the ``x'' and ``y'' coordinates of the curve, respectively.
28489In this case the ``x'' vector or interval you specified is not directly
28490visible in the graph. For example, if ``x'' is the interval @samp{[0..360]}
28491and ``y'' is the formula @samp{xy(sin(t), cos(t))}, the resulting graph
28492will be a circle.
28493
28494Also, ``x'' and ``y'' may each be variable names, in which case Calc
28495looks for suitable vectors, intervals, or formulas stored in those
28496variables.
28497
28498The ``x'' and ``y'' values for the data points (as pulled from the vectors,
28499calculated from the formulas, or interpolated from the intervals) should
28500be real numbers (integers, fractions, or floats). One exception to this
28501is that the ``y'' entry can consist of a vector of numbers combined with
28502error forms, in which case the points will be plotted with the
28503appropriate error bars. Other than this, if either the ``x''
28504value or the ``y'' value of a given data point is not a real number, that
28505data point will be omitted from the graph. The points on either side
28506of the invalid point will @emph{not} be connected by a line.
28507
28508See the documentation for @kbd{g a} below for a description of the way
28509numeric prefix arguments affect @kbd{g f}.
28510
28511@cindex @code{PlotRejects} variable
28512@vindex PlotRejects
28513If you store an empty vector in the variable @code{PlotRejects}
28514(i.e., @kbd{[ ] s t PlotRejects}), Calc will append information to
28515this vector for every data point which was rejected because its
28516``x'' or ``y'' values were not real numbers. The result will be
28517a matrix where each row holds the curve number, data point number,
28518``x'' value, and ``y'' value for a rejected data point.
28519@xref{Evaluates-To Operator}, for a handy way to keep tabs on the
28520current value of @code{PlotRejects}. @xref{Operations on Variables},
28521for the @kbd{s R} command which is another easy way to examine
28522@code{PlotRejects}.
28523
28524@kindex g c
28525@pindex calc-graph-clear
28526To clear the graphics display, type @kbd{g c} (@code{calc-graph-clear}).
28527If the GNUPLOT output device is an X window, the window will go away.
28528Effects on other kinds of output devices will vary. You don't need
28529to use @kbd{g c} if you don't want to---if you give another @kbd{g f}
28530or @kbd{g p} command later on, it will reuse the existing graphics
28531window if there is one.
28532
28533@node Three Dimensional Graphics, Managing Curves, Basic Graphics, Graphics
28534@section Three-Dimensional Graphics
28535
28536@kindex g F
28537@pindex calc-graph-fast-3d
28538The @kbd{g F} (@code{calc-graph-fast-3d}) command makes a three-dimensional
28539graph. It works only if you have GNUPLOT 3.0 or later; with GNUPLOT 2.0,
28540you will see a GNUPLOT error message if you try this command.
28541
28542The @kbd{g F} command takes three values from the stack, called ``x'',
28543``y'', and ``z'', respectively. As was the case for 2D graphs, there
28544are several options for these values.
28545
28546In the first case, ``x'' and ``y'' are each vectors (not necessarily of
28547the same length); either or both may instead be interval forms. The
28548``z'' value must be a matrix with the same number of rows as elements
28549in ``x'', and the same number of columns as elements in ``y''. The
28550result is a surface plot where
28551@texline @math{z_{ij}}
28552@infoline @expr{z_ij}
28553is the height of the point
28554at coordinate @expr{(x_i, y_j)} on the surface. The 3D graph will
28555be displayed from a certain default viewpoint; you can change this
28556viewpoint by adding a @samp{set view} to the @samp{*Gnuplot Commands*}
28557buffer as described later. See the GNUPLOT documentation for a
28558description of the @samp{set view} command.
28559
28560Each point in the matrix will be displayed as a dot in the graph,
28561and these points will be connected by a grid of lines (@dfn{isolines}).
28562
28563In the second case, ``x'', ``y'', and ``z'' are all vectors of equal
28564length. The resulting graph displays a 3D line instead of a surface,
28565where the coordinates of points along the line are successive triplets
28566of values from the input vectors.
28567
28568In the third case, ``x'' and ``y'' are vectors or interval forms, and
28569``z'' is any formula involving two variables (not counting variables
28570with assigned values). These variables are sorted into alphabetical
28571order; the first takes on values from ``x'' and the second takes on
28572values from ``y'' to form a matrix of results that are graphed as a
285733D surface.
28574
28575@ignore
28576@starindex
28577@end ignore
28578@tindex xyz
28579If the ``z'' formula evaluates to a call to the fictitious function
28580@samp{xyz(@var{x}, @var{y}, @var{z})}, then the result is a
28581``parametric surface.'' In this case, the axes of the graph are
28582taken from the @var{x} and @var{y} values in these calls, and the
28583``x'' and ``y'' values from the input vectors or intervals are used only
28584to specify the range of inputs to the formula. For example, plotting
28585@samp{[0..360], [0..180], xyz(sin(x)*sin(y), cos(x)*sin(y), cos(y))}
28586will draw a sphere. (Since the default resolution for 3D plots is
285875 steps in each of ``x'' and ``y'', this will draw a very crude
28588sphere. You could use the @kbd{g N} command, described below, to
28589increase this resolution, or specify the ``x'' and ``y'' values as
28590vectors with more than 5 elements.
28591
28592It is also possible to have a function in a regular @kbd{g f} plot
28593evaluate to an @code{xyz} call. Since @kbd{g f} plots a line, not
28594a surface, the result will be a 3D parametric line. For example,
28595@samp{[[0..720], xyz(sin(x), cos(x), x)]} will plot two turns of a
28596helix (a three-dimensional spiral).
28597
28598As for @kbd{g f}, each of ``x'', ``y'', and ``z'' may instead be
28599variables containing the relevant data.
28600
28601@node Managing Curves, Graphics Options, Three Dimensional Graphics, Graphics
28602@section Managing Curves
28603
28604@noindent
28605The @kbd{g f} command is really shorthand for the following commands:
28606@kbd{C-u g d g a g p}. Likewise, @w{@kbd{g F}} is shorthand for
28607@kbd{C-u g d g A g p}. You can gain more control over your graph
28608by using these commands directly.
28609
28610@kindex g a
28611@pindex calc-graph-add
28612The @kbd{g a} (@code{calc-graph-add}) command adds the ``curve''
28613represented by the two values on the top of the stack to the current
28614graph. You can have any number of curves in the same graph. When
28615you give the @kbd{g p} command, all the curves will be drawn superimposed
28616on the same axes.
28617
28618The @kbd{g a} command (and many others that affect the current graph)
28619will cause a special buffer, @samp{*Gnuplot Commands*}, to be displayed
28620in another window. This buffer is a template of the commands that will
28621be sent to GNUPLOT when it is time to draw the graph. The first
28622@kbd{g a} command adds a @code{plot} command to this buffer. Succeeding
28623@kbd{g a} commands add extra curves onto that @code{plot} command.
28624Other graph-related commands put other GNUPLOT commands into this
28625buffer. In normal usage you never need to work with this buffer
28626directly, but you can if you wish. The only constraint is that there
28627must be only one @code{plot} command, and it must be the last command
28628in the buffer. If you want to save and later restore a complete graph
28629configuration, you can use regular Emacs commands to save and restore
28630the contents of the @samp{*Gnuplot Commands*} buffer.
28631
28632@vindex PlotData1
28633@vindex PlotData2
28634If the values on the stack are not variable names, @kbd{g a} will invent
28635variable names for them (of the form @samp{PlotData@var{n}}) and store
28636the values in those variables. The ``x'' and ``y'' variables are what
28637go into the @code{plot} command in the template. If you add a curve
28638that uses a certain variable and then later change that variable, you
28639can replot the graph without having to delete and re-add the curve.
28640That's because the variable name, not the vector, interval or formula
28641itself, is what was added by @kbd{g a}.
28642
28643A numeric prefix argument on @kbd{g a} or @kbd{g f} changes the way
28644stack entries are interpreted as curves. With a positive prefix
28645argument @expr{n}, the top @expr{n} stack entries are ``y'' values
28646for @expr{n} different curves which share a common ``x'' value in
28647the @expr{n+1}st stack entry. (Thus @kbd{g a} with no prefix
28648argument is equivalent to @kbd{C-u 1 g a}.)
28649
28650A prefix of zero or plain @kbd{C-u} means to take two stack entries,
28651``x'' and ``y'' as usual, but to interpret ``y'' as a vector of
28652``y'' values for several curves that share a common ``x''.
28653
28654A negative prefix argument tells Calc to read @expr{n} vectors from
28655the stack; each vector @expr{[x, y]} describes an independent curve.
28656This is the only form of @kbd{g a} that creates several curves at once
28657that don't have common ``x'' values. (Of course, the range of ``x''
28658values covered by all the curves ought to be roughly the same if
28659they are to look nice on the same graph.)
28660
28661For example, to plot
28662@texline @math{\sin n x}
28663@infoline @expr{sin(n x)}
28664for integers @expr{n}
28665from 1 to 5, you could use @kbd{v x} to create a vector of integers
28666(@expr{n}), then @kbd{V M '} or @kbd{V M $} to map @samp{sin(n x)}
28667across this vector. The resulting vector of formulas is suitable
28668for use as the ``y'' argument to a @kbd{C-u g a} or @kbd{C-u g f}
28669command.
28670
28671@kindex g A
28672@pindex calc-graph-add-3d
28673The @kbd{g A} (@code{calc-graph-add-3d}) command adds a 3D curve
28674to the graph. It is not valid to intermix 2D and 3D curves in a
28675single graph. This command takes three arguments, ``x'', ``y'',
28676and ``z'', from the stack. With a positive prefix @expr{n}, it
28677takes @expr{n+2} arguments (common ``x'' and ``y'', plus @expr{n}
28678separate ``z''s). With a zero prefix, it takes three stack entries
28679but the ``z'' entry is a vector of curve values. With a negative
28680prefix @expr{-n}, it takes @expr{n} vectors of the form @expr{[x, y, z]}.
28681The @kbd{g A} command works by adding a @code{splot} (surface-plot)
28682command to the @samp{*Gnuplot Commands*} buffer.
28683
28684(Although @kbd{g a} adds a 2D @code{plot} command to the
28685@samp{*Gnuplot Commands*} buffer, Calc changes this to @code{splot}
28686before sending it to GNUPLOT if it notices that the data points are
28687evaluating to @code{xyz} calls. It will not work to mix 2D and 3D
28688@kbd{g a} curves in a single graph, although Calc does not currently
28689check for this.)
28690
28691@kindex g d
28692@pindex calc-graph-delete
28693The @kbd{g d} (@code{calc-graph-delete}) command deletes the most
28694recently added curve from the graph. It has no effect if there are
28695no curves in the graph. With a numeric prefix argument of any kind,
28696it deletes all of the curves from the graph.
28697
28698@kindex g H
28699@pindex calc-graph-hide
28700The @kbd{g H} (@code{calc-graph-hide}) command ``hides'' or ``unhides''
28701the most recently added curve. A hidden curve will not appear in
28702the actual plot, but information about it such as its name and line and
28703point styles will be retained.
28704
28705@kindex g j
28706@pindex calc-graph-juggle
28707The @kbd{g j} (@code{calc-graph-juggle}) command moves the curve
28708at the end of the list (the ``most recently added curve'') to the
28709front of the list. The next-most-recent curve is thus exposed for
28710@w{@kbd{g d}} or similar commands to use. With @kbd{g j} you can work
28711with any curve in the graph even though curve-related commands only
28712affect the last curve in the list.
28713
28714@kindex g p
28715@pindex calc-graph-plot
28716The @kbd{g p} (@code{calc-graph-plot}) command uses GNUPLOT to draw
28717the graph described in the @samp{*Gnuplot Commands*} buffer. Any
28718GNUPLOT parameters which are not defined by commands in this buffer
28719are reset to their default values. The variables named in the @code{plot}
28720command are written to a temporary data file and the variable names
28721are then replaced by the file name in the template. The resulting
28722plotting commands are fed to the GNUPLOT program. See the documentation
28723for the GNUPLOT program for more specific information. All temporary
28724files are removed when Emacs or GNUPLOT exits.
28725
28726If you give a formula for ``y'', Calc will remember all the values that
28727it calculates for the formula so that later plots can reuse these values.
28728Calc throws out these saved values when you change any circumstances
28729that may affect the data, such as switching from Degrees to Radians
28730mode, or changing the value of a parameter in the formula. You can
28731force Calc to recompute the data from scratch by giving a negative
28732numeric prefix argument to @kbd{g p}.
28733
28734Calc uses a fairly rough step size when graphing formulas over intervals.
28735This is to ensure quick response. You can ``refine'' a plot by giving
28736a positive numeric prefix argument to @kbd{g p}. Calc goes through
28737the data points it has computed and saved from previous plots of the
28738function, and computes and inserts a new data point midway between
28739each of the existing points. You can refine a plot any number of times,
28740but beware that the amount of calculation involved doubles each time.
28741
28742Calc does not remember computed values for 3D graphs. This means the
28743numerix prefix argument, if any, to @kbd{g p} is effectively ignored if
28744the current graph is three-dimensional.
28745
28746@kindex g P
28747@pindex calc-graph-print
28748The @kbd{g P} (@code{calc-graph-print}) command is like @kbd{g p},
28749except that it sends the output to a printer instead of to the
28750screen. More precisely, @kbd{g p} looks for @samp{set terminal}
28751or @samp{set output} commands in the @samp{*Gnuplot Commands*} buffer;
28752lacking these it uses the default settings. However, @kbd{g P}
28753ignores @samp{set terminal} and @samp{set output} commands and
28754uses a different set of default values. All of these values are
28755controlled by the @kbd{g D} and @kbd{g O} commands discussed below.
28756Provided everything is set up properly, @kbd{g p} will plot to
28757the screen unless you have specified otherwise and @kbd{g P} will
28758always plot to the printer.
28759
28760@node Graphics Options, Devices, Managing Curves, Graphics
28761@section Graphics Options
28762
28763@noindent
28764@kindex g g
28765@pindex calc-graph-grid
28766The @kbd{g g} (@code{calc-graph-grid}) command turns the ``grid''
28767on and off. It is off by default; tick marks appear only at the
28768edges of the graph. With the grid turned on, dotted lines appear
28769across the graph at each tick mark. Note that this command only
28770changes the setting in @samp{*Gnuplot Commands*}; to see the effects
28771of the change you must give another @kbd{g p} command.
28772
28773@kindex g b
28774@pindex calc-graph-border
28775The @kbd{g b} (@code{calc-graph-border}) command turns the border
28776(the box that surrounds the graph) on and off. It is on by default.
28777This command will only work with GNUPLOT 3.0 and later versions.
28778
28779@kindex g k
28780@pindex calc-graph-key
28781The @kbd{g k} (@code{calc-graph-key}) command turns the ``key''
28782on and off. The key is a chart in the corner of the graph that
28783shows the correspondence between curves and line styles. It is
28784off by default, and is only really useful if you have several
28785curves on the same graph.
28786
28787@kindex g N
28788@pindex calc-graph-num-points
28789The @kbd{g N} (@code{calc-graph-num-points}) command allows you
28790to select the number of data points in the graph. This only affects
28791curves where neither ``x'' nor ``y'' is specified as a vector.
28792Enter a blank line to revert to the default value (initially 15).
28793With no prefix argument, this command affects only the current graph.
28794With a positive prefix argument this command changes or, if you enter
28795a blank line, displays the default number of points used for all
28796graphs created by @kbd{g a} that don't specify the resolution explicitly.
28797With a negative prefix argument, this command changes or displays
28798the default value (initially 5) used for 3D graphs created by @kbd{g A}.
28799Note that a 3D setting of 5 means that a total of @expr{5^2 = 25} points
28800will be computed for the surface.
28801
28802Data values in the graph of a function are normally computed to a
28803precision of five digits, regardless of the current precision at the
28804time. This is usually more than adequate, but there are cases where
28805it will not be. For example, plotting @expr{1 + x} with @expr{x} in the
28806interval @samp{[0 ..@: 1e-6]} will round all the data points down
28807to 1.0! Putting the command @samp{set precision @var{n}} in the
28808@samp{*Gnuplot Commands*} buffer will cause the data to be computed
28809at precision @var{n} instead of 5. Since this is such a rare case,
28810there is no keystroke-based command to set the precision.
28811
28812@kindex g h
28813@pindex calc-graph-header
28814The @kbd{g h} (@code{calc-graph-header}) command sets the title
28815for the graph. This will show up centered above the graph.
28816The default title is blank (no title).
28817
28818@kindex g n
28819@pindex calc-graph-name
28820The @kbd{g n} (@code{calc-graph-name}) command sets the title of an
28821individual curve. Like the other curve-manipulating commands, it
28822affects the most recently added curve, i.e., the last curve on the
28823list in the @samp{*Gnuplot Commands*} buffer. To set the title of
28824the other curves you must first juggle them to the end of the list
28825with @kbd{g j}, or edit the @samp{*Gnuplot Commands*} buffer by hand.
28826Curve titles appear in the key; if the key is turned off they are
28827not used.
28828
28829@kindex g t
28830@kindex g T
28831@pindex calc-graph-title-x
28832@pindex calc-graph-title-y
28833The @kbd{g t} (@code{calc-graph-title-x}) and @kbd{g T}
28834(@code{calc-graph-title-y}) commands set the titles on the ``x''
28835and ``y'' axes, respectively. These titles appear next to the
28836tick marks on the left and bottom edges of the graph, respectively.
28837Calc does not have commands to control the tick marks themselves,
28838but you can edit them into the @samp{*Gnuplot Commands*} buffer if
28839you wish. See the GNUPLOT documentation for details.
28840
28841@kindex g r
28842@kindex g R
28843@pindex calc-graph-range-x
28844@pindex calc-graph-range-y
28845The @kbd{g r} (@code{calc-graph-range-x}) and @kbd{g R}
28846(@code{calc-graph-range-y}) commands set the range of values on the
28847``x'' and ``y'' axes, respectively. You are prompted to enter a
28848suitable range. This should be either a pair of numbers of the
28849form, @samp{@var{min}:@var{max}}, or a blank line to revert to the
28850default behavior of setting the range based on the range of values
28851in the data, or @samp{$} to take the range from the top of the stack.
28852Ranges on the stack can be represented as either interval forms or
28853vectors: @samp{[@var{min} ..@: @var{max}]} or @samp{[@var{min}, @var{max}]}.
28854
28855@kindex g l
28856@kindex g L
28857@pindex calc-graph-log-x
28858@pindex calc-graph-log-y
28859The @kbd{g l} (@code{calc-graph-log-x}) and @kbd{g L} (@code{calc-graph-log-y})
28860commands allow you to set either or both of the axes of the graph to
28861be logarithmic instead of linear.
28862
28863@kindex g C-l
28864@kindex g C-r
28865@kindex g C-t
28866@pindex calc-graph-log-z
28867@pindex calc-graph-range-z
28868@pindex calc-graph-title-z
28869For 3D plots, @kbd{g C-t}, @kbd{g C-r}, and @kbd{g C-l} (those are
28870letters with the Control key held down) are the corresponding commands
28871for the ``z'' axis.
28872
28873@kindex g z
28874@kindex g Z
28875@pindex calc-graph-zero-x
28876@pindex calc-graph-zero-y
28877The @kbd{g z} (@code{calc-graph-zero-x}) and @kbd{g Z}
28878(@code{calc-graph-zero-y}) commands control whether a dotted line is
28879drawn to indicate the ``x'' and/or ``y'' zero axes. (These are the same
28880dotted lines that would be drawn there anyway if you used @kbd{g g} to
28881turn the ``grid'' feature on.) Zero-axis lines are on by default, and
28882may be turned off only in GNUPLOT 3.0 and later versions. They are
28883not available for 3D plots.
28884
28885@kindex g s
28886@pindex calc-graph-line-style
28887The @kbd{g s} (@code{calc-graph-line-style}) command turns the connecting
28888lines on or off for the most recently added curve, and optionally selects
28889the style of lines to be used for that curve. Plain @kbd{g s} simply
28890toggles the lines on and off. With a numeric prefix argument, @kbd{g s}
28891turns lines on and sets a particular line style. Line style numbers
28892start at one and their meanings vary depending on the output device.
28893GNUPLOT guarantees that there will be at least six different line styles
28894available for any device.
28895
28896@kindex g S
28897@pindex calc-graph-point-style
28898The @kbd{g S} (@code{calc-graph-point-style}) command similarly turns
28899the symbols at the data points on or off, or sets the point style.
28900If you turn both lines and points off, the data points will show as
28901tiny dots. If the ``y'' values being plotted contain error forms and
28902the connecting lines are turned off, then this command will also turn
28903the error bars on or off.
28904
28905@cindex @code{LineStyles} variable
28906@cindex @code{PointStyles} variable
28907@vindex LineStyles
28908@vindex PointStyles
28909Another way to specify curve styles is with the @code{LineStyles} and
28910@code{PointStyles} variables. These variables initially have no stored
28911values, but if you store a vector of integers in one of these variables,
28912the @kbd{g a} and @kbd{g f} commands will use those style numbers
28913instead of the defaults for new curves that are added to the graph.
28914An entry should be a positive integer for a specific style, or 0 to let
28915the style be chosen automatically, or @mathit{-1} to turn off lines or points
28916altogether. If there are more curves than elements in the vector, the
28917last few curves will continue to have the default styles. Of course,
28918you can later use @kbd{g s} and @kbd{g S} to change any of these styles.
28919
28920For example, @kbd{'[2 -1 3] @key{RET} s t LineStyles} causes the first curve
28921to have lines in style number 2, the second curve to have no connecting
28922lines, and the third curve to have lines in style 3. Point styles will
28923still be assigned automatically, but you could store another vector in
28924@code{PointStyles} to define them, too.
28925
28926@node Devices, , Graphics Options, Graphics
28927@section Graphical Devices
28928
28929@noindent
28930@kindex g D
28931@pindex calc-graph-device
28932The @kbd{g D} (@code{calc-graph-device}) command sets the device name
28933(or ``terminal name'' in GNUPLOT lingo) to be used by @kbd{g p} commands
28934on this graph. It does not affect the permanent default device name.
28935If you enter a blank name, the device name reverts to the default.
28936Enter @samp{?} to see a list of supported devices.
28937
28938With a positive numeric prefix argument, @kbd{g D} instead sets
28939the default device name, used by all plots in the future which do
28940not override it with a plain @kbd{g D} command. If you enter a
28941blank line this command shows you the current default. The special
28942name @code{default} signifies that Calc should choose @code{x11} if
28943the X window system is in use (as indicated by the presence of a
28944@code{DISPLAY} environment variable), or otherwise @code{dumb} under
28945GNUPLOT 3.0 and later, or @code{postscript} under GNUPLOT 2.0.
28946This is the initial default value.
28947
28948The @code{dumb} device is an interface to ``dumb terminals,'' i.e.,
28949terminals with no special graphics facilities. It writes a crude
28950picture of the graph composed of characters like @code{-} and @code{|}
28951to a buffer called @samp{*Gnuplot Trail*}, which Calc then displays.
28952The graph is made the same size as the Emacs screen, which on most
28953dumb terminals will be
28954@texline @math{80\times24}
28955@infoline 80x24
28956characters. The graph is displayed in
28957an Emacs ``recursive edit''; type @kbd{q} or @kbd{C-c C-c} to exit
28958the recursive edit and return to Calc. Note that the @code{dumb}
28959device is present only in GNUPLOT 3.0 and later versions.
28960
28961The word @code{dumb} may be followed by two numbers separated by
28962spaces. These are the desired width and height of the graph in
28963characters. Also, the device name @code{big} is like @code{dumb}
28964but creates a graph four times the width and height of the Emacs
28965screen. You will then have to scroll around to view the entire
28966graph. In the @samp{*Gnuplot Trail*} buffer, @key{SPC}, @key{DEL},
28967@kbd{<}, and @kbd{>} are defined to scroll by one screenful in each
28968of the four directions.
28969
28970With a negative numeric prefix argument, @kbd{g D} sets or displays
28971the device name used by @kbd{g P} (@code{calc-graph-print}). This
28972is initially @code{postscript}. If you don't have a PostScript
28973printer, you may decide once again to use @code{dumb} to create a
28974plot on any text-only printer.
28975
28976@kindex g O
28977@pindex calc-graph-output
28978The @kbd{g O} (@code{calc-graph-output}) command sets the name of
28979the output file used by GNUPLOT. For some devices, notably @code{x11},
28980there is no output file and this information is not used. Many other
28981``devices'' are really file formats like @code{postscript}; in these
28982cases the output in the desired format goes into the file you name
28983with @kbd{g O}. Type @kbd{g O stdout @key{RET}} to set GNUPLOT to write
28984to its standard output stream, i.e., to @samp{*Gnuplot Trail*}.
28985This is the default setting.
28986
28987Another special output name is @code{tty}, which means that GNUPLOT
28988is going to write graphics commands directly to its standard output,
28989which you wish Emacs to pass through to your terminal. Tektronix
28990graphics terminals, among other devices, operate this way. Calc does
28991this by telling GNUPLOT to write to a temporary file, then running a
28992sub-shell executing the command @samp{cat tempfile >/dev/tty}. On
28993typical Unix systems, this will copy the temporary file directly to
28994the terminal, bypassing Emacs entirely. You will have to type @kbd{C-l}
28995to Emacs afterwards to refresh the screen.
28996
28997Once again, @kbd{g O} with a positive or negative prefix argument
28998sets the default or printer output file names, respectively. In each
28999case you can specify @code{auto}, which causes Calc to invent a temporary
29000file name for each @kbd{g p} (or @kbd{g P}) command. This temporary file
29001will be deleted once it has been displayed or printed. If the output file
29002name is not @code{auto}, the file is not automatically deleted.
29003
29004The default and printer devices and output files can be saved
29005permanently by the @kbd{m m} (@code{calc-save-modes}) command. The
29006default number of data points (see @kbd{g N}) and the X geometry
29007(see @kbd{g X}) are also saved. Other graph information is @emph{not}
29008saved; you can save a graph's configuration simply by saving the contents
29009of the @samp{*Gnuplot Commands*} buffer.
29010
29011@vindex calc-gnuplot-plot-command
29012@vindex calc-gnuplot-default-device
29013@vindex calc-gnuplot-default-output
29014@vindex calc-gnuplot-print-command
29015@vindex calc-gnuplot-print-device
29016@vindex calc-gnuplot-print-output
29017You may wish to configure the default and
29018printer devices and output files for the whole system. The relevant
29019Lisp variables are @code{calc-gnuplot-default-device} and @code{-output},
29020and @code{calc-gnuplot-print-device} and @code{-output}. The output
29021file names must be either strings as described above, or Lisp
29022expressions which are evaluated on the fly to get the output file names.
29023
29024Other important Lisp variables are @code{calc-gnuplot-plot-command} and
29025@code{calc-gnuplot-print-command}, which give the system commands to
29026display or print the output of GNUPLOT, respectively. These may be
29027@code{nil} if no command is necessary, or strings which can include
29028@samp{%s} to signify the name of the file to be displayed or printed.
29029Or, these variables may contain Lisp expressions which are evaluated
29030to display or print the output. These variables are customizable
29031(@pxref{Customizing Calc}).
29032
29033@kindex g x
29034@pindex calc-graph-display
29035The @kbd{g x} (@code{calc-graph-display}) command lets you specify
29036on which X window system display your graphs should be drawn. Enter
29037a blank line to see the current display name. This command has no
29038effect unless the current device is @code{x11}.
29039
29040@kindex g X
29041@pindex calc-graph-geometry
29042The @kbd{g X} (@code{calc-graph-geometry}) command is a similar
29043command for specifying the position and size of the X window.
29044The normal value is @code{default}, which generally means your
29045window manager will let you place the window interactively.
29046Entering @samp{800x500+0+0} would create an 800-by-500 pixel
29047window in the upper-left corner of the screen.
29048
29049The buffer called @samp{*Gnuplot Trail*} holds a transcript of the
29050session with GNUPLOT. This shows the commands Calc has ``typed'' to
29051GNUPLOT and the responses it has received. Calc tries to notice when an
29052error message has appeared here and display the buffer for you when
29053this happens. You can check this buffer yourself if you suspect
29054something has gone wrong.
29055
29056@kindex g C
29057@pindex calc-graph-command
29058The @kbd{g C} (@code{calc-graph-command}) command prompts you to
29059enter any line of text, then simply sends that line to the current
29060GNUPLOT process. The @samp{*Gnuplot Trail*} buffer looks deceptively
29061like a Shell buffer but you can't type commands in it yourself.
29062Instead, you must use @kbd{g C} for this purpose.
29063
29064@kindex g v
29065@kindex g V
29066@pindex calc-graph-view-commands
29067@pindex calc-graph-view-trail
29068The @kbd{g v} (@code{calc-graph-view-commands}) and @kbd{g V}
29069(@code{calc-graph-view-trail}) commands display the @samp{*Gnuplot Commands*}
29070and @samp{*Gnuplot Trail*} buffers, respectively, in another window.
29071This happens automatically when Calc thinks there is something you
29072will want to see in either of these buffers. If you type @kbd{g v}
29073or @kbd{g V} when the relevant buffer is already displayed, the
29074buffer is hidden again.
29075
29076One reason to use @kbd{g v} is to add your own commands to the
29077@samp{*Gnuplot Commands*} buffer. Press @kbd{g v}, then use
29078@kbd{C-x o} to switch into that window. For example, GNUPLOT has
29079@samp{set label} and @samp{set arrow} commands that allow you to
29080annotate your plots. Since Calc doesn't understand these commands,
29081you have to add them to the @samp{*Gnuplot Commands*} buffer
29082yourself, then use @w{@kbd{g p}} to replot using these new commands. Note
29083that your commands must appear @emph{before} the @code{plot} command.
29084To get help on any GNUPLOT feature, type, e.g., @kbd{g C help set label}.
29085You may have to type @kbd{g C @key{RET}} a few times to clear the
29086``press return for more'' or ``subtopic of @dots{}'' requests.
29087Note that Calc always sends commands (like @samp{set nolabel}) to
29088reset all plotting parameters to the defaults before each plot, so
29089to delete a label all you need to do is delete the @samp{set label}
29090line you added (or comment it out with @samp{#}) and then replot
29091with @kbd{g p}.
29092
29093@kindex g q
29094@pindex calc-graph-quit
29095You can use @kbd{g q} (@code{calc-graph-quit}) to kill the GNUPLOT
29096process that is running. The next graphing command you give will
29097start a fresh GNUPLOT process. The word @samp{Graph} appears in
29098the Calc window's mode line whenever a GNUPLOT process is currently
29099running. The GNUPLOT process is automatically killed when you
29100exit Emacs if you haven't killed it manually by then.
29101
29102@kindex g K
29103@pindex calc-graph-kill
29104The @kbd{g K} (@code{calc-graph-kill}) command is like @kbd{g q}
29105except that it also views the @samp{*Gnuplot Trail*} buffer so that
29106you can see the process being killed. This is better if you are
29107killing GNUPLOT because you think it has gotten stuck.
29108
29109@node Kill and Yank, Keypad Mode, Graphics, Top
29110@chapter Kill and Yank Functions
29111
29112@noindent
29113The commands in this chapter move information between the Calculator and
29114other Emacs editing buffers.
29115
29116In many cases Embedded mode is an easier and more natural way to
29117work with Calc from a regular editing buffer. @xref{Embedded Mode}.
29118
29119@menu
29120* Killing From Stack::
29121* Yanking Into Stack::
29122* Grabbing From Buffers::
29123* Yanking Into Buffers::
29124* X Cut and Paste::
29125@end menu
29126
29127@node Killing From Stack, Yanking Into Stack, Kill and Yank, Kill and Yank
29128@section Killing from the Stack
29129
29130@noindent
29131@kindex C-k
29132@pindex calc-kill
29133@kindex M-k
29134@pindex calc-copy-as-kill
29135@kindex C-w
29136@pindex calc-kill-region
29137@kindex M-w
29138@pindex calc-copy-region-as-kill
29139@cindex Kill ring
29140@dfn{Kill} commands are Emacs commands that insert text into the
29141``kill ring,'' from which it can later be ``yanked'' by a @kbd{C-y}
29142command. Three common kill commands in normal Emacs are @kbd{C-k}, which
29143kills one line, @kbd{C-w}, which kills the region between mark and point,
29144and @kbd{M-w}, which puts the region into the kill ring without actually
29145deleting it. All of these commands work in the Calculator, too. Also,
29146@kbd{M-k} has been provided to complete the set; it puts the current line
29147into the kill ring without deleting anything.
29148
29149The kill commands are unusual in that they pay attention to the location
29150of the cursor in the Calculator buffer. If the cursor is on or below the
29151bottom line, the kill commands operate on the top of the stack. Otherwise,
29152they operate on whatever stack element the cursor is on. Calc's kill
29153commands always operate on whole stack entries. (They act the same as their
29154standard Emacs cousins except they ``round up'' the specified region to
29155encompass full lines.) The text is copied into the kill ring exactly as
29156it appears on the screen, including line numbers if they are enabled.
29157
29158A numeric prefix argument to @kbd{C-k} or @kbd{M-k} affects the number
29159of lines killed. A positive argument kills the current line and @expr{n-1}
29160lines below it. A negative argument kills the @expr{-n} lines above the
29161current line. Again this mirrors the behavior of the standard Emacs
29162@kbd{C-k} command. Although a whole line is always deleted, @kbd{C-k}
29163with no argument copies only the number itself into the kill ring, whereas
29164@kbd{C-k} with a prefix argument of 1 copies the number with its trailing
29165newline.
29166
29167@node Yanking Into Stack, Grabbing From Buffers, Killing From Stack, Kill and Yank
29168@section Yanking into the Stack
29169
29170@noindent
29171@kindex C-y
29172@pindex calc-yank
29173The @kbd{C-y} command yanks the most recently killed text back into the
29174Calculator. It pushes this value onto the top of the stack regardless of
29175the cursor position. In general it re-parses the killed text as a number
29176or formula (or a list of these separated by commas or newlines). However if
29177the thing being yanked is something that was just killed from the Calculator
29178itself, its full internal structure is yanked. For example, if you have
29179set the floating-point display mode to show only four significant digits,
29180then killing and re-yanking 3.14159 (which displays as 3.142) will yank the
29181full 3.14159, even though yanking it into any other buffer would yank the
29182number in its displayed form, 3.142. (Since the default display modes
29183show all objects to their full precision, this feature normally makes no
29184difference.)
29185
29186@node Grabbing From Buffers, Yanking Into Buffers, Yanking Into Stack, Kill and Yank
29187@section Grabbing from Other Buffers
29188
29189@noindent
29190@kindex C-x * g
29191@pindex calc-grab-region
29192The @kbd{C-x * g} (@code{calc-grab-region}) command takes the text between
29193point and mark in the current buffer and attempts to parse it as a
29194vector of values. Basically, it wraps the text in vector brackets
29195@samp{[ ]} unless the text already is enclosed in vector brackets,
29196then reads the text as if it were an algebraic entry. The contents
29197of the vector may be numbers, formulas, or any other Calc objects.
29198If the @kbd{C-x * g} command works successfully, it does an automatic
29199@kbd{C-x * c} to enter the Calculator buffer.
29200
29201A numeric prefix argument grabs the specified number of lines around
29202point, ignoring the mark. A positive prefix grabs from point to the
29203@expr{n}th following newline (so that @kbd{M-1 C-x * g} grabs from point
29204to the end of the current line); a negative prefix grabs from point
29205back to the @expr{n+1}st preceding newline. In these cases the text
29206that is grabbed is exactly the same as the text that @kbd{C-k} would
29207delete given that prefix argument.
29208
29209A prefix of zero grabs the current line; point may be anywhere on the
29210line.
29211
29212A plain @kbd{C-u} prefix interprets the region between point and mark
29213as a single number or formula rather than a vector. For example,
29214@kbd{C-x * g} on the text @samp{2 a b} produces the vector of three
29215values @samp{[2, a, b]}, but @kbd{C-u C-x * g} on the same region
29216reads a formula which is a product of three things: @samp{2 a b}.
29217(The text @samp{a + b}, on the other hand, will be grabbed as a
29218vector of one element by plain @kbd{C-x * g} because the interpretation
29219@samp{[a, +, b]} would be a syntax error.)
29220
29221If a different language has been specified (@pxref{Language Modes}),
29222the grabbed text will be interpreted according to that language.
29223
29224@kindex C-x * r
29225@pindex calc-grab-rectangle
29226The @kbd{C-x * r} (@code{calc-grab-rectangle}) command takes the text between
29227point and mark and attempts to parse it as a matrix. If point and mark
29228are both in the leftmost column, the lines in between are parsed in their
29229entirety. Otherwise, point and mark define the corners of a rectangle
29230whose contents are parsed.
29231
29232Each line of the grabbed area becomes a row of the matrix. The result
29233will actually be a vector of vectors, which Calc will treat as a matrix
29234only if every row contains the same number of values.
29235
29236If a line contains a portion surrounded by square brackets (or curly
29237braces), that portion is interpreted as a vector which becomes a row
29238of the matrix. Any text surrounding the bracketed portion on the line
29239is ignored.
29240
29241Otherwise, the entire line is interpreted as a row vector as if it
29242were surrounded by square brackets. Leading line numbers (in the
29243format used in the Calc stack buffer) are ignored. If you wish to
29244force this interpretation (even if the line contains bracketed
29245portions), give a negative numeric prefix argument to the
29246@kbd{C-x * r} command.
29247
29248If you give a numeric prefix argument of zero or plain @kbd{C-u}, each
29249line is instead interpreted as a single formula which is converted into
29250a one-element vector. Thus the result of @kbd{C-u C-x * r} will be a
29251one-column matrix. For example, suppose one line of the data is the
29252expression @samp{2 a}. A plain @w{@kbd{C-x * r}} will interpret this as
29253@samp{[2 a]}, which in turn is read as a two-element vector that forms
29254one row of the matrix. But a @kbd{C-u C-x * r} will interpret this row
29255as @samp{[2*a]}.
29256
29257If you give a positive numeric prefix argument @var{n}, then each line
29258will be split up into columns of width @var{n}; each column is parsed
29259separately as a matrix element. If a line contained
29260@w{@samp{2 +/- 3 4 +/- 5}}, then grabbing with a prefix argument of 8
29261would correctly split the line into two error forms.
29262
29263@xref{Matrix Functions}, to see how to pull the matrix apart into its
29264constituent rows and columns. (If it is a
29265@texline @math{1\times1}
29266@infoline 1x1
29267matrix, just hit @kbd{v u} (@code{calc-unpack}) twice.)
29268
29269@kindex C-x * :
29270@kindex C-x * _
29271@pindex calc-grab-sum-across
29272@pindex calc-grab-sum-down
29273@cindex Summing rows and columns of data
29274The @kbd{C-x * :} (@code{calc-grab-sum-down}) command is a handy way to
29275grab a rectangle of data and sum its columns. It is equivalent to
29276typing @kbd{C-x * r}, followed by @kbd{V R : +} (the vector reduction
29277command that sums the columns of a matrix; @pxref{Reducing}). The
29278result of the command will be a vector of numbers, one for each column
29279in the input data. The @kbd{C-x * _} (@code{calc-grab-sum-across}) command
29280similarly grabs a rectangle and sums its rows by executing @w{@kbd{V R _ +}}.
29281
29282As well as being more convenient, @kbd{C-x * :} and @kbd{C-x * _} are also
29283much faster because they don't actually place the grabbed vector on
29284the stack. In a @kbd{C-x * r V R : +} sequence, formatting the vector
29285for display on the stack takes a large fraction of the total time
29286(unless you have planned ahead and used @kbd{v .} and @kbd{t .} modes).
29287
29288For example, suppose we have a column of numbers in a file which we
29289wish to sum. Go to one corner of the column and press @kbd{C-@@} to
29290set the mark; go to the other corner and type @kbd{C-x * :}. Since there
29291is only one column, the result will be a vector of one number, the sum.
29292(You can type @kbd{v u} to unpack this vector into a plain number if
29293you want to do further arithmetic with it.)
29294
29295To compute the product of the column of numbers, we would have to do
29296it ``by hand'' since there's no special grab-and-multiply command.
29297Use @kbd{C-x * r} to grab the column of numbers into the calculator in
29298the form of a column matrix. The statistics command @kbd{u *} is a
29299handy way to find the product of a vector or matrix of numbers.
29300@xref{Statistical Operations}. Another approach would be to use
29301an explicit column reduction command, @kbd{V R : *}.
29302
29303@node Yanking Into Buffers, X Cut and Paste, Grabbing From Buffers, Kill and Yank
29304@section Yanking into Other Buffers
29305
29306@noindent
29307@kindex y
29308@pindex calc-copy-to-buffer
29309The plain @kbd{y} (@code{calc-copy-to-buffer}) command inserts the number
29310at the top of the stack into the most recently used normal editing buffer.
29311(More specifically, this is the most recently used buffer which is displayed
29312in a window and whose name does not begin with @samp{*}. If there is no
29313such buffer, this is the most recently used buffer except for Calculator
29314and Calc Trail buffers.) The number is inserted exactly as it appears and
29315without a newline. (If line-numbering is enabled, the line number is
29316normally not included.) The number is @emph{not} removed from the stack.
29317
29318With a prefix argument, @kbd{y} inserts several numbers, one per line.
29319A positive argument inserts the specified number of values from the top
29320of the stack. A negative argument inserts the @expr{n}th value from the
29321top of the stack. An argument of zero inserts the entire stack. Note
29322that @kbd{y} with an argument of 1 is slightly different from @kbd{y}
29323with no argument; the former always copies full lines, whereas the
29324latter strips off the trailing newline.
29325
29326With a lone @kbd{C-u} as a prefix argument, @kbd{y} @emph{replaces} the
29327region in the other buffer with the yanked text, then quits the
29328Calculator, leaving you in that buffer. A typical use would be to use
29329@kbd{C-x * g} to read a region of data into the Calculator, operate on the
29330data to produce a new matrix, then type @kbd{C-u y} to replace the
29331original data with the new data. One might wish to alter the matrix
29332display style (@pxref{Vector and Matrix Formats}) or change the current
29333display language (@pxref{Language Modes}) before doing this. Also, note
29334that this command replaces a linear region of text (as grabbed by
29335@kbd{C-x * g}), not a rectangle (as grabbed by @kbd{C-x * r}).
29336
29337If the editing buffer is in overwrite (as opposed to insert) mode,
29338and the @kbd{C-u} prefix was not used, then the yanked number will
29339overwrite the characters following point rather than being inserted
29340before those characters. The usual conventions of overwrite mode
29341are observed; for example, characters will be inserted at the end of
29342a line rather than overflowing onto the next line. Yanking a multi-line
29343object such as a matrix in overwrite mode overwrites the next @var{n}
29344lines in the buffer, lengthening or shortening each line as necessary.
29345Finally, if the thing being yanked is a simple integer or floating-point
29346number (like @samp{-1.2345e-3}) and the characters following point also
29347make up such a number, then Calc will replace that number with the new
29348number, lengthening or shortening as necessary. The concept of
29349``overwrite mode'' has thus been generalized from overwriting characters
29350to overwriting one complete number with another.
29351
29352@kindex C-x * y
29353The @kbd{C-x * y} key sequence is equivalent to @kbd{y} except that
29354it can be typed anywhere, not just in Calc. This provides an easy
29355way to guarantee that Calc knows which editing buffer you want to use!
29356
29357@node X Cut and Paste, , Yanking Into Buffers, Kill and Yank
29358@section X Cut and Paste
29359
29360@noindent
29361If you are using Emacs with the X window system, there is an easier
29362way to move small amounts of data into and out of the calculator:
29363Use the mouse-oriented cut and paste facilities of X.
29364
29365The default bindings for a three-button mouse cause the left button
29366to move the Emacs cursor to the given place, the right button to
29367select the text between the cursor and the clicked location, and
29368the middle button to yank the selection into the buffer at the
29369clicked location. So, if you have a Calc window and an editing
29370window on your Emacs screen, you can use left-click/right-click
29371to select a number, vector, or formula from one window, then
29372middle-click to paste that value into the other window. When you
29373paste text into the Calc window, Calc interprets it as an algebraic
29374entry. It doesn't matter where you click in the Calc window; the
29375new value is always pushed onto the top of the stack.
29376
29377The @code{xterm} program that is typically used for general-purpose
29378shell windows in X interprets the mouse buttons in the same way.
29379So you can use the mouse to move data between Calc and any other
29380Unix program. One nice feature of @code{xterm} is that a double
29381left-click selects one word, and a triple left-click selects a
29382whole line. So you can usually transfer a single number into Calc
29383just by double-clicking on it in the shell, then middle-clicking
29384in the Calc window.
29385
29386@node Keypad Mode, Embedded Mode, Kill and Yank, Top
29387@chapter Keypad Mode
29388
29389@noindent
29390@kindex C-x * k
29391@pindex calc-keypad
29392The @kbd{C-x * k} (@code{calc-keypad}) command starts the Calculator
29393and displays a picture of a calculator-style keypad. If you are using
29394the X window system, you can click on any of the ``keys'' in the
29395keypad using the left mouse button to operate the calculator.
29396The original window remains the selected window; in Keypad mode
29397you can type in your file while simultaneously performing
29398calculations with the mouse.
29399
29400@pindex full-calc-keypad
29401If you have used @kbd{C-x * b} first, @kbd{C-x * k} instead invokes
29402the @code{full-calc-keypad} command, which takes over the whole
29403Emacs screen and displays the keypad, the Calc stack, and the Calc
29404trail all at once. This mode would normally be used when running
29405Calc standalone (@pxref{Standalone Operation}).
29406
29407If you aren't using the X window system, you must switch into
29408the @samp{*Calc Keypad*} window, place the cursor on the desired
29409``key,'' and type @key{SPC} or @key{RET}. If you think this
29410is easier than using Calc normally, go right ahead.
29411
29412Calc commands are more or less the same in Keypad mode. Certain
29413keypad keys differ slightly from the corresponding normal Calc
29414keystrokes; all such deviations are described below.
29415
29416Keypad mode includes many more commands than will fit on the keypad
29417at once. Click the right mouse button [@code{calc-keypad-menu}]
29418to switch to the next menu. The bottom five rows of the keypad
29419stay the same; the top three rows change to a new set of commands.
29420To return to earlier menus, click the middle mouse button
29421[@code{calc-keypad-menu-back}] or simply advance through the menus
29422until you wrap around. Typing @key{TAB} inside the keypad window
29423is equivalent to clicking the right mouse button there.
29424
29425You can always click the @key{EXEC} button and type any normal
29426Calc key sequence. This is equivalent to switching into the
29427Calc buffer, typing the keys, then switching back to your
29428original buffer.
29429
29430@menu
29431* Keypad Main Menu::
29432* Keypad Functions Menu::
29433* Keypad Binary Menu::
29434* Keypad Vectors Menu::
29435* Keypad Modes Menu::
29436@end menu
29437
29438@node Keypad Main Menu, Keypad Functions Menu, Keypad Mode, Keypad Mode
29439@section Main Menu
29440
29441@smallexample
29442@group
29443|----+-----Calc 2.1------+----1
29444|FLR |CEIL|RND |TRNC|CLN2|FLT |
29445|----+----+----+----+----+----|
29446| LN |EXP | |ABS |IDIV|MOD |
29447|----+----+----+----+----+----|
29448|SIN |COS |TAN |SQRT|y^x |1/x |
29449|----+----+----+----+----+----|
29450| ENTER |+/- |EEX |UNDO| <- |
29451|-----+---+-+--+--+-+---++----|
29452| INV | 7 | 8 | 9 | / |
29453|-----+-----+-----+-----+-----|
29454| HYP | 4 | 5 | 6 | * |
29455|-----+-----+-----+-----+-----|
29456|EXEC | 1 | 2 | 3 | - |
29457|-----+-----+-----+-----+-----|
29458| OFF | 0 | . | PI | + |
29459|-----+-----+-----+-----+-----+
29460@end group
29461@end smallexample
29462
29463@noindent
29464This is the menu that appears the first time you start Keypad mode.
29465It will show up in a vertical window on the right side of your screen.
29466Above this menu is the traditional Calc stack display. On a 24-line
29467screen you will be able to see the top three stack entries.
29468
29469The ten digit keys, decimal point, and @key{EEX} key are used for
29470entering numbers in the obvious way. @key{EEX} begins entry of an
29471exponent in scientific notation. Just as with regular Calc, the
29472number is pushed onto the stack as soon as you press @key{ENTER}
29473or any other function key.
29474
29475The @key{+/-} key corresponds to normal Calc's @kbd{n} key. During
29476numeric entry it changes the sign of the number or of the exponent.
29477At other times it changes the sign of the number on the top of the
29478stack.
29479
29480The @key{INV} and @key{HYP} keys modify other keys. As well as
29481having the effects described elsewhere in this manual, Keypad mode
29482defines several other ``inverse'' operations. These are described
29483below and in the following sections.
29484
29485The @key{ENTER} key finishes the current numeric entry, or otherwise
29486duplicates the top entry on the stack.
29487
29488The @key{UNDO} key undoes the most recent Calc operation.
29489@kbd{INV UNDO} is the ``redo'' command, and @kbd{HYP UNDO} is
29490``last arguments'' (@kbd{M-@key{RET}}).
29491
29492The @key{<-} key acts as a ``backspace'' during numeric entry.
29493At other times it removes the top stack entry. @kbd{INV <-}
29494clears the entire stack. @kbd{HYP <-} takes an integer from
29495the stack, then removes that many additional stack elements.
29496
29497The @key{EXEC} key prompts you to enter any keystroke sequence
29498that would normally work in Calc mode. This can include a
29499numeric prefix if you wish. It is also possible simply to
29500switch into the Calc window and type commands in it; there is
29501nothing ``magic'' about this window when Keypad mode is active.
29502
29503The other keys in this display perform their obvious calculator
29504functions. @key{CLN2} rounds the top-of-stack by temporarily
29505reducing the precision by 2 digits. @key{FLT} converts an
29506integer or fraction on the top of the stack to floating-point.
29507
29508The @key{INV} and @key{HYP} keys combined with several of these keys
29509give you access to some common functions even if the appropriate menu
29510is not displayed. Obviously you don't need to learn these keys
29511unless you find yourself wasting time switching among the menus.
29512
29513@table @kbd
29514@item INV +/-
29515is the same as @key{1/x}.
29516@item INV +
29517is the same as @key{SQRT}.
29518@item INV -
29519is the same as @key{CONJ}.
29520@item INV *
29521is the same as @key{y^x}.
29522@item INV /
29523is the same as @key{INV y^x} (the @expr{x}th root of @expr{y}).
29524@item HYP/INV 1
29525are the same as @key{SIN} / @kbd{INV SIN}.
29526@item HYP/INV 2
29527are the same as @key{COS} / @kbd{INV COS}.
29528@item HYP/INV 3
29529are the same as @key{TAN} / @kbd{INV TAN}.
29530@item INV/HYP 4
29531are the same as @key{LN} / @kbd{HYP LN}.
29532@item INV/HYP 5
29533are the same as @key{EXP} / @kbd{HYP EXP}.
29534@item INV 6
29535is the same as @key{ABS}.
29536@item INV 7
29537is the same as @key{RND} (@code{calc-round}).
29538@item INV 8
29539is the same as @key{CLN2}.
29540@item INV 9
29541is the same as @key{FLT} (@code{calc-float}).
29542@item INV 0
29543is the same as @key{IMAG}.
29544@item INV .
29545is the same as @key{PREC}.
29546@item INV ENTER
29547is the same as @key{SWAP}.
29548@item HYP ENTER
29549is the same as @key{RLL3}.
29550@item INV HYP ENTER
29551is the same as @key{OVER}.
29552@item HYP +/-
29553packs the top two stack entries as an error form.
29554@item HYP EEX
29555packs the top two stack entries as a modulo form.
29556@item INV EEX
29557creates an interval form; this removes an integer which is one
29558of 0 @samp{[]}, 1 @samp{[)}, 2 @samp{(]} or 3 @samp{()}, followed
29559by the two limits of the interval.
29560@end table
29561
29562The @kbd{OFF} key turns Calc off; typing @kbd{C-x * k} or @kbd{C-x * *}
29563again has the same effect. This is analogous to typing @kbd{q} or
29564hitting @kbd{C-x * c} again in the normal calculator. If Calc is
29565running standalone (the @code{full-calc-keypad} command appeared in the
29566command line that started Emacs), then @kbd{OFF} is replaced with
29567@kbd{EXIT}; clicking on this actually exits Emacs itself.
29568
29569@node Keypad Functions Menu, Keypad Binary Menu, Keypad Main Menu, Keypad Mode
29570@section Functions Menu
29571
29572@smallexample
29573@group
29574|----+----+----+----+----+----2
29575|IGAM|BETA|IBET|ERF |BESJ|BESY|
29576|----+----+----+----+----+----|
29577|IMAG|CONJ| RE |ATN2|RAND|RAGN|
29578|----+----+----+----+----+----|
29579|GCD |FACT|DFCT|BNOM|PERM|NXTP|
29580|----+----+----+----+----+----|
29581@end group
29582@end smallexample
29583
29584@noindent
29585This menu provides various operations from the @kbd{f} and @kbd{k}
29586prefix keys.
29587
29588@key{IMAG} multiplies the number on the stack by the imaginary
29589number @expr{i = (0, 1)}.
29590
29591@key{RE} extracts the real part a complex number. @kbd{INV RE}
29592extracts the imaginary part.
29593
29594@key{RAND} takes a number from the top of the stack and computes
29595a random number greater than or equal to zero but less than that
29596number. (@xref{Random Numbers}.) @key{RAGN} is the ``random
29597again'' command; it computes another random number using the
29598same limit as last time.
29599
29600@key{INV GCD} computes the LCM (least common multiple) function.
29601
29602@key{INV FACT} is the gamma function.
29603@texline @math{\Gamma(x) = (x-1)!}.
29604@infoline @expr{gamma(x) = (x-1)!}.
29605
29606@key{PERM} is the number-of-permutations function, which is on the
29607@kbd{H k c} key in normal Calc.
29608
29609@key{NXTP} finds the next prime after a number. @kbd{INV NXTP}
29610finds the previous prime.
29611
29612@node Keypad Binary Menu, Keypad Vectors Menu, Keypad Functions Menu, Keypad Mode
29613@section Binary Menu
29614
29615@smallexample
29616@group
29617|----+----+----+----+----+----3
29618|AND | OR |XOR |NOT |LSH |RSH |
29619|----+----+----+----+----+----|
29620|DEC |HEX |OCT |BIN |WSIZ|ARSH|
29621|----+----+----+----+----+----|
29622| A | B | C | D | E | F |
29623|----+----+----+----+----+----|
29624@end group
29625@end smallexample
29626
29627@noindent
29628The keys in this menu perform operations on binary integers.
29629Note that both logical and arithmetic right-shifts are provided.
29630@key{INV LSH} rotates one bit to the left.
29631
29632The ``difference'' function (normally on @kbd{b d}) is on @key{INV AND}.
29633The ``clip'' function (normally on @w{@kbd{b c}}) is on @key{INV NOT}.
29634
29635The @key{DEC}, @key{HEX}, @key{OCT}, and @key{BIN} keys select the
29636current radix for display and entry of numbers: Decimal, hexadecimal,
29637octal, or binary. The six letter keys @key{A} through @key{F} are used
29638for entering hexadecimal numbers.
29639
29640The @key{WSIZ} key displays the current word size for binary operations
29641and allows you to enter a new word size. You can respond to the prompt
29642using either the keyboard or the digits and @key{ENTER} from the keypad.
29643The initial word size is 32 bits.
29644
29645@node Keypad Vectors Menu, Keypad Modes Menu, Keypad Binary Menu, Keypad Mode
29646@section Vectors Menu
29647
29648@smallexample
29649@group
29650|----+----+----+----+----+----4
29651|SUM |PROD|MAX |MAP*|MAP^|MAP$|
29652|----+----+----+----+----+----|
29653|MINV|MDET|MTRN|IDNT|CRSS|"x" |
29654|----+----+----+----+----+----|
29655|PACK|UNPK|INDX|BLD |LEN |... |
29656|----+----+----+----+----+----|
29657@end group
29658@end smallexample
29659
29660@noindent
29661The keys in this menu operate on vectors and matrices.
29662
29663@key{PACK} removes an integer @var{n} from the top of the stack;
29664the next @var{n} stack elements are removed and packed into a vector,
29665which is replaced onto the stack. Thus the sequence
29666@kbd{1 ENTER 3 ENTER 5 ENTER 3 PACK} enters the vector
29667@samp{[1, 3, 5]} onto the stack. To enter a matrix, build each row
29668on the stack as a vector, then use a final @key{PACK} to collect the
29669rows into a matrix.
29670
29671@key{UNPK} unpacks the vector on the stack, pushing each of its
29672components separately.
29673
29674@key{INDX} removes an integer @var{n}, then builds a vector of
29675integers from 1 to @var{n}. @kbd{INV INDX} takes three numbers
29676from the stack: The vector size @var{n}, the starting number,
29677and the increment. @kbd{BLD} takes an integer @var{n} and any
29678value @var{x} and builds a vector of @var{n} copies of @var{x}.
29679
29680@key{IDNT} removes an integer @var{n}, then builds an @var{n}-by-@var{n}
29681identity matrix.
29682
29683@key{LEN} replaces a vector by its length, an integer.
29684
29685@key{...} turns on or off ``abbreviated'' display mode for large vectors.
29686
29687@key{MINV}, @key{MDET}, @key{MTRN}, and @key{CROSS} are the matrix
29688inverse, determinant, and transpose, and vector cross product.
29689
29690@key{SUM} replaces a vector by the sum of its elements. It is
29691equivalent to @kbd{u +} in normal Calc (@pxref{Statistical Operations}).
29692@key{PROD} computes the product of the elements of a vector, and
29693@key{MAX} computes the maximum of all the elements of a vector.
29694
29695@key{INV SUM} computes the alternating sum of the first element
29696minus the second, plus the third, minus the fourth, and so on.
29697@key{INV MAX} computes the minimum of the vector elements.
29698
29699@key{HYP SUM} computes the mean of the vector elements.
29700@key{HYP PROD} computes the sample standard deviation.
29701@key{HYP MAX} computes the median.
29702
29703@key{MAP*} multiplies two vectors elementwise. It is equivalent
29704to the @kbd{V M *} command. @key{MAP^} computes powers elementwise.
29705The arguments must be vectors of equal length, or one must be a vector
29706and the other must be a plain number. For example, @kbd{2 MAP^} squares
29707all the elements of a vector.
29708
29709@key{MAP$} maps the formula on the top of the stack across the
29710vector in the second-to-top position. If the formula contains
29711several variables, Calc takes that many vectors starting at the
29712second-to-top position and matches them to the variables in
29713alphabetical order. The result is a vector of the same size as
29714the input vectors, whose elements are the formula evaluated with
29715the variables set to the various sets of numbers in those vectors.
29716For example, you could simulate @key{MAP^} using @key{MAP$} with
29717the formula @samp{x^y}.
29718
29719The @kbd{"x"} key pushes the variable name @expr{x} onto the
29720stack. To build the formula @expr{x^2 + 6}, you would use the
29721key sequence @kbd{"x" 2 y^x 6 +}. This formula would then be
29722suitable for use with the @key{MAP$} key described above.
29723With @key{INV}, @key{HYP}, or @key{INV} and @key{HYP}, the
29724@kbd{"x"} key pushes the variable names @expr{y}, @expr{z}, and
29725@expr{t}, respectively.
29726
29727@node Keypad Modes Menu, , Keypad Vectors Menu, Keypad Mode
29728@section Modes Menu
29729
29730@smallexample
29731@group
29732|----+----+----+----+----+----5
29733|FLT |FIX |SCI |ENG |GRP | |
29734|----+----+----+----+----+----|
29735|RAD |DEG |FRAC|POLR|SYMB|PREC|
29736|----+----+----+----+----+----|
29737|SWAP|RLL3|RLL4|OVER|STO |RCL |
29738|----+----+----+----+----+----|
29739@end group
29740@end smallexample
29741
29742@noindent
29743The keys in this menu manipulate modes, variables, and the stack.
29744
29745The @key{FLT}, @key{FIX}, @key{SCI}, and @key{ENG} keys select
29746floating-point, fixed-point, scientific, or engineering notation.
29747@key{FIX} displays two digits after the decimal by default; the
29748others display full precision. With the @key{INV} prefix, these
29749keys pop a number-of-digits argument from the stack.
29750
29751The @key{GRP} key turns grouping of digits with commas on or off.
29752@kbd{INV GRP} enables grouping to the right of the decimal point as
29753well as to the left.
29754
29755The @key{RAD} and @key{DEG} keys switch between radians and degrees
29756for trigonometric functions.
29757
29758The @key{FRAC} key turns Fraction mode on or off. This affects
29759whether commands like @kbd{/} with integer arguments produce
29760fractional or floating-point results.
29761
29762The @key{POLR} key turns Polar mode on or off, determining whether
29763polar or rectangular complex numbers are used by default.
29764
29765The @key{SYMB} key turns Symbolic mode on or off, in which
29766operations that would produce inexact floating-point results
29767are left unevaluated as algebraic formulas.
29768
29769The @key{PREC} key selects the current precision. Answer with
29770the keyboard or with the keypad digit and @key{ENTER} keys.
29771
29772The @key{SWAP} key exchanges the top two stack elements.
29773The @key{RLL3} key rotates the top three stack elements upwards.
29774The @key{RLL4} key rotates the top four stack elements upwards.
29775The @key{OVER} key duplicates the second-to-top stack element.
29776
29777The @key{STO} and @key{RCL} keys are analogous to @kbd{s t} and
29778@kbd{s r} in regular Calc. @xref{Store and Recall}. Click the
29779@key{STO} or @key{RCL} key, then one of the ten digits. (Named
29780variables are not available in Keypad mode.) You can also use,
29781for example, @kbd{STO + 3} to add to register 3.
29782
29783@node Embedded Mode, Programming, Keypad Mode, Top
29784@chapter Embedded Mode
29785
29786@noindent
29787Embedded mode in Calc provides an alternative to copying numbers
29788and formulas back and forth between editing buffers and the Calc
29789stack. In Embedded mode, your editing buffer becomes temporarily
29790linked to the stack and this copying is taken care of automatically.
29791
29792@menu
29793* Basic Embedded Mode::
29794* More About Embedded Mode::
29795* Assignments in Embedded Mode::
29796* Mode Settings in Embedded Mode::
29797* Customizing Embedded Mode::
29798@end menu
29799
29800@node Basic Embedded Mode, More About Embedded Mode, Embedded Mode, Embedded Mode
29801@section Basic Embedded Mode
29802
29803@noindent
29804@kindex C-x * e
29805@pindex calc-embedded
29806To enter Embedded mode, position the Emacs point (cursor) on a
29807formula in any buffer and press @kbd{C-x * e} (@code{calc-embedded}).
29808Note that @kbd{C-x * e} is not to be used in the Calc stack buffer
29809like most Calc commands, but rather in regular editing buffers that
29810are visiting your own files.
29811
29812Calc will try to guess an appropriate language based on the major mode
29813of the editing buffer. (@xref{Language Modes}.) If the current buffer is
29814in @code{latex-mode}, for example, Calc will set its language to La@TeX{}.
29815Similarly, Calc will use @TeX{} language for @code{tex-mode},
29816@code{plain-tex-mode} and @code{context-mode}, C language for
29817@code{c-mode} and @code{c++-mode}, FORTRAN language for
29818@code{fortran-mode} and @code{f90-mode}, Pascal for @code{pascal-mode},
29819and eqn for @code{nroff-mode} (@pxref{Customizing Calc}).
29820These can be overridden with Calc's mode
29821changing commands (@pxref{Mode Settings in Embedded Mode}). If no
29822suitable language is available, Calc will continue with its current language.
29823
29824Calc normally scans backward and forward in the buffer for the
29825nearest opening and closing @dfn{formula delimiters}. The simplest
29826delimiters are blank lines. Other delimiters that Embedded mode
29827understands are:
29828
29829@enumerate
29830@item
29831The @TeX{} and La@TeX{} math delimiters @samp{$ $}, @samp{$$ $$},
29832@samp{\[ \]}, and @samp{\( \)};
29833@item
29834Lines beginning with @samp{\begin} and @samp{\end} (except matrix delimiters);
29835@item
29836Lines beginning with @samp{@@} (Texinfo delimiters).
29837@item
29838Lines beginning with @samp{.EQ} and @samp{.EN} (@dfn{eqn} delimiters);
29839@item
29840Lines containing a single @samp{%} or @samp{.\"} symbol and nothing else.
29841@end enumerate
29842
29843@xref{Customizing Embedded Mode}, to see how to make Calc recognize
29844your own favorite delimiters. Delimiters like @samp{$ $} can appear
29845on their own separate lines or in-line with the formula.
29846
29847If you give a positive or negative numeric prefix argument, Calc
29848instead uses the current point as one end of the formula, and includes
29849that many lines forward or backward (respectively, including the current
29850line). Explicit delimiters are not necessary in this case.
29851
29852With a prefix argument of zero, Calc uses the current region (delimited
29853by point and mark) instead of formula delimiters. With a prefix
29854argument of @kbd{C-u} only, Calc uses the current line as the formula.
29855
29856@kindex C-x * w
29857@pindex calc-embedded-word
29858The @kbd{C-x * w} (@code{calc-embedded-word}) command will start Embedded
29859mode on the current ``word''; in this case Calc will scan for the first
29860non-numeric character (i.e., the first character that is not a digit,
29861sign, decimal point, or upper- or lower-case @samp{e}) forward and
29862backward to delimit the formula.
29863
29864When you enable Embedded mode for a formula, Calc reads the text
29865between the delimiters and tries to interpret it as a Calc formula.
29866Calc can generally identify @TeX{} formulas and
29867Big-style formulas even if the language mode is wrong. If Calc
29868can't make sense of the formula, it beeps and refuses to enter
29869Embedded mode. But if the current language is wrong, Calc can
29870sometimes parse the formula successfully (but incorrectly);
29871for example, the C expression @samp{atan(a[1])} can be parsed
29872in Normal language mode, but the @code{atan} won't correspond to
29873the built-in @code{arctan} function, and the @samp{a[1]} will be
29874interpreted as @samp{a} times the vector @samp{[1]}!
29875
29876If you press @kbd{C-x * e} or @kbd{C-x * w} to activate an embedded
29877formula which is blank, say with the cursor on the space between
29878the two delimiters @samp{$ $}, Calc will immediately prompt for
29879an algebraic entry.
29880
29881Only one formula in one buffer can be enabled at a time. If you
29882move to another area of the current buffer and give Calc commands,
29883Calc turns Embedded mode off for the old formula and then tries
29884to restart Embedded mode at the new position. Other buffers are
29885not affected by Embedded mode.
29886
29887When Embedded mode begins, Calc pushes the current formula onto
29888the stack. No Calc stack window is created; however, Calc copies
29889the top-of-stack position into the original buffer at all times.
29890You can create a Calc window by hand with @kbd{C-x * o} if you
29891find you need to see the entire stack.
29892
29893For example, typing @kbd{C-x * e} while somewhere in the formula
29894@samp{n>2} in the following line enables Embedded mode on that
29895inequality:
29896
29897@example
29898We define $F_n = F_(n-1)+F_(n-2)$ for all $n>2$.
29899@end example
29900
29901@noindent
29902The formula @expr{n>2} will be pushed onto the Calc stack, and
29903the top of stack will be copied back into the editing buffer.
29904This means that spaces will appear around the @samp{>} symbol
29905to match Calc's usual display style:
29906
29907@example
29908We define $F_n = F_(n-1)+F_(n-2)$ for all $n > 2$.
29909@end example
29910
29911@noindent
29912No spaces have appeared around the @samp{+} sign because it's
29913in a different formula, one which we have not yet touched with
29914Embedded mode.
29915
29916Now that Embedded mode is enabled, keys you type in this buffer
29917are interpreted as Calc commands. At this point we might use
29918the ``commute'' command @kbd{j C} to reverse the inequality.
29919This is a selection-based command for which we first need to
29920move the cursor onto the operator (@samp{>} in this case) that
29921needs to be commuted.
29922
29923@example
29924We define $F_n = F_(n-1)+F_(n-2)$ for all $2 < n$.
29925@end example
29926
29927The @kbd{C-x * o} command is a useful way to open a Calc window
29928without actually selecting that window. Giving this command
29929verifies that @samp{2 < n} is also on the Calc stack. Typing
29930@kbd{17 @key{RET}} would produce:
29931
29932@example
29933We define $F_n = F_(n-1)+F_(n-2)$ for all $17$.
29934@end example
29935
29936@noindent
29937with @samp{2 < n} and @samp{17} on the stack; typing @key{TAB}
29938at this point will exchange the two stack values and restore
29939@samp{2 < n} to the embedded formula. Even though you can't
29940normally see the stack in Embedded mode, it is still there and
29941it still operates in the same way. But, as with old-fashioned
29942RPN calculators, you can only see the value at the top of the
29943stack at any given time (unless you use @kbd{C-x * o}).
29944
29945Typing @kbd{C-x * e} again turns Embedded mode off. The Calc
29946window reveals that the formula @w{@samp{2 < n}} is automatically
29947removed from the stack, but the @samp{17} is not. Entering
29948Embedded mode always pushes one thing onto the stack, and
29949leaving Embedded mode always removes one thing. Anything else
29950that happens on the stack is entirely your business as far as
29951Embedded mode is concerned.
29952
29953If you press @kbd{C-x * e} in the wrong place by accident, it is
29954possible that Calc will be able to parse the nearby text as a
29955formula and will mangle that text in an attempt to redisplay it
29956``properly'' in the current language mode. If this happens,
29957press @kbd{C-x * e} again to exit Embedded mode, then give the
29958regular Emacs ``undo'' command (@kbd{C-_} or @kbd{C-x u}) to put
29959the text back the way it was before Calc edited it. Note that Calc's
29960own Undo command (typed before you turn Embedded mode back off)
29961will not do you any good, because as far as Calc is concerned
29962you haven't done anything with this formula yet.
29963
29964@node More About Embedded Mode, Assignments in Embedded Mode, Basic Embedded Mode, Embedded Mode
29965@section More About Embedded Mode
29966
29967@noindent
29968When Embedded mode ``activates'' a formula, i.e., when it examines
29969the formula for the first time since the buffer was created or
29970loaded, Calc tries to sense the language in which the formula was
29971written. If the formula contains any La@TeX{}-like @samp{\} sequences,
29972it is parsed (i.e., read) in La@TeX{} mode. If the formula appears to
29973be written in multi-line Big mode, it is parsed in Big mode. Otherwise,
29974it is parsed according to the current language mode.
29975
29976Note that Calc does not change the current language mode according
29977the formula it reads in. Even though it can read a La@TeX{} formula when
29978not in La@TeX{} mode, it will immediately rewrite this formula using
29979whatever language mode is in effect.
29980
29981@tex
29982\bigskip
29983@end tex
29984
29985@kindex d p
29986@pindex calc-show-plain
29987Calc's parser is unable to read certain kinds of formulas. For
29988example, with @kbd{v ]} (@code{calc-matrix-brackets}) you can
29989specify matrix display styles which the parser is unable to
29990recognize as matrices. The @kbd{d p} (@code{calc-show-plain})
29991command turns on a mode in which a ``plain'' version of a
29992formula is placed in front of the fully-formatted version.
29993When Calc reads a formula that has such a plain version in
29994front, it reads the plain version and ignores the formatted
29995version.
29996
29997Plain formulas are preceded and followed by @samp{%%%} signs
29998by default. This notation has the advantage that the @samp{%}
29999character begins a comment in @TeX{} and La@TeX{}, so if your formula is
30000embedded in a @TeX{} or La@TeX{} document its plain version will be
30001invisible in the final printed copy. Certain major modes have different
30002delimiters to ensure that the ``plain'' version will be
30003in a comment for those modes, also.
30004See @ref{Customizing Embedded Mode} to see how to change the ``plain''
30005formula delimiters.
30006
30007There are several notations which Calc's parser for ``big''
30008formatted formulas can't yet recognize. In particular, it can't
30009read the large symbols for @code{sum}, @code{prod}, and @code{integ},
30010and it can't handle @samp{=>} with the righthand argument omitted.
30011Also, Calc won't recognize special formats you have defined with
30012the @kbd{Z C} command (@pxref{User-Defined Compositions}). In
30013these cases it is important to use ``plain'' mode to make sure
30014Calc will be able to read your formula later.
30015
30016Another example where ``plain'' mode is important is if you have
30017specified a float mode with few digits of precision. Normally
30018any digits that are computed but not displayed will simply be
30019lost when you save and re-load your embedded buffer, but ``plain''
30020mode allows you to make sure that the complete number is present
30021in the file as well as the rounded-down number.
30022
30023@tex
30024\bigskip
30025@end tex
30026
30027Embedded buffers remember active formulas for as long as they
30028exist in Emacs memory. Suppose you have an embedded formula
30029which is @cpi{} to the normal 12 decimal places, and then
30030type @w{@kbd{C-u 5 d n}} to display only five decimal places.
30031If you then type @kbd{d n}, all 12 places reappear because the
30032full number is still there on the Calc stack. More surprisingly,
30033even if you exit Embedded mode and later re-enter it for that
30034formula, typing @kbd{d n} will restore all 12 places because
30035each buffer remembers all its active formulas. However, if you
30036save the buffer in a file and reload it in a new Emacs session,
30037all non-displayed digits will have been lost unless you used
30038``plain'' mode.
30039
30040@tex
30041\bigskip
30042@end tex
30043
30044In some applications of Embedded mode, you will want to have a
30045sequence of copies of a formula that show its evolution as you
30046work on it. For example, you might want to have a sequence
30047like this in your file (elaborating here on the example from
30048the ``Getting Started'' chapter):
30049
30050@smallexample
30051The derivative of
30052
30053 ln(ln(x))
30054
30055is
30056
30057 @r{(the derivative of }ln(ln(x))@r{)}
30058
30059whose value at x = 2 is
30060
30061 @r{(the value)}
30062
30063and at x = 3 is
30064
30065 @r{(the value)}
30066@end smallexample
30067
30068@kindex C-x * d
30069@pindex calc-embedded-duplicate
30070The @kbd{C-x * d} (@code{calc-embedded-duplicate}) command is a
30071handy way to make sequences like this. If you type @kbd{C-x * d},
30072the formula under the cursor (which may or may not have Embedded
30073mode enabled for it at the time) is copied immediately below and
30074Embedded mode is then enabled for that copy.
30075
30076For this example, you would start with just
30077
30078@smallexample
30079The derivative of
30080
30081 ln(ln(x))
30082@end smallexample
30083
30084@noindent
30085and press @kbd{C-x * d} with the cursor on this formula. The result
30086is
30087
30088@smallexample
30089The derivative of
30090
30091 ln(ln(x))
30092
30093
30094 ln(ln(x))
30095@end smallexample
30096
30097@noindent
30098with the second copy of the formula enabled in Embedded mode.
30099You can now press @kbd{a d x @key{RET}} to take the derivative, and
30100@kbd{C-x * d C-x * d} to make two more copies of the derivative.
30101To complete the computations, type @kbd{3 s l x @key{RET}} to evaluate
30102the last formula, then move up to the second-to-last formula
30103and type @kbd{2 s l x @key{RET}}.
30104
30105Finally, you would want to press @kbd{C-x * e} to exit Embedded
30106mode, then go up and insert the necessary text in between the
30107various formulas and numbers.
30108
30109@tex
30110\bigskip
30111@end tex
30112
30113@kindex C-x * f
30114@kindex C-x * '
30115@pindex calc-embedded-new-formula
30116The @kbd{C-x * f} (@code{calc-embedded-new-formula}) command
30117creates a new embedded formula at the current point. It inserts
30118some default delimiters, which are usually just blank lines,
30119and then does an algebraic entry to get the formula (which is
30120then enabled for Embedded mode). This is just shorthand for
30121typing the delimiters yourself, positioning the cursor between
30122the new delimiters, and pressing @kbd{C-x * e}. The key sequence
30123@kbd{C-x * '} is equivalent to @kbd{C-x * f}.
30124
30125@kindex C-x * n
30126@kindex C-x * p
30127@pindex calc-embedded-next
30128@pindex calc-embedded-previous
30129The @kbd{C-x * n} (@code{calc-embedded-next}) and @kbd{C-x * p}
30130(@code{calc-embedded-previous}) commands move the cursor to the
30131next or previous active embedded formula in the buffer. They
30132can take positive or negative prefix arguments to move by several
30133formulas. Note that these commands do not actually examine the
30134text of the buffer looking for formulas; they only see formulas
30135which have previously been activated in Embedded mode. In fact,
30136@kbd{C-x * n} and @kbd{C-x * p} are a useful way to tell which
30137embedded formulas are currently active. Also, note that these
30138commands do not enable Embedded mode on the next or previous
30139formula, they just move the cursor.
30140
30141@kindex C-x * `
30142@pindex calc-embedded-edit
30143The @kbd{C-x * `} (@code{calc-embedded-edit}) command edits the
30144embedded formula at the current point as if by @kbd{`} (@code{calc-edit}).
30145Embedded mode does not have to be enabled for this to work. Press
30146@kbd{C-c C-c} to finish the edit, or @kbd{C-x k} to cancel.
30147
30148@node Assignments in Embedded Mode, Mode Settings in Embedded Mode, More About Embedded Mode, Embedded Mode
30149@section Assignments in Embedded Mode
30150
30151@noindent
30152The @samp{:=} (assignment) and @samp{=>} (``evaluates-to'') operators
30153are especially useful in Embedded mode. They allow you to make
30154a definition in one formula, then refer to that definition in
30155other formulas embedded in the same buffer.
30156
30157An embedded formula which is an assignment to a variable, as in
30158
30159@example
30160foo := 5
30161@end example
30162
30163@noindent
30164records @expr{5} as the stored value of @code{foo} for the
30165purposes of Embedded mode operations in the current buffer. It
30166does @emph{not} actually store @expr{5} as the ``global'' value
30167of @code{foo}, however. Regular Calc operations, and Embedded
30168formulas in other buffers, will not see this assignment.
30169
30170One way to use this assigned value is simply to create an
30171Embedded formula elsewhere that refers to @code{foo}, and to press
30172@kbd{=} in that formula. However, this permanently replaces the
30173@code{foo} in the formula with its current value. More interesting
30174is to use @samp{=>} elsewhere:
30175
30176@example
30177foo + 7 => 12
30178@end example
30179
30180@xref{Evaluates-To Operator}, for a general discussion of @samp{=>}.
30181
30182If you move back and change the assignment to @code{foo}, any
30183@samp{=>} formulas which refer to it are automatically updated.
30184
30185@example
30186foo := 17
30187
30188foo + 7 => 24
30189@end example
30190
30191The obvious question then is, @emph{how} can one easily change the
30192assignment to @code{foo}? If you simply select the formula in
30193Embedded mode and type 17, the assignment itself will be replaced
30194by the 17. The effect on the other formula will be that the
30195variable @code{foo} becomes unassigned:
30196
30197@example
3019817
30199
30200foo + 7 => foo + 7
30201@end example
30202
30203The right thing to do is first to use a selection command (@kbd{j 2}
30204will do the trick) to select the righthand side of the assignment.
30205Then, @kbd{17 @key{TAB} @key{DEL}} will swap the 17 into place (@pxref{Selecting
30206Subformulas}, to see how this works).
30207
30208@kindex C-x * j
30209@pindex calc-embedded-select
30210The @kbd{C-x * j} (@code{calc-embedded-select}) command provides an
30211easy way to operate on assignments. It is just like @kbd{C-x * e},
30212except that if the enabled formula is an assignment, it uses
30213@kbd{j 2} to select the righthand side. If the enabled formula
30214is an evaluates-to, it uses @kbd{j 1} to select the lefthand side.
30215A formula can also be a combination of both:
30216
30217@example
30218bar := foo + 3 => 20
30219@end example
30220
30221@noindent
30222in which case @kbd{C-x * j} will select the middle part (@samp{foo + 3}).
30223
30224The formula is automatically deselected when you leave Embedded
30225mode.
30226
30227@kindex C-x * u
30228@pindex calc-embedded-update-formula
30229Another way to change the assignment to @code{foo} would simply be
30230to edit the number using regular Emacs editing rather than Embedded
30231mode. Then, we have to find a way to get Embedded mode to notice
30232the change. The @kbd{C-x * u} (@code{calc-embedded-update-formula})
30233command is a convenient way to do this.
30234
30235@example
30236foo := 6
30237
30238foo + 7 => 13
30239@end example
30240
30241Pressing @kbd{C-x * u} is much like pressing @kbd{C-x * e = C-x * e}, that
30242is, temporarily enabling Embedded mode for the formula under the
30243cursor and then evaluating it with @kbd{=}. But @kbd{C-x * u} does
30244not actually use @kbd{C-x * e}, and in fact another formula somewhere
30245else can be enabled in Embedded mode while you use @kbd{C-x * u} and
30246that formula will not be disturbed.
30247
30248With a numeric prefix argument, @kbd{C-x * u} updates all active
30249@samp{=>} formulas in the buffer. Formulas which have not yet
30250been activated in Embedded mode, and formulas which do not have
30251@samp{=>} as their top-level operator, are not affected by this.
30252(This is useful only if you have used @kbd{m C}; see below.)
30253
30254With a plain @kbd{C-u} prefix, @kbd{C-u C-x * u} updates only in the
30255region between mark and point rather than in the whole buffer.
30256
30257@kbd{C-x * u} is also a handy way to activate a formula, such as an
30258@samp{=>} formula that has freshly been typed in or loaded from a
30259file.
30260
30261@kindex C-x * a
30262@pindex calc-embedded-activate
30263The @kbd{C-x * a} (@code{calc-embedded-activate}) command scans
30264through the current buffer and activates all embedded formulas
30265that contain @samp{:=} or @samp{=>} symbols. This does not mean
30266that Embedded mode is actually turned on, but only that the
30267formulas' positions are registered with Embedded mode so that
30268the @samp{=>} values can be properly updated as assignments are
30269changed.
30270
30271It is a good idea to type @kbd{C-x * a} right after loading a file
30272that uses embedded @samp{=>} operators. Emacs includes a nifty
30273``buffer-local variables'' feature that you can use to do this
30274automatically. The idea is to place near the end of your file
30275a few lines that look like this:
30276
30277@example
30278--- Local Variables: ---
30279--- eval:(calc-embedded-activate) ---
30280--- End: ---
30281@end example
30282
30283@noindent
30284where the leading and trailing @samp{---} can be replaced by
30285any suitable strings (which must be the same on all three lines)
30286or omitted altogether; in a @TeX{} or La@TeX{} file, @samp{%} would be a good
30287leading string and no trailing string would be necessary. In a
30288C program, @samp{/*} and @samp{*/} would be good leading and
30289trailing strings.
30290
30291When Emacs loads a file into memory, it checks for a Local Variables
30292section like this one at the end of the file. If it finds this
30293section, it does the specified things (in this case, running
30294@kbd{C-x * a} automatically) before editing of the file begins.
30295The Local Variables section must be within 3000 characters of the
30296end of the file for Emacs to find it, and it must be in the last
30297page of the file if the file has any page separators.
30298@xref{File Variables, , Local Variables in Files, emacs, the
30299Emacs manual}.
30300
30301Note that @kbd{C-x * a} does not update the formulas it finds.
30302To do this, type, say, @kbd{M-1 C-x * u} after @w{@kbd{C-x * a}}.
30303Generally this should not be a problem, though, because the
30304formulas will have been up-to-date already when the file was
30305saved.
30306
30307Normally, @kbd{C-x * a} activates all the formulas it finds, but
30308any previous active formulas remain active as well. With a
30309positive numeric prefix argument, @kbd{C-x * a} first deactivates
30310all current active formulas, then actives the ones it finds in
30311its scan of the buffer. With a negative prefix argument,
30312@kbd{C-x * a} simply deactivates all formulas.
30313
30314Embedded mode has two symbols, @samp{Active} and @samp{~Active},
30315which it puts next to the major mode name in a buffer's mode line.
30316It puts @samp{Active} if it has reason to believe that all
30317formulas in the buffer are active, because you have typed @kbd{C-x * a}
30318and Calc has not since had to deactivate any formulas (which can
30319happen if Calc goes to update an @samp{=>} formula somewhere because
30320a variable changed, and finds that the formula is no longer there
30321due to some kind of editing outside of Embedded mode). Calc puts
30322@samp{~Active} in the mode line if some, but probably not all,
30323formulas in the buffer are active. This happens if you activate
30324a few formulas one at a time but never use @kbd{C-x * a}, or if you
30325used @kbd{C-x * a} but then Calc had to deactivate a formula
30326because it lost track of it. If neither of these symbols appears
30327in the mode line, no embedded formulas are active in the buffer
30328(e.g., before Embedded mode has been used, or after a @kbd{M-- C-x * a}).
30329
30330Embedded formulas can refer to assignments both before and after them
30331in the buffer. If there are several assignments to a variable, the
30332nearest preceding assignment is used if there is one, otherwise the
30333following assignment is used.
30334
30335@example
30336x => 1
30337
30338x := 1
30339
30340x => 1
30341
30342x := 2
30343
30344x => 2
30345@end example
30346
30347As well as simple variables, you can also assign to subscript
30348expressions of the form @samp{@var{var}_@var{number}} (as in
30349@code{x_0}), or @samp{@var{var}_@var{var}} (as in @code{x_max}).
30350Assignments to other kinds of objects can be represented by Calc,
30351but the automatic linkage between assignments and references works
30352only for plain variables and these two kinds of subscript expressions.
30353
30354If there are no assignments to a given variable, the global
30355stored value for the variable is used (@pxref{Storing Variables}),
30356or, if no value is stored, the variable is left in symbolic form.
30357Note that global stored values will be lost when the file is saved
30358and loaded in a later Emacs session, unless you have used the
30359@kbd{s p} (@code{calc-permanent-variable}) command to save them;
30360@pxref{Operations on Variables}.
30361
30362The @kbd{m C} (@code{calc-auto-recompute}) command turns automatic
30363recomputation of @samp{=>} forms on and off. If you turn automatic
30364recomputation off, you will have to use @kbd{C-x * u} to update these
30365formulas manually after an assignment has been changed. If you
30366plan to change several assignments at once, it may be more efficient
30367to type @kbd{m C}, change all the assignments, then use @kbd{M-1 C-x * u}
30368to update the entire buffer afterwards. The @kbd{m C} command also
30369controls @samp{=>} formulas on the stack; @pxref{Evaluates-To
30370Operator}. When you turn automatic recomputation back on, the
30371stack will be updated but the Embedded buffer will not; you must
30372use @kbd{C-x * u} to update the buffer by hand.
30373
30374@node Mode Settings in Embedded Mode, Customizing Embedded Mode, Assignments in Embedded Mode, Embedded Mode
30375@section Mode Settings in Embedded Mode
30376
30377@kindex m e
30378@pindex calc-embedded-preserve-modes
30379@noindent
30380The mode settings can be changed while Calc is in embedded mode, but
30381by default they will revert to their original values when embedded mode
30382is ended. However, the modes saved when the mode-recording mode is
30383@code{Save} (see below) and the modes in effect when the @kbd{m e}
30384(@code{calc-embedded-preserve-modes}) command is given
30385will be preserved when embedded mode is ended.
30386
30387Embedded mode has a rather complicated mechanism for handling mode
30388settings in Embedded formulas. It is possible to put annotations
30389in the file that specify mode settings either global to the entire
30390file or local to a particular formula or formulas. In the latter
30391case, different modes can be specified for use when a formula
30392is the enabled Embedded mode formula.
30393
30394When you give any mode-setting command, like @kbd{m f} (for Fraction
30395mode) or @kbd{d s} (for scientific notation), Embedded mode adds
30396a line like the following one to the file just before the opening
30397delimiter of the formula.
30398
30399@example
30400% [calc-mode: fractions: t]
30401% [calc-mode: float-format: (sci 0)]
30402@end example
30403
30404When Calc interprets an embedded formula, it scans the text before
30405the formula for mode-setting annotations like these and sets the
30406Calc buffer to match these modes. Modes not explicitly described
30407in the file are not changed. Calc scans all the way to the top of
30408the file, or up to a line of the form
30409
30410@example
30411% [calc-defaults]
30412@end example
30413
30414@noindent
30415which you can insert at strategic places in the file if this backward
30416scan is getting too slow, or just to provide a barrier between one
30417``zone'' of mode settings and another.
30418
30419If the file contains several annotations for the same mode, the
30420closest one before the formula is used. Annotations after the
30421formula are never used (except for global annotations, described
30422below).
30423
30424The scan does not look for the leading @samp{% }, only for the
30425square brackets and the text they enclose. In fact, the leading
30426characters are different for different major modes. You can edit the
30427mode annotations to a style that works better in context if you wish.
30428@xref{Customizing Embedded Mode}, to see how to change the style
30429that Calc uses when it generates the annotations. You can write
30430mode annotations into the file yourself if you know the syntax;
30431the easiest way to find the syntax for a given mode is to let
30432Calc write the annotation for it once and see what it does.
30433
30434If you give a mode-changing command for a mode that already has
30435a suitable annotation just above the current formula, Calc will
30436modify that annotation rather than generating a new, conflicting
30437one.
30438
30439Mode annotations have three parts, separated by colons. (Spaces
30440after the colons are optional.) The first identifies the kind
30441of mode setting, the second is a name for the mode itself, and
30442the third is the value in the form of a Lisp symbol, number,
30443or list. Annotations with unrecognizable text in the first or
30444second parts are ignored. The third part is not checked to make
30445sure the value is of a valid type or range; if you write an
30446annotation by hand, be sure to give a proper value or results
30447will be unpredictable. Mode-setting annotations are case-sensitive.
30448
30449While Embedded mode is enabled, the word @code{Local} appears in
30450the mode line. This is to show that mode setting commands generate
30451annotations that are ``local'' to the current formula or set of
30452formulas. The @kbd{m R} (@code{calc-mode-record-mode}) command
30453causes Calc to generate different kinds of annotations. Pressing
30454@kbd{m R} repeatedly cycles through the possible modes.
30455
30456@code{LocEdit} and @code{LocPerm} modes generate annotations
30457that look like this, respectively:
30458
30459@example
30460% [calc-edit-mode: float-format: (sci 0)]
30461% [calc-perm-mode: float-format: (sci 5)]
30462@end example
30463
30464The first kind of annotation will be used only while a formula
30465is enabled in Embedded mode. The second kind will be used only
30466when the formula is @emph{not} enabled. (Whether the formula
30467is ``active'' or not, i.e., whether Calc has seen this formula
30468yet, is not relevant here.)
30469
30470@code{Global} mode generates an annotation like this at the end
30471of the file:
30472
30473@example
30474% [calc-global-mode: fractions t]
30475@end example
30476
30477Global mode annotations affect all formulas throughout the file,
30478and may appear anywhere in the file. This allows you to tuck your
30479mode annotations somewhere out of the way, say, on a new page of
30480the file, as long as those mode settings are suitable for all
30481formulas in the file.
30482
30483Enabling a formula with @kbd{C-x * e} causes a fresh scan for local
30484mode annotations; you will have to use this after adding annotations
30485above a formula by hand to get the formula to notice them. Updating
30486a formula with @kbd{C-x * u} will also re-scan the local modes, but
30487global modes are only re-scanned by @kbd{C-x * a}.
30488
30489Another way that modes can get out of date is if you add a local
30490mode annotation to a formula that has another formula after it.
30491In this example, we have used the @kbd{d s} command while the
30492first of the two embedded formulas is active. But the second
30493formula has not changed its style to match, even though by the
30494rules of reading annotations the @samp{(sci 0)} applies to it, too.
30495
30496@example
30497% [calc-mode: float-format: (sci 0)]
304981.23e2
30499
30500456.
30501@end example
30502
30503We would have to go down to the other formula and press @kbd{C-x * u}
30504on it in order to get it to notice the new annotation.
30505
30506Two more mode-recording modes selectable by @kbd{m R} are available
30507which are also available outside of Embedded mode.
30508(@pxref{General Mode Commands}.) They are @code{Save}, in which mode
30509settings are recorded permanently in your Calc init file (the file given
30510by the variable @code{calc-settings-file}, typically @file{~/.calc.el})
30511rather than by annotating the current document, and no-recording
30512mode (where there is no symbol like @code{Save} or @code{Local} in
30513the mode line), in which mode-changing commands do not leave any
30514annotations at all.
30515
30516When Embedded mode is not enabled, mode-recording modes except
30517for @code{Save} have no effect.
30518
30519@node Customizing Embedded Mode, , Mode Settings in Embedded Mode, Embedded Mode
30520@section Customizing Embedded Mode
30521
30522@noindent
30523You can modify Embedded mode's behavior by setting various Lisp
30524variables described here. These variables are customizable
30525(@pxref{Customizing Calc}), or you can use @kbd{M-x set-variable}
30526or @kbd{M-x edit-options} to adjust a variable on the fly.
30527(Another possibility would be to use a file-local variable annotation at
30528the end of the file;
30529@pxref{File Variables, , Local Variables in Files, emacs, the Emacs manual}.)
30530Many of the variables given mentioned here can be set to depend on the
30531major mode of the editing buffer (@pxref{Customizing Calc}).
30532
30533@vindex calc-embedded-open-formula
30534The @code{calc-embedded-open-formula} variable holds a regular
30535expression for the opening delimiter of a formula. @xref{Regexp Search,
30536, Regular Expression Search, emacs, the Emacs manual}, to see
30537how regular expressions work. Basically, a regular expression is a
30538pattern that Calc can search for. A regular expression that considers
30539blank lines, @samp{$}, and @samp{$$} to be opening delimiters is
30540@code{"\\`\\|^\n\\|\\$\\$?"}. Just in case the meaning of this
30541regular expression is not completely plain, let's go through it
30542in detail.
30543
30544The surrounding @samp{" "} marks quote the text between them as a
30545Lisp string. If you left them off, @code{set-variable} or
30546@code{edit-options} would try to read the regular expression as a
30547Lisp program.
30548
30549The most obvious property of this regular expression is that it
30550contains indecently many backslashes. There are actually two levels
30551of backslash usage going on here. First, when Lisp reads a quoted
30552string, all pairs of characters beginning with a backslash are
30553interpreted as special characters. Here, @code{\n} changes to a
30554new-line character, and @code{\\} changes to a single backslash.
30555So the actual regular expression seen by Calc is
30556@samp{\`\|^ @r{(newline)} \|\$\$?}.
30557
30558Regular expressions also consider pairs beginning with backslash
30559to have special meanings. Sometimes the backslash is used to quote
30560a character that otherwise would have a special meaning in a regular
30561expression, like @samp{$}, which normally means ``end-of-line,''
30562or @samp{?}, which means that the preceding item is optional. So
30563@samp{\$\$?} matches either one or two dollar signs.
30564
30565The other codes in this regular expression are @samp{^}, which matches
30566``beginning-of-line,'' @samp{\|}, which means ``or,'' and @samp{\`},
30567which matches ``beginning-of-buffer.'' So the whole pattern means
30568that a formula begins at the beginning of the buffer, or on a newline
30569that occurs at the beginning of a line (i.e., a blank line), or at
30570one or two dollar signs.
30571
30572The default value of @code{calc-embedded-open-formula} looks just
30573like this example, with several more alternatives added on to
30574recognize various other common kinds of delimiters.
30575
30576By the way, the reason to use @samp{^\n} rather than @samp{^$}
30577or @samp{\n\n}, which also would appear to match blank lines,
30578is that the former expression actually ``consumes'' only one
30579newline character as @emph{part of} the delimiter, whereas the
30580latter expressions consume zero or two newlines, respectively.
30581The former choice gives the most natural behavior when Calc
30582must operate on a whole formula including its delimiters.
30583
30584See the Emacs manual for complete details on regular expressions.
30585But just for your convenience, here is a list of all characters
30586which must be quoted with backslash (like @samp{\$}) to avoid
30587some special interpretation: @samp{. * + ? [ ] ^ $ \}. (Note
30588the backslash in this list; for example, to match @samp{\[} you
30589must use @code{"\\\\\\["}. An exercise for the reader is to
30590account for each of these six backslashes!)
30591
30592@vindex calc-embedded-close-formula
30593The @code{calc-embedded-close-formula} variable holds a regular
30594expression for the closing delimiter of a formula. A closing
30595regular expression to match the above example would be
30596@code{"\\'\\|\n$\\|\\$\\$?"}. This is almost the same as the
30597other one, except it now uses @samp{\'} (``end-of-buffer'') and
30598@samp{\n$} (newline occurring at end of line, yet another way
30599of describing a blank line that is more appropriate for this
30600case).
30601
30602@vindex calc-embedded-open-word
30603@vindex calc-embedded-close-word
30604The @code{calc-embedded-open-word} and @code{calc-embedded-close-word}
30605variables are similar expressions used when you type @kbd{C-x * w}
30606instead of @kbd{C-x * e} to enable Embedded mode.
30607
30608@vindex calc-embedded-open-plain
30609The @code{calc-embedded-open-plain} variable is a string which
30610begins a ``plain'' formula written in front of the formatted
30611formula when @kbd{d p} mode is turned on. Note that this is an
30612actual string, not a regular expression, because Calc must be able
30613to write this string into a buffer as well as to recognize it.
30614The default string is @code{"%%% "} (note the trailing space), but may
30615be different for certain major modes.
30616
30617@vindex calc-embedded-close-plain
30618The @code{calc-embedded-close-plain} variable is a string which
30619ends a ``plain'' formula. The default is @code{" %%%\n"}, but may be
30620different for different major modes. Without
30621the trailing newline here, the first line of a Big mode formula
30622that followed might be shifted over with respect to the other lines.
30623
30624@vindex calc-embedded-open-new-formula
30625The @code{calc-embedded-open-new-formula} variable is a string
30626which is inserted at the front of a new formula when you type
30627@kbd{C-x * f}. Its default value is @code{"\n\n"}. If this
30628string begins with a newline character and the @kbd{C-x * f} is
30629typed at the beginning of a line, @kbd{C-x * f} will skip this
30630first newline to avoid introducing unnecessary blank lines in
30631the file.
30632
30633@vindex calc-embedded-close-new-formula
30634The @code{calc-embedded-close-new-formula} variable is the corresponding
30635string which is inserted at the end of a new formula. Its default
30636value is also @code{"\n\n"}. The final newline is omitted by
30637@w{@kbd{C-x * f}} if typed at the end of a line. (It follows that if
30638@kbd{C-x * f} is typed on a blank line, both a leading opening
30639newline and a trailing closing newline are omitted.)
30640
30641@vindex calc-embedded-announce-formula
30642The @code{calc-embedded-announce-formula} variable is a regular
30643expression which is sure to be followed by an embedded formula.
30644The @kbd{C-x * a} command searches for this pattern as well as for
30645@samp{=>} and @samp{:=} operators. Note that @kbd{C-x * a} will
30646not activate just anything surrounded by formula delimiters; after
30647all, blank lines are considered formula delimiters by default!
30648But if your language includes a delimiter which can only occur
30649actually in front of a formula, you can take advantage of it here.
30650The default pattern is @code{"%Embed\n\\(% .*\n\\)*"}, but may be
30651different for different major modes.
30652This pattern will check for @samp{%Embed} followed by any number of
30653lines beginning with @samp{%} and a space. This last is important to
30654make Calc consider mode annotations part of the pattern, so that the
30655formula's opening delimiter really is sure to follow the pattern.
30656
30657@vindex calc-embedded-open-mode
30658The @code{calc-embedded-open-mode} variable is a string (not a
30659regular expression) which should precede a mode annotation.
30660Calc never scans for this string; Calc always looks for the
30661annotation itself. But this is the string that is inserted before
30662the opening bracket when Calc adds an annotation on its own.
30663The default is @code{"% "}, but may be different for different major
30664modes.
30665
30666@vindex calc-embedded-close-mode
30667The @code{calc-embedded-close-mode} variable is a string which
30668follows a mode annotation written by Calc. Its default value
30669is simply a newline, @code{"\n"}, but may be different for different
30670major modes. If you change this, it is a good idea still to end with a
30671newline so that mode annotations will appear on lines by themselves.
30672
30673@node Programming, Copying, Embedded Mode, Top
30674@chapter Programming
30675
30676@noindent
30677There are several ways to ``program'' the Emacs Calculator, depending
30678on the nature of the problem you need to solve.
30679
30680@enumerate
30681@item
30682@dfn{Keyboard macros} allow you to record a sequence of keystrokes
30683and play them back at a later time. This is just the standard Emacs
30684keyboard macro mechanism, dressed up with a few more features such
30685as loops and conditionals.
30686
30687@item
30688@dfn{Algebraic definitions} allow you to use any formula to define a
30689new function. This function can then be used in algebraic formulas or
30690as an interactive command.
30691
30692@item
30693@dfn{Rewrite rules} are discussed in the section on algebra commands.
30694@xref{Rewrite Rules}. If you put your rewrite rules in the variable
30695@code{EvalRules}, they will be applied automatically to all Calc
30696results in just the same way as an internal ``rule'' is applied to
30697evaluate @samp{sqrt(9)} to 3 and so on. @xref{Automatic Rewrites}.
30698
30699@item
30700@dfn{Lisp} is the programming language that Calc (and most of Emacs)
30701is written in. If the above techniques aren't powerful enough, you
30702can write Lisp functions to do anything that built-in Calc commands
30703can do. Lisp code is also somewhat faster than keyboard macros or
30704rewrite rules.
30705@end enumerate
30706
30707@kindex z
30708Programming features are available through the @kbd{z} and @kbd{Z}
30709prefix keys. New commands that you define are two-key sequences
30710beginning with @kbd{z}. Commands for managing these definitions
30711use the shift-@kbd{Z} prefix. (The @kbd{Z T} (@code{calc-timing})
30712command is described elsewhere; @pxref{Troubleshooting Commands}.
30713The @kbd{Z C} (@code{calc-user-define-composition}) command is also
30714described elsewhere; @pxref{User-Defined Compositions}.)
30715
30716@menu
30717* Creating User Keys::
30718* Keyboard Macros::
30719* Invocation Macros::
30720* Algebraic Definitions::
30721* Lisp Definitions::
30722@end menu
30723
30724@node Creating User Keys, Keyboard Macros, Programming, Programming
30725@section Creating User Keys
30726
30727@noindent
30728@kindex Z D
30729@pindex calc-user-define
30730Any Calculator command may be bound to a key using the @kbd{Z D}
30731(@code{calc-user-define}) command. Actually, it is bound to a two-key
30732sequence beginning with the lower-case @kbd{z} prefix.
30733
30734The @kbd{Z D} command first prompts for the key to define. For example,
30735press @kbd{Z D a} to define the new key sequence @kbd{z a}. You are then
30736prompted for the name of the Calculator command that this key should
30737run. For example, the @code{calc-sincos} command is not normally
30738available on a key. Typing @kbd{Z D s sincos @key{RET}} programs the
30739@kbd{z s} key sequence to run @code{calc-sincos}. This definition will remain
30740in effect for the rest of this Emacs session, or until you redefine
30741@kbd{z s} to be something else.
30742
30743You can actually bind any Emacs command to a @kbd{z} key sequence by
30744backspacing over the @samp{calc-} when you are prompted for the command name.
30745
30746As with any other prefix key, you can type @kbd{z ?} to see a list of
30747all the two-key sequences you have defined that start with @kbd{z}.
30748Initially, no @kbd{z} sequences (except @kbd{z ?} itself) are defined.
30749
30750User keys are typically letters, but may in fact be any key.
30751(@key{META}-keys are not permitted, nor are a terminal's special
30752function keys which generate multi-character sequences when pressed.)
30753You can define different commands on the shifted and unshifted versions
30754of a letter if you wish.
30755
30756@kindex Z U
30757@pindex calc-user-undefine
30758The @kbd{Z U} (@code{calc-user-undefine}) command unbinds a user key.
30759For example, the key sequence @kbd{Z U s} will undefine the @code{sincos}
30760key we defined above.
30761
30762@kindex Z P
30763@pindex calc-user-define-permanent
30764@cindex Storing user definitions
30765@cindex Permanent user definitions
30766@cindex Calc init file, user-defined commands
30767The @kbd{Z P} (@code{calc-user-define-permanent}) command makes a key
30768binding permanent so that it will remain in effect even in future Emacs
30769sessions. (It does this by adding a suitable bit of Lisp code into
30770your Calc init file; that is, the file given by the variable
30771@code{calc-settings-file}, typically @file{~/.calc.el}.) For example,
30772@kbd{Z P s} would register our @code{sincos} command permanently. If
30773you later wish to unregister this command you must edit your Calc init
30774file by hand. (@xref{General Mode Commands}, for a way to tell Calc to
30775use a different file for the Calc init file.)
30776
30777The @kbd{Z P} command also saves the user definition, if any, for the
30778command bound to the key. After @kbd{Z F} and @kbd{Z C}, a given user
30779key could invoke a command, which in turn calls an algebraic function,
30780which might have one or more special display formats. A single @kbd{Z P}
30781command will save all of these definitions.
30782To save an algebraic function, type @kbd{'} (the apostrophe)
30783when prompted for a key, and type the function name. To save a command
30784without its key binding, type @kbd{M-x} and enter a function name. (The
30785@samp{calc-} prefix will automatically be inserted for you.)
30786(If the command you give implies a function, the function will be saved,
30787and if the function has any display formats, those will be saved, but
30788not the other way around: Saving a function will not save any commands
30789or key bindings associated with the function.)
30790
30791@kindex Z E
30792@pindex calc-user-define-edit
30793@cindex Editing user definitions
30794The @kbd{Z E} (@code{calc-user-define-edit}) command edits the definition
30795of a user key. This works for keys that have been defined by either
30796keyboard macros or formulas; further details are contained in the relevant
30797following sections.
30798
30799@node Keyboard Macros, Invocation Macros, Creating User Keys, Programming
30800@section Programming with Keyboard Macros
30801
30802@noindent
30803@kindex X
30804@cindex Programming with keyboard macros
30805@cindex Keyboard macros
30806The easiest way to ``program'' the Emacs Calculator is to use standard
30807keyboard macros. Press @w{@kbd{C-x (}} to begin recording a macro. From
30808this point on, keystrokes you type will be saved away as well as
30809performing their usual functions. Press @kbd{C-x )} to end recording.
30810Press shift-@kbd{X} (or the standard Emacs key sequence @kbd{C-x e}) to
30811execute your keyboard macro by replaying the recorded keystrokes.
30812@xref{Keyboard Macros, , , emacs, the Emacs Manual}, for further
30813information.
30814
30815When you use @kbd{X} to invoke a keyboard macro, the entire macro is
30816treated as a single command by the undo and trail features. The stack
30817display buffer is not updated during macro execution, but is instead
30818fixed up once the macro completes. Thus, commands defined with keyboard
30819macros are convenient and efficient. The @kbd{C-x e} command, on the
30820other hand, invokes the keyboard macro with no special treatment: Each
30821command in the macro will record its own undo information and trail entry,
30822and update the stack buffer accordingly. If your macro uses features
30823outside of Calc's control to operate on the contents of the Calc stack
30824buffer, or if it includes Undo, Redo, or last-arguments commands, you
30825must use @kbd{C-x e} to make sure the buffer and undo list are up-to-date
30826at all times. You could also consider using @kbd{K} (@code{calc-keep-args})
30827instead of @kbd{M-@key{RET}} (@code{calc-last-args}).
30828
30829Calc extends the standard Emacs keyboard macros in several ways.
30830Keyboard macros can be used to create user-defined commands. Keyboard
30831macros can include conditional and iteration structures, somewhat
30832analogous to those provided by a traditional programmable calculator.
30833
30834@menu
30835* Naming Keyboard Macros::
30836* Conditionals in Macros::
30837* Loops in Macros::
30838* Local Values in Macros::
30839* Queries in Macros::
30840@end menu
30841
30842@node Naming Keyboard Macros, Conditionals in Macros, Keyboard Macros, Keyboard Macros
30843@subsection Naming Keyboard Macros
30844
30845@noindent
30846@kindex Z K
30847@pindex calc-user-define-kbd-macro
30848Once you have defined a keyboard macro, you can bind it to a @kbd{z}
30849key sequence with the @kbd{Z K} (@code{calc-user-define-kbd-macro}) command.
30850This command prompts first for a key, then for a command name. For
30851example, if you type @kbd{C-x ( n @key{TAB} n @key{TAB} C-x )} you will
30852define a keyboard macro which negates the top two numbers on the stack
30853(@key{TAB} swaps the top two stack elements). Now you can type
30854@kbd{Z K n @key{RET}} to define this keyboard macro onto the @kbd{z n} key
30855sequence. The default command name (if you answer the second prompt with
30856just the @key{RET} key as in this example) will be something like
30857@samp{calc-User-n}. The keyboard macro will now be available as both
30858@kbd{z n} and @kbd{M-x calc-User-n}. You can backspace and enter a more
30859descriptive command name if you wish.
30860
30861Macros defined by @kbd{Z K} act like single commands; they are executed
30862in the same way as by the @kbd{X} key. If you wish to define the macro
30863as a standard no-frills Emacs macro (to be executed as if by @kbd{C-x e}),
30864give a negative prefix argument to @kbd{Z K}.
30865
30866Once you have bound your keyboard macro to a key, you can use
30867@kbd{Z P} to register it permanently with Emacs. @xref{Creating User Keys}.
30868
30869@cindex Keyboard macros, editing
30870The @kbd{Z E} (@code{calc-user-define-edit}) command on a key that has
30871been defined by a keyboard macro tries to use the @code{edmacro} package
30872edit the macro. Type @kbd{C-c C-c} to finish editing and update
30873the definition stored on the key, or, to cancel the edit, kill the
30874buffer with @kbd{C-x k}.
30875The special characters @code{RET}, @code{LFD}, @code{TAB}, @code{SPC},
30876@code{DEL}, and @code{NUL} must be entered as these three character
30877sequences, written in all uppercase, as must the prefixes @code{C-} and
30878@code{M-}. Spaces and line breaks are ignored. Other characters are
30879copied verbatim into the keyboard macro. Basically, the notation is the
30880same as is used in all of this manual's examples, except that the manual
30881takes some liberties with spaces: When we say @kbd{' [1 2 3] @key{RET}},
30882we take it for granted that it is clear we really mean
30883@kbd{' [1 @key{SPC} 2 @key{SPC} 3] @key{RET}}.
30884
30885@kindex C-x * m
30886@pindex read-kbd-macro
30887The @kbd{C-x * m} (@code{read-kbd-macro}) command reads an Emacs ``region''
30888of spelled-out keystrokes and defines it as the current keyboard macro.
30889It is a convenient way to define a keyboard macro that has been stored
30890in a file, or to define a macro without executing it at the same time.
30891
30892@node Conditionals in Macros, Loops in Macros, Naming Keyboard Macros, Keyboard Macros
30893@subsection Conditionals in Keyboard Macros
30894
30895@noindent
30896@kindex Z [
30897@kindex Z ]
30898@pindex calc-kbd-if
30899@pindex calc-kbd-else
30900@pindex calc-kbd-else-if
30901@pindex calc-kbd-end-if
30902@cindex Conditional structures
30903The @kbd{Z [} (@code{calc-kbd-if}) and @kbd{Z ]} (@code{calc-kbd-end-if})
30904commands allow you to put simple tests in a keyboard macro. When Calc
30905sees the @kbd{Z [}, it pops an object from the stack and, if the object is
30906a non-zero value, continues executing keystrokes. But if the object is
30907zero, or if it is not provably nonzero, Calc skips ahead to the matching
30908@kbd{Z ]} keystroke. @xref{Logical Operations}, for a set of commands for
30909performing tests which conveniently produce 1 for true and 0 for false.
30910
30911For example, @kbd{@key{RET} 0 a < Z [ n Z ]} implements an absolute-value
30912function in the form of a keyboard macro. This macro duplicates the
30913number on the top of the stack, pushes zero and compares using @kbd{a <}
30914(@code{calc-less-than}), then, if the number was less than zero,
30915executes @kbd{n} (@code{calc-change-sign}). Otherwise, the change-sign
30916command is skipped.
30917
30918To program this macro, type @kbd{C-x (}, type the above sequence of
30919keystrokes, then type @kbd{C-x )}. Note that the keystrokes will be
30920executed while you are making the definition as well as when you later
30921re-execute the macro by typing @kbd{X}. Thus you should make sure a
30922suitable number is on the stack before defining the macro so that you
30923don't get a stack-underflow error during the definition process.
30924
30925Conditionals can be nested arbitrarily. However, there should be exactly
30926one @kbd{Z ]} for each @kbd{Z [} in a keyboard macro.
30927
30928@kindex Z :
30929The @kbd{Z :} (@code{calc-kbd-else}) command allows you to choose between
30930two keystroke sequences. The general format is @kbd{@var{cond} Z [
30931@var{then-part} Z : @var{else-part} Z ]}. If @var{cond} is true
30932(i.e., if the top of stack contains a non-zero number after @var{cond}
30933has been executed), the @var{then-part} will be executed and the
30934@var{else-part} will be skipped. Otherwise, the @var{then-part} will
30935be skipped and the @var{else-part} will be executed.
30936
30937@kindex Z |
30938The @kbd{Z |} (@code{calc-kbd-else-if}) command allows you to choose
30939between any number of alternatives. For example,
30940@kbd{@var{cond1} Z [ @var{part1} Z : @var{cond2} Z | @var{part2} Z :
30941@var{part3} Z ]} will execute @var{part1} if @var{cond1} is true,
30942otherwise it will execute @var{part2} if @var{cond2} is true, otherwise
30943it will execute @var{part3}.
30944
30945More precisely, @kbd{Z [} pops a number and conditionally skips to the
30946next matching @kbd{Z :} or @kbd{Z ]} key. @w{@kbd{Z ]}} has no effect when
30947actually executed. @kbd{Z :} skips to the next matching @kbd{Z ]}.
30948@kbd{Z |} pops a number and conditionally skips to the next matching
30949@kbd{Z :} or @kbd{Z ]}; thus, @kbd{Z [} and @kbd{Z |} are functionally
30950equivalent except that @kbd{Z [} participates in nesting but @kbd{Z |}
30951does not.
30952
30953Calc's conditional and looping constructs work by scanning the
30954keyboard macro for occurrences of character sequences like @samp{Z:}
30955and @samp{Z]}. One side-effect of this is that if you use these
30956constructs you must be careful that these character pairs do not
30957occur by accident in other parts of the macros. Since Calc rarely
30958uses shift-@kbd{Z} for any purpose except as a prefix character, this
30959is not likely to be a problem. Another side-effect is that it will
30960not work to define your own custom key bindings for these commands.
30961Only the standard shift-@kbd{Z} bindings will work correctly.
30962
30963@kindex Z C-g
30964If Calc gets stuck while skipping characters during the definition of a
30965macro, type @kbd{Z C-g} to cancel the definition. (Typing plain @kbd{C-g}
30966actually adds a @kbd{C-g} keystroke to the macro.)
30967
30968@node Loops in Macros, Local Values in Macros, Conditionals in Macros, Keyboard Macros
30969@subsection Loops in Keyboard Macros
30970
30971@noindent
30972@kindex Z <
30973@kindex Z >
30974@pindex calc-kbd-repeat
30975@pindex calc-kbd-end-repeat
30976@cindex Looping structures
30977@cindex Iterative structures
30978The @kbd{Z <} (@code{calc-kbd-repeat}) and @kbd{Z >}
30979(@code{calc-kbd-end-repeat}) commands pop a number from the stack,
30980which must be an integer, then repeat the keystrokes between the brackets
30981the specified number of times. If the integer is zero or negative, the
30982body is skipped altogether. For example, @kbd{1 @key{TAB} Z < 2 * Z >}
30983computes two to a nonnegative integer power. First, we push 1 on the
30984stack and then swap the integer argument back to the top. The @kbd{Z <}
30985pops that argument leaving the 1 back on top of the stack. Then, we
30986repeat a multiply-by-two step however many times.
30987
30988Once again, the keyboard macro is executed as it is being entered.
30989In this case it is especially important to set up reasonable initial
30990conditions before making the definition: Suppose the integer 1000 just
30991happened to be sitting on the stack before we typed the above definition!
30992Another approach is to enter a harmless dummy definition for the macro,
30993then go back and edit in the real one with a @kbd{Z E} command. Yet
30994another approach is to type the macro as written-out keystroke names
30995in a buffer, then use @kbd{C-x * m} (@code{read-kbd-macro}) to read the
30996macro.
30997
30998@kindex Z /
30999@pindex calc-break
31000The @kbd{Z /} (@code{calc-kbd-break}) command allows you to break out
31001of a keyboard macro loop prematurely. It pops an object from the stack;
31002if that object is true (a non-zero number), control jumps out of the
31003innermost enclosing @kbd{Z <} @dots{} @kbd{Z >} loop and continues
31004after the @kbd{Z >}. If the object is false, the @kbd{Z /} has no
31005effect. Thus @kbd{@var{cond} Z /} is similar to @samp{if (@var{cond}) break;}
31006in the C language.
31007
31008@kindex Z (
31009@kindex Z )
31010@pindex calc-kbd-for
31011@pindex calc-kbd-end-for
31012The @kbd{Z (} (@code{calc-kbd-for}) and @kbd{Z )} (@code{calc-kbd-end-for})
31013commands are similar to @kbd{Z <} and @kbd{Z >}, except that they make the
31014value of the counter available inside the loop. The general layout is
31015@kbd{@var{init} @var{final} Z ( @var{body} @var{step} Z )}. The @kbd{Z (}
31016command pops initial and final values from the stack. It then creates
31017a temporary internal counter and initializes it with the value @var{init}.
31018The @kbd{Z (} command then repeatedly pushes the counter value onto the
31019stack and executes @var{body} and @var{step}, adding @var{step} to the
31020counter each time until the loop finishes.
31021
31022@cindex Summations (by keyboard macros)
31023By default, the loop finishes when the counter becomes greater than (or
31024less than) @var{final}, assuming @var{initial} is less than (greater
31025than) @var{final}. If @var{initial} is equal to @var{final}, the body
31026executes exactly once. The body of the loop always executes at least
31027once. For example, @kbd{0 1 10 Z ( 2 ^ + 1 Z )} computes the sum of the
31028squares of the integers from 1 to 10, in steps of 1.
31029
31030If you give a numeric prefix argument of 1 to @kbd{Z (}, the loop is
31031forced to use upward-counting conventions. In this case, if @var{initial}
31032is greater than @var{final} the body will not be executed at all.
31033Note that @var{step} may still be negative in this loop; the prefix
31034argument merely constrains the loop-finished test. Likewise, a prefix
31035argument of @mathit{-1} forces downward-counting conventions.
31036
31037@kindex Z @{
31038@kindex Z @}
31039@pindex calc-kbd-loop
31040@pindex calc-kbd-end-loop
31041The @kbd{Z @{} (@code{calc-kbd-loop}) and @kbd{Z @}}
31042(@code{calc-kbd-end-loop}) commands are similar to @kbd{Z <} and
31043@kbd{Z >}, except that they do not pop a count from the stack---they
31044effectively create an infinite loop. Every @kbd{Z @{} @dots{} @kbd{Z @}}
31045loop ought to include at least one @kbd{Z /} to make sure the loop
31046doesn't run forever. (If any error message occurs which causes Emacs
31047to beep, the keyboard macro will also be halted; this is a standard
31048feature of Emacs. You can also generally press @kbd{C-g} to halt a
31049running keyboard macro, although not all versions of Unix support
31050this feature.)
31051
31052The conditional and looping constructs are not actually tied to
31053keyboard macros, but they are most often used in that context.
31054For example, the keystrokes @kbd{10 Z < 23 @key{RET} Z >} push
31055ten copies of 23 onto the stack. This can be typed ``live'' just
31056as easily as in a macro definition.
31057
31058@xref{Conditionals in Macros}, for some additional notes about
31059conditional and looping commands.
31060
31061@node Local Values in Macros, Queries in Macros, Loops in Macros, Keyboard Macros
31062@subsection Local Values in Macros
31063
31064@noindent
31065@cindex Local variables
31066@cindex Restoring saved modes
31067Keyboard macros sometimes want to operate under known conditions
31068without affecting surrounding conditions. For example, a keyboard
31069macro may wish to turn on Fraction mode, or set a particular
31070precision, independent of the user's normal setting for those
31071modes.
31072
31073@kindex Z `
31074@kindex Z '
31075@pindex calc-kbd-push
31076@pindex calc-kbd-pop
31077Macros also sometimes need to use local variables. Assignments to
31078local variables inside the macro should not affect any variables
31079outside the macro. The @kbd{Z `} (@code{calc-kbd-push}) and @kbd{Z '}
31080(@code{calc-kbd-pop}) commands give you both of these capabilities.
31081
31082When you type @kbd{Z `} (with a backquote or accent grave character),
31083the values of various mode settings are saved away. The ten ``quick''
31084variables @code{q0} through @code{q9} are also saved. When
31085you type @w{@kbd{Z '}} (with an apostrophe), these values are restored.
31086Pairs of @kbd{Z `} and @kbd{Z '} commands may be nested.
31087
31088If a keyboard macro halts due to an error in between a @kbd{Z `} and
31089a @kbd{Z '}, the saved values will be restored correctly even though
31090the macro never reaches the @kbd{Z '} command. Thus you can use
31091@kbd{Z `} and @kbd{Z '} without having to worry about what happens
31092in exceptional conditions.
31093
31094If you type @kbd{Z `} ``live'' (not in a keyboard macro), Calc puts
31095you into a ``recursive edit.'' You can tell you are in a recursive
31096edit because there will be extra square brackets in the mode line,
31097as in @samp{[(Calculator)]}. These brackets will go away when you
31098type the matching @kbd{Z '} command. The modes and quick variables
31099will be saved and restored in just the same way as if actual keyboard
31100macros were involved.
31101
31102The modes saved by @kbd{Z `} and @kbd{Z '} are the current precision
31103and binary word size, the angular mode (Deg, Rad, or HMS), the
31104simplification mode, Algebraic mode, Symbolic mode, Infinite mode,
31105Matrix or Scalar mode, Fraction mode, and the current complex mode
31106(Polar or Rectangular). The ten ``quick'' variables' values (or lack
31107thereof) are also saved.
31108
31109Most mode-setting commands act as toggles, but with a numeric prefix
31110they force the mode either on (positive prefix) or off (negative
31111or zero prefix). Since you don't know what the environment might
31112be when you invoke your macro, it's best to use prefix arguments
31113for all mode-setting commands inside the macro.
31114
31115In fact, @kbd{C-u Z `} is like @kbd{Z `} except that it sets the modes
31116listed above to their default values. As usual, the matching @kbd{Z '}
31117will restore the modes to their settings from before the @kbd{C-u Z `}.
31118Also, @w{@kbd{Z `}} with a negative prefix argument resets the algebraic mode
31119to its default (off) but leaves the other modes the same as they were
31120outside the construct.
31121
31122The contents of the stack and trail, values of non-quick variables, and
31123other settings such as the language mode and the various display modes,
31124are @emph{not} affected by @kbd{Z `} and @kbd{Z '}.
31125
31126@node Queries in Macros, , Local Values in Macros, Keyboard Macros
31127@subsection Queries in Keyboard Macros
31128
31129@c @noindent
31130@c @kindex Z =
31131@c @pindex calc-kbd-report
31132@c The @kbd{Z =} (@code{calc-kbd-report}) command displays an informative
31133@c message including the value on the top of the stack. You are prompted
31134@c to enter a string. That string, along with the top-of-stack value,
31135@c is displayed unless @kbd{m w} (@code{calc-working}) has been used
31136@c to turn such messages off.
31137
31138@noindent
31139@kindex Z #
31140@pindex calc-kbd-query
31141The @kbd{Z #} (@code{calc-kbd-query}) command prompts for an algebraic
31142entry which takes its input from the keyboard, even during macro
31143execution. All the normal conventions of algebraic input, including the
31144use of @kbd{$} characters, are supported. The prompt message itself is
31145taken from the top of the stack, and so must be entered (as a string)
31146before the @kbd{Z #} command. (Recall, as a string it can be entered by
31147pressing the @kbd{"} key and will appear as a vector when it is put on
31148the stack. The prompt message is only put on the stack to provide a
31149prompt for the @kbd{Z #} command; it will not play any role in any
31150subsequent calculations.) This command allows your keyboard macros to
31151accept numbers or formulas as interactive input.
31152
31153As an example,
31154@kbd{2 @key{RET} "Power: " @key{RET} Z # 3 @key{RET} ^} will prompt for
31155input with ``Power: '' in the minibuffer, then return 2 to the provided
31156power. (The response to the prompt that's given, 3 in this example,
31157will not be part of the macro.)
31158
31159@xref{Keyboard Macro Query, , , emacs, the Emacs Manual}, for a description of
31160@kbd{C-x q} (@code{kbd-macro-query}), the standard Emacs way to accept
31161keyboard input during a keyboard macro. In particular, you can use
31162@kbd{C-x q} to enter a recursive edit, which allows the user to perform
31163any Calculator operations interactively before pressing @kbd{C-M-c} to
31164return control to the keyboard macro.
31165
31166@node Invocation Macros, Algebraic Definitions, Keyboard Macros, Programming
31167@section Invocation Macros
31168
31169@kindex C-x * z
31170@kindex Z I
31171@pindex calc-user-invocation
31172@pindex calc-user-define-invocation
31173Calc provides one special keyboard macro, called up by @kbd{C-x * z}
31174(@code{calc-user-invocation}), that is intended to allow you to define
31175your own special way of starting Calc. To define this ``invocation
31176macro,'' create the macro in the usual way with @kbd{C-x (} and
31177@kbd{C-x )}, then type @kbd{Z I} (@code{calc-user-define-invocation}).
31178There is only one invocation macro, so you don't need to type any
31179additional letters after @kbd{Z I}. From now on, you can type
31180@kbd{C-x * z} at any time to execute your invocation macro.
31181
31182For example, suppose you find yourself often grabbing rectangles of
31183numbers into Calc and multiplying their columns. You can do this
31184by typing @kbd{C-x * r} to grab, and @kbd{V R : *} to multiply columns.
31185To make this into an invocation macro, just type @kbd{C-x ( C-x * r
31186V R : * C-x )}, then @kbd{Z I}. Then, to multiply a rectangle of data,
31187just mark the data in its buffer in the usual way and type @kbd{C-x * z}.
31188
31189Invocation macros are treated like regular Emacs keyboard macros;
31190all the special features described above for @kbd{Z K}-style macros
31191do not apply. @kbd{C-x * z} is just like @kbd{C-x e}, except that it
31192uses the macro that was last stored by @kbd{Z I}. (In fact, the
31193macro does not even have to have anything to do with Calc!)
31194
31195The @kbd{m m} command saves the last invocation macro defined by
31196@kbd{Z I} along with all the other Calc mode settings.
31197@xref{General Mode Commands}.
31198
31199@node Algebraic Definitions, Lisp Definitions, Invocation Macros, Programming
31200@section Programming with Formulas
31201
31202@noindent
31203@kindex Z F
31204@pindex calc-user-define-formula
31205@cindex Programming with algebraic formulas
31206Another way to create a new Calculator command uses algebraic formulas.
31207The @kbd{Z F} (@code{calc-user-define-formula}) command stores the
31208formula at the top of the stack as the definition for a key. This
31209command prompts for five things: The key, the command name, the function
31210name, the argument list, and the behavior of the command when given
31211non-numeric arguments.
31212
31213For example, suppose we type @kbd{' a+2b @key{RET}} to push the formula
31214@samp{a + 2*b} onto the stack. We now type @kbd{Z F m} to define this
31215formula on the @kbd{z m} key sequence. The next prompt is for a command
31216name, beginning with @samp{calc-}, which should be the long (@kbd{M-x}) form
31217for the new command. If you simply press @key{RET}, a default name like
31218@code{calc-User-m} will be constructed. In our example, suppose we enter
31219@kbd{spam @key{RET}} to define the new command as @code{calc-spam}.
31220
31221If you want to give the formula a long-style name only, you can press
31222@key{SPC} or @key{RET} when asked which single key to use. For example
31223@kbd{Z F @key{RET} spam @key{RET}} defines the new command as
31224@kbd{M-x calc-spam}, with no keyboard equivalent.
31225
31226The third prompt is for an algebraic function name. The default is to
31227use the same name as the command name but without the @samp{calc-}
31228prefix. (If this is of the form @samp{User-m}, the hyphen is removed so
31229it won't be taken for a minus sign in algebraic formulas.)
31230This is the name you will use if you want to enter your
31231new function in an algebraic formula. Suppose we enter @kbd{yow @key{RET}}.
31232Then the new function can be invoked by pushing two numbers on the
31233stack and typing @kbd{z m} or @kbd{x spam}, or by entering the algebraic
31234formula @samp{yow(x,y)}.
31235
31236The fourth prompt is for the function's argument list. This is used to
31237associate values on the stack with the variables that appear in the formula.
31238The default is a list of all variables which appear in the formula, sorted
31239into alphabetical order. In our case, the default would be @samp{(a b)}.
31240This means that, when the user types @kbd{z m}, the Calculator will remove
31241two numbers from the stack, substitute these numbers for @samp{a} and
31242@samp{b} (respectively) in the formula, then simplify the formula and
31243push the result on the stack. In other words, @kbd{10 @key{RET} 100 z m}
31244would replace the 10 and 100 on the stack with the number 210, which is
31245@expr{a + 2 b} with @expr{a=10} and @expr{b=100}. Likewise, the formula
31246@samp{yow(10, 100)} will be evaluated by substituting @expr{a=10} and
31247@expr{b=100} in the definition.
31248
31249You can rearrange the order of the names before pressing @key{RET} to
31250control which stack positions go to which variables in the formula. If
31251you remove a variable from the argument list, that variable will be left
31252in symbolic form by the command. Thus using an argument list of @samp{(b)}
31253for our function would cause @kbd{10 z m} to replace the 10 on the stack
31254with the formula @samp{a + 20}. If we had used an argument list of
31255@samp{(b a)}, the result with inputs 10 and 100 would have been 120.
31256
31257You can also put a nameless function on the stack instead of just a
31258formula, as in @samp{<a, b : a + 2 b>}. @xref{Specifying Operators}.
31259In this example, the command will be defined by the formula @samp{a + 2 b}
31260using the argument list @samp{(a b)}.
31261
31262The final prompt is a y-or-n question concerning what to do if symbolic
31263arguments are given to your function. If you answer @kbd{y}, then
31264executing @kbd{z m} (using the original argument list @samp{(a b)}) with
31265arguments @expr{10} and @expr{x} will leave the function in symbolic
31266form, i.e., @samp{yow(10,x)}. On the other hand, if you answer @kbd{n},
31267then the formula will always be expanded, even for non-constant
31268arguments: @samp{10 + 2 x}. If you never plan to feed algebraic
31269formulas to your new function, it doesn't matter how you answer this
31270question.
31271
31272If you answered @kbd{y} to this question you can still cause a function
31273call to be expanded by typing @kbd{a "} (@code{calc-expand-formula}).
31274Also, Calc will expand the function if necessary when you take a
31275derivative or integral or solve an equation involving the function.
31276
31277@kindex Z G
31278@pindex calc-get-user-defn
31279Once you have defined a formula on a key, you can retrieve this formula
31280with the @kbd{Z G} (@code{calc-user-define-get-defn}) command. Press a
31281key, and this command pushes the formula that was used to define that
31282key onto the stack. Actually, it pushes a nameless function that
31283specifies both the argument list and the defining formula. You will get
31284an error message if the key is undefined, or if the key was not defined
31285by a @kbd{Z F} command.
31286
31287The @kbd{Z E} (@code{calc-user-define-edit}) command on a key that has
31288been defined by a formula uses a variant of the @code{calc-edit} command
31289to edit the defining formula. Press @kbd{C-c C-c} to finish editing and
31290store the new formula back in the definition, or kill the buffer with
31291@kbd{C-x k} to
31292cancel the edit. (The argument list and other properties of the
31293definition are unchanged; to adjust the argument list, you can use
31294@kbd{Z G} to grab the function onto the stack, edit with @kbd{`}, and
31295then re-execute the @kbd{Z F} command.)
31296
31297As usual, the @kbd{Z P} command records your definition permanently.
31298In this case it will permanently record all three of the relevant
31299definitions: the key, the command, and the function.
31300
31301You may find it useful to turn off the default simplifications with
31302@kbd{m O} (@code{calc-no-simplify-mode}) when entering a formula to be
31303used as a function definition. For example, the formula @samp{deriv(a^2,v)}
31304which might be used to define a new function @samp{dsqr(a,v)} will be
31305``simplified'' to 0 immediately upon entry since @code{deriv} considers
31306@expr{a} to be constant with respect to @expr{v}. Turning off
31307default simplifications cures this problem: The definition will be stored
31308in symbolic form without ever activating the @code{deriv} function. Press
31309@kbd{m D} to turn the default simplifications back on afterwards.
31310
31311@node Lisp Definitions, , Algebraic Definitions, Programming
31312@section Programming with Lisp
31313
31314@noindent
31315The Calculator can be programmed quite extensively in Lisp. All you
31316do is write a normal Lisp function definition, but with @code{defmath}
31317in place of @code{defun}. This has the same form as @code{defun}, but it
31318automagically replaces calls to standard Lisp functions like @code{+} and
31319@code{zerop} with calls to the corresponding functions in Calc's own library.
31320Thus you can write natural-looking Lisp code which operates on all of the
31321standard Calculator data types. You can then use @kbd{Z D} if you wish to
31322bind your new command to a @kbd{z}-prefix key sequence. The @kbd{Z E} command
31323will not edit a Lisp-based definition.
31324
31325Emacs Lisp is described in the GNU Emacs Lisp Reference Manual. This section
31326assumes a familiarity with Lisp programming concepts; if you do not know
31327Lisp, you may find keyboard macros or rewrite rules to be an easier way
31328to program the Calculator.
31329
31330This section first discusses ways to write commands, functions, or
31331small programs to be executed inside of Calc. Then it discusses how
31332your own separate programs are able to call Calc from the outside.
31333Finally, there is a list of internal Calc functions and data structures
31334for the true Lisp enthusiast.
31335
31336@menu
31337* Defining Functions::
31338* Defining Simple Commands::
31339* Defining Stack Commands::
31340* Argument Qualifiers::
31341* Example Definitions::
31342
31343* Calling Calc from Your Programs::
31344* Internals::
31345@end menu
31346
31347@node Defining Functions, Defining Simple Commands, Lisp Definitions, Lisp Definitions
31348@subsection Defining New Functions
31349
31350@noindent
31351@findex defmath
31352The @code{defmath} function (actually a Lisp macro) is like @code{defun}
31353except that code in the body of the definition can make use of the full
31354range of Calculator data types. The prefix @samp{calcFunc-} is added
31355to the specified name to get the actual Lisp function name. As a simple
31356example,
31357
31358@example
31359(defmath myfact (n)
31360 (if (> n 0)
31361 (* n (myfact (1- n)))
31362 1))
31363@end example
31364
31365@noindent
31366This actually expands to the code,
31367
31368@example
31369(defun calcFunc-myfact (n)
31370 (if (math-posp n)
31371 (math-mul n (calcFunc-myfact (math-add n -1)))
31372 1))
31373@end example
31374
31375@noindent
31376This function can be used in algebraic expressions, e.g., @samp{myfact(5)}.
31377
31378The @samp{myfact} function as it is defined above has the bug that an
31379expression @samp{myfact(a+b)} will be simplified to 1 because the
31380formula @samp{a+b} is not considered to be @code{posp}. A robust
31381factorial function would be written along the following lines:
31382
31383@smallexample
31384(defmath myfact (n)
31385 (if (> n 0)
31386 (* n (myfact (1- n)))
31387 (if (= n 0)
31388 1
31389 nil))) ; this could be simplified as: (and (= n 0) 1)
31390@end smallexample
31391
31392If a function returns @code{nil}, it is left unsimplified by the Calculator
31393(except that its arguments will be simplified). Thus, @samp{myfact(a+1+2)}
31394will be simplified to @samp{myfact(a+3)} but no further. Beware that every
31395time the Calculator reexamines this formula it will attempt to resimplify
31396it, so your function ought to detect the returning-@code{nil} case as
31397efficiently as possible.
31398
31399The following standard Lisp functions are treated by @code{defmath}:
31400@code{+}, @code{-}, @code{*}, @code{/}, @code{%}, @code{^} or
31401@code{expt}, @code{=}, @code{<}, @code{>}, @code{<=}, @code{>=},
31402@code{/=}, @code{1+}, @code{1-}, @code{logand}, @code{logior}, @code{logxor},
31403@code{logandc2}, @code{lognot}. Also, @code{~=} is an abbreviation for
31404@code{math-nearly-equal}, which is useful in implementing Taylor series.
31405
31406For other functions @var{func}, if a function by the name
31407@samp{calcFunc-@var{func}} exists it is used, otherwise if a function by the
31408name @samp{math-@var{func}} exists it is used, otherwise if @var{func} itself
31409is defined as a function it is used, otherwise @samp{calcFunc-@var{func}} is
31410used on the assumption that this is a to-be-defined math function. Also, if
31411the function name is quoted as in @samp{('integerp a)} the function name is
31412always used exactly as written (but not quoted).
31413
31414Variable names have @samp{var-} prepended to them unless they appear in
31415the function's argument list or in an enclosing @code{let}, @code{let*},
31416@code{for}, or @code{foreach} form,
31417or their names already contain a @samp{-} character. Thus a reference to
31418@samp{foo} is the same as a reference to @samp{var-foo}.
31419
31420A few other Lisp extensions are available in @code{defmath} definitions:
31421
31422@itemize @bullet
31423@item
31424The @code{elt} function accepts any number of index variables.
31425Note that Calc vectors are stored as Lisp lists whose first
31426element is the symbol @code{vec}; thus, @samp{(elt v 2)} yields
31427the second element of vector @code{v}, and @samp{(elt m i j)}
31428yields one element of a Calc matrix.
31429
31430@item
31431The @code{setq} function has been extended to act like the Common
31432Lisp @code{setf} function. (The name @code{setf} is recognized as
31433a synonym of @code{setq}.) Specifically, the first argument of
31434@code{setq} can be an @code{nth}, @code{elt}, @code{car}, or @code{cdr} form,
31435in which case the effect is to store into the specified
31436element of a list. Thus, @samp{(setq (elt m i j) x)} stores @expr{x}
31437into one element of a matrix.
31438
31439@item
31440A @code{for} looping construct is available. For example,
31441@samp{(for ((i 0 10)) body)} executes @code{body} once for each
31442binding of @expr{i} from zero to 10. This is like a @code{let}
31443form in that @expr{i} is temporarily bound to the loop count
31444without disturbing its value outside the @code{for} construct.
31445Nested loops, as in @samp{(for ((i 0 10) (j 0 (1- i) 2)) body)},
31446are also available. For each value of @expr{i} from zero to 10,
31447@expr{j} counts from 0 to @expr{i-1} in steps of two. Note that
31448@code{for} has the same general outline as @code{let*}, except
31449that each element of the header is a list of three or four
31450things, not just two.
31451
31452@item
31453The @code{foreach} construct loops over elements of a list.
31454For example, @samp{(foreach ((x (cdr v))) body)} executes
31455@code{body} with @expr{x} bound to each element of Calc vector
31456@expr{v} in turn. The purpose of @code{cdr} here is to skip over
31457the initial @code{vec} symbol in the vector.
31458
31459@item
31460The @code{break} function breaks out of the innermost enclosing
31461@code{while}, @code{for}, or @code{foreach} loop. If given a
31462value, as in @samp{(break x)}, this value is returned by the
31463loop. (Lisp loops otherwise always return @code{nil}.)
31464
31465@item
31466The @code{return} function prematurely returns from the enclosing
31467function. For example, @samp{(return (+ x y))} returns @expr{x+y}
31468as the value of a function. You can use @code{return} anywhere
31469inside the body of the function.
31470@end itemize
31471
31472Non-integer numbers (and extremely large integers) cannot be included
31473directly into a @code{defmath} definition. This is because the Lisp
31474reader will fail to parse them long before @code{defmath} ever gets control.
31475Instead, use the notation, @samp{:"3.1415"}. In fact, any algebraic
31476formula can go between the quotes. For example,
31477
31478@smallexample
31479(defmath sqexp (x) ; sqexp(x) == sqrt(exp(x)) == exp(x*0.5)
31480 (and (numberp x)
31481 (exp :"x * 0.5")))
31482@end smallexample
31483
31484expands to
31485
31486@smallexample
31487(defun calcFunc-sqexp (x)
31488 (and (math-numberp x)
31489 (calcFunc-exp (math-mul x '(float 5 -1)))))
31490@end smallexample
31491
31492Note the use of @code{numberp} as a guard to ensure that the argument is
31493a number first, returning @code{nil} if not. The exponential function
31494could itself have been included in the expression, if we had preferred:
31495@samp{:"exp(x * 0.5)"}. As another example, the multiplication-and-recursion
31496step of @code{myfact} could have been written
31497
31498@example
31499:"n * myfact(n-1)"
31500@end example
31501
31502A good place to put your @code{defmath} commands is your Calc init file
31503(the file given by @code{calc-settings-file}, typically
31504@file{~/.calc.el}), which will not be loaded until Calc starts.
31505If a file named @file{.emacs} exists in your home directory, Emacs reads
31506and executes the Lisp forms in this file as it starts up. While it may
31507seem reasonable to put your favorite @code{defmath} commands there,
31508this has the unfortunate side-effect that parts of the Calculator must be
31509loaded in to process the @code{defmath} commands whether or not you will
31510actually use the Calculator! If you want to put the @code{defmath}
31511commands there (for example, if you redefine @code{calc-settings-file}
31512to be @file{.emacs}), a better effect can be had by writing
31513
31514@example
31515(put 'calc-define 'thing '(progn
31516 (defmath ... )
31517 (defmath ... )
31518))
31519@end example
31520
31521@noindent
31522@vindex calc-define
31523The @code{put} function adds a @dfn{property} to a symbol. Each Lisp
31524symbol has a list of properties associated with it. Here we add a
31525property with a name of @code{thing} and a @samp{(progn ...)} form as
31526its value. When Calc starts up, and at the start of every Calc command,
31527the property list for the symbol @code{calc-define} is checked and the
31528values of any properties found are evaluated as Lisp forms. The
31529properties are removed as they are evaluated. The property names
31530(like @code{thing}) are not used; you should choose something like the
31531name of your project so as not to conflict with other properties.
31532
31533The net effect is that you can put the above code in your @file{.emacs}
31534file and it will not be executed until Calc is loaded. Or, you can put
31535that same code in another file which you load by hand either before or
31536after Calc itself is loaded.
31537
31538The properties of @code{calc-define} are evaluated in the same order
31539that they were added. They can assume that the Calc modules @file{calc.el},
31540@file{calc-ext.el}, and @file{calc-macs.el} have been fully loaded, and
31541that the @samp{*Calculator*} buffer will be the current buffer.
31542
31543If your @code{calc-define} property only defines algebraic functions,
31544you can be sure that it will have been evaluated before Calc tries to
31545call your function, even if the file defining the property is loaded
31546after Calc is loaded. But if the property defines commands or key
31547sequences, it may not be evaluated soon enough. (Suppose it defines the
31548new command @code{tweak-calc}; the user can load your file, then type
31549@kbd{M-x tweak-calc} before Calc has had chance to do anything.) To
31550protect against this situation, you can put
31551
31552@example
31553(run-hooks 'calc-check-defines)
31554@end example
31555
31556@findex calc-check-defines
31557@noindent
31558at the end of your file. The @code{calc-check-defines} function is what
31559looks for and evaluates properties on @code{calc-define}; @code{run-hooks}
31560has the advantage that it is quietly ignored if @code{calc-check-defines}
31561is not yet defined because Calc has not yet been loaded.
31562
31563Examples of things that ought to be enclosed in a @code{calc-define}
31564property are @code{defmath} calls, @code{define-key} calls that modify
31565the Calc key map, and any calls that redefine things defined inside Calc.
31566Ordinary @code{defun}s need not be enclosed with @code{calc-define}.
31567
31568@node Defining Simple Commands, Defining Stack Commands, Defining Functions, Lisp Definitions
31569@subsection Defining New Simple Commands
31570
31571@noindent
31572@findex interactive
31573If a @code{defmath} form contains an @code{interactive} clause, it defines
31574a Calculator command. Actually such a @code{defmath} results in @emph{two}
31575function definitions: One, a @samp{calcFunc-} function as was just described,
31576with the @code{interactive} clause removed. Two, a @samp{calc-} function
31577with a suitable @code{interactive} clause and some sort of wrapper to make
31578the command work in the Calc environment.
31579
31580In the simple case, the @code{interactive} clause has the same form as
31581for normal Emacs Lisp commands:
31582
31583@smallexample
31584(defmath increase-precision (delta)
31585 "Increase precision by DELTA." ; This is the "documentation string"
31586 (interactive "p") ; Register this as a M-x-able command
31587 (setq calc-internal-prec (+ calc-internal-prec delta)))
31588@end smallexample
31589
31590This expands to the pair of definitions,
31591
31592@smallexample
31593(defun calc-increase-precision (delta)
31594 "Increase precision by DELTA."
31595 (interactive "p")
31596 (calc-wrapper
31597 (setq calc-internal-prec (math-add calc-internal-prec delta))))
31598
31599(defun calcFunc-increase-precision (delta)
31600 "Increase precision by DELTA."
31601 (setq calc-internal-prec (math-add calc-internal-prec delta)))
31602@end smallexample
31603
31604@noindent
31605where in this case the latter function would never really be used! Note
31606that since the Calculator stores small integers as plain Lisp integers,
31607the @code{math-add} function will work just as well as the native
31608@code{+} even when the intent is to operate on native Lisp integers.
31609
31610@findex calc-wrapper
31611The @samp{calc-wrapper} call invokes a macro which surrounds the body of
31612the function with code that looks roughly like this:
31613
31614@smallexample
31615(let ((calc-command-flags nil))
31616 (unwind-protect
31617 (save-excursion
31618 (calc-select-buffer)
31619 @emph{body of function}
31620 @emph{renumber stack}
31621 @emph{clear} Working @emph{message})
31622 @emph{realign cursor and window}
31623 @emph{clear Inverse, Hyperbolic, and Keep Args flags}
31624 @emph{update Emacs mode line}))
31625@end smallexample
31626
31627@findex calc-select-buffer
31628The @code{calc-select-buffer} function selects the @samp{*Calculator*}
31629buffer if necessary, say, because the command was invoked from inside
31630the @samp{*Calc Trail*} window.
31631
31632@findex calc-set-command-flag
31633You can call, for example, @code{(calc-set-command-flag 'no-align)} to
31634set the above-mentioned command flags. Calc routines recognize the
31635following command flags:
31636
31637@table @code
31638@item renum-stack
31639Stack line numbers @samp{1:}, @samp{2:}, and so on must be renumbered
31640after this command completes. This is set by routines like
31641@code{calc-push}.
31642
31643@item clear-message
31644Calc should call @samp{(message "")} if this command completes normally
31645(to clear a ``Working@dots{}'' message out of the echo area).
31646
31647@item no-align
31648Do not move the cursor back to the @samp{.} top-of-stack marker.
31649
31650@item position-point
31651Use the variables @code{calc-position-point-line} and
31652@code{calc-position-point-column} to position the cursor after
31653this command finishes.
31654
31655@item keep-flags
31656Do not clear @code{calc-inverse-flag}, @code{calc-hyperbolic-flag},
31657and @code{calc-keep-args-flag} at the end of this command.
31658
31659@item do-edit
31660Switch to buffer @samp{*Calc Edit*} after this command.
31661
31662@item hold-trail
31663Do not move trail pointer to end of trail when something is recorded
31664there.
31665@end table
31666
31667@kindex Y
31668@kindex Y ?
31669@vindex calc-Y-help-msgs
31670Calc reserves a special prefix key, shift-@kbd{Y}, for user-written
31671extensions to Calc. There are no built-in commands that work with
31672this prefix key; you must call @code{define-key} from Lisp (probably
31673from inside a @code{calc-define} property) to add to it. Initially only
31674@kbd{Y ?} is defined; it takes help messages from a list of strings
31675(initially @code{nil}) in the variable @code{calc-Y-help-msgs}. All
31676other undefined keys except for @kbd{Y} are reserved for use by
31677future versions of Calc.
31678
31679If you are writing a Calc enhancement which you expect to give to
31680others, it is best to minimize the number of @kbd{Y}-key sequences
31681you use. In fact, if you have more than one key sequence you should
31682consider defining three-key sequences with a @kbd{Y}, then a key that
31683stands for your package, then a third key for the particular command
31684within your package.
31685
31686Users may wish to install several Calc enhancements, and it is possible
31687that several enhancements will choose to use the same key. In the
31688example below, a variable @code{inc-prec-base-key} has been defined
31689to contain the key that identifies the @code{inc-prec} package. Its
31690value is initially @code{"P"}, but a user can change this variable
31691if necessary without having to modify the file.
31692
31693Here is a complete file, @file{inc-prec.el}, which makes a @kbd{Y P I}
31694command that increases the precision, and a @kbd{Y P D} command that
31695decreases the precision.
31696
31697@smallexample
31698;;; Increase and decrease Calc precision. Dave Gillespie, 5/31/91.
31699;; (Include copyright or copyleft stuff here.)
31700
31701(defvar inc-prec-base-key "P"
31702 "Base key for inc-prec.el commands.")
31703
31704(put 'calc-define 'inc-prec '(progn
31705
31706(define-key calc-mode-map (format "Y%sI" inc-prec-base-key)
31707 'increase-precision)
31708(define-key calc-mode-map (format "Y%sD" inc-prec-base-key)
31709 'decrease-precision)
31710
31711(setq calc-Y-help-msgs
31712 (cons (format "%s + Inc-prec, Dec-prec" inc-prec-base-key)
31713 calc-Y-help-msgs))
31714
31715(defmath increase-precision (delta)
31716 "Increase precision by DELTA."
31717 (interactive "p")
31718 (setq calc-internal-prec (+ calc-internal-prec delta)))
31719
31720(defmath decrease-precision (delta)
31721 "Decrease precision by DELTA."
31722 (interactive "p")
31723 (setq calc-internal-prec (- calc-internal-prec delta)))
31724
31725)) ; end of calc-define property
31726
31727(run-hooks 'calc-check-defines)
31728@end smallexample
31729
31730@node Defining Stack Commands, Argument Qualifiers, Defining Simple Commands, Lisp Definitions
31731@subsection Defining New Stack-Based Commands
31732
31733@noindent
31734To define a new computational command which takes and/or leaves arguments
31735on the stack, a special form of @code{interactive} clause is used.
31736
31737@example
31738(interactive @var{num} @var{tag})
31739@end example
31740
31741@noindent
31742where @var{num} is an integer, and @var{tag} is a string. The effect is
31743to pop @var{num} values off the stack, resimplify them by calling
31744@code{calc-normalize}, and hand them to your function according to the
31745function's argument list. Your function may include @code{&optional} and
31746@code{&rest} parameters, so long as calling the function with @var{num}
31747parameters is valid.
31748
31749Your function must return either a number or a formula in a form
31750acceptable to Calc, or a list of such numbers or formulas. These value(s)
31751are pushed onto the stack when the function completes. They are also
31752recorded in the Calc Trail buffer on a line beginning with @var{tag},
31753a string of (normally) four characters or less. If you omit @var{tag}
31754or use @code{nil} as a tag, the result is not recorded in the trail.
31755
31756As an example, the definition
31757
31758@smallexample
31759(defmath myfact (n)
31760 "Compute the factorial of the integer at the top of the stack."
31761 (interactive 1 "fact")
31762 (if (> n 0)
31763 (* n (myfact (1- n)))
31764 (and (= n 0) 1)))
31765@end smallexample
31766
31767@noindent
31768is a version of the factorial function shown previously which can be used
31769as a command as well as an algebraic function. It expands to
31770
31771@smallexample
31772(defun calc-myfact ()
31773 "Compute the factorial of the integer at the top of the stack."
31774 (interactive)
31775 (calc-slow-wrapper
31776 (calc-enter-result 1 "fact"
31777 (cons 'calcFunc-myfact (calc-top-list-n 1)))))
31778
31779(defun calcFunc-myfact (n)
31780 "Compute the factorial of the integer at the top of the stack."
31781 (if (math-posp n)
31782 (math-mul n (calcFunc-myfact (math-add n -1)))
31783 (and (math-zerop n) 1)))
31784@end smallexample
31785
31786@findex calc-slow-wrapper
31787The @code{calc-slow-wrapper} function is a version of @code{calc-wrapper}
31788that automatically puts up a @samp{Working...} message before the
31789computation begins. (This message can be turned off by the user
31790with an @kbd{m w} (@code{calc-working}) command.)
31791
31792@findex calc-top-list-n
31793The @code{calc-top-list-n} function returns a list of the specified number
31794of values from the top of the stack. It resimplifies each value by
31795calling @code{calc-normalize}. If its argument is zero it returns an
31796empty list. It does not actually remove these values from the stack.
31797
31798@findex calc-enter-result
31799The @code{calc-enter-result} function takes an integer @var{num} and string
31800@var{tag} as described above, plus a third argument which is either a
31801Calculator data object or a list of such objects. These objects are
31802resimplified and pushed onto the stack after popping the specified number
31803of values from the stack. If @var{tag} is non-@code{nil}, the values
31804being pushed are also recorded in the trail.
31805
31806Note that if @code{calcFunc-myfact} returns @code{nil} this represents
31807``leave the function in symbolic form.'' To return an actual empty list,
31808in the sense that @code{calc-enter-result} will push zero elements back
31809onto the stack, you should return the special value @samp{'(nil)}, a list
31810containing the single symbol @code{nil}.
31811
31812The @code{interactive} declaration can actually contain a limited
31813Emacs-style code string as well which comes just before @var{num} and
31814@var{tag}. Currently the only Emacs code supported is @samp{"p"}, as in
31815
31816@example
31817(defmath foo (a b &optional c)
31818 (interactive "p" 2 "foo")
31819 @var{body})
31820@end example
31821
31822In this example, the command @code{calc-foo} will evaluate the expression
31823@samp{foo(a,b)} if executed with no argument, or @samp{foo(a,b,n)} if
31824executed with a numeric prefix argument of @expr{n}.
31825
31826The other code string allowed is @samp{"m"} (unrelated to the usual @samp{"m"}
31827code as used with @code{defun}). It uses the numeric prefix argument as the
31828number of objects to remove from the stack and pass to the function.
31829In this case, the integer @var{num} serves as a default number of
31830arguments to be used when no prefix is supplied.
31831
31832@node Argument Qualifiers, Example Definitions, Defining Stack Commands, Lisp Definitions
31833@subsection Argument Qualifiers
31834
31835@noindent
31836Anywhere a parameter name can appear in the parameter list you can also use
31837an @dfn{argument qualifier}. Thus the general form of a definition is:
31838
31839@example
31840(defmath @var{name} (@var{param} @var{param...}
31841 &optional @var{param} @var{param...}
31842 &rest @var{param})
31843 @var{body})
31844@end example
31845
31846@noindent
31847where each @var{param} is either a symbol or a list of the form
31848
31849@example
31850(@var{qual} @var{param})
31851@end example
31852
31853The following qualifiers are recognized:
31854
31855@table @samp
31856@item complete
31857@findex complete
31858The argument must not be an incomplete vector, interval, or complex number.
31859(This is rarely needed since the Calculator itself will never call your
31860function with an incomplete argument. But there is nothing stopping your
31861own Lisp code from calling your function with an incomplete argument.)
31862
31863@item integer
31864@findex integer
31865The argument must be an integer. If it is an integer-valued float
31866it will be accepted but converted to integer form. Non-integers and
31867formulas are rejected.
31868
31869@item natnum
31870@findex natnum
31871Like @samp{integer}, but the argument must be non-negative.
31872
31873@item fixnum
31874@findex fixnum
31875Like @samp{integer}, but the argument must fit into a native Lisp integer,
31876which on most systems means less than 2^23 in absolute value. The
31877argument is converted into Lisp-integer form if necessary.
31878
31879@item float
31880@findex float
31881The argument is converted to floating-point format if it is a number or
31882vector. If it is a formula it is left alone. (The argument is never
31883actually rejected by this qualifier.)
31884
31885@item @var{pred}
31886The argument must satisfy predicate @var{pred}, which is one of the
31887standard Calculator predicates. @xref{Predicates}.
31888
31889@item not-@var{pred}
31890The argument must @emph{not} satisfy predicate @var{pred}.
31891@end table
31892
31893For example,
31894
31895@example
31896(defmath foo (a (constp (not-matrixp b)) &optional (float c)
31897 &rest (integer d))
31898 @var{body})
31899@end example
31900
31901@noindent
31902expands to
31903
31904@example
31905(defun calcFunc-foo (a b &optional c &rest d)
31906 (and (math-matrixp b)
31907 (math-reject-arg b 'not-matrixp))
31908 (or (math-constp b)
31909 (math-reject-arg b 'constp))
31910 (and c (setq c (math-check-float c)))
31911 (setq d (mapcar 'math-check-integer d))
31912 @var{body})
31913@end example
31914
31915@noindent
31916which performs the necessary checks and conversions before executing the
31917body of the function.
31918
31919@node Example Definitions, Calling Calc from Your Programs, Argument Qualifiers, Lisp Definitions
31920@subsection Example Definitions
31921
31922@noindent
31923This section includes some Lisp programming examples on a larger scale.
31924These programs make use of some of the Calculator's internal functions;
31925@pxref{Internals}.
31926
31927@menu
31928* Bit Counting Example::
31929* Sine Example::
31930@end menu
31931
31932@node Bit Counting Example, Sine Example, Example Definitions, Example Definitions
31933@subsubsection Bit-Counting
31934
31935@noindent
31936@ignore
31937@starindex
31938@end ignore
31939@tindex bcount
31940Calc does not include a built-in function for counting the number of
31941``one'' bits in a binary integer. It's easy to invent one using @kbd{b u}
31942to convert the integer to a set, and @kbd{V #} to count the elements of
31943that set; let's write a function that counts the bits without having to
31944create an intermediate set.
31945
31946@smallexample
31947(defmath bcount ((natnum n))
31948 (interactive 1 "bcnt")
31949 (let ((count 0))
31950 (while (> n 0)
31951 (if (oddp n)
31952 (setq count (1+ count)))
31953 (setq n (lsh n -1)))
31954 count))
31955@end smallexample
31956
31957@noindent
31958When this is expanded by @code{defmath}, it will become the following
31959Emacs Lisp function:
31960
31961@smallexample
31962(defun calcFunc-bcount (n)
31963 (setq n (math-check-natnum n))
31964 (let ((count 0))
31965 (while (math-posp n)
31966 (if (math-oddp n)
31967 (setq count (math-add count 1)))
31968 (setq n (calcFunc-lsh n -1)))
31969 count))
31970@end smallexample
31971
31972If the input numbers are large, this function involves a fair amount
31973of arithmetic. A binary right shift is essentially a division by two;
31974recall that Calc stores integers in decimal form so bit shifts must
31975involve actual division.
31976
31977To gain a bit more efficiency, we could divide the integer into
31978@var{n}-bit chunks, each of which can be handled quickly because
31979they fit into Lisp integers. It turns out that Calc's arithmetic
31980routines are especially fast when dividing by an integer less than
319811000, so we can set @var{n = 9} bits and use repeated division by 512:
31982
31983@smallexample
31984(defmath bcount ((natnum n))
31985 (interactive 1 "bcnt")
31986 (let ((count 0))
31987 (while (not (fixnump n))
31988 (let ((qr (idivmod n 512)))
31989 (setq count (+ count (bcount-fixnum (cdr qr)))
31990 n (car qr))))
31991 (+ count (bcount-fixnum n))))
31992
31993(defun bcount-fixnum (n)
31994 (let ((count 0))
31995 (while (> n 0)
31996 (setq count (+ count (logand n 1))
31997 n (lsh n -1)))
31998 count))
31999@end smallexample
32000
32001@noindent
32002Note that the second function uses @code{defun}, not @code{defmath}.
32003Because this function deals only with native Lisp integers (``fixnums''),
32004it can use the actual Emacs @code{+} and related functions rather
32005than the slower but more general Calc equivalents which @code{defmath}
32006uses.
32007
32008The @code{idivmod} function does an integer division, returning both
32009the quotient and the remainder at once. Again, note that while it
32010might seem that @samp{(logand n 511)} and @samp{(lsh n -9)} are
32011more efficient ways to split off the bottom nine bits of @code{n},
32012actually they are less efficient because each operation is really
32013a division by 512 in disguise; @code{idivmod} allows us to do the
32014same thing with a single division by 512.
32015
32016@node Sine Example, , Bit Counting Example, Example Definitions
32017@subsubsection The Sine Function
32018
32019@noindent
32020@ignore
32021@starindex
32022@end ignore
32023@tindex mysin
32024A somewhat limited sine function could be defined as follows, using the
32025well-known Taylor series expansion for
32026@texline @math{\sin x}:
32027@infoline @samp{sin(x)}:
32028
32029@smallexample
32030(defmath mysin ((float (anglep x)))
32031 (interactive 1 "mysn")
32032 (setq x (to-radians x)) ; Convert from current angular mode.
32033 (let ((sum x) ; Initial term of Taylor expansion of sin.
32034 newsum
32035 (nfact 1) ; "nfact" equals "n" factorial at all times.
32036 (xnegsqr :"-(x^2)")) ; "xnegsqr" equals -x^2.
32037 (for ((n 3 100 2)) ; Upper limit of 100 is a good precaution.
32038 (working "mysin" sum) ; Display "Working" message, if enabled.
32039 (setq nfact (* nfact (1- n) n)
32040 x (* x xnegsqr)
32041 newsum (+ sum (/ x nfact)))
32042 (if (~= newsum sum) ; If newsum is "nearly equal to" sum,
32043 (break)) ; then we are done.
32044 (setq sum newsum))
32045 sum))
32046@end smallexample
32047
32048The actual @code{sin} function in Calc works by first reducing the problem
32049to a sine or cosine of a nonnegative number less than @cpiover{4}. This
32050ensures that the Taylor series will converge quickly. Also, the calculation
32051is carried out with two extra digits of precision to guard against cumulative
32052round-off in @samp{sum}. Finally, complex arguments are allowed and handled
32053by a separate algorithm.
32054
32055@smallexample
32056(defmath mysin ((float (scalarp x)))
32057 (interactive 1 "mysn")
32058 (setq x (to-radians x)) ; Convert from current angular mode.
32059 (with-extra-prec 2 ; Evaluate with extra precision.
32060 (cond ((complexp x)
32061 (mysin-complex x))
32062 ((< x 0)
32063 (- (mysin-raw (- x))) ; Always call mysin-raw with x >= 0.
32064 (t (mysin-raw x))))))
32065
32066(defmath mysin-raw (x)
32067 (cond ((>= x 7)
32068 (mysin-raw (% x (two-pi)))) ; Now x < 7.
32069 ((> x (pi-over-2))
32070 (- (mysin-raw (- x (pi))))) ; Now -pi/2 <= x <= pi/2.
32071 ((> x (pi-over-4))
32072 (mycos-raw (- x (pi-over-2)))) ; Now -pi/2 <= x <= pi/4.
32073 ((< x (- (pi-over-4)))
32074 (- (mycos-raw (+ x (pi-over-2))))) ; Now -pi/4 <= x <= pi/4,
32075 (t (mysin-series x)))) ; so the series will be efficient.
32076@end smallexample
32077
32078@noindent
32079where @code{mysin-complex} is an appropriate function to handle complex
32080numbers, @code{mysin-series} is the routine to compute the sine Taylor
32081series as before, and @code{mycos-raw} is a function analogous to
32082@code{mysin-raw} for cosines.
32083
32084The strategy is to ensure that @expr{x} is nonnegative before calling
32085@code{mysin-raw}. This function then recursively reduces its argument
32086to a suitable range, namely, plus-or-minus @cpiover{4}. Note that each
32087test, and particularly the first comparison against 7, is designed so
32088that small roundoff errors cannot produce an infinite loop. (Suppose
32089we compared with @samp{(two-pi)} instead; if due to roundoff problems
32090the modulo operator ever returned @samp{(two-pi)} exactly, an infinite
32091recursion could result!) We use modulo only for arguments that will
32092clearly get reduced, knowing that the next rule will catch any reductions
32093that this rule misses.
32094
32095If a program is being written for general use, it is important to code
32096it carefully as shown in this second example. For quick-and-dirty programs,
32097when you know that your own use of the sine function will never encounter
32098a large argument, a simpler program like the first one shown is fine.
32099
32100@node Calling Calc from Your Programs, Internals, Example Definitions, Lisp Definitions
32101@subsection Calling Calc from Your Lisp Programs
32102
32103@noindent
32104A later section (@pxref{Internals}) gives a full description of
32105Calc's internal Lisp functions. It's not hard to call Calc from
32106inside your programs, but the number of these functions can be daunting.
32107So Calc provides one special ``programmer-friendly'' function called
32108@code{calc-eval} that can be made to do just about everything you
32109need. It's not as fast as the low-level Calc functions, but it's
32110much simpler to use!
32111
32112It may seem that @code{calc-eval} itself has a daunting number of
32113options, but they all stem from one simple operation.
32114
32115In its simplest manifestation, @samp{(calc-eval "1+2")} parses the
32116string @code{"1+2"} as if it were a Calc algebraic entry and returns
32117the result formatted as a string: @code{"3"}.
32118
32119Since @code{calc-eval} is on the list of recommended @code{autoload}
32120functions, you don't need to make any special preparations to load
32121Calc before calling @code{calc-eval} the first time. Calc will be
32122loaded and initialized for you.
32123
32124All the Calc modes that are currently in effect will be used when
32125evaluating the expression and formatting the result.
32126
32127@ifinfo
32128@example
32129
32130@end example
32131@end ifinfo
32132@subsubsection Additional Arguments to @code{calc-eval}
32133
32134@noindent
32135If the input string parses to a list of expressions, Calc returns
32136the results separated by @code{", "}. You can specify a different
32137separator by giving a second string argument to @code{calc-eval}:
32138@samp{(calc-eval "1+2,3+4" ";")} returns @code{"3;7"}.
32139
32140The ``separator'' can also be any of several Lisp symbols which
32141request other behaviors from @code{calc-eval}. These are discussed
32142one by one below.
32143
32144You can give additional arguments to be substituted for
32145@samp{$}, @samp{$$}, and so on in the main expression. For
32146example, @samp{(calc-eval "$/$$" nil "7" "1+1")} evaluates the
32147expression @code{"7/(1+1)"} to yield the result @code{"3.5"}
32148(assuming Fraction mode is not in effect). Note the @code{nil}
32149used as a placeholder for the item-separator argument.
32150
32151@ifinfo
32152@example
32153
32154@end example
32155@end ifinfo
32156@subsubsection Error Handling
32157
32158@noindent
32159If @code{calc-eval} encounters an error, it returns a list containing
32160the character position of the error, plus a suitable message as a
32161string. Note that @samp{1 / 0} is @emph{not} an error by Calc's
32162standards; it simply returns the string @code{"1 / 0"} which is the
32163division left in symbolic form. But @samp{(calc-eval "1/")} will
32164return the list @samp{(2 "Expected a number")}.
32165
32166If you bind the variable @code{calc-eval-error} to @code{t}
32167using a @code{let} form surrounding the call to @code{calc-eval},
32168errors instead call the Emacs @code{error} function which aborts
32169to the Emacs command loop with a beep and an error message.
32170
32171If you bind this variable to the symbol @code{string}, error messages
32172are returned as strings instead of lists. The character position is
32173ignored.
32174
32175As a courtesy to other Lisp code which may be using Calc, be sure
32176to bind @code{calc-eval-error} using @code{let} rather than changing
32177it permanently with @code{setq}.
32178
32179@ifinfo
32180@example
32181
32182@end example
32183@end ifinfo
32184@subsubsection Numbers Only
32185
32186@noindent
32187Sometimes it is preferable to treat @samp{1 / 0} as an error
32188rather than returning a symbolic result. If you pass the symbol
32189@code{num} as the second argument to @code{calc-eval}, results
32190that are not constants are treated as errors. The error message
32191reported is the first @code{calc-why} message if there is one,
32192or otherwise ``Number expected.''
32193
32194A result is ``constant'' if it is a number, vector, or other
32195object that does not include variables or function calls. If it
32196is a vector, the components must themselves be constants.
32197
32198@ifinfo
32199@example
32200
32201@end example
32202@end ifinfo
32203@subsubsection Default Modes
32204
32205@noindent
32206If the first argument to @code{calc-eval} is a list whose first
32207element is a formula string, then @code{calc-eval} sets all the
32208various Calc modes to their default values while the formula is
32209evaluated and formatted. For example, the precision is set to 12
32210digits, digit grouping is turned off, and the Normal language
32211mode is used.
32212
32213This same principle applies to the other options discussed below.
32214If the first argument would normally be @var{x}, then it can also
32215be the list @samp{(@var{x})} to use the default mode settings.
32216
32217If there are other elements in the list, they are taken as
32218variable-name/value pairs which override the default mode
32219settings. Look at the documentation at the front of the
32220@file{calc.el} file to find the names of the Lisp variables for
32221the various modes. The mode settings are restored to their
32222original values when @code{calc-eval} is done.
32223
32224For example, @samp{(calc-eval '("$+$$" calc-internal-prec 8) 'num a b)}
32225computes the sum of two numbers, requiring a numeric result, and
32226using default mode settings except that the precision is 8 instead
32227of the default of 12.
32228
32229It's usually best to use this form of @code{calc-eval} unless your
32230program actually considers the interaction with Calc's mode settings
32231to be a feature. This will avoid all sorts of potential ``gotchas'';
32232consider what happens with @samp{(calc-eval "sqrt(2)" 'num)}
32233when the user has left Calc in Symbolic mode or No-Simplify mode.
32234
32235As another example, @samp{(equal (calc-eval '("$<$$") nil a b) "1")}
32236checks if the number in string @expr{a} is less than the one in
32237string @expr{b}. Without using a list, the integer 1 might
32238come out in a variety of formats which would be hard to test for
32239conveniently: @code{"1"}, @code{"8#1"}, @code{"00001"}. (But
32240see ``Predicates'' mode, below.)
32241
32242@ifinfo
32243@example
32244
32245@end example
32246@end ifinfo
32247@subsubsection Raw Numbers
32248
32249@noindent
32250Normally all input and output for @code{calc-eval} is done with strings.
32251You can do arithmetic with, say, @samp{(calc-eval "$+$$" nil a b)}
32252in place of @samp{(+ a b)}, but this is very inefficient since the
32253numbers must be converted to and from string format as they are passed
32254from one @code{calc-eval} to the next.
32255
32256If the separator is the symbol @code{raw}, the result will be returned
32257as a raw Calc data structure rather than a string. You can read about
32258how these objects look in the following sections, but usually you can
32259treat them as ``black box'' objects with no important internal
32260structure.
32261
32262There is also a @code{rawnum} symbol, which is a combination of
32263@code{raw} (returning a raw Calc object) and @code{num} (signaling
32264an error if that object is not a constant).
32265
32266You can pass a raw Calc object to @code{calc-eval} in place of a
32267string, either as the formula itself or as one of the @samp{$}
32268arguments. Thus @samp{(calc-eval "$+$$" 'raw a b)} is an
32269addition function that operates on raw Calc objects. Of course
32270in this case it would be easier to call the low-level @code{math-add}
32271function in Calc, if you can remember its name.
32272
32273In particular, note that a plain Lisp integer is acceptable to Calc
32274as a raw object. (All Lisp integers are accepted on input, but
32275integers of more than six decimal digits are converted to ``big-integer''
32276form for output. @xref{Data Type Formats}.)
32277
32278When it comes time to display the object, just use @samp{(calc-eval a)}
32279to format it as a string.
32280
32281It is an error if the input expression evaluates to a list of
32282values. The separator symbol @code{list} is like @code{raw}
32283except that it returns a list of one or more raw Calc objects.
32284
32285Note that a Lisp string is not a valid Calc object, nor is a list
32286containing a string. Thus you can still safely distinguish all the
32287various kinds of error returns discussed above.
32288
32289@ifinfo
32290@example
32291
32292@end example
32293@end ifinfo
32294@subsubsection Predicates
32295
32296@noindent
32297If the separator symbol is @code{pred}, the result of the formula is
32298treated as a true/false value; @code{calc-eval} returns @code{t} or
32299@code{nil}, respectively. A value is considered ``true'' if it is a
32300non-zero number, or false if it is zero or if it is not a number.
32301
32302For example, @samp{(calc-eval "$<$$" 'pred a b)} tests whether
32303one value is less than another.
32304
32305As usual, it is also possible for @code{calc-eval} to return one of
32306the error indicators described above. Lisp will interpret such an
32307indicator as ``true'' if you don't check for it explicitly. If you
32308wish to have an error register as ``false'', use something like
32309@samp{(eq (calc-eval ...) t)}.
32310
32311@ifinfo
32312@example
32313
32314@end example
32315@end ifinfo
32316@subsubsection Variable Values
32317
32318@noindent
32319Variables in the formula passed to @code{calc-eval} are not normally
32320replaced by their values. If you wish this, you can use the
32321@code{evalv} function (@pxref{Algebraic Manipulation}). For example,
32322if 4 is stored in Calc variable @code{a} (i.e., in Lisp variable
32323@code{var-a}), then @samp{(calc-eval "a+pi")} will return the
32324formula @code{"a + pi"}, but @samp{(calc-eval "evalv(a+pi)")}
32325will return @code{"7.14159265359"}.
32326
32327To store in a Calc variable, just use @code{setq} to store in the
32328corresponding Lisp variable. (This is obtained by prepending
32329@samp{var-} to the Calc variable name.) Calc routines will
32330understand either string or raw form values stored in variables,
32331although raw data objects are much more efficient. For example,
32332to increment the Calc variable @code{a}:
32333
32334@example
32335(setq var-a (calc-eval "evalv(a+1)" 'raw))
32336@end example
32337
32338@ifinfo
32339@example
32340
32341@end example
32342@end ifinfo
32343@subsubsection Stack Access
32344
32345@noindent
32346If the separator symbol is @code{push}, the formula argument is
32347evaluated (with possible @samp{$} expansions, as usual). The
32348result is pushed onto the Calc stack. The return value is @code{nil}
32349(unless there is an error from evaluating the formula, in which
32350case the return value depends on @code{calc-eval-error} in the
32351usual way).
32352
32353If the separator symbol is @code{pop}, the first argument to
32354@code{calc-eval} must be an integer instead of a string. That
32355many values are popped from the stack and thrown away. A negative
32356argument deletes the entry at that stack level. The return value
32357is the number of elements remaining in the stack after popping;
32358@samp{(calc-eval 0 'pop)} is a good way to measure the size of
32359the stack.
32360
32361If the separator symbol is @code{top}, the first argument to
32362@code{calc-eval} must again be an integer. The value at that
32363stack level is formatted as a string and returned. Thus
32364@samp{(calc-eval 1 'top)} returns the top-of-stack value. If the
32365integer is out of range, @code{nil} is returned.
32366
32367The separator symbol @code{rawtop} is just like @code{top} except
32368that the stack entry is returned as a raw Calc object instead of
32369as a string.
32370
32371In all of these cases the first argument can be made a list in
32372order to force the default mode settings, as described above.
32373Thus @samp{(calc-eval '(2 calc-number-radix 16) 'top)} returns the
32374second-to-top stack entry, formatted as a string using the default
32375instead of current display modes, except that the radix is
32376hexadecimal instead of decimal.
32377
32378It is, of course, polite to put the Calc stack back the way you
32379found it when you are done, unless the user of your program is
32380actually expecting it to affect the stack.
32381
32382Note that you do not actually have to switch into the @samp{*Calculator*}
32383buffer in order to use @code{calc-eval}; it temporarily switches into
32384the stack buffer if necessary.
32385
32386@ifinfo
32387@example
32388
32389@end example
32390@end ifinfo
32391@subsubsection Keyboard Macros
32392
32393@noindent
32394If the separator symbol is @code{macro}, the first argument must be a
32395string of characters which Calc can execute as a sequence of keystrokes.
32396This switches into the Calc buffer for the duration of the macro.
32397For example, @samp{(calc-eval "vx5\rVR+" 'macro)} pushes the
32398vector @samp{[1,2,3,4,5]} on the stack and then replaces it
32399with the sum of those numbers. Note that @samp{\r} is the Lisp
32400notation for the carriage-return, @key{RET}, character.
32401
32402If your keyboard macro wishes to pop the stack, @samp{\C-d} is
32403safer than @samp{\177} (the @key{DEL} character) because some
32404installations may have switched the meanings of @key{DEL} and
32405@kbd{C-h}. Calc always interprets @kbd{C-d} as a synonym for
32406``pop-stack'' regardless of key mapping.
32407
32408If you provide a third argument to @code{calc-eval}, evaluation
32409of the keyboard macro will leave a record in the Trail using
32410that argument as a tag string. Normally the Trail is unaffected.
32411
32412The return value in this case is always @code{nil}.
32413
32414@ifinfo
32415@example
32416
32417@end example
32418@end ifinfo
32419@subsubsection Lisp Evaluation
32420
32421@noindent
32422Finally, if the separator symbol is @code{eval}, then the Lisp
32423@code{eval} function is called on the first argument, which must
32424be a Lisp expression rather than a Calc formula. Remember to
32425quote the expression so that it is not evaluated until inside
32426@code{calc-eval}.
32427
32428The difference from plain @code{eval} is that @code{calc-eval}
32429switches to the Calc buffer before evaluating the expression.
32430For example, @samp{(calc-eval '(setq calc-internal-prec 17) 'eval)}
32431will correctly affect the buffer-local Calc precision variable.
32432
32433An alternative would be @samp{(calc-eval '(calc-precision 17) 'eval)}.
32434This is evaluating a call to the function that is normally invoked
32435by the @kbd{p} key, giving it 17 as its ``numeric prefix argument.''
32436Note that this function will leave a message in the echo area as
32437a side effect. Also, all Calc functions switch to the Calc buffer
32438automatically if not invoked from there, so the above call is
32439also equivalent to @samp{(calc-precision 17)} by itself.
32440In all cases, Calc uses @code{save-excursion} to switch back to
32441your original buffer when it is done.
32442
32443As usual the first argument can be a list that begins with a Lisp
32444expression to use default instead of current mode settings.
32445
32446The result of @code{calc-eval} in this usage is just the result
32447returned by the evaluated Lisp expression.
32448
32449@ifinfo
32450@example
32451
32452@end example
32453@end ifinfo
32454@subsubsection Example
32455
32456@noindent
32457@findex convert-temp
32458Here is a sample Emacs command that uses @code{calc-eval}. Suppose
32459you have a document with lots of references to temperatures on the
32460Fahrenheit scale, say ``98.6 F'', and you wish to convert these
32461references to Centigrade. The following command does this conversion.
32462Place the Emacs cursor right after the letter ``F'' and invoke the
32463command to change ``98.6 F'' to ``37 C''. Or, if the temperature is
32464already in Centigrade form, the command changes it back to Fahrenheit.
32465
32466@example
32467(defun convert-temp ()
32468 (interactive)
32469 (save-excursion
32470 (re-search-backward "[^-.0-9]\\([-.0-9]+\\) *\\([FC]\\)")
32471 (let* ((top1 (match-beginning 1))
32472 (bot1 (match-end 1))
32473 (number (buffer-substring top1 bot1))
32474 (top2 (match-beginning 2))
32475 (bot2 (match-end 2))
32476 (type (buffer-substring top2 bot2)))
32477 (if (equal type "F")
32478 (setq type "C"
32479 number (calc-eval "($ - 32)*5/9" nil number))
32480 (setq type "F"
32481 number (calc-eval "$*9/5 + 32" nil number)))
32482 (goto-char top2)
32483 (delete-region top2 bot2)
32484 (insert-before-markers type)
32485 (goto-char top1)
32486 (delete-region top1 bot1)
32487 (if (string-match "\\.$" number) ; change "37." to "37"
32488 (setq number (substring number 0 -1)))
32489 (insert number))))
32490@end example
32491
32492Note the use of @code{insert-before-markers} when changing between
32493``F'' and ``C'', so that the character winds up before the cursor
32494instead of after it.
32495
32496@node Internals, , Calling Calc from Your Programs, Lisp Definitions
32497@subsection Calculator Internals
32498
32499@noindent
32500This section describes the Lisp functions defined by the Calculator that
32501may be of use to user-written Calculator programs (as described in the
32502rest of this chapter). These functions are shown by their names as they
32503conventionally appear in @code{defmath}. Their full Lisp names are
32504generally gotten by prepending @samp{calcFunc-} or @samp{math-} to their
32505apparent names. (Names that begin with @samp{calc-} are already in
32506their full Lisp form.) You can use the actual full names instead if you
32507prefer them, or if you are calling these functions from regular Lisp.
32508
32509The functions described here are scattered throughout the various
32510Calc component files. Note that @file{calc.el} includes @code{autoload}s
32511for only a few component files; when Calc wants to call an advanced
32512function it calls @samp{(calc-extensions)} first; this function
32513autoloads @file{calc-ext.el}, which in turn autoloads all the functions
32514in the remaining component files.
32515
32516Because @code{defmath} itself uses the extensions, user-written code
32517generally always executes with the extensions already loaded, so
32518normally you can use any Calc function and be confident that it will
32519be autoloaded for you when necessary. If you are doing something
32520special, check carefully to make sure each function you are using is
32521from @file{calc.el} or its components, and call @samp{(calc-extensions)}
32522before using any function based in @file{calc-ext.el} if you can't
32523prove this file will already be loaded.
32524
32525@menu
32526* Data Type Formats::
32527* Interactive Lisp Functions::
32528* Stack Lisp Functions::
32529* Predicates::
32530* Computational Lisp Functions::
32531* Vector Lisp Functions::
32532* Symbolic Lisp Functions::
32533* Formatting Lisp Functions::
32534* Hooks::
32535@end menu
32536
32537@node Data Type Formats, Interactive Lisp Functions, Internals, Internals
32538@subsubsection Data Type Formats
32539
32540@noindent
32541Integers are stored in either of two ways, depending on their magnitude.
32542Integers less than one million in absolute value are stored as standard
32543Lisp integers. This is the only storage format for Calc data objects
32544which is not a Lisp list.
32545
32546Large integers are stored as lists of the form @samp{(bigpos @var{d0}
32547@var{d1} @var{d2} @dots{})} for positive integers 1000000 or more, or
32548@samp{(bigneg @var{d0} @var{d1} @var{d2} @dots{})} for negative integers
32549@mathit{-1000000} or less. Each @var{d} is a base-1000 ``digit,'' a Lisp integer
32550from 0 to 999. The least significant digit is @var{d0}; the last digit,
32551@var{dn}, which is always nonzero, is the most significant digit. For
32552example, the integer @mathit{-12345678} is stored as @samp{(bigneg 678 345 12)}.
32553
32554The distinction between small and large integers is entirely hidden from
32555the user. In @code{defmath} definitions, the Lisp predicate @code{integerp}
32556returns true for either kind of integer, and in general both big and small
32557integers are accepted anywhere the word ``integer'' is used in this manual.
32558If the distinction must be made, native Lisp integers are called @dfn{fixnums}
32559and large integers are called @dfn{bignums}.
32560
32561Fractions are stored as a list of the form, @samp{(frac @var{n} @var{d})}
32562where @var{n} is an integer (big or small) numerator, @var{d} is an
32563integer denominator greater than one, and @var{n} and @var{d} are relatively
32564prime. Note that fractions where @var{d} is one are automatically converted
32565to plain integers by all math routines; fractions where @var{d} is negative
32566are normalized by negating the numerator and denominator.
32567
32568Floating-point numbers are stored in the form, @samp{(float @var{mant}
32569@var{exp})}, where @var{mant} (the ``mantissa'') is an integer less than
32570@samp{10^@var{p}} in absolute value (@var{p} represents the current
32571precision), and @var{exp} (the ``exponent'') is a fixnum. The value of
32572the float is @samp{@var{mant} * 10^@var{exp}}. For example, the number
32573@mathit{-3.14} is stored as @samp{(float -314 -2) = -314*10^-2}. Other constraints
32574are that the number 0.0 is always stored as @samp{(float 0 0)}, and,
32575except for the 0.0 case, the rightmost base-10 digit of @var{mant} is
32576always nonzero. (If the rightmost digit is zero, the number is
32577rearranged by dividing @var{mant} by ten and incrementing @var{exp}.)
32578
32579Rectangular complex numbers are stored in the form @samp{(cplx @var{re}
32580@var{im})}, where @var{re} and @var{im} are each real numbers, either
32581integers, fractions, or floats. The value is @samp{@var{re} + @var{im}i}.
32582The @var{im} part is nonzero; complex numbers with zero imaginary
32583components are converted to real numbers automatically.
32584
32585Polar complex numbers are stored in the form @samp{(polar @var{r}
32586@var{theta})}, where @var{r} is a positive real value and @var{theta}
32587is a real value or HMS form representing an angle. This angle is
32588usually normalized to lie in the interval @samp{(-180 ..@: 180)} degrees,
32589or @samp{(-pi ..@: pi)} radians, according to the current angular mode.
32590If the angle is 0 the value is converted to a real number automatically.
32591(If the angle is 180 degrees, the value is usually also converted to a
32592negative real number.)
32593
32594Hours-minutes-seconds forms are stored as @samp{(hms @var{h} @var{m}
32595@var{s})}, where @var{h} is an integer or an integer-valued float (i.e.,
32596a float with @samp{@var{exp} >= 0}), @var{m} is an integer or integer-valued
32597float in the range @w{@samp{[0 ..@: 60)}}, and @var{s} is any real number
32598in the range @samp{[0 ..@: 60)}.
32599
32600Date forms are stored as @samp{(date @var{n})}, where @var{n} is
32601a real number that counts days since midnight on the morning of
32602January 1, 1 AD. If @var{n} is an integer, this is a pure date
32603form. If @var{n} is a fraction or float, this is a date/time form.
32604
32605Modulo forms are stored as @samp{(mod @var{n} @var{m})}, where @var{m} is a
32606positive real number or HMS form, and @var{n} is a real number or HMS
32607form in the range @samp{[0 ..@: @var{m})}.
32608
32609Error forms are stored as @samp{(sdev @var{x} @var{sigma})}, where @var{x}
32610is the mean value and @var{sigma} is the standard deviation. Each
32611component is either a number, an HMS form, or a symbolic object
32612(a variable or function call). If @var{sigma} is zero, the value is
32613converted to a plain real number. If @var{sigma} is negative or
32614complex, it is automatically normalized to be a positive real.
32615
32616Interval forms are stored as @samp{(intv @var{mask} @var{lo} @var{hi})},
32617where @var{mask} is one of the integers 0, 1, 2, or 3, and @var{lo} and
32618@var{hi} are real numbers, HMS forms, or symbolic objects. The @var{mask}
32619is a binary integer where 1 represents the fact that the interval is
32620closed on the high end, and 2 represents the fact that it is closed on
32621the low end. (Thus 3 represents a fully closed interval.) The interval
32622@w{@samp{(intv 3 @var{x} @var{x})}} is converted to the plain number @var{x};
32623intervals @samp{(intv @var{mask} @var{x} @var{x})} for any other @var{mask}
32624represent empty intervals. If @var{hi} is less than @var{lo}, the interval
32625is converted to a standard empty interval by replacing @var{hi} with @var{lo}.
32626
32627Vectors are stored as @samp{(vec @var{v1} @var{v2} @dots{})}, where @var{v1}
32628is the first element of the vector, @var{v2} is the second, and so on.
32629An empty vector is stored as @samp{(vec)}. A matrix is simply a vector
32630where all @var{v}'s are themselves vectors of equal lengths. Note that
32631Calc vectors are unrelated to the Emacs Lisp ``vector'' type, which is
32632generally unused by Calc data structures.
32633
32634Variables are stored as @samp{(var @var{name} @var{sym})}, where
32635@var{name} is a Lisp symbol whose print name is used as the visible name
32636of the variable, and @var{sym} is a Lisp symbol in which the variable's
32637value is actually stored. Thus, @samp{(var pi var-pi)} represents the
32638special constant @samp{pi}. Almost always, the form is @samp{(var
32639@var{v} var-@var{v})}. If the variable name was entered with @code{#}
32640signs (which are converted to hyphens internally), the form is
32641@samp{(var @var{u} @var{v})}, where @var{u} is a symbol whose name
32642contains @code{#} characters, and @var{v} is a symbol that contains
32643@code{-} characters instead. The value of a variable is the Calc
32644object stored in its @var{sym} symbol's value cell. If the symbol's
32645value cell is void or if it contains @code{nil}, the variable has no
32646value. Special constants have the form @samp{(special-const
32647@var{value})} stored in their value cell, where @var{value} is a formula
32648which is evaluated when the constant's value is requested. Variables
32649which represent units are not stored in any special way; they are units
32650only because their names appear in the units table. If the value
32651cell contains a string, it is parsed to get the variable's value when
32652the variable is used.
32653
32654A Lisp list with any other symbol as the first element is a function call.
32655The symbols @code{+}, @code{-}, @code{*}, @code{/}, @code{%}, @code{^},
32656and @code{|} represent special binary operators; these lists are always
32657of the form @samp{(@var{op} @var{lhs} @var{rhs})} where @var{lhs} is the
32658sub-formula on the lefthand side and @var{rhs} is the sub-formula on the
32659right. The symbol @code{neg} represents unary negation; this list is always
32660of the form @samp{(neg @var{arg})}. Any other symbol @var{func} represents a
32661function that would be displayed in function-call notation; the symbol
32662@var{func} is in general always of the form @samp{calcFunc-@var{name}}.
32663The function cell of the symbol @var{func} should contain a Lisp function
32664for evaluating a call to @var{func}. This function is passed the remaining
32665elements of the list (themselves already evaluated) as arguments; such
32666functions should return @code{nil} or call @code{reject-arg} to signify
32667that they should be left in symbolic form, or they should return a Calc
32668object which represents their value, or a list of such objects if they
32669wish to return multiple values. (The latter case is allowed only for
32670functions which are the outer-level call in an expression whose value is
32671about to be pushed on the stack; this feature is considered obsolete
32672and is not used by any built-in Calc functions.)
32673
32674@node Interactive Lisp Functions, Stack Lisp Functions, Data Type Formats, Internals
32675@subsubsection Interactive Functions
32676
32677@noindent
32678The functions described here are used in implementing interactive Calc
32679commands. Note that this list is not exhaustive! If there is an
32680existing command that behaves similarly to the one you want to define,
32681you may find helpful tricks by checking the source code for that command.
32682
32683@defun calc-set-command-flag flag
32684Set the command flag @var{flag}. This is generally a Lisp symbol, but
32685may in fact be anything. The effect is to add @var{flag} to the list
32686stored in the variable @code{calc-command-flags}, unless it is already
32687there. @xref{Defining Simple Commands}.
32688@end defun
32689
32690@defun calc-clear-command-flag flag
32691If @var{flag} appears among the list of currently-set command flags,
32692remove it from that list.
32693@end defun
32694
32695@defun calc-record-undo rec
32696Add the ``undo record'' @var{rec} to the list of steps to take if the
32697current operation should need to be undone. Stack push and pop functions
32698automatically call @code{calc-record-undo}, so the kinds of undo records
32699you might need to create take the form @samp{(set @var{sym} @var{value})},
32700which says that the Lisp variable @var{sym} was changed and had previously
32701contained @var{value}; @samp{(store @var{var} @var{value})} which says that
32702the Calc variable @var{var} (a string which is the name of the symbol that
32703contains the variable's value) was stored and its previous value was
32704@var{value} (either a Calc data object, or @code{nil} if the variable was
32705previously void); or @samp{(eval @var{undo} @var{redo} @var{args} @dots{})},
32706which means that to undo requires calling the function @samp{(@var{undo}
32707@var{args} @dots{})} and, if the undo is later redone, calling
32708@samp{(@var{redo} @var{args} @dots{})}.
32709@end defun
32710
32711@defun calc-record-why msg args
32712Record the error or warning message @var{msg}, which is normally a string.
32713This message will be replayed if the user types @kbd{w} (@code{calc-why});
32714if the message string begins with a @samp{*}, it is considered important
32715enough to display even if the user doesn't type @kbd{w}. If one or more
32716@var{args} are present, the displayed message will be of the form,
32717@samp{@var{msg}: @var{arg1}, @var{arg2}, @dots{}}, where the arguments are
32718formatted on the assumption that they are either strings or Calc objects of
32719some sort. If @var{msg} is a symbol, it is the name of a Calc predicate
32720(such as @code{integerp} or @code{numvecp}) which the arguments did not
32721satisfy; it is expanded to a suitable string such as ``Expected an
32722integer.'' The @code{reject-arg} function calls @code{calc-record-why}
32723automatically; @pxref{Predicates}.
32724@end defun
32725
32726@defun calc-is-inverse
32727This predicate returns true if the current command is inverse,
32728i.e., if the Inverse (@kbd{I} key) flag was set.
32729@end defun
32730
32731@defun calc-is-hyperbolic
32732This predicate is the analogous function for the @kbd{H} key.
32733@end defun
32734
32735@node Stack Lisp Functions, Predicates, Interactive Lisp Functions, Internals
32736@subsubsection Stack-Oriented Functions
32737
32738@noindent
32739The functions described here perform various operations on the Calc
32740stack and trail. They are to be used in interactive Calc commands.
32741
32742@defun calc-push-list vals n
32743Push the Calc objects in list @var{vals} onto the stack at stack level
32744@var{n}. If @var{n} is omitted it defaults to 1, so that the elements
32745are pushed at the top of the stack. If @var{n} is greater than 1, the
32746elements will be inserted into the stack so that the last element will
32747end up at level @var{n}, the next-to-last at level @var{n}+1, etc.
32748The elements of @var{vals} are assumed to be valid Calc objects, and
32749are not evaluated, rounded, or renormalized in any way. If @var{vals}
32750is an empty list, nothing happens.
32751
32752The stack elements are pushed without any sub-formula selections.
32753You can give an optional third argument to this function, which must
32754be a list the same size as @var{vals} of selections. Each selection
32755must be @code{eq} to some sub-formula of the corresponding formula
32756in @var{vals}, or @code{nil} if that formula should have no selection.
32757@end defun
32758
32759@defun calc-top-list n m
32760Return a list of the @var{n} objects starting at level @var{m} of the
32761stack. If @var{m} is omitted it defaults to 1, so that the elements are
32762taken from the top of the stack. If @var{n} is omitted, it also
32763defaults to 1, so that the top stack element (in the form of a
32764one-element list) is returned. If @var{m} is greater than 1, the
32765@var{m}th stack element will be at the end of the list, the @var{m}+1st
32766element will be next-to-last, etc. If @var{n} or @var{m} are out of
32767range, the command is aborted with a suitable error message. If @var{n}
32768is zero, the function returns an empty list. The stack elements are not
32769evaluated, rounded, or renormalized.
32770
32771If any stack elements contain selections, and selections have not
32772been disabled by the @kbd{j e} (@code{calc-enable-selections}) command,
32773this function returns the selected portions rather than the entire
32774stack elements. It can be given a third ``selection-mode'' argument
32775which selects other behaviors. If it is the symbol @code{t}, then
32776a selection in any of the requested stack elements produces an
32777``invalid operation on selections'' error. If it is the symbol @code{full},
32778the whole stack entry is always returned regardless of selections.
32779If it is the symbol @code{sel}, the selected portion is always returned,
32780or @code{nil} if there is no selection. (This mode ignores the @kbd{j e}
32781command.) If the symbol is @code{entry}, the complete stack entry in
32782list form is returned; the first element of this list will be the whole
32783formula, and the third element will be the selection (or @code{nil}).
32784@end defun
32785
32786@defun calc-pop-stack n m
32787Remove the specified elements from the stack. The parameters @var{n}
32788and @var{m} are defined the same as for @code{calc-top-list}. The return
32789value of @code{calc-pop-stack} is uninteresting.
32790
32791If there are any selected sub-formulas among the popped elements, and
32792@kbd{j e} has not been used to disable selections, this produces an
32793error without changing the stack. If you supply an optional third
32794argument of @code{t}, the stack elements are popped even if they
32795contain selections.
32796@end defun
32797
32798@defun calc-record-list vals tag
32799This function records one or more results in the trail. The @var{vals}
32800are a list of strings or Calc objects. The @var{tag} is the four-character
32801tag string to identify the values. If @var{tag} is omitted, a blank tag
32802will be used.
32803@end defun
32804
32805@defun calc-normalize n
32806This function takes a Calc object and ``normalizes'' it. At the very
32807least this involves re-rounding floating-point values according to the
32808current precision and other similar jobs. Also, unless the user has
32809selected No-Simplify mode (@pxref{Simplification Modes}), this involves
32810actually evaluating a formula object by executing the function calls
32811it contains, and possibly also doing algebraic simplification, etc.
32812@end defun
32813
32814@defun calc-top-list-n n m
32815This function is identical to @code{calc-top-list}, except that it calls
32816@code{calc-normalize} on the values that it takes from the stack. They
32817are also passed through @code{check-complete}, so that incomplete
32818objects will be rejected with an error message. All computational
32819commands should use this in preference to @code{calc-top-list}; the only
32820standard Calc commands that operate on the stack without normalizing
32821are stack management commands like @code{calc-enter} and @code{calc-roll-up}.
32822This function accepts the same optional selection-mode argument as
32823@code{calc-top-list}.
32824@end defun
32825
32826@defun calc-top-n m
32827This function is a convenient form of @code{calc-top-list-n} in which only
32828a single element of the stack is taken and returned, rather than a list
32829of elements. This also accepts an optional selection-mode argument.
32830@end defun
32831
32832@defun calc-enter-result n tag vals
32833This function is a convenient interface to most of the above functions.
32834The @var{vals} argument should be either a single Calc object, or a list
32835of Calc objects; the object or objects are normalized, and the top @var{n}
32836stack entries are replaced by the normalized objects. If @var{tag} is
32837non-@code{nil}, the normalized objects are also recorded in the trail.
32838A typical stack-based computational command would take the form,
32839
32840@smallexample
32841(calc-enter-result @var{n} @var{tag} (cons 'calcFunc-@var{func}
32842 (calc-top-list-n @var{n})))
32843@end smallexample
32844
32845If any of the @var{n} stack elements replaced contain sub-formula
32846selections, and selections have not been disabled by @kbd{j e},
32847this function takes one of two courses of action. If @var{n} is
32848equal to the number of elements in @var{vals}, then each element of
32849@var{vals} is spliced into the corresponding selection; this is what
32850happens when you use the @key{TAB} key, or when you use a unary
32851arithmetic operation like @code{sqrt}. If @var{vals} has only one
32852element but @var{n} is greater than one, there must be only one
32853selection among the top @var{n} stack elements; the element from
32854@var{vals} is spliced into that selection. This is what happens when
32855you use a binary arithmetic operation like @kbd{+}. Any other
32856combination of @var{n} and @var{vals} is an error when selections
32857are present.
32858@end defun
32859
32860@defun calc-unary-op tag func arg
32861This function implements a unary operator that allows a numeric prefix
32862argument to apply the operator over many stack entries. If the prefix
32863argument @var{arg} is @code{nil}, this uses @code{calc-enter-result}
32864as outlined above. Otherwise, it maps the function over several stack
32865elements; @pxref{Prefix Arguments}. For example,
32866
32867@smallexample
32868(defun calc-zeta (arg)
32869 (interactive "P")
32870 (calc-unary-op "zeta" 'calcFunc-zeta arg))
32871@end smallexample
32872@end defun
32873
32874@defun calc-binary-op tag func arg ident unary
32875This function implements a binary operator, analogously to
32876@code{calc-unary-op}. The optional @var{ident} and @var{unary}
32877arguments specify the behavior when the prefix argument is zero or
32878one, respectively. If the prefix is zero, the value @var{ident}
32879is pushed onto the stack, if specified, otherwise an error message
32880is displayed. If the prefix is one, the unary function @var{unary}
32881is applied to the top stack element, or, if @var{unary} is not
32882specified, nothing happens. When the argument is two or more,
32883the binary function @var{func} is reduced across the top @var{arg}
32884stack elements; when the argument is negative, the function is
32885mapped between the next-to-top @mathit{-@var{arg}} stack elements and the
32886top element.
32887@end defun
32888
32889@defun calc-stack-size
32890Return the number of elements on the stack as an integer. This count
32891does not include elements that have been temporarily hidden by stack
32892truncation; @pxref{Truncating the Stack}.
32893@end defun
32894
32895@defun calc-cursor-stack-index n
32896Move the point to the @var{n}th stack entry. If @var{n} is zero, this
32897will be the @samp{.} line. If @var{n} is from 1 to the current stack size,
32898this will be the beginning of the first line of that stack entry's display.
32899If line numbers are enabled, this will move to the first character of the
32900line number, not the stack entry itself.
32901@end defun
32902
32903@defun calc-substack-height n
32904Return the number of lines between the beginning of the @var{n}th stack
32905entry and the bottom of the buffer. If @var{n} is zero, this
32906will be one (assuming no stack truncation). If all stack entries are
32907one line long (i.e., no matrices are displayed), the return value will
32908be equal @var{n}+1 as long as @var{n} is in range. (Note that in Big
32909mode, the return value includes the blank lines that separate stack
32910entries.)
32911@end defun
32912
32913@defun calc-refresh
32914Erase the @code{*Calculator*} buffer and reformat its contents from memory.
32915This must be called after changing any parameter, such as the current
32916display radix, which might change the appearance of existing stack
32917entries. (During a keyboard macro invoked by the @kbd{X} key, refreshing
32918is suppressed, but a flag is set so that the entire stack will be refreshed
32919rather than just the top few elements when the macro finishes.)
32920@end defun
32921
32922@node Predicates, Computational Lisp Functions, Stack Lisp Functions, Internals
32923@subsubsection Predicates
32924
32925@noindent
32926The functions described here are predicates, that is, they return a
32927true/false value where @code{nil} means false and anything else means
32928true. These predicates are expanded by @code{defmath}, for example,
32929from @code{zerop} to @code{math-zerop}. In many cases they correspond
32930to native Lisp functions by the same name, but are extended to cover
32931the full range of Calc data types.
32932
32933@defun zerop x
32934Returns true if @var{x} is numerically zero, in any of the Calc data
32935types. (Note that for some types, such as error forms and intervals,
32936it never makes sense to return true.) In @code{defmath}, the expression
32937@samp{(= x 0)} will automatically be converted to @samp{(math-zerop x)},
32938and @samp{(/= x 0)} will be converted to @samp{(not (math-zerop x))}.
32939@end defun
32940
32941@defun negp x
32942Returns true if @var{x} is negative. This accepts negative real numbers
32943of various types, negative HMS and date forms, and intervals in which
32944all included values are negative. In @code{defmath}, the expression
32945@samp{(< x 0)} will automatically be converted to @samp{(math-negp x)},
32946and @samp{(>= x 0)} will be converted to @samp{(not (math-negp x))}.
32947@end defun
32948
32949@defun posp x
32950Returns true if @var{x} is positive (and non-zero). For complex
32951numbers, none of these three predicates will return true.
32952@end defun
32953
32954@defun looks-negp x
32955Returns true if @var{x} is ``negative-looking.'' This returns true if
32956@var{x} is a negative number, or a formula with a leading minus sign
32957such as @samp{-a/b}. In other words, this is an object which can be
32958made simpler by calling @code{(- @var{x})}.
32959@end defun
32960
32961@defun integerp x
32962Returns true if @var{x} is an integer of any size.
32963@end defun
32964
32965@defun fixnump x
32966Returns true if @var{x} is a native Lisp integer.
32967@end defun
32968
32969@defun natnump x
32970Returns true if @var{x} is a nonnegative integer of any size.
32971@end defun
32972
32973@defun fixnatnump x
32974Returns true if @var{x} is a nonnegative Lisp integer.
32975@end defun
32976
32977@defun num-integerp x
32978Returns true if @var{x} is numerically an integer, i.e., either a
32979true integer or a float with no significant digits to the right of
32980the decimal point.
32981@end defun
32982
32983@defun messy-integerp x
32984Returns true if @var{x} is numerically, but not literally, an integer.
32985A value is @code{num-integerp} if it is @code{integerp} or
32986@code{messy-integerp} (but it is never both at once).
32987@end defun
32988
32989@defun num-natnump x
32990Returns true if @var{x} is numerically a nonnegative integer.
32991@end defun
32992
32993@defun evenp x
32994Returns true if @var{x} is an even integer.
32995@end defun
32996
32997@defun looks-evenp x
32998Returns true if @var{x} is an even integer, or a formula with a leading
32999multiplicative coefficient which is an even integer.
33000@end defun
33001
33002@defun oddp x
33003Returns true if @var{x} is an odd integer.
33004@end defun
33005
33006@defun ratp x
33007Returns true if @var{x} is a rational number, i.e., an integer or a
33008fraction.
33009@end defun
33010
33011@defun realp x
33012Returns true if @var{x} is a real number, i.e., an integer, fraction,
33013or floating-point number.
33014@end defun
33015
33016@defun anglep x
33017Returns true if @var{x} is a real number or HMS form.
33018@end defun
33019
33020@defun floatp x
33021Returns true if @var{x} is a float, or a complex number, error form,
33022interval, date form, or modulo form in which at least one component
33023is a float.
33024@end defun
33025
33026@defun complexp x
33027Returns true if @var{x} is a rectangular or polar complex number
33028(but not a real number).
33029@end defun
33030
33031@defun rect-complexp x
33032Returns true if @var{x} is a rectangular complex number.
33033@end defun
33034
33035@defun polar-complexp x
33036Returns true if @var{x} is a polar complex number.
33037@end defun
33038
33039@defun numberp x
33040Returns true if @var{x} is a real number or a complex number.
33041@end defun
33042
33043@defun scalarp x
33044Returns true if @var{x} is a real or complex number or an HMS form.
33045@end defun
33046
33047@defun vectorp x
33048Returns true if @var{x} is a vector (this simply checks if its argument
33049is a list whose first element is the symbol @code{vec}).
33050@end defun
33051
33052@defun numvecp x
33053Returns true if @var{x} is a number or vector.
33054@end defun
33055
33056@defun matrixp x
33057Returns true if @var{x} is a matrix, i.e., a vector of one or more vectors,
33058all of the same size.
33059@end defun
33060
33061@defun square-matrixp x
33062Returns true if @var{x} is a square matrix.
33063@end defun
33064
33065@defun objectp x
33066Returns true if @var{x} is any numeric Calc object, including real and
33067complex numbers, HMS forms, date forms, error forms, intervals, and
33068modulo forms. (Note that error forms and intervals may include formulas
33069as their components; see @code{constp} below.)
33070@end defun
33071
33072@defun objvecp x
33073Returns true if @var{x} is an object or a vector. This also accepts
33074incomplete objects, but it rejects variables and formulas (except as
33075mentioned above for @code{objectp}).
33076@end defun
33077
33078@defun primp x
33079Returns true if @var{x} is a ``primitive'' or ``atomic'' Calc object,
33080i.e., one whose components cannot be regarded as sub-formulas. This
33081includes variables, and all @code{objectp} types except error forms
33082and intervals.
33083@end defun
33084
33085@defun constp x
33086Returns true if @var{x} is constant, i.e., a real or complex number,
33087HMS form, date form, or error form, interval, or vector all of whose
33088components are @code{constp}.
33089@end defun
33090
33091@defun lessp x y
33092Returns true if @var{x} is numerically less than @var{y}. Returns false
33093if @var{x} is greater than or equal to @var{y}, or if the order is
33094undefined or cannot be determined. Generally speaking, this works
33095by checking whether @samp{@var{x} - @var{y}} is @code{negp}. In
33096@code{defmath}, the expression @samp{(< x y)} will automatically be
33097converted to @samp{(lessp x y)}; expressions involving @code{>}, @code{<=},
33098and @code{>=} are similarly converted in terms of @code{lessp}.
33099@end defun
33100
33101@defun beforep x y
33102Returns true if @var{x} comes before @var{y} in a canonical ordering
33103of Calc objects. If @var{x} and @var{y} are both real numbers, this
33104will be the same as @code{lessp}. But whereas @code{lessp} considers
33105other types of objects to be unordered, @code{beforep} puts any two
33106objects into a definite, consistent order. The @code{beforep}
33107function is used by the @kbd{V S} vector-sorting command, and also
33108by @kbd{a s} to put the terms of a product into canonical order:
33109This allows @samp{x y + y x} to be simplified easily to @samp{2 x y}.
33110@end defun
33111
33112@defun equal x y
33113This is the standard Lisp @code{equal} predicate; it returns true if
33114@var{x} and @var{y} are structurally identical. This is the usual way
33115to compare numbers for equality, but note that @code{equal} will treat
331160 and 0.0 as different.
33117@end defun
33118
33119@defun math-equal x y
33120Returns true if @var{x} and @var{y} are numerically equal, either because
33121they are @code{equal}, or because their difference is @code{zerop}. In
33122@code{defmath}, the expression @samp{(= x y)} will automatically be
33123converted to @samp{(math-equal x y)}.
33124@end defun
33125
33126@defun equal-int x n
33127Returns true if @var{x} and @var{n} are numerically equal, where @var{n}
33128is a fixnum which is not a multiple of 10. This will automatically be
33129used by @code{defmath} in place of the more general @code{math-equal}
33130whenever possible.
33131@end defun
33132
33133@defun nearly-equal x y
33134Returns true if @var{x} and @var{y}, as floating-point numbers, are
33135equal except possibly in the last decimal place. For example,
33136314.159 and 314.166 are considered nearly equal if the current
33137precision is 6 (since they differ by 7 units), but not if the current
33138precision is 7 (since they differ by 70 units). Most functions which
33139use series expansions use @code{with-extra-prec} to evaluate the
33140series with 2 extra digits of precision, then use @code{nearly-equal}
33141to decide when the series has converged; this guards against cumulative
33142error in the series evaluation without doing extra work which would be
33143lost when the result is rounded back down to the current precision.
33144In @code{defmath}, this can be written @samp{(~= @var{x} @var{y})}.
33145The @var{x} and @var{y} can be numbers of any kind, including complex.
33146@end defun
33147
33148@defun nearly-zerop x y
33149Returns true if @var{x} is nearly zero, compared to @var{y}. This
33150checks whether @var{x} plus @var{y} would by be @code{nearly-equal}
33151to @var{y} itself, to within the current precision, in other words,
33152if adding @var{x} to @var{y} would have a negligible effect on @var{y}
33153due to roundoff error. @var{X} may be a real or complex number, but
33154@var{y} must be real.
33155@end defun
33156
33157@defun is-true x
33158Return true if the formula @var{x} represents a true value in
33159Calc, not Lisp, terms. It tests if @var{x} is a non-zero number
33160or a provably non-zero formula.
33161@end defun
33162
33163@defun reject-arg val pred
33164Abort the current function evaluation due to unacceptable argument values.
33165This calls @samp{(calc-record-why @var{pred} @var{val})}, then signals a
33166Lisp error which @code{normalize} will trap. The net effect is that the
33167function call which led here will be left in symbolic form.
33168@end defun
33169
33170@defun inexact-value
33171If Symbolic mode is enabled, this will signal an error that causes
33172@code{normalize} to leave the formula in symbolic form, with the message
33173``Inexact result.'' (This function has no effect when not in Symbolic mode.)
33174Note that if your function calls @samp{(sin 5)} in Symbolic mode, the
33175@code{sin} function will call @code{inexact-value}, which will cause your
33176function to be left unsimplified. You may instead wish to call
33177@samp{(normalize (list 'calcFunc-sin 5))}, which in Symbolic mode will
33178return the formula @samp{sin(5)} to your function.
33179@end defun
33180
33181@defun overflow
33182This signals an error that will be reported as a floating-point overflow.
33183@end defun
33184
33185@defun underflow
33186This signals a floating-point underflow.
33187@end defun
33188
33189@node Computational Lisp Functions, Vector Lisp Functions, Predicates, Internals
33190@subsubsection Computational Functions
33191
33192@noindent
33193The functions described here do the actual computational work of the
33194Calculator. In addition to these, note that any function described in
33195the main body of this manual may be called from Lisp; for example, if
33196the documentation refers to the @code{calc-sqrt} [@code{sqrt}] command,
33197this means @code{calc-sqrt} is an interactive stack-based square-root
33198command and @code{sqrt} (which @code{defmath} expands to @code{calcFunc-sqrt})
33199is the actual Lisp function for taking square roots.
33200
33201The functions @code{math-add}, @code{math-sub}, @code{math-mul},
33202@code{math-div}, @code{math-mod}, and @code{math-neg} are not included
33203in this list, since @code{defmath} allows you to write native Lisp
33204@code{+}, @code{-}, @code{*}, @code{/}, @code{%}, and unary @code{-},
33205respectively, instead.
33206
33207@defun normalize val
33208(Full form: @code{math-normalize}.)
33209Reduce the value @var{val} to standard form. For example, if @var{val}
33210is a fixnum, it will be converted to a bignum if it is too large, and
33211if @var{val} is a bignum it will be normalized by clipping off trailing
33212(i.e., most-significant) zero digits and converting to a fixnum if it is
33213small. All the various data types are similarly converted to their standard
33214forms. Variables are left alone, but function calls are actually evaluated
33215in formulas. For example, normalizing @samp{(+ 2 (calcFunc-abs -4))} will
33216return 6.
33217
33218If a function call fails, because the function is void or has the wrong
33219number of parameters, or because it returns @code{nil} or calls
33220@code{reject-arg} or @code{inexact-result}, @code{normalize} returns
33221the formula still in symbolic form.
33222
33223If the current simplification mode is ``none'' or ``numeric arguments
33224only,'' @code{normalize} will act appropriately. However, the more
33225powerful simplification modes (like Algebraic Simplification) are
33226not handled by @code{normalize}. They are handled by @code{calc-normalize},
33227which calls @code{normalize} and possibly some other routines, such
33228as @code{simplify} or @code{simplify-units}. Programs generally will
33229never call @code{calc-normalize} except when popping or pushing values
33230on the stack.
33231@end defun
33232
33233@defun evaluate-expr expr
33234Replace all variables in @var{expr} that have values with their values,
33235then use @code{normalize} to simplify the result. This is what happens
33236when you press the @kbd{=} key interactively.
33237@end defun
33238
33239@defmac with-extra-prec n body
33240Evaluate the Lisp forms in @var{body} with precision increased by @var{n}
33241digits. This is a macro which expands to
33242
33243@smallexample
33244(math-normalize
33245 (let ((calc-internal-prec (+ calc-internal-prec @var{n})))
33246 @var{body}))
33247@end smallexample
33248
33249The surrounding call to @code{math-normalize} causes a floating-point
33250result to be rounded down to the original precision afterwards. This
33251is important because some arithmetic operations assume a number's
33252mantissa contains no more digits than the current precision allows.
33253@end defmac
33254
33255@defun make-frac n d
33256Build a fraction @samp{@var{n}:@var{d}}. This is equivalent to calling
33257@samp{(normalize (list 'frac @var{n} @var{d}))}, but more efficient.
33258@end defun
33259
33260@defun make-float mant exp
33261Build a floating-point value out of @var{mant} and @var{exp}, both
33262of which are arbitrary integers. This function will return a
33263properly normalized float value, or signal an overflow or underflow
33264if @var{exp} is out of range.
33265@end defun
33266
33267@defun make-sdev x sigma
33268Build an error form out of @var{x} and the absolute value of @var{sigma}.
33269If @var{sigma} is zero, the result is the number @var{x} directly.
33270If @var{sigma} is negative or complex, its absolute value is used.
33271If @var{x} or @var{sigma} is not a valid type of object for use in
33272error forms, this calls @code{reject-arg}.
33273@end defun
33274
33275@defun make-intv mask lo hi
33276Build an interval form out of @var{mask} (which is assumed to be an
33277integer from 0 to 3), and the limits @var{lo} and @var{hi}. If
33278@var{lo} is greater than @var{hi}, an empty interval form is returned.
33279This calls @code{reject-arg} if @var{lo} or @var{hi} is unsuitable.
33280@end defun
33281
33282@defun sort-intv mask lo hi
33283Build an interval form, similar to @code{make-intv}, except that if
33284@var{lo} is less than @var{hi} they are simply exchanged, and the
33285bits of @var{mask} are swapped accordingly.
33286@end defun
33287
33288@defun make-mod n m
33289Build a modulo form out of @var{n} and the modulus @var{m}. Since modulo
33290forms do not allow formulas as their components, if @var{n} or @var{m}
33291is not a real number or HMS form the result will be a formula which
33292is a call to @code{makemod}, the algebraic version of this function.
33293@end defun
33294
33295@defun float x
33296Convert @var{x} to floating-point form. Integers and fractions are
33297converted to numerically equivalent floats; components of complex
33298numbers, vectors, HMS forms, date forms, error forms, intervals, and
33299modulo forms are recursively floated. If the argument is a variable
33300or formula, this calls @code{reject-arg}.
33301@end defun
33302
33303@defun compare x y
33304Compare the numbers @var{x} and @var{y}, and return @mathit{-1} if
33305@samp{(lessp @var{x} @var{y})}, 1 if @samp{(lessp @var{y} @var{x})},
333060 if @samp{(math-equal @var{x} @var{y})}, or 2 if the order is
33307undefined or cannot be determined.
33308@end defun
33309
33310@defun numdigs n
33311Return the number of digits of integer @var{n}, effectively
33312@samp{ceil(log10(@var{n}))}, but much more efficient. Zero is
33313considered to have zero digits.
33314@end defun
33315
33316@defun scale-int x n
33317Shift integer @var{x} left @var{n} decimal digits, or right @mathit{-@var{n}}
33318digits with truncation toward zero.
33319@end defun
33320
33321@defun scale-rounding x n
33322Like @code{scale-int}, except that a right shift rounds to the nearest
33323integer rather than truncating.
33324@end defun
33325
33326@defun fixnum n
33327Return the integer @var{n} as a fixnum, i.e., a native Lisp integer.
33328If @var{n} is outside the permissible range for Lisp integers (usually
3332924 binary bits) the result is undefined.
33330@end defun
33331
33332@defun sqr x
33333Compute the square of @var{x}; short for @samp{(* @var{x} @var{x})}.
33334@end defun
33335
33336@defun quotient x y
33337Divide integer @var{x} by integer @var{y}; return an integer quotient
33338and discard the remainder. If @var{x} or @var{y} is negative, the
33339direction of rounding is undefined.
33340@end defun
33341
33342@defun idiv x y
33343Perform an integer division; if @var{x} and @var{y} are both nonnegative
33344integers, this uses the @code{quotient} function, otherwise it computes
33345@samp{floor(@var{x}/@var{y})}. Thus the result is well-defined but
33346slower than for @code{quotient}.
33347@end defun
33348
33349@defun imod x y
33350Divide integer @var{x} by integer @var{y}; return the integer remainder
33351and discard the quotient. Like @code{quotient}, this works only for
33352integer arguments and is not well-defined for negative arguments.
33353For a more well-defined result, use @samp{(% @var{x} @var{y})}.
33354@end defun
33355
33356@defun idivmod x y
33357Divide integer @var{x} by integer @var{y}; return a cons cell whose
33358@code{car} is @samp{(quotient @var{x} @var{y})} and whose @code{cdr}
33359is @samp{(imod @var{x} @var{y})}.
33360@end defun
33361
33362@defun pow x y
33363Compute @var{x} to the power @var{y}. In @code{defmath} code, this can
33364also be written @samp{(^ @var{x} @var{y})} or
33365@w{@samp{(expt @var{x} @var{y})}}.
33366@end defun
33367
33368@defun abs-approx x
33369Compute a fast approximation to the absolute value of @var{x}. For
33370example, for a rectangular complex number the result is the sum of
33371the absolute values of the components.
33372@end defun
33373
33374@findex e
33375@findex gamma-const
33376@findex ln-2
33377@findex ln-10
33378@findex phi
33379@findex pi-over-2
33380@findex pi-over-4
33381@findex pi-over-180
33382@findex sqrt-two-pi
33383@findex sqrt-e
33384@findex two-pi
33385@defun pi
33386The function @samp{(pi)} computes @samp{pi} to the current precision.
33387Other related constant-generating functions are @code{two-pi},
33388@code{pi-over-2}, @code{pi-over-4}, @code{pi-over-180}, @code{sqrt-two-pi},
33389@code{e}, @code{sqrt-e}, @code{ln-2}, @code{ln-10}, @code{phi} and
33390@code{gamma-const}. Each function returns a floating-point value in the
33391current precision, and each uses caching so that all calls after the
33392first are essentially free.
33393@end defun
33394
33395@defmac math-defcache @var{func} @var{initial} @var{form}
33396This macro, usually used as a top-level call like @code{defun} or
33397@code{defvar}, defines a new cached constant analogous to @code{pi}, etc.
33398It defines a function @code{func} which returns the requested value;
33399if @var{initial} is non-@code{nil} it must be a @samp{(float @dots{})}
33400form which serves as an initial value for the cache. If @var{func}
33401is called when the cache is empty or does not have enough digits to
33402satisfy the current precision, the Lisp expression @var{form} is evaluated
33403with the current precision increased by four, and the result minus its
33404two least significant digits is stored in the cache. For example,
33405calling @samp{(pi)} with a precision of 30 computes @samp{pi} to 34
33406digits, rounds it down to 32 digits for future use, then rounds it
33407again to 30 digits for use in the present request.
33408@end defmac
33409
33410@findex half-circle
33411@findex quarter-circle
33412@defun full-circle symb
33413If the current angular mode is Degrees or HMS, this function returns the
33414integer 360. In Radians mode, this function returns either the
33415corresponding value in radians to the current precision, or the formula
33416@samp{2*pi}, depending on the Symbolic mode. There are also similar
33417function @code{half-circle} and @code{quarter-circle}.
33418@end defun
33419
33420@defun power-of-2 n
33421Compute two to the integer power @var{n}, as a (potentially very large)
33422integer. Powers of two are cached, so only the first call for a
33423particular @var{n} is expensive.
33424@end defun
33425
33426@defun integer-log2 n
33427Compute the base-2 logarithm of @var{n}, which must be an integer which
33428is a power of two. If @var{n} is not a power of two, this function will
33429return @code{nil}.
33430@end defun
33431
33432@defun div-mod a b m
33433Divide @var{a} by @var{b}, modulo @var{m}. This returns @code{nil} if
33434there is no solution, or if any of the arguments are not integers.
33435@end defun
33436
33437@defun pow-mod a b m
33438Compute @var{a} to the power @var{b}, modulo @var{m}. If @var{a},
33439@var{b}, and @var{m} are integers, this uses an especially efficient
33440algorithm. Otherwise, it simply computes @samp{(% (^ a b) m)}.
33441@end defun
33442
33443@defun isqrt n
33444Compute the integer square root of @var{n}. This is the square root
33445of @var{n} rounded down toward zero, i.e., @samp{floor(sqrt(@var{n}))}.
33446If @var{n} is itself an integer, the computation is especially efficient.
33447@end defun
33448
33449@defun to-hms a ang
33450Convert the argument @var{a} into an HMS form. If @var{ang} is specified,
33451it is the angular mode in which to interpret @var{a}, either @code{deg}
33452or @code{rad}. Otherwise, the current angular mode is used. If @var{a}
33453is already an HMS form it is returned as-is.
33454@end defun
33455
33456@defun from-hms a ang
33457Convert the HMS form @var{a} into a real number. If @var{ang} is specified,
33458it is the angular mode in which to express the result, otherwise the
33459current angular mode is used. If @var{a} is already a real number, it
33460is returned as-is.
33461@end defun
33462
33463@defun to-radians a
33464Convert the number or HMS form @var{a} to radians from the current
33465angular mode.
33466@end defun
33467
33468@defun from-radians a
33469Convert the number @var{a} from radians to the current angular mode.
33470If @var{a} is a formula, this returns the formula @samp{deg(@var{a})}.
33471@end defun
33472
33473@defun to-radians-2 a
33474Like @code{to-radians}, except that in Symbolic mode a degrees to
33475radians conversion yields a formula like @samp{@var{a}*pi/180}.
33476@end defun
33477
33478@defun from-radians-2 a
33479Like @code{from-radians}, except that in Symbolic mode a radians to
33480degrees conversion yields a formula like @samp{@var{a}*180/pi}.
33481@end defun
33482
33483@defun random-digit
33484Produce a random base-1000 digit in the range 0 to 999.
33485@end defun
33486
33487@defun random-digits n
33488Produce a random @var{n}-digit integer; this will be an integer
33489in the interval @samp{[0, 10^@var{n})}.
33490@end defun
33491
33492@defun random-float
33493Produce a random float in the interval @samp{[0, 1)}.
33494@end defun
33495
33496@defun prime-test n iters
33497Determine whether the integer @var{n} is prime. Return a list which has
33498one of these forms: @samp{(nil @var{f})} means the number is non-prime
33499because it was found to be divisible by @var{f}; @samp{(nil)} means it
33500was found to be non-prime by table look-up (so no factors are known);
33501@samp{(nil unknown)} means it is definitely non-prime but no factors
33502are known because @var{n} was large enough that Fermat's probabilistic
33503test had to be used; @samp{(t)} means the number is definitely prime;
33504and @samp{(maybe @var{i} @var{p})} means that Fermat's test, after @var{i}
33505iterations, is @var{p} percent sure that the number is prime. The
33506@var{iters} parameter is the number of Fermat iterations to use, in the
33507case that this is necessary. If @code{prime-test} returns ``maybe,''
33508you can call it again with the same @var{n} to get a greater certainty;
33509@code{prime-test} remembers where it left off.
33510@end defun
33511
33512@defun to-simple-fraction f
33513If @var{f} is a floating-point number which can be represented exactly
33514as a small rational number. return that number, else return @var{f}.
33515For example, 0.75 would be converted to 3:4. This function is very
33516fast.
33517@end defun
33518
33519@defun to-fraction f tol
33520Find a rational approximation to floating-point number @var{f} to within
33521a specified tolerance @var{tol}; this corresponds to the algebraic
33522function @code{frac}, and can be rather slow.
33523@end defun
33524
33525@defun quarter-integer n
33526If @var{n} is an integer or integer-valued float, this function
33527returns zero. If @var{n} is a half-integer (i.e., an integer plus
33528@mathit{1:2} or 0.5), it returns 2. If @var{n} is a quarter-integer,
33529it returns 1 or 3. If @var{n} is anything else, this function
33530returns @code{nil}.
33531@end defun
33532
33533@node Vector Lisp Functions, Symbolic Lisp Functions, Computational Lisp Functions, Internals
33534@subsubsection Vector Functions
33535
33536@noindent
33537The functions described here perform various operations on vectors and
33538matrices.
33539
33540@defun math-concat x y
33541Do a vector concatenation; this operation is written @samp{@var{x} | @var{y}}
33542in a symbolic formula. @xref{Building Vectors}.
33543@end defun
33544
33545@defun vec-length v
33546Return the length of vector @var{v}. If @var{v} is not a vector, the
33547result is zero. If @var{v} is a matrix, this returns the number of
33548rows in the matrix.
33549@end defun
33550
33551@defun mat-dimens m
33552Determine the dimensions of vector or matrix @var{m}. If @var{m} is not
33553a vector, the result is an empty list. If @var{m} is a plain vector
33554but not a matrix, the result is a one-element list containing the length
33555of the vector. If @var{m} is a matrix with @var{r} rows and @var{c} columns,
33556the result is the list @samp{(@var{r} @var{c})}. Higher-order tensors
33557produce lists of more than two dimensions. Note that the object
33558@samp{[[1, 2, 3], [4, 5]]} is a vector of vectors not all the same size,
33559and is treated by this and other Calc routines as a plain vector of two
33560elements.
33561@end defun
33562
33563@defun dimension-error
33564Abort the current function with a message of ``Dimension error.''
33565The Calculator will leave the function being evaluated in symbolic
33566form; this is really just a special case of @code{reject-arg}.
33567@end defun
33568
33569@defun build-vector args
33570Return a Calc vector with @var{args} as elements.
33571For example, @samp{(build-vector 1 2 3)} returns the Calc vector
33572@samp{[1, 2, 3]}, stored internally as the list @samp{(vec 1 2 3)}.
33573@end defun
33574
33575@defun make-vec obj dims
33576Return a Calc vector or matrix all of whose elements are equal to
33577@var{obj}. For example, @samp{(make-vec 27 3 4)} returns a 3x4 matrix
33578filled with 27's.
33579@end defun
33580
33581@defun row-matrix v
33582If @var{v} is a plain vector, convert it into a row matrix, i.e.,
33583a matrix whose single row is @var{v}. If @var{v} is already a matrix,
33584leave it alone.
33585@end defun
33586
33587@defun col-matrix v
33588If @var{v} is a plain vector, convert it into a column matrix, i.e., a
33589matrix with each element of @var{v} as a separate row. If @var{v} is
33590already a matrix, leave it alone.
33591@end defun
33592
33593@defun map-vec f v
33594Map the Lisp function @var{f} over the Calc vector @var{v}. For example,
33595@samp{(map-vec 'math-floor v)} returns a vector of the floored components
33596of vector @var{v}.
33597@end defun
33598
33599@defun map-vec-2 f a b
33600Map the Lisp function @var{f} over the two vectors @var{a} and @var{b}.
33601If @var{a} and @var{b} are vectors of equal length, the result is a
33602vector of the results of calling @samp{(@var{f} @var{ai} @var{bi})}
33603for each pair of elements @var{ai} and @var{bi}. If either @var{a} or
33604@var{b} is a scalar, it is matched with each value of the other vector.
33605For example, @samp{(map-vec-2 'math-add v 1)} returns the vector @var{v}
33606with each element increased by one. Note that using @samp{'+} would not
33607work here, since @code{defmath} does not expand function names everywhere,
33608just where they are in the function position of a Lisp expression.
33609@end defun
33610
33611@defun reduce-vec f v
33612Reduce the function @var{f} over the vector @var{v}. For example, if
33613@var{v} is @samp{[10, 20, 30, 40]}, this calls @samp{(f (f (f 10 20) 30) 40)}.
33614If @var{v} is a matrix, this reduces over the rows of @var{v}.
33615@end defun
33616
33617@defun reduce-cols f m
33618Reduce the function @var{f} over the columns of matrix @var{m}. For
33619example, if @var{m} is @samp{[[1, 2], [3, 4], [5, 6]]}, the result
33620is a vector of the two elements @samp{(f (f 1 3) 5)} and @samp{(f (f 2 4) 6)}.
33621@end defun
33622
33623@defun mat-row m n
33624Return the @var{n}th row of matrix @var{m}. This is equivalent to
33625@samp{(elt m n)}. For a slower but safer version, use @code{mrow}.
33626(@xref{Extracting Elements}.)
33627@end defun
33628
33629@defun mat-col m n
33630Return the @var{n}th column of matrix @var{m}, in the form of a vector.
33631The arguments are not checked for correctness.
33632@end defun
33633
33634@defun mat-less-row m n
33635Return a copy of matrix @var{m} with its @var{n}th row deleted. The
33636number @var{n} must be in range from 1 to the number of rows in @var{m}.
33637@end defun
33638
33639@defun mat-less-col m n
33640Return a copy of matrix @var{m} with its @var{n}th column deleted.
33641@end defun
33642
33643@defun transpose m
33644Return the transpose of matrix @var{m}.
33645@end defun
33646
33647@defun flatten-vector v
33648Flatten nested vector @var{v} into a vector of scalars. For example,
33649if @var{v} is @samp{[[1, 2, 3], [4, 5]]} the result is @samp{[1, 2, 3, 4, 5]}.
33650@end defun
33651
33652@defun copy-matrix m
33653If @var{m} is a matrix, return a copy of @var{m}. This maps
33654@code{copy-sequence} over the rows of @var{m}; in Lisp terms, each
33655element of the result matrix will be @code{eq} to the corresponding
33656element of @var{m}, but none of the @code{cons} cells that make up
33657the structure of the matrix will be @code{eq}. If @var{m} is a plain
33658vector, this is the same as @code{copy-sequence}.
33659@end defun
33660
33661@defun swap-rows m r1 r2
33662Exchange rows @var{r1} and @var{r2} of matrix @var{m} in-place. In
33663other words, unlike most of the other functions described here, this
33664function changes @var{m} itself rather than building up a new result
33665matrix. The return value is @var{m}, i.e., @samp{(eq (swap-rows m 1 2) m)}
33666is true, with the side effect of exchanging the first two rows of
33667@var{m}.
33668@end defun
33669
33670@node Symbolic Lisp Functions, Formatting Lisp Functions, Vector Lisp Functions, Internals
33671@subsubsection Symbolic Functions
33672
33673@noindent
33674The functions described here operate on symbolic formulas in the
33675Calculator.
33676
33677@defun calc-prepare-selection num
33678Prepare a stack entry for selection operations. If @var{num} is
33679omitted, the stack entry containing the cursor is used; otherwise,
33680it is the number of the stack entry to use. This function stores
33681useful information about the current stack entry into a set of
33682variables. @code{calc-selection-cache-num} contains the number of
33683the stack entry involved (equal to @var{num} if you specified it);
33684@code{calc-selection-cache-entry} contains the stack entry as a
33685list (such as @code{calc-top-list} would return with @code{entry}
33686as the selection mode); and @code{calc-selection-cache-comp} contains
33687a special ``tagged'' composition (@pxref{Formatting Lisp Functions})
33688which allows Calc to relate cursor positions in the buffer with
33689their corresponding sub-formulas.
33690
33691A slight complication arises in the selection mechanism because
33692formulas may contain small integers. For example, in the vector
33693@samp{[1, 2, 1]} the first and last elements are @code{eq} to each
33694other; selections are recorded as the actual Lisp object that
33695appears somewhere in the tree of the whole formula, but storing
33696@code{1} would falsely select both @code{1}'s in the vector. So
33697@code{calc-prepare-selection} also checks the stack entry and
33698replaces any plain integers with ``complex number'' lists of the form
33699@samp{(cplx @var{n} 0)}. This list will be displayed the same as a
33700plain @var{n} and the change will be completely invisible to the
33701user, but it will guarantee that no two sub-formulas of the stack
33702entry will be @code{eq} to each other. Next time the stack entry
33703is involved in a computation, @code{calc-normalize} will replace
33704these lists with plain numbers again, again invisibly to the user.
33705@end defun
33706
33707@defun calc-encase-atoms x
33708This modifies the formula @var{x} to ensure that each part of the
33709formula is a unique atom, using the @samp{(cplx @var{n} 0)} trick
33710described above. This function may use @code{setcar} to modify
33711the formula in-place.
33712@end defun
33713
33714@defun calc-find-selected-part
33715Find the smallest sub-formula of the current formula that contains
33716the cursor. This assumes @code{calc-prepare-selection} has been
33717called already. If the cursor is not actually on any part of the
33718formula, this returns @code{nil}.
33719@end defun
33720
33721@defun calc-change-current-selection selection
33722Change the currently prepared stack element's selection to
33723@var{selection}, which should be @code{eq} to some sub-formula
33724of the stack element, or @code{nil} to unselect the formula.
33725The stack element's appearance in the Calc buffer is adjusted
33726to reflect the new selection.
33727@end defun
33728
33729@defun calc-find-nth-part expr n
33730Return the @var{n}th sub-formula of @var{expr}. This function is used
33731by the selection commands, and (unless @kbd{j b} has been used) treats
33732sums and products as flat many-element formulas. Thus if @var{expr}
33733is @samp{((a + b) - c) + d}, calling @code{calc-find-nth-part} with
33734@var{n} equal to four will return @samp{d}.
33735@end defun
33736
33737@defun calc-find-parent-formula expr part
33738Return the sub-formula of @var{expr} which immediately contains
33739@var{part}. If @var{expr} is @samp{a*b + (c+1)*d} and @var{part}
33740is @code{eq} to the @samp{c+1} term of @var{expr}, then this function
33741will return @samp{(c+1)*d}. If @var{part} turns out not to be a
33742sub-formula of @var{expr}, the function returns @code{nil}. If
33743@var{part} is @code{eq} to @var{expr}, the function returns @code{t}.
33744This function does not take associativity into account.
33745@end defun
33746
33747@defun calc-find-assoc-parent-formula expr part
33748This is the same as @code{calc-find-parent-formula}, except that
33749(unless @kbd{j b} has been used) it continues widening the selection
33750to contain a complete level of the formula. Given @samp{a} from
33751@samp{((a + b) - c) + d}, @code{calc-find-parent-formula} will
33752return @samp{a + b} but @code{calc-find-assoc-parent-formula} will
33753return the whole expression.
33754@end defun
33755
33756@defun calc-grow-assoc-formula expr part
33757This expands sub-formula @var{part} of @var{expr} to encompass a
33758complete level of the formula. If @var{part} and its immediate
33759parent are not compatible associative operators, or if @kbd{j b}
33760has been used, this simply returns @var{part}.
33761@end defun
33762
33763@defun calc-find-sub-formula expr part
33764This finds the immediate sub-formula of @var{expr} which contains
33765@var{part}. It returns an index @var{n} such that
33766@samp{(calc-find-nth-part @var{expr} @var{n})} would return @var{part}.
33767If @var{part} is not a sub-formula of @var{expr}, it returns @code{nil}.
33768If @var{part} is @code{eq} to @var{expr}, it returns @code{t}. This
33769function does not take associativity into account.
33770@end defun
33771
33772@defun calc-replace-sub-formula expr old new
33773This function returns a copy of formula @var{expr}, with the
33774sub-formula that is @code{eq} to @var{old} replaced by @var{new}.
33775@end defun
33776
33777@defun simplify expr
33778Simplify the expression @var{expr} by applying various algebraic rules.
33779This is what the @w{@kbd{a s}} (@code{calc-simplify}) command uses. This
33780always returns a copy of the expression; the structure @var{expr} points
33781to remains unchanged in memory.
33782
33783More precisely, here is what @code{simplify} does: The expression is
33784first normalized and evaluated by calling @code{normalize}. If any
33785@code{AlgSimpRules} have been defined, they are then applied. Then
33786the expression is traversed in a depth-first, bottom-up fashion; at
33787each level, any simplifications that can be made are made until no
33788further changes are possible. Once the entire formula has been
33789traversed in this way, it is compared with the original formula (from
33790before the call to @code{normalize}) and, if it has changed,
33791the entire procedure is repeated (starting with @code{normalize})
33792until no further changes occur. Usually only two iterations are
33793needed:@: one to simplify the formula, and another to verify that no
33794further simplifications were possible.
33795@end defun
33796
33797@defun simplify-extended expr
33798Simplify the expression @var{expr}, with additional rules enabled that
33799help do a more thorough job, while not being entirely ``safe'' in all
33800circumstances. (For example, this mode will simplify @samp{sqrt(x^2)}
33801to @samp{x}, which is only valid when @var{x} is positive.) This is
33802implemented by temporarily binding the variable @code{math-living-dangerously}
33803to @code{t} (using a @code{let} form) and calling @code{simplify}.
33804Dangerous simplification rules are written to check this variable
33805before taking any action.
33806@end defun
33807
33808@defun simplify-units expr
33809Simplify the expression @var{expr}, treating variable names as units
33810whenever possible. This works by binding the variable
33811@code{math-simplifying-units} to @code{t} while calling @code{simplify}.
33812@end defun
33813
33814@defmac math-defsimplify funcs body
33815Register a new simplification rule; this is normally called as a top-level
33816form, like @code{defun} or @code{defmath}. If @var{funcs} is a symbol
33817(like @code{+} or @code{calcFunc-sqrt}), this simplification rule is
33818applied to the formulas which are calls to the specified function. Or,
33819@var{funcs} can be a list of such symbols; the rule applies to all
33820functions on the list. The @var{body} is written like the body of a
33821function with a single argument called @code{expr}. The body will be
33822executed with @code{expr} bound to a formula which is a call to one of
33823the functions @var{funcs}. If the function body returns @code{nil}, or
33824if it returns a result @code{equal} to the original @code{expr}, it is
33825ignored and Calc goes on to try the next simplification rule that applies.
33826If the function body returns something different, that new formula is
33827substituted for @var{expr} in the original formula.
33828
33829At each point in the formula, rules are tried in the order of the
33830original calls to @code{math-defsimplify}; the search stops after the
33831first rule that makes a change. Thus later rules for that same
33832function will not have a chance to trigger until the next iteration
33833of the main @code{simplify} loop.
33834
33835Note that, since @code{defmath} is not being used here, @var{body} must
33836be written in true Lisp code without the conveniences that @code{defmath}
33837provides. If you prefer, you can have @var{body} simply call another
33838function (defined with @code{defmath}) which does the real work.
33839
33840The arguments of a function call will already have been simplified
33841before any rules for the call itself are invoked. Since a new argument
33842list is consed up when this happens, this means that the rule's body is
33843allowed to rearrange the function's arguments destructively if that is
33844convenient. Here is a typical example of a simplification rule:
33845
33846@smallexample
33847(math-defsimplify calcFunc-arcsinh
33848 (or (and (math-looks-negp (nth 1 expr))
33849 (math-neg (list 'calcFunc-arcsinh
33850 (math-neg (nth 1 expr)))))
33851 (and (eq (car-safe (nth 1 expr)) 'calcFunc-sinh)
33852 (or math-living-dangerously
33853 (math-known-realp (nth 1 (nth 1 expr))))
33854 (nth 1 (nth 1 expr)))))
33855@end smallexample
33856
33857This is really a pair of rules written with one @code{math-defsimplify}
33858for convenience; the first replaces @samp{arcsinh(-x)} with
33859@samp{-arcsinh(x)}, and the second, which is safe only for real @samp{x},
33860replaces @samp{arcsinh(sinh(x))} with @samp{x}.
33861@end defmac
33862
33863@defun common-constant-factor expr
33864Check @var{expr} to see if it is a sum of terms all multiplied by the
33865same rational value. If so, return this value. If not, return @code{nil}.
33866For example, if called on @samp{6x + 9y + 12z}, it would return 3, since
338673 is a common factor of all the terms.
33868@end defun
33869
33870@defun cancel-common-factor expr factor
33871Assuming @var{expr} is a sum with @var{factor} as a common factor,
33872divide each term of the sum by @var{factor}. This is done by
33873destructively modifying parts of @var{expr}, on the assumption that
33874it is being used by a simplification rule (where such things are
33875allowed; see above). For example, consider this built-in rule for
33876square roots:
33877
33878@smallexample
33879(math-defsimplify calcFunc-sqrt
33880 (let ((fac (math-common-constant-factor (nth 1 expr))))
33881 (and fac (not (eq fac 1))
33882 (math-mul (math-normalize (list 'calcFunc-sqrt fac))
33883 (math-normalize
33884 (list 'calcFunc-sqrt
33885 (math-cancel-common-factor
33886 (nth 1 expr) fac)))))))
33887@end smallexample
33888@end defun
33889
33890@defun frac-gcd a b
33891Compute a ``rational GCD'' of @var{a} and @var{b}, which must both be
33892rational numbers. This is the fraction composed of the GCD of the
33893numerators of @var{a} and @var{b}, over the GCD of the denominators.
33894It is used by @code{common-constant-factor}. Note that the standard
33895@code{gcd} function uses the LCM to combine the denominators.
33896@end defun
33897
33898@defun map-tree func expr many
33899Try applying Lisp function @var{func} to various sub-expressions of
33900@var{expr}. Initially, call @var{func} with @var{expr} itself as an
33901argument. If this returns an expression which is not @code{equal} to
33902@var{expr}, apply @var{func} again until eventually it does return
33903@var{expr} with no changes. Then, if @var{expr} is a function call,
33904recursively apply @var{func} to each of the arguments. This keeps going
33905until no changes occur anywhere in the expression; this final expression
33906is returned by @code{map-tree}. Note that, unlike simplification rules,
33907@var{func} functions may @emph{not} make destructive changes to
33908@var{expr}. If a third argument @var{many} is provided, it is an
33909integer which says how many times @var{func} may be applied; the
33910default, as described above, is infinitely many times.
33911@end defun
33912
33913@defun compile-rewrites rules
33914Compile the rewrite rule set specified by @var{rules}, which should
33915be a formula that is either a vector or a variable name. If the latter,
33916the compiled rules are saved so that later @code{compile-rules} calls
33917for that same variable can return immediately. If there are problems
33918with the rules, this function calls @code{error} with a suitable
33919message.
33920@end defun
33921
33922@defun apply-rewrites expr crules heads
33923Apply the compiled rewrite rule set @var{crules} to the expression
33924@var{expr}. This will make only one rewrite and only checks at the
33925top level of the expression. The result @code{nil} if no rules
33926matched, or if the only rules that matched did not actually change
33927the expression. The @var{heads} argument is optional; if is given,
33928it should be a list of all function names that (may) appear in
33929@var{expr}. The rewrite compiler tags each rule with the
33930rarest-looking function name in the rule; if you specify @var{heads},
33931@code{apply-rewrites} can use this information to narrow its search
33932down to just a few rules in the rule set.
33933@end defun
33934
33935@defun rewrite-heads expr
33936Compute a @var{heads} list for @var{expr} suitable for use with
33937@code{apply-rewrites}, as discussed above.
33938@end defun
33939
33940@defun rewrite expr rules many
33941This is an all-in-one rewrite function. It compiles the rule set
33942specified by @var{rules}, then uses @code{map-tree} to apply the
33943rules throughout @var{expr} up to @var{many} (default infinity)
33944times.
33945@end defun
33946
33947@defun match-patterns pat vec not-flag
33948Given a Calc vector @var{vec} and an uncompiled pattern set or
33949pattern set variable @var{pat}, this function returns a new vector
33950of all elements of @var{vec} which do (or don't, if @var{not-flag} is
33951non-@code{nil}) match any of the patterns in @var{pat}.
33952@end defun
33953
33954@defun deriv expr var value symb
33955Compute the derivative of @var{expr} with respect to variable @var{var}
33956(which may actually be any sub-expression). If @var{value} is specified,
33957the derivative is evaluated at the value of @var{var}; otherwise, the
33958derivative is left in terms of @var{var}. If the expression contains
33959functions for which no derivative formula is known, new derivative
33960functions are invented by adding primes to the names; @pxref{Calculus}.
33961However, if @var{symb} is non-@code{nil}, the presence of undifferentiable
33962functions in @var{expr} instead cancels the whole differentiation, and
33963@code{deriv} returns @code{nil} instead.
33964
33965Derivatives of an @var{n}-argument function can be defined by
33966adding a @code{math-derivative-@var{n}} property to the property list
33967of the symbol for the function's derivative, which will be the
33968function name followed by an apostrophe. The value of the property
33969should be a Lisp function; it is called with the same arguments as the
33970original function call that is being differentiated. It should return
33971a formula for the derivative. For example, the derivative of @code{ln}
33972is defined by
33973
33974@smallexample
33975(put 'calcFunc-ln\' 'math-derivative-1
33976 (function (lambda (u) (math-div 1 u))))
33977@end smallexample
33978
33979The two-argument @code{log} function has two derivatives,
33980@smallexample
33981(put 'calcFunc-log\' 'math-derivative-2 ; d(log(x,b)) / dx
33982 (function (lambda (x b) ... )))
33983(put 'calcFunc-log\'2 'math-derivative-2 ; d(log(x,b)) / db
33984 (function (lambda (x b) ... )))
33985@end smallexample
33986@end defun
33987
33988@defun tderiv expr var value symb
33989Compute the total derivative of @var{expr}. This is the same as
33990@code{deriv}, except that variables other than @var{var} are not
33991assumed to be constant with respect to @var{var}.
33992@end defun
33993
33994@defun integ expr var low high
33995Compute the integral of @var{expr} with respect to @var{var}.
33996@xref{Calculus}, for further details.
33997@end defun
33998
33999@defmac math-defintegral funcs body
34000Define a rule for integrating a function or functions of one argument;
34001this macro is very similar in format to @code{math-defsimplify}.
34002The main difference is that here @var{body} is the body of a function
34003with a single argument @code{u} which is bound to the argument to the
34004function being integrated, not the function call itself. Also, the
34005variable of integration is available as @code{math-integ-var}. If
34006evaluation of the integral requires doing further integrals, the body
34007should call @samp{(math-integral @var{x})} to find the integral of
34008@var{x} with respect to @code{math-integ-var}; this function returns
34009@code{nil} if the integral could not be done. Some examples:
34010
34011@smallexample
34012(math-defintegral calcFunc-conj
34013 (let ((int (math-integral u)))
34014 (and int
34015 (list 'calcFunc-conj int))))
34016
34017(math-defintegral calcFunc-cos
34018 (and (equal u math-integ-var)
34019 (math-from-radians-2 (list 'calcFunc-sin u))))
34020@end smallexample
34021
34022In the @code{cos} example, we define only the integral of @samp{cos(x) dx},
34023relying on the general integration-by-substitution facility to handle
34024cosines of more complicated arguments. An integration rule should return
34025@code{nil} if it can't do the integral; if several rules are defined for
34026the same function, they are tried in order until one returns a non-@code{nil}
34027result.
34028@end defmac
34029
34030@defmac math-defintegral-2 funcs body
34031Define a rule for integrating a function or functions of two arguments.
34032This is exactly analogous to @code{math-defintegral}, except that @var{body}
34033is written as the body of a function with two arguments, @var{u} and
34034@var{v}.
34035@end defmac
34036
34037@defun solve-for lhs rhs var full
34038Attempt to solve the equation @samp{@var{lhs} = @var{rhs}} by isolating
34039the variable @var{var} on the lefthand side; return the resulting righthand
34040side, or @code{nil} if the equation cannot be solved. The variable
34041@var{var} must appear at least once in @var{lhs} or @var{rhs}. Note that
34042the return value is a formula which does not contain @var{var}; this is
34043different from the user-level @code{solve} and @code{finv} functions,
34044which return a rearranged equation or a functional inverse, respectively.
34045If @var{full} is non-@code{nil}, a full solution including dummy signs
34046and dummy integers will be produced. User-defined inverses are provided
34047as properties in a manner similar to derivatives:
34048
34049@smallexample
34050(put 'calcFunc-ln 'math-inverse
34051 (function (lambda (x) (list 'calcFunc-exp x))))
34052@end smallexample
34053
34054This function can call @samp{(math-solve-get-sign @var{x})} to create
34055a new arbitrary sign variable, returning @var{x} times that sign, and
34056@samp{(math-solve-get-int @var{x})} to create a new arbitrary integer
34057variable multiplied by @var{x}. These functions simply return @var{x}
34058if the caller requested a non-``full'' solution.
34059@end defun
34060
34061@defun solve-eqn expr var full
34062This version of @code{solve-for} takes an expression which will
34063typically be an equation or inequality. (If it is not, it will be
34064interpreted as the equation @samp{@var{expr} = 0}.) It returns an
34065equation or inequality, or @code{nil} if no solution could be found.
34066@end defun
34067
34068@defun solve-system exprs vars full
34069This function solves a system of equations. Generally, @var{exprs}
34070and @var{vars} will be vectors of equal length.
34071@xref{Solving Systems of Equations}, for other options.
34072@end defun
34073
34074@defun expr-contains expr var
34075Returns a non-@code{nil} value if @var{var} occurs as a subexpression
34076of @var{expr}.
34077
34078This function might seem at first to be identical to
34079@code{calc-find-sub-formula}. The key difference is that
34080@code{expr-contains} uses @code{equal} to test for matches, whereas
34081@code{calc-find-sub-formula} uses @code{eq}. In the formula
34082@samp{f(a, a)}, the two @samp{a}s will be @code{equal} but not
34083@code{eq} to each other.
34084@end defun
34085
34086@defun expr-contains-count expr var
34087Returns the number of occurrences of @var{var} as a subexpression
34088of @var{expr}, or @code{nil} if there are no occurrences.
34089@end defun
34090
34091@defun expr-depends expr var
34092Returns true if @var{expr} refers to any variable the occurs in @var{var}.
34093In other words, it checks if @var{expr} and @var{var} have any variables
34094in common.
34095@end defun
34096
34097@defun expr-contains-vars expr
34098Return true if @var{expr} contains any variables, or @code{nil} if @var{expr}
34099contains only constants and functions with constant arguments.
34100@end defun
34101
34102@defun expr-subst expr old new
34103Returns a copy of @var{expr}, with all occurrences of @var{old} replaced
34104by @var{new}. This treats @code{lambda} forms specially with respect
34105to the dummy argument variables, so that the effect is always to return
34106@var{expr} evaluated at @var{old} = @var{new}.
34107@end defun
34108
34109@defun multi-subst expr old new
34110This is like @code{expr-subst}, except that @var{old} and @var{new}
34111are lists of expressions to be substituted simultaneously. If one
34112list is shorter than the other, trailing elements of the longer list
34113are ignored.
34114@end defun
34115
34116@defun expr-weight expr
34117Returns the ``weight'' of @var{expr}, basically a count of the total
34118number of objects and function calls that appear in @var{expr}. For
34119``primitive'' objects, this will be one.
34120@end defun
34121
34122@defun expr-height expr
34123Returns the ``height'' of @var{expr}, which is the deepest level to
34124which function calls are nested. (Note that @samp{@var{a} + @var{b}}
34125counts as a function call.) For primitive objects, this returns zero.
34126@end defun
34127
34128@defun polynomial-p expr var
34129Check if @var{expr} is a polynomial in variable (or sub-expression)
34130@var{var}. If so, return the degree of the polynomial, that is, the
34131highest power of @var{var} that appears in @var{expr}. For example,
34132for @samp{(x^2 + 3)^3 + 4} this would return 6. This function returns
34133@code{nil} unless @var{expr}, when expanded out by @kbd{a x}
34134(@code{calc-expand}), would consist of a sum of terms in which @var{var}
34135appears only raised to nonnegative integer powers. Note that if
34136@var{var} does not occur in @var{expr}, then @var{expr} is considered
34137a polynomial of degree 0.
34138@end defun
34139
34140@defun is-polynomial expr var degree loose
34141Check if @var{expr} is a polynomial in variable or sub-expression
34142@var{var}, and, if so, return a list representation of the polynomial
34143where the elements of the list are coefficients of successive powers of
34144@var{var}: @samp{@var{a} + @var{b} x + @var{c} x^3} would produce the
34145list @samp{(@var{a} @var{b} 0 @var{c})}, and @samp{(x + 1)^2} would
34146produce the list @samp{(1 2 1)}. The highest element of the list will
34147be non-zero, with the special exception that if @var{expr} is the
34148constant zero, the returned value will be @samp{(0)}. Return @code{nil}
34149if @var{expr} is not a polynomial in @var{var}. If @var{degree} is
34150specified, this will not consider polynomials of degree higher than that
34151value. This is a good precaution because otherwise an input of
34152@samp{(x+1)^1000} will cause a huge coefficient list to be built. If
34153@var{loose} is non-@code{nil}, then a looser definition of a polynomial
34154is used in which coefficients are no longer required not to depend on
34155@var{var}, but are only required not to take the form of polynomials
34156themselves. For example, @samp{sin(x) x^2 + cos(x)} is a loose
34157polynomial with coefficients @samp{((calcFunc-cos x) 0 (calcFunc-sin
34158x))}. The result will never be @code{nil} in loose mode, since any
34159expression can be interpreted as a ``constant'' loose polynomial.
34160@end defun
34161
34162@defun polynomial-base expr pred
34163Check if @var{expr} is a polynomial in any variable that occurs in it;
34164if so, return that variable. (If @var{expr} is a multivariate polynomial,
34165this chooses one variable arbitrarily.) If @var{pred} is specified, it should
34166be a Lisp function which is called as @samp{(@var{pred} @var{subexpr})},
34167and which should return true if @code{mpb-top-expr} (a global name for
34168the original @var{expr}) is a suitable polynomial in @var{subexpr}.
34169The default predicate uses @samp{(polynomial-p mpb-top-expr @var{subexpr})};
34170you can use @var{pred} to specify additional conditions. Or, you could
34171have @var{pred} build up a list of every suitable @var{subexpr} that
34172is found.
34173@end defun
34174
34175@defun poly-simplify poly
34176Simplify polynomial coefficient list @var{poly} by (destructively)
34177clipping off trailing zeros.
34178@end defun
34179
34180@defun poly-mix a ac b bc
34181Mix two polynomial lists @var{a} and @var{b} (in the form returned by
34182@code{is-polynomial}) in a linear combination with coefficient expressions
34183@var{ac} and @var{bc}. The result is a (not necessarily simplified)
34184polynomial list representing @samp{@var{ac} @var{a} + @var{bc} @var{b}}.
34185@end defun
34186
34187@defun poly-mul a b
34188Multiply two polynomial coefficient lists @var{a} and @var{b}. The
34189result will be in simplified form if the inputs were simplified.
34190@end defun
34191
34192@defun build-polynomial-expr poly var
34193Construct a Calc formula which represents the polynomial coefficient
34194list @var{poly} applied to variable @var{var}. The @kbd{a c}
34195(@code{calc-collect}) command uses @code{is-polynomial} to turn an
34196expression into a coefficient list, then @code{build-polynomial-expr}
34197to turn the list back into an expression in regular form.
34198@end defun
34199
34200@defun check-unit-name var
34201Check if @var{var} is a variable which can be interpreted as a unit
34202name. If so, return the units table entry for that unit. This
34203will be a list whose first element is the unit name (not counting
34204prefix characters) as a symbol and whose second element is the
34205Calc expression which defines the unit. (Refer to the Calc sources
34206for details on the remaining elements of this list.) If @var{var}
34207is not a variable or is not a unit name, return @code{nil}.
34208@end defun
34209
34210@defun units-in-expr-p expr sub-exprs
34211Return true if @var{expr} contains any variables which can be
34212interpreted as units. If @var{sub-exprs} is @code{t}, the entire
34213expression is searched. If @var{sub-exprs} is @code{nil}, this
34214checks whether @var{expr} is directly a units expression.
34215@end defun
34216
34217@defun single-units-in-expr-p expr
34218Check whether @var{expr} contains exactly one units variable. If so,
34219return the units table entry for the variable. If @var{expr} does
34220not contain any units, return @code{nil}. If @var{expr} contains
34221two or more units, return the symbol @code{wrong}.
34222@end defun
34223
34224@defun to-standard-units expr which
34225Convert units expression @var{expr} to base units. If @var{which}
34226is @code{nil}, use Calc's native base units. Otherwise, @var{which}
34227can specify a units system, which is a list of two-element lists,
34228where the first element is a Calc base symbol name and the second
34229is an expression to substitute for it.
34230@end defun
34231
34232@defun remove-units expr
34233Return a copy of @var{expr} with all units variables replaced by ones.
34234This expression is generally normalized before use.
34235@end defun
34236
34237@defun extract-units expr
34238Return a copy of @var{expr} with everything but units variables replaced
34239by ones.
34240@end defun
34241
34242@node Formatting Lisp Functions, Hooks, Symbolic Lisp Functions, Internals
34243@subsubsection I/O and Formatting Functions
34244
34245@noindent
34246The functions described here are responsible for parsing and formatting
34247Calc numbers and formulas.
34248
34249@defun calc-eval str sep arg1 arg2 @dots{}
34250This is the simplest interface to the Calculator from another Lisp program.
34251@xref{Calling Calc from Your Programs}.
34252@end defun
34253
34254@defun read-number str
34255If string @var{str} contains a valid Calc number, either integer,
34256fraction, float, or HMS form, this function parses and returns that
34257number. Otherwise, it returns @code{nil}.
34258@end defun
34259
34260@defun read-expr str
34261Read an algebraic expression from string @var{str}. If @var{str} does
34262not have the form of a valid expression, return a list of the form
34263@samp{(error @var{pos} @var{msg})} where @var{pos} is an integer index
34264into @var{str} of the general location of the error, and @var{msg} is
34265a string describing the problem.
34266@end defun
34267
34268@defun read-exprs str
34269Read a list of expressions separated by commas, and return it as a
34270Lisp list. If an error occurs in any expressions, an error list as
34271shown above is returned instead.
34272@end defun
34273
34274@defun calc-do-alg-entry initial prompt no-norm
34275Read an algebraic formula or formulas using the minibuffer. All
34276conventions of regular algebraic entry are observed. The return value
34277is a list of Calc formulas; there will be more than one if the user
34278entered a list of values separated by commas. The result is @code{nil}
34279if the user presses Return with a blank line. If @var{initial} is
34280given, it is a string which the minibuffer will initially contain.
34281If @var{prompt} is given, it is the prompt string to use; the default
34282is ``Algebraic:''. If @var{no-norm} is @code{t}, the formulas will
34283be returned exactly as parsed; otherwise, they will be passed through
34284@code{calc-normalize} first.
34285
34286To support the use of @kbd{$} characters in the algebraic entry, use
34287@code{let} to bind @code{calc-dollar-values} to a list of the values
34288to be substituted for @kbd{$}, @kbd{$$}, and so on, and bind
34289@code{calc-dollar-used} to 0. Upon return, @code{calc-dollar-used}
34290will have been changed to the highest number of consecutive @kbd{$}s
34291that actually appeared in the input.
34292@end defun
34293
34294@defun format-number a
34295Convert the real or complex number or HMS form @var{a} to string form.
34296@end defun
34297
34298@defun format-flat-expr a prec
34299Convert the arbitrary Calc number or formula @var{a} to string form,
34300in the style used by the trail buffer and the @code{calc-edit} command.
34301This is a simple format designed
34302mostly to guarantee the string is of a form that can be re-parsed by
34303@code{read-expr}. Most formatting modes, such as digit grouping,
34304complex number format, and point character, are ignored to ensure the
34305result will be re-readable. The @var{prec} parameter is normally 0; if
34306you pass a large integer like 1000 instead, the expression will be
34307surrounded by parentheses unless it is a plain number or variable name.
34308@end defun
34309
34310@defun format-nice-expr a width
34311This is like @code{format-flat-expr} (with @var{prec} equal to 0),
34312except that newlines will be inserted to keep lines down to the
34313specified @var{width}, and vectors that look like matrices or rewrite
34314rules are written in a pseudo-matrix format. The @code{calc-edit}
34315command uses this when only one stack entry is being edited.
34316@end defun
34317
34318@defun format-value a width
34319Convert the Calc number or formula @var{a} to string form, using the
34320format seen in the stack buffer. Beware the string returned may
34321not be re-readable by @code{read-expr}, for example, because of digit
34322grouping. Multi-line objects like matrices produce strings that
34323contain newline characters to separate the lines. The @var{w}
34324parameter, if given, is the target window size for which to format
34325the expressions. If @var{w} is omitted, the width of the Calculator
34326window is used.
34327@end defun
34328
34329@defun compose-expr a prec
34330Format the Calc number or formula @var{a} according to the current
34331language mode, returning a ``composition.'' To learn about the
34332structure of compositions, see the comments in the Calc source code.
34333You can specify the format of a given type of function call by putting
34334a @code{math-compose-@var{lang}} property on the function's symbol,
34335whose value is a Lisp function that takes @var{a} and @var{prec} as
34336arguments and returns a composition. Here @var{lang} is a language
34337mode name, one of @code{normal}, @code{big}, @code{c}, @code{pascal},
34338@code{fortran}, @code{tex}, @code{eqn}, @code{math}, or @code{maple}.
34339In Big mode, Calc actually tries @code{math-compose-big} first, then
34340tries @code{math-compose-normal}. If this property does not exist,
34341or if the function returns @code{nil}, the function is written in the
34342normal function-call notation for that language.
34343@end defun
34344
34345@defun composition-to-string c w
34346Convert a composition structure returned by @code{compose-expr} into
34347a string. Multi-line compositions convert to strings containing
34348newline characters. The target window size is given by @var{w}.
34349The @code{format-value} function basically calls @code{compose-expr}
34350followed by @code{composition-to-string}.
34351@end defun
34352
34353@defun comp-width c
34354Compute the width in characters of composition @var{c}.
34355@end defun
34356
34357@defun comp-height c
34358Compute the height in lines of composition @var{c}.
34359@end defun
34360
34361@defun comp-ascent c
34362Compute the portion of the height of composition @var{c} which is on or
34363above the baseline. For a one-line composition, this will be one.
34364@end defun
34365
34366@defun comp-descent c
34367Compute the portion of the height of composition @var{c} which is below
34368the baseline. For a one-line composition, this will be zero.
34369@end defun
34370
34371@defun comp-first-char c
34372If composition @var{c} is a ``flat'' composition, return the first
34373(leftmost) character of the composition as an integer. Otherwise,
34374return @code{nil}.
34375@end defun
34376
34377@defun comp-last-char c
34378If composition @var{c} is a ``flat'' composition, return the last
34379(rightmost) character, otherwise return @code{nil}.
34380@end defun
34381
34382@comment @node Lisp Variables, Hooks, Formatting Lisp Functions, Internals
34383@comment @subsubsection Lisp Variables
34384@comment
34385@comment @noindent
34386@comment (This section is currently unfinished.)
34387
34388@node Hooks, , Formatting Lisp Functions, Internals
34389@subsubsection Hooks
34390
34391@noindent
34392Hooks are variables which contain Lisp functions (or lists of functions)
34393which are called at various times. Calc defines a number of hooks
34394that help you to customize it in various ways. Calc uses the Lisp
34395function @code{run-hooks} to invoke the hooks shown below. Several
34396other customization-related variables are also described here.
34397
34398@defvar calc-load-hook
34399This hook is called at the end of @file{calc.el}, after the file has
34400been loaded, before any functions in it have been called, but after
34401@code{calc-mode-map} and similar variables have been set up.
34402@end defvar
34403
34404@defvar calc-ext-load-hook
34405This hook is called at the end of @file{calc-ext.el}.
34406@end defvar
34407
34408@defvar calc-start-hook
34409This hook is called as the last step in a @kbd{M-x calc} command.
34410At this point, the Calc buffer has been created and initialized if
34411necessary, the Calc window and trail window have been created,
34412and the ``Welcome to Calc'' message has been displayed.
34413@end defvar
34414
34415@defvar calc-mode-hook
34416This hook is called when the Calc buffer is being created. Usually
34417this will only happen once per Emacs session. The hook is called
34418after Emacs has switched to the new buffer, the mode-settings file
34419has been read if necessary, and all other buffer-local variables
34420have been set up. After this hook returns, Calc will perform a
34421@code{calc-refresh} operation, set up the mode line display, then
34422evaluate any deferred @code{calc-define} properties that have not
34423been evaluated yet.
34424@end defvar
34425
34426@defvar calc-trail-mode-hook
34427This hook is called when the Calc Trail buffer is being created.
34428It is called as the very last step of setting up the Trail buffer.
34429Like @code{calc-mode-hook}, this will normally happen only once
34430per Emacs session.
34431@end defvar
34432
34433@defvar calc-end-hook
34434This hook is called by @code{calc-quit}, generally because the user
34435presses @kbd{q} or @kbd{C-x * c} while in Calc. The Calc buffer will
34436be the current buffer. The hook is called as the very first
34437step, before the Calc window is destroyed.
34438@end defvar
34439
34440@defvar calc-window-hook
34441If this hook is non-@code{nil}, it is called to create the Calc window.
34442Upon return, this new Calc window should be the current window.
34443(The Calc buffer will already be the current buffer when the
34444hook is called.) If the hook is not defined, Calc will
34445generally use @code{split-window}, @code{set-window-buffer},
34446and @code{select-window} to create the Calc window.
34447@end defvar
34448
34449@defvar calc-trail-window-hook
34450If this hook is non-@code{nil}, it is called to create the Calc Trail
34451window. The variable @code{calc-trail-buffer} will contain the buffer
34452which the window should use. Unlike @code{calc-window-hook}, this hook
34453must @emph{not} switch into the new window.
34454@end defvar
34455
34456@defvar calc-embedded-mode-hook
34457This hook is called the first time that Embedded mode is entered.
34458@end defvar
34459
34460@defvar calc-embedded-new-buffer-hook
34461This hook is called each time that Embedded mode is entered in a
34462new buffer.
34463@end defvar
34464
34465@defvar calc-embedded-new-formula-hook
34466This hook is called each time that Embedded mode is enabled for a
34467new formula.
34468@end defvar
34469
34470@defvar calc-edit-mode-hook
34471This hook is called by @code{calc-edit} (and the other ``edit''
34472commands) when the temporary editing buffer is being created.
34473The buffer will have been selected and set up to be in
34474@code{calc-edit-mode}, but will not yet have been filled with
34475text. (In fact it may still have leftover text from a previous
34476@code{calc-edit} command.)
34477@end defvar
34478
34479@defvar calc-mode-save-hook
34480This hook is called by the @code{calc-save-modes} command,
34481after Calc's own mode features have been inserted into the
34482Calc init file and just before the ``End of mode settings''
34483message is inserted.
34484@end defvar
34485
34486@defvar calc-reset-hook
34487This hook is called after @kbd{C-x * 0} (@code{calc-reset}) has
34488reset all modes. The Calc buffer will be the current buffer.
34489@end defvar
34490
34491@defvar calc-other-modes
34492This variable contains a list of strings. The strings are
34493concatenated at the end of the modes portion of the Calc
34494mode line (after standard modes such as ``Deg'', ``Inv'' and
34495``Hyp''). Each string should be a short, single word followed
34496by a space. The variable is @code{nil} by default.
34497@end defvar
34498
34499@defvar calc-mode-map
34500This is the keymap that is used by Calc mode. The best time
34501to adjust it is probably in a @code{calc-mode-hook}. If the
34502Calc extensions package (@file{calc-ext.el}) has not yet been
34503loaded, many of these keys will be bound to @code{calc-missing-key},
34504which is a command that loads the extensions package and
34505``retypes'' the key. If your @code{calc-mode-hook} rebinds
34506one of these keys, it will probably be overridden when the
34507extensions are loaded.
34508@end defvar
34509
34510@defvar calc-digit-map
34511This is the keymap that is used during numeric entry. Numeric
34512entry uses the minibuffer, but this map binds every non-numeric
34513key to @code{calcDigit-nondigit} which generally calls
34514@code{exit-minibuffer} and ``retypes'' the key.
34515@end defvar
34516
34517@defvar calc-alg-ent-map
34518This is the keymap that is used during algebraic entry. This is
34519mostly a copy of @code{minibuffer-local-map}.
34520@end defvar
34521
34522@defvar calc-store-var-map
34523This is the keymap that is used during entry of variable names for
34524commands like @code{calc-store} and @code{calc-recall}. This is
34525mostly a copy of @code{minibuffer-local-completion-map}.
34526@end defvar
34527
34528@defvar calc-edit-mode-map
34529This is the (sparse) keymap used by @code{calc-edit} and other
34530temporary editing commands. It binds @key{RET}, @key{LFD},
34531and @kbd{C-c C-c} to @code{calc-edit-finish}.
34532@end defvar
34533
34534@defvar calc-mode-var-list
34535This is a list of variables which are saved by @code{calc-save-modes}.
34536Each entry is a list of two items, the variable (as a Lisp symbol)
34537and its default value. When modes are being saved, each variable
34538is compared with its default value (using @code{equal}) and any
34539non-default variables are written out.
34540@end defvar
34541
34542@defvar calc-local-var-list
34543This is a list of variables which should be buffer-local to the
34544Calc buffer. Each entry is a variable name (as a Lisp symbol).
34545These variables also have their default values manipulated by
34546the @code{calc} and @code{calc-quit} commands; @pxref{Multiple Calculators}.
34547Since @code{calc-mode-hook} is called after this list has been
34548used the first time, your hook should add a variable to the
34549list and also call @code{make-local-variable} itself.
34550@end defvar
34551
34552@node Copying, GNU Free Documentation License, Programming, Top
34553@appendix GNU GENERAL PUBLIC LICENSE
34554@include gpl.texi
34555
34556@node GNU Free Documentation License, Customizing Calc, Copying, Top
34557@appendix GNU Free Documentation License
34558@include doclicense.texi
34559
34560@node Customizing Calc, Reporting Bugs, GNU Free Documentation License, Top
34561@appendix Customizing Calc
34562
34563The usual prefix for Calc is the key sequence @kbd{C-x *}. If you wish
34564to use a different prefix, you can put
34565
34566@example
34567(global-set-key "NEWPREFIX" 'calc-dispatch)
34568@end example
34569
34570@noindent
34571in your .emacs file.
34572(@xref{Key Bindings,,Customizing Key Bindings,emacs,
34573The GNU Emacs Manual}, for more information on binding keys.)
34574A convenient way to start Calc is with @kbd{C-x * *}; to make it equally
34575convenient for users who use a different prefix, the prefix can be
34576followed by @kbd{=}, @kbd{&}, @kbd{#}, @kbd{\}, @kbd{/}, @kbd{+} or
34577@kbd{-} as well as @kbd{*} to start Calc, and so in many cases the last
34578character of the prefix can simply be typed twice.
34579
34580Calc is controlled by many variables, most of which can be reset
34581from within Calc. Some variables are less involved with actual
34582calculation, and can be set outside of Calc using Emacs's
34583customization facilities. These variables are listed below.
34584Typing @kbd{M-x customize-variable RET @var{variable-name} RET}
34585will bring up a buffer in which the variable's value can be redefined.
34586Typing @kbd{M-x customize-group RET calc RET} will bring up a buffer which
34587contains all of Calc's customizable variables. (These variables can
34588also be reset by putting the appropriate lines in your .emacs file;
34589@xref{Init File, ,Init File, emacs, The GNU Emacs Manual}.)
34590
34591Some of the customizable variables are regular expressions. A regular
34592expression is basically a pattern that Calc can search for.
34593See @ref{Regexp Search,, Regular Expression Search, emacs, The GNU Emacs Manual}
34594to see how regular expressions work.
34595
34596@defvar calc-settings-file
34597The variable @code{calc-settings-file} holds the file name in
34598which commands like @kbd{m m} and @kbd{Z P} store ``permanent''
34599definitions.
34600If @code{calc-settings-file} is not your user init file (typically
34601@file{~/.emacs}) and if the variable @code{calc-loaded-settings-file} is
34602@code{nil}, then Calc will automatically load your settings file (if it
34603exists) the first time Calc is invoked.
34604
34605The default value for this variable is @code{"~/.calc.el"}.
34606@end defvar
34607
34608@defvar calc-gnuplot-name
34609See @ref{Graphics}.@*
34610The variable @code{calc-gnuplot-name} should be the name of the
34611GNUPLOT program (a string). If you have GNUPLOT installed on your
34612system but Calc is unable to find it, you may need to set this
34613variable. You may also need to set some Lisp variables to show Calc how
34614to run GNUPLOT on your system, see @ref{Devices, ,Graphical Devices} .
34615The default value of @code{calc-gnuplot-name} is @code{"gnuplot"}.
34616@end defvar
34617
34618@defvar calc-gnuplot-plot-command
34619@defvarx calc-gnuplot-print-command
34620See @ref{Devices, ,Graphical Devices}.@*
34621The variables @code{calc-gnuplot-plot-command} and
34622@code{calc-gnuplot-print-command} represent system commands to
34623display and print the output of GNUPLOT, respectively. These may be
34624@code{nil} if no command is necessary, or strings which can include
34625@samp{%s} to signify the name of the file to be displayed or printed.
34626Or, these variables may contain Lisp expressions which are evaluated
34627to display or print the output.
34628
34629The default value of @code{calc-gnuplot-plot-command} is @code{nil},
34630and the default value of @code{calc-gnuplot-print-command} is
34631@code{"lp %s"}.
34632@end defvar
34633
34634@defvar calc-language-alist
34635See @ref{Basic Embedded Mode}.@*
34636The variable @code{calc-language-alist} controls the languages that
34637Calc will associate with major modes. When Calc embedded mode is
34638enabled, it will try to use the current major mode to
34639determine what language should be used. (This can be overridden using
34640Calc's mode changing commands, @xref{Mode Settings in Embedded Mode}.)
34641The variable @code{calc-language-alist} consists of a list of pairs of
34642the form @code{(@var{MAJOR-MODE} . @var{LANGUAGE})}; for example,
34643@code{(latex-mode . latex)} is one such pair. If Calc embedded is
34644activated in a buffer whose major mode is @var{MAJOR-MODE}, it will set itself
34645to use the language @var{LANGUAGE}.
34646
34647The default value of @code{calc-language-alist} is
34648@example
34649 ((latex-mode . latex)
34650 (tex-mode . tex)
34651 (plain-tex-mode . tex)
34652 (context-mode . tex)
34653 (nroff-mode . eqn)
34654 (pascal-mode . pascal)
34655 (c-mode . c)
34656 (c++-mode . c)
34657 (fortran-mode . fortran)
34658 (f90-mode . fortran))
34659@end example
34660@end defvar
34661
34662@defvar calc-embedded-announce-formula
34663@defvarx calc-embedded-announce-formula-alist
34664See @ref{Customizing Embedded Mode}.@*
34665The variable @code{calc-embedded-announce-formula} helps determine
34666what formulas @kbd{C-x * a} will activate in a buffer. It is a
34667regular expression, and when activating embedded formulas with
34668@kbd{C-x * a}, it will tell Calc that what follows is a formula to be
34669activated. (Calc also uses other patterns to find formulas, such as
34670@samp{=>} and @samp{:=}.)
34671
34672The default pattern is @code{"%Embed\n\\(% .*\n\\)*"}, which checks
34673for @samp{%Embed} followed by any number of lines beginning with
34674@samp{%} and a space.
34675
34676The variable @code{calc-embedded-announce-formula-alist} is used to
34677set @code{calc-embedded-announce-formula} to different regular
34678expressions depending on the major mode of the editing buffer.
34679It consists of a list of pairs of the form @code{(@var{MAJOR-MODE} .
34680@var{REGEXP})}, and its default value is
34681@example
34682 ((c++-mode . "//Embed\n\\(// .*\n\\)*")
34683 (c-mode . "/\\*Embed\\*/\n\\(/\\* .*\\*/\n\\)*")
34684 (f90-mode . "!Embed\n\\(! .*\n\\)*")
34685 (fortran-mode . "C Embed\n\\(C .*\n\\)*")
34686 (html-helper-mode . "<!-- Embed -->\n\\(<!-- .* -->\n\\)*")
34687 (html-mode . "<!-- Embed -->\n\\(<!-- .* -->\n\\)*")
34688 (nroff-mode . "\\\\\"Embed\n\\(\\\\\" .*\n\\)*")
34689 (pascal-mode . "@{Embed@}\n\\(@{.*@}\n\\)*")
34690 (sgml-mode . "<!-- Embed -->\n\\(<!-- .* -->\n\\)*")
34691 (xml-mode . "<!-- Embed -->\n\\(<!-- .* -->\n\\)*")
34692 (texinfo-mode . "@@c Embed\n\\(@@c .*\n\\)*"))
34693@end example
34694Any major modes added to @code{calc-embedded-announce-formula-alist}
34695should also be added to @code{calc-embedded-open-close-plain-alist}
34696and @code{calc-embedded-open-close-mode-alist}.
34697@end defvar
34698
34699@defvar calc-embedded-open-formula
34700@defvarx calc-embedded-close-formula
34701@defvarx calc-embedded-open-close-formula-alist
34702See @ref{Customizing Embedded Mode}.@*
34703The variables @code{calc-embedded-open-formula} and
34704@code{calc-embedded-open-formula} control the region that Calc will
34705activate as a formula when Embedded mode is entered with @kbd{C-x * e}.
34706They are regular expressions;
34707Calc normally scans backward and forward in the buffer for the
34708nearest text matching these regular expressions to be the ``formula
34709delimiters''.
34710
34711The simplest delimiters are blank lines. Other delimiters that
34712Embedded mode understands by default are:
34713@enumerate
34714@item
34715The @TeX{} and La@TeX{} math delimiters @samp{$ $}, @samp{$$ $$},
34716@samp{\[ \]}, and @samp{\( \)};
34717@item
34718Lines beginning with @samp{\begin} and @samp{\end} (except matrix delimiters);
34719@item
34720Lines beginning with @samp{@@} (Texinfo delimiters).
34721@item
34722Lines beginning with @samp{.EQ} and @samp{.EN} (@dfn{eqn} delimiters);
34723@item
34724Lines containing a single @samp{%} or @samp{.\"} symbol and nothing else.
34725@end enumerate
34726
34727The variable @code{calc-embedded-open-close-formula-alist} is used to
34728set @code{calc-embedded-open-formula} and
34729@code{calc-embedded-close-formula} to different regular
34730expressions depending on the major mode of the editing buffer.
34731It consists of a list of lists of the form
34732@code{(@var{MAJOR-MODE} @var{OPEN-FORMULA-REGEXP}
34733@var{CLOSE-FORMULA-REGEXP})}, and its default value is
34734@code{nil}.
34735@end defvar
34736
34737@defvar calc-embedded-open-word
34738@defvarx calc-embedded-close-word
34739@defvarx calc-embedded-open-close-word-alist
34740See @ref{Customizing Embedded Mode}.@*
34741The variables @code{calc-embedded-open-word} and
34742@code{calc-embedded-close-word} control the region that Calc will
34743activate when Embedded mode is entered with @kbd{C-x * w}. They are
34744regular expressions.
34745
34746The default values of @code{calc-embedded-open-word} and
34747@code{calc-embedded-close-word} are @code{"^\\|[^-+0-9.eE]"} and
34748@code{"$\\|[^-+0-9.eE]"} respectively.
34749
34750The variable @code{calc-embedded-open-close-word-alist} is used to
34751set @code{calc-embedded-open-word} and
34752@code{calc-embedded-close-word} to different regular
34753expressions depending on the major mode of the editing buffer.
34754It consists of a list of lists of the form
34755@code{(@var{MAJOR-MODE} @var{OPEN-WORD-REGEXP}
34756@var{CLOSE-WORD-REGEXP})}, and its default value is
34757@code{nil}.
34758@end defvar
34759
34760@defvar calc-embedded-open-plain
34761@defvarx calc-embedded-close-plain
34762@defvarx calc-embedded-open-close-plain-alist
34763See @ref{Customizing Embedded Mode}.@*
34764The variables @code{calc-embedded-open-plain} and
34765@code{calc-embedded-open-plain} are used to delimit ``plain''
34766formulas. Note that these are actual strings, not regular
34767expressions, because Calc must be able to write these string into a
34768buffer as well as to recognize them.
34769
34770The default string for @code{calc-embedded-open-plain} is
34771@code{"%%% "}, note the trailing space. The default string for
34772@code{calc-embedded-close-plain} is @code{" %%%\n"}, without
34773the trailing newline here, the first line of a Big mode formula
34774that followed might be shifted over with respect to the other lines.
34775
34776The variable @code{calc-embedded-open-close-plain-alist} is used to
34777set @code{calc-embedded-open-plain} and
34778@code{calc-embedded-close-plain} to different strings
34779depending on the major mode of the editing buffer.
34780It consists of a list of lists of the form
34781@code{(@var{MAJOR-MODE} @var{OPEN-PLAIN-STRING}
34782@var{CLOSE-PLAIN-STRING})}, and its default value is
34783@example
34784 ((c++-mode "// %% " " %%\n")
34785 (c-mode "/* %% " " %% */\n")
34786 (f90-mode "! %% " " %%\n")
34787 (fortran-mode "C %% " " %%\n")
34788 (html-helper-mode "<!-- %% " " %% -->\n")
34789 (html-mode "<!-- %% " " %% -->\n")
34790 (nroff-mode "\\\" %% " " %%\n")
34791 (pascal-mode "@{%% " " %%@}\n")
34792 (sgml-mode "<!-- %% " " %% -->\n")
34793 (xml-mode "<!-- %% " " %% -->\n")
34794 (texinfo-mode "@@c %% " " %%\n"))
34795@end example
34796Any major modes added to @code{calc-embedded-open-close-plain-alist}
34797should also be added to @code{calc-embedded-announce-formula-alist}
34798and @code{calc-embedded-open-close-mode-alist}.
34799@end defvar
34800
34801@defvar calc-embedded-open-new-formula
34802@defvarx calc-embedded-close-new-formula
34803@defvarx calc-embedded-open-close-new-formula-alist
34804See @ref{Customizing Embedded Mode}.@*
34805The variables @code{calc-embedded-open-new-formula} and
34806@code{calc-embedded-close-new-formula} are strings which are
34807inserted before and after a new formula when you type @kbd{C-x * f}.
34808
34809The default value of @code{calc-embedded-open-new-formula} is
34810@code{"\n\n"}. If this string begins with a newline character and the
34811@kbd{C-x * f} is typed at the beginning of a line, @kbd{C-x * f} will skip
34812this first newline to avoid introducing unnecessary blank lines in the
34813file. The default value of @code{calc-embedded-close-new-formula} is
34814also @code{"\n\n"}. The final newline is omitted by @w{@kbd{C-x * f}}
34815if typed at the end of a line. (It follows that if @kbd{C-x * f} is
34816typed on a blank line, both a leading opening newline and a trailing
34817closing newline are omitted.)
34818
34819The variable @code{calc-embedded-open-close-new-formula-alist} is used to
34820set @code{calc-embedded-open-new-formula} and
34821@code{calc-embedded-close-new-formula} to different strings
34822depending on the major mode of the editing buffer.
34823It consists of a list of lists of the form
34824@code{(@var{MAJOR-MODE} @var{OPEN-NEW-FORMULA-STRING}
34825@var{CLOSE-NEW-FORMULA-STRING})}, and its default value is
34826@code{nil}.
34827@end defvar
34828
34829@defvar calc-embedded-open-mode
34830@defvarx calc-embedded-close-mode
34831@defvarx calc-embedded-open-close-mode-alist
34832See @ref{Customizing Embedded Mode}.@*
34833The variables @code{calc-embedded-open-mode} and
34834@code{calc-embedded-close-mode} are strings which Calc will place before
34835and after any mode annotations that it inserts. Calc never scans for
34836these strings; Calc always looks for the annotation itself, so it is not
34837necessary to add them to user-written annotations.
34838
34839The default value of @code{calc-embedded-open-mode} is @code{"% "}
34840and the default value of @code{calc-embedded-close-mode} is
34841@code{"\n"}.
34842If you change the value of @code{calc-embedded-close-mode}, it is a good
34843idea still to end with a newline so that mode annotations will appear on
34844lines by themselves.
34845
34846The variable @code{calc-embedded-open-close-mode-alist} is used to
34847set @code{calc-embedded-open-mode} and
34848@code{calc-embedded-close-mode} to different strings
34849expressions depending on the major mode of the editing buffer.
34850It consists of a list of lists of the form
34851@code{(@var{MAJOR-MODE} @var{OPEN-MODE-STRING}
34852@var{CLOSE-MODE-STRING})}, and its default value is
34853@example
34854 ((c++-mode "// " "\n")
34855 (c-mode "/* " " */\n")
34856 (f90-mode "! " "\n")
34857 (fortran-mode "C " "\n")
34858 (html-helper-mode "<!-- " " -->\n")
34859 (html-mode "<!-- " " -->\n")
34860 (nroff-mode "\\\" " "\n")
34861 (pascal-mode "@{ " " @}\n")
34862 (sgml-mode "<!-- " " -->\n")
34863 (xml-mode "<!-- " " -->\n")
34864 (texinfo-mode "@@c " "\n"))
34865@end example
34866Any major modes added to @code{calc-embedded-open-close-mode-alist}
34867should also be added to @code{calc-embedded-announce-formula-alist}
34868and @code{calc-embedded-open-close-plain-alist}.
34869@end defvar
34870
34871@defvar calc-multiplication-has-precedence
34872The variable @code{calc-multiplication-has-precedence} determines
45b778a6
JB
34873whether multiplication has precedence over division in algebraic
34874formulas in normal language modes. If
34875@code{calc-multiplication-has-precedence} is non-@code{nil}, then
34876multiplication has precedence (and, for certain obscure reasons, is
34877right associative), and so for example @samp{a/b*c} will be interpreted
34878as @samp{a/(b*c)}. If @code{calc-multiplication-has-precedence} is
34879@code{nil}, then multiplication has the same precedence as division
34880(and, like division, is left associative), and so for example
4009494e
GM
34881@samp{a/b*c} will be interpreted as @samp{(a/b)*c}. The default value
34882of @code{calc-multiplication-has-precedence} is @code{t}.
34883@end defvar
34884
34885@node Reporting Bugs, Summary, Customizing Calc, Top
34886@appendix Reporting Bugs
34887
34888@noindent
34889If you find a bug in Calc, send e-mail to Jay Belanger,
34890
34891@example
34892jay.p.belanger@@gmail.com
34893@end example
34894
34895@noindent
34896There is an automatic command @kbd{M-x report-calc-bug} which helps
34897you to report bugs. This command prompts you for a brief subject
34898line, then leaves you in a mail editing buffer. Type @kbd{C-c C-c} to
34899send your mail. Make sure your subject line indicates that you are
34900reporting a Calc bug; this command sends mail to the maintainer's
34901regular mailbox.
34902
34903If you have suggestions for additional features for Calc, please send
34904them. Some have dared to suggest that Calc is already top-heavy with
34905features; this obviously cannot be the case, so if you have ideas, send
34906them right in.
34907
34908At the front of the source file, @file{calc.el}, is a list of ideas for
34909future work. If any enthusiastic souls wish to take it upon themselves
34910to work on these, please send a message (using @kbd{M-x report-calc-bug})
34911so any efforts can be coordinated.
34912
34913The latest version of Calc is available from Savannah, in the Emacs
34914CVS tree. See @uref{http://savannah.gnu.org/projects/emacs}.
34915
34916@c [summary]
34917@node Summary, Key Index, Reporting Bugs, Top
34918@appendix Calc Summary
34919
34920@noindent
34921This section includes a complete list of Calc 2.1 keystroke commands.
34922Each line lists the stack entries used by the command (top-of-stack
34923last), the keystrokes themselves, the prompts asked by the command,
34924and the result of the command (also with top-of-stack last).
34925The result is expressed using the equivalent algebraic function.
34926Commands which put no results on the stack show the full @kbd{M-x}
34927command name in that position. Numbers preceding the result or
34928command name refer to notes at the end.
34929
34930Algebraic functions and @kbd{M-x} commands that don't have corresponding
34931keystrokes are not listed in this summary.
34932@xref{Command Index}. @xref{Function Index}.
34933
34934@iftex
34935@begingroup
34936@tex
34937\vskip-2\baselineskip \null
34938\gdef\sumrow#1{\sumrowx#1\relax}%
34939\gdef\sumrowx#1\:#2\:#3\:#4\:#5\:#6\relax{%
34940\leavevmode%
34941{\smallfonts
34942\hbox to5em{\sl\hss#1}%
34943\hbox to5em{\tt#2\hss}%
34944\hbox to4em{\sl#3\hss}%
34945\hbox to5em{\rm\hss#4}%
34946\thinspace%
34947{\tt#5}%
34948{\sl#6}%
34949}}%
34950\gdef\sumlpar{{\rm(}}%
34951\gdef\sumrpar{{\rm)}}%
34952\gdef\sumcomma{{\rm,\thinspace}}%
34953\gdef\sumexcl{{\rm!}}%
34954\gdef\sumbreak{\vskip-2.5\baselineskip\goodbreak}%
34955\gdef\minus#1{{\tt-}}%
34956@end tex
34957@let@:=@sumsep
34958@let@r=@sumrow
34959@catcode`@(=@active @let(=@sumlpar
34960@catcode`@)=@active @let)=@sumrpar
34961@catcode`@,=@active @let,=@sumcomma
34962@catcode`@!=@active @let!=@sumexcl
34963@end iftex
34964@format
34965@iftex
34966@advance@baselineskip-2.5pt
34967@let@c@sumbreak
34968@end iftex
34969@r{ @: C-x * a @: @: 33 @:calc-embedded-activate@:}
34970@r{ @: C-x * b @: @: @:calc-big-or-small@:}
34971@r{ @: C-x * c @: @: @:calc@:}
34972@r{ @: C-x * d @: @: @:calc-embedded-duplicate@:}
34973@r{ @: C-x * e @: @: 34 @:calc-embedded@:}
34974@r{ @: C-x * f @:formula @: @:calc-embedded-new-formula@:}
34975@r{ @: C-x * g @: @: 35 @:calc-grab-region@:}
34976@r{ @: C-x * i @: @: @:calc-info@:}
34977@r{ @: C-x * j @: @: @:calc-embedded-select@:}
34978@r{ @: C-x * k @: @: @:calc-keypad@:}
34979@r{ @: C-x * l @: @: @:calc-load-everything@:}
34980@r{ @: C-x * m @: @: @:read-kbd-macro@:}
34981@r{ @: C-x * n @: @: 4 @:calc-embedded-next@:}
34982@r{ @: C-x * o @: @: @:calc-other-window@:}
34983@r{ @: C-x * p @: @: 4 @:calc-embedded-previous@:}
34984@r{ @: C-x * q @:formula @: @:quick-calc@:}
34985@r{ @: C-x * r @: @: 36 @:calc-grab-rectangle@:}
34986@r{ @: C-x * s @: @: @:calc-info-summary@:}
34987@r{ @: C-x * t @: @: @:calc-tutorial@:}
34988@r{ @: C-x * u @: @: @:calc-embedded-update-formula@:}
34989@r{ @: C-x * w @: @: @:calc-embedded-word@:}
34990@r{ @: C-x * x @: @: @:calc-quit@:}
34991@r{ @: C-x * y @: @:1,28,49 @:calc-copy-to-buffer@:}
34992@r{ @: C-x * z @: @: @:calc-user-invocation@:}
34993@r{ @: C-x * : @: @: 36 @:calc-grab-sum-down@:}
34994@r{ @: C-x * _ @: @: 36 @:calc-grab-sum-across@:}
34995@r{ @: C-x * ` @:editing @: 30 @:calc-embedded-edit@:}
34996@r{ @: C-x * 0 @:(zero) @: @:calc-reset@:}
34997
34998@c
34999@r{ @: 0-9 @:number @: @:@:number}
35000@r{ @: . @:number @: @:@:0.number}
35001@r{ @: _ @:number @: @:-@:number}
35002@r{ @: e @:number @: @:@:1e number}
35003@r{ @: # @:number @: @:@:current-radix@tfn{#}number}
35004@r{ @: P @:(in number) @: @:+/-@:}
35005@r{ @: M @:(in number) @: @:mod@:}
35006@r{ @: @@ ' " @: (in number)@: @:@:HMS form}
35007@r{ @: h m s @: (in number)@: @:@:HMS form}
35008
35009@c
35010@r{ @: ' @:formula @: 37,46 @:@:formula}
35011@r{ @: $ @:formula @: 37,46 @:$@:formula}
35012@r{ @: " @:string @: 37,46 @:@:string}
35013
35014@c
35015@r{ a b@: + @: @: 2 @:add@:(a,b) a+b}
35016@r{ a b@: - @: @: 2 @:sub@:(a,b) a@minus{}b}
35017@r{ a b@: * @: @: 2 @:mul@:(a,b) a b, a*b}
35018@r{ a b@: / @: @: 2 @:div@:(a,b) a/b}
35019@r{ a b@: ^ @: @: 2 @:pow@:(a,b) a^b}
35020@r{ a b@: I ^ @: @: 2 @:nroot@:(a,b) a^(1/b)}
35021@r{ a b@: % @: @: 2 @:mod@:(a,b) a%b}
35022@r{ a b@: \ @: @: 2 @:idiv@:(a,b) a\b}
35023@r{ a b@: : @: @: 2 @:fdiv@:(a,b)}
35024@r{ a b@: | @: @: 2 @:vconcat@:(a,b) a|b}
35025@r{ a b@: I | @: @: @:vconcat@:(b,a) b|a}
35026@r{ a b@: H | @: @: 2 @:append@:(a,b)}
35027@r{ a b@: I H | @: @: @:append@:(b,a)}
35028@r{ a@: & @: @: 1 @:inv@:(a) 1/a}
35029@r{ a@: ! @: @: 1 @:fact@:(a) a!}
35030@r{ a@: = @: @: 1 @:evalv@:(a)}
35031@r{ a@: M-% @: @: @:percent@:(a) a%}
35032
35033@c
35034@r{ ... a@: @key{RET} @: @: 1 @:@:... a a}
35035@r{ ... a@: @key{SPC} @: @: 1 @:@:... a a}
35036@r{... a b@: @key{TAB} @: @: 3 @:@:... b a}
35037@r{. a b c@: M-@key{TAB} @: @: 3 @:@:... b c a}
35038@r{... a b@: @key{LFD} @: @: 1 @:@:... a b a}
35039@r{ ... a@: @key{DEL} @: @: 1 @:@:...}
35040@r{... a b@: M-@key{DEL} @: @: 1 @:@:... b}
35041@r{ @: M-@key{RET} @: @: 4 @:calc-last-args@:}
35042@r{ a@: ` @:editing @: 1,30 @:calc-edit@:}
35043
35044@c
35045@r{ ... a@: C-d @: @: 1 @:@:...}
35046@r{ @: C-k @: @: 27 @:calc-kill@:}
35047@r{ @: C-w @: @: 27 @:calc-kill-region@:}
35048@r{ @: C-y @: @: @:calc-yank@:}
35049@r{ @: C-_ @: @: 4 @:calc-undo@:}
35050@r{ @: M-k @: @: 27 @:calc-copy-as-kill@:}
35051@r{ @: M-w @: @: 27 @:calc-copy-region-as-kill@:}
35052
35053@c
35054@r{ @: [ @: @: @:@:[...}
35055@r{[.. a b@: ] @: @: @:@:[a,b]}
35056@r{ @: ( @: @: @:@:(...}
35057@r{(.. a b@: ) @: @: @:@:(a,b)}
35058@r{ @: , @: @: @:@:vector or rect complex}
35059@r{ @: ; @: @: @:@:matrix or polar complex}
35060@r{ @: .. @: @: @:@:interval}
35061
35062@c
35063@r{ @: ~ @: @: @:calc-num-prefix@:}
35064@r{ @: < @: @: 4 @:calc-scroll-left@:}
35065@r{ @: > @: @: 4 @:calc-scroll-right@:}
35066@r{ @: @{ @: @: 4 @:calc-scroll-down@:}
35067@r{ @: @} @: @: 4 @:calc-scroll-up@:}
35068@r{ @: ? @: @: @:calc-help@:}
35069
35070@c
35071@r{ a@: n @: @: 1 @:neg@:(a) @minus{}a}
35072@r{ @: o @: @: 4 @:calc-realign@:}
35073@r{ @: p @:precision @: 31 @:calc-precision@:}
35074@r{ @: q @: @: @:calc-quit@:}
35075@r{ @: w @: @: @:calc-why@:}
35076@r{ @: x @:command @: @:M-x calc-@:command}
35077@r{ a@: y @: @:1,28,49 @:calc-copy-to-buffer@:}
35078
35079@c
35080@r{ a@: A @: @: 1 @:abs@:(a)}
35081@r{ a b@: B @: @: 2 @:log@:(a,b)}
35082@r{ a b@: I B @: @: 2 @:alog@:(a,b) b^a}
35083@r{ a@: C @: @: 1 @:cos@:(a)}
35084@r{ a@: I C @: @: 1 @:arccos@:(a)}
35085@r{ a@: H C @: @: 1 @:cosh@:(a)}
35086@r{ a@: I H C @: @: 1 @:arccosh@:(a)}
35087@r{ @: D @: @: 4 @:calc-redo@:}
35088@r{ a@: E @: @: 1 @:exp@:(a)}
35089@r{ a@: H E @: @: 1 @:exp10@:(a) 10.^a}
35090@r{ a@: F @: @: 1,11 @:floor@:(a,d)}
35091@r{ a@: I F @: @: 1,11 @:ceil@:(a,d)}
35092@r{ a@: H F @: @: 1,11 @:ffloor@:(a,d)}
35093@r{ a@: I H F @: @: 1,11 @:fceil@:(a,d)}
35094@r{ a@: G @: @: 1 @:arg@:(a)}
35095@r{ @: H @:command @: 32 @:@:Hyperbolic}
35096@r{ @: I @:command @: 32 @:@:Inverse}
35097@r{ a@: J @: @: 1 @:conj@:(a)}
35098@r{ @: K @:command @: 32 @:@:Keep-args}
35099@r{ a@: L @: @: 1 @:ln@:(a)}
35100@r{ a@: H L @: @: 1 @:log10@:(a)}
35101@r{ @: M @: @: @:calc-more-recursion-depth@:}
35102@r{ @: I M @: @: @:calc-less-recursion-depth@:}
35103@r{ a@: N @: @: 5 @:evalvn@:(a)}
35104@r{ @: P @: @: @:@:pi}
35105@r{ @: I P @: @: @:@:gamma}
35106@r{ @: H P @: @: @:@:e}
35107@r{ @: I H P @: @: @:@:phi}
35108@r{ a@: Q @: @: 1 @:sqrt@:(a)}
35109@r{ a@: I Q @: @: 1 @:sqr@:(a) a^2}
35110@r{ a@: R @: @: 1,11 @:round@:(a,d)}
35111@r{ a@: I R @: @: 1,11 @:trunc@:(a,d)}
35112@r{ a@: H R @: @: 1,11 @:fround@:(a,d)}
35113@r{ a@: I H R @: @: 1,11 @:ftrunc@:(a,d)}
35114@r{ a@: S @: @: 1 @:sin@:(a)}
35115@r{ a@: I S @: @: 1 @:arcsin@:(a)}
35116@r{ a@: H S @: @: 1 @:sinh@:(a)}
35117@r{ a@: I H S @: @: 1 @:arcsinh@:(a)}
35118@r{ a@: T @: @: 1 @:tan@:(a)}
35119@r{ a@: I T @: @: 1 @:arctan@:(a)}
35120@r{ a@: H T @: @: 1 @:tanh@:(a)}
35121@r{ a@: I H T @: @: 1 @:arctanh@:(a)}
35122@r{ @: U @: @: 4 @:calc-undo@:}
35123@r{ @: X @: @: 4 @:calc-call-last-kbd-macro@:}
35124
35125@c
35126@r{ a b@: a = @: @: 2 @:eq@:(a,b) a=b}
35127@r{ a b@: a # @: @: 2 @:neq@:(a,b) a!=b}
35128@r{ a b@: a < @: @: 2 @:lt@:(a,b) a<b}
35129@r{ a b@: a > @: @: 2 @:gt@:(a,b) a>b}
35130@r{ a b@: a [ @: @: 2 @:leq@:(a,b) a<=b}
35131@r{ a b@: a ] @: @: 2 @:geq@:(a,b) a>=b}
35132@r{ a b@: a @{ @: @: 2 @:in@:(a,b)}
35133@r{ a b@: a & @: @: 2,45 @:land@:(a,b) a&&b}
35134@r{ a b@: a | @: @: 2,45 @:lor@:(a,b) a||b}
35135@r{ a@: a ! @: @: 1,45 @:lnot@:(a) !a}
35136@r{ a b c@: a : @: @: 45 @:if@:(a,b,c) a?b:c}
35137@r{ a@: a . @: @: 1 @:rmeq@:(a)}
35138@r{ a@: a " @: @: 7,8 @:calc-expand-formula@:}
35139
35140@c
35141@r{ a@: a + @:i, l, h @: 6,38 @:sum@:(a,i,l,h)}
35142@r{ a@: a - @:i, l, h @: 6,38 @:asum@:(a,i,l,h)}
35143@r{ a@: a * @:i, l, h @: 6,38 @:prod@:(a,i,l,h)}
35144@r{ a b@: a _ @: @: 2 @:subscr@:(a,b) a_b}
35145
35146@c
35147@r{ a b@: a \ @: @: 2 @:pdiv@:(a,b)}
35148@r{ a b@: a % @: @: 2 @:prem@:(a,b)}
35149@r{ a b@: a / @: @: 2 @:pdivrem@:(a,b) [q,r]}
35150@r{ a b@: H a / @: @: 2 @:pdivide@:(a,b) q+r/b}
35151
35152@c
35153@r{ a@: a a @: @: 1 @:apart@:(a)}
35154@r{ a@: a b @:old, new @: 38 @:subst@:(a,old,new)}
35155@r{ a@: a c @:v @: 38 @:collect@:(a,v)}
35156@r{ a@: a d @:v @: 4,38 @:deriv@:(a,v)}
35157@r{ a@: H a d @:v @: 4,38 @:tderiv@:(a,v)}
35158@r{ a@: a e @: @: @:esimplify@:(a)}
35159@r{ a@: a f @: @: 1 @:factor@:(a)}
35160@r{ a@: H a f @: @: 1 @:factors@:(a)}
35161@r{ a b@: a g @: @: 2 @:pgcd@:(a,b)}
35162@r{ a@: a i @:v @: 38 @:integ@:(a,v)}
35163@r{ a@: a m @:pats @: 38 @:match@:(a,pats)}
35164@r{ a@: I a m @:pats @: 38 @:matchnot@:(a,pats)}
35165@r{ data x@: a p @: @: 28 @:polint@:(data,x)}
35166@r{ data x@: H a p @: @: 28 @:ratint@:(data,x)}
35167@r{ a@: a n @: @: 1 @:nrat@:(a)}
35168@r{ a@: a r @:rules @:4,8,38 @:rewrite@:(a,rules,n)}
35169@r{ a@: a s @: @: @:simplify@:(a)}
35170@r{ a@: a t @:v, n @: 31,39 @:taylor@:(a,v,n)}
35171@r{ a@: a v @: @: 7,8 @:calc-alg-evaluate@:}
35172@r{ a@: a x @: @: 4,8 @:expand@:(a)}
35173
35174@c
35175@r{ data@: a F @:model, vars @: 48 @:fit@:(m,iv,pv,data)}
35176@r{ data@: I a F @:model, vars @: 48 @:xfit@:(m,iv,pv,data)}
35177@r{ data@: H a F @:model, vars @: 48 @:efit@:(m,iv,pv,data)}
35178@r{ a@: a I @:v, l, h @: 38 @:ninteg@:(a,v,l,h)}
35179@r{ a b@: a M @:op @: 22 @:mapeq@:(op,a,b)}
35180@r{ a b@: I a M @:op @: 22 @:mapeqr@:(op,a,b)}
35181@r{ a b@: H a M @:op @: 22 @:mapeqp@:(op,a,b)}
35182@r{ a g@: a N @:v @: 38 @:minimize@:(a,v,g)}
35183@r{ a g@: H a N @:v @: 38 @:wminimize@:(a,v,g)}
35184@r{ a@: a P @:v @: 38 @:roots@:(a,v)}
35185@r{ a g@: a R @:v @: 38 @:root@:(a,v,g)}
35186@r{ a g@: H a R @:v @: 38 @:wroot@:(a,v,g)}
35187@r{ a@: a S @:v @: 38 @:solve@:(a,v)}
35188@r{ a@: I a S @:v @: 38 @:finv@:(a,v)}
35189@r{ a@: H a S @:v @: 38 @:fsolve@:(a,v)}
35190@r{ a@: I H a S @:v @: 38 @:ffinv@:(a,v)}
35191@r{ a@: a T @:i, l, h @: 6,38 @:table@:(a,i,l,h)}
35192@r{ a g@: a X @:v @: 38 @:maximize@:(a,v,g)}
35193@r{ a g@: H a X @:v @: 38 @:wmaximize@:(a,v,g)}
35194
35195@c
35196@r{ a b@: b a @: @: 9 @:and@:(a,b,w)}
35197@r{ a@: b c @: @: 9 @:clip@:(a,w)}
35198@r{ a b@: b d @: @: 9 @:diff@:(a,b,w)}
35199@r{ a@: b l @: @: 10 @:lsh@:(a,n,w)}
35200@r{ a n@: H b l @: @: 9 @:lsh@:(a,n,w)}
35201@r{ a@: b n @: @: 9 @:not@:(a,w)}
35202@r{ a b@: b o @: @: 9 @:or@:(a,b,w)}
35203@r{ v@: b p @: @: 1 @:vpack@:(v)}
35204@r{ a@: b r @: @: 10 @:rsh@:(a,n,w)}
35205@r{ a n@: H b r @: @: 9 @:rsh@:(a,n,w)}
35206@r{ a@: b t @: @: 10 @:rot@:(a,n,w)}
35207@r{ a n@: H b t @: @: 9 @:rot@:(a,n,w)}
35208@r{ a@: b u @: @: 1 @:vunpack@:(a)}
35209@r{ @: b w @:w @: 9,50 @:calc-word-size@:}
35210@r{ a b@: b x @: @: 9 @:xor@:(a,b,w)}
35211
35212@c
35213@r{c s l p@: b D @: @: @:ddb@:(c,s,l,p)}
35214@r{ r n p@: b F @: @: @:fv@:(r,n,p)}
35215@r{ r n p@: I b F @: @: @:fvb@:(r,n,p)}
35216@r{ r n p@: H b F @: @: @:fvl@:(r,n,p)}
35217@r{ v@: b I @: @: 19 @:irr@:(v)}
35218@r{ v@: I b I @: @: 19 @:irrb@:(v)}
35219@r{ a@: b L @: @: 10 @:ash@:(a,n,w)}
35220@r{ a n@: H b L @: @: 9 @:ash@:(a,n,w)}
35221@r{ r n a@: b M @: @: @:pmt@:(r,n,a)}
35222@r{ r n a@: I b M @: @: @:pmtb@:(r,n,a)}
35223@r{ r n a@: H b M @: @: @:pmtl@:(r,n,a)}
35224@r{ r v@: b N @: @: 19 @:npv@:(r,v)}
35225@r{ r v@: I b N @: @: 19 @:npvb@:(r,v)}
35226@r{ r n p@: b P @: @: @:pv@:(r,n,p)}
35227@r{ r n p@: I b P @: @: @:pvb@:(r,n,p)}
35228@r{ r n p@: H b P @: @: @:pvl@:(r,n,p)}
35229@r{ a@: b R @: @: 10 @:rash@:(a,n,w)}
35230@r{ a n@: H b R @: @: 9 @:rash@:(a,n,w)}
35231@r{ c s l@: b S @: @: @:sln@:(c,s,l)}
35232@r{ n p a@: b T @: @: @:rate@:(n,p,a)}
35233@r{ n p a@: I b T @: @: @:rateb@:(n,p,a)}
35234@r{ n p a@: H b T @: @: @:ratel@:(n,p,a)}
35235@r{c s l p@: b Y @: @: @:syd@:(c,s,l,p)}
35236
35237@r{ r p a@: b # @: @: @:nper@:(r,p,a)}
35238@r{ r p a@: I b # @: @: @:nperb@:(r,p,a)}
35239@r{ r p a@: H b # @: @: @:nperl@:(r,p,a)}
35240@r{ a b@: b % @: @: @:relch@:(a,b)}
35241
35242@c
35243@r{ a@: c c @: @: 5 @:pclean@:(a,p)}
35244@r{ a@: c 0-9 @: @: @:pclean@:(a,p)}
35245@r{ a@: H c c @: @: 5 @:clean@:(a,p)}
35246@r{ a@: H c 0-9 @: @: @:clean@:(a,p)}
35247@r{ a@: c d @: @: 1 @:deg@:(a)}
35248@r{ a@: c f @: @: 1 @:pfloat@:(a)}
35249@r{ a@: H c f @: @: 1 @:float@:(a)}
35250@r{ a@: c h @: @: 1 @:hms@:(a)}
35251@r{ a@: c p @: @: @:polar@:(a)}
35252@r{ a@: I c p @: @: @:rect@:(a)}
35253@r{ a@: c r @: @: 1 @:rad@:(a)}
35254
35255@c
35256@r{ a@: c F @: @: 5 @:pfrac@:(a,p)}
35257@r{ a@: H c F @: @: 5 @:frac@:(a,p)}
35258
35259@c
35260@r{ a@: c % @: @: @:percent@:(a*100)}
35261
35262@c
35263@r{ @: d . @:char @: 50 @:calc-point-char@:}
35264@r{ @: d , @:char @: 50 @:calc-group-char@:}
35265@r{ @: d < @: @: 13,50 @:calc-left-justify@:}
35266@r{ @: d = @: @: 13,50 @:calc-center-justify@:}
35267@r{ @: d > @: @: 13,50 @:calc-right-justify@:}
35268@r{ @: d @{ @:label @: 50 @:calc-left-label@:}
35269@r{ @: d @} @:label @: 50 @:calc-right-label@:}
35270@r{ @: d [ @: @: 4 @:calc-truncate-up@:}
35271@r{ @: d ] @: @: 4 @:calc-truncate-down@:}
35272@r{ @: d " @: @: 12,50 @:calc-display-strings@:}
35273@r{ @: d @key{SPC} @: @: @:calc-refresh@:}
35274@r{ @: d @key{RET} @: @: 1 @:calc-refresh-top@:}
35275
35276@c
35277@r{ @: d 0 @: @: 50 @:calc-decimal-radix@:}
35278@r{ @: d 2 @: @: 50 @:calc-binary-radix@:}
35279@r{ @: d 6 @: @: 50 @:calc-hex-radix@:}
35280@r{ @: d 8 @: @: 50 @:calc-octal-radix@:}
35281
35282@c
35283@r{ @: d b @: @:12,13,50 @:calc-line-breaking@:}
35284@r{ @: d c @: @: 50 @:calc-complex-notation@:}
35285@r{ @: d d @:format @: 50 @:calc-date-notation@:}
35286@r{ @: d e @: @: 5,50 @:calc-eng-notation@:}
35287@r{ @: d f @:num @: 31,50 @:calc-fix-notation@:}
35288@r{ @: d g @: @:12,13,50 @:calc-group-digits@:}
35289@r{ @: d h @:format @: 50 @:calc-hms-notation@:}
35290@r{ @: d i @: @: 50 @:calc-i-notation@:}
35291@r{ @: d j @: @: 50 @:calc-j-notation@:}
35292@r{ @: d l @: @: 12,50 @:calc-line-numbering@:}
35293@r{ @: d n @: @: 5,50 @:calc-normal-notation@:}
35294@r{ @: d o @:format @: 50 @:calc-over-notation@:}
35295@r{ @: d p @: @: 12,50 @:calc-show-plain@:}
35296@r{ @: d r @:radix @: 31,50 @:calc-radix@:}
35297@r{ @: d s @: @: 5,50 @:calc-sci-notation@:}
35298@r{ @: d t @: @: 27 @:calc-truncate-stack@:}
35299@r{ @: d w @: @: 12,13 @:calc-auto-why@:}
35300@r{ @: d z @: @: 12,50 @:calc-leading-zeros@:}
35301
35302@c
35303@r{ @: d B @: @: 50 @:calc-big-language@:}
35304@r{ @: d C @: @: 50 @:calc-c-language@:}
35305@r{ @: d E @: @: 50 @:calc-eqn-language@:}
35306@r{ @: d F @: @: 50 @:calc-fortran-language@:}
35307@r{ @: d M @: @: 50 @:calc-mathematica-language@:}
35308@r{ @: d N @: @: 50 @:calc-normal-language@:}
35309@r{ @: d O @: @: 50 @:calc-flat-language@:}
35310@r{ @: d P @: @: 50 @:calc-pascal-language@:}
35311@r{ @: d T @: @: 50 @:calc-tex-language@:}
35312@r{ @: d L @: @: 50 @:calc-latex-language@:}
35313@r{ @: d U @: @: 50 @:calc-unformatted-language@:}
35314@r{ @: d W @: @: 50 @:calc-maple-language@:}
35315
35316@c
35317@r{ a@: f [ @: @: 4 @:decr@:(a,n)}
35318@r{ a@: f ] @: @: 4 @:incr@:(a,n)}
35319
35320@c
35321@r{ a b@: f b @: @: 2 @:beta@:(a,b)}
35322@r{ a@: f e @: @: 1 @:erf@:(a)}
35323@r{ a@: I f e @: @: 1 @:erfc@:(a)}
35324@r{ a@: f g @: @: 1 @:gamma@:(a)}
35325@r{ a b@: f h @: @: 2 @:hypot@:(a,b)}
35326@r{ a@: f i @: @: 1 @:im@:(a)}
35327@r{ n a@: f j @: @: 2 @:besJ@:(n,a)}
35328@r{ a b@: f n @: @: 2 @:min@:(a,b)}
35329@r{ a@: f r @: @: 1 @:re@:(a)}
35330@r{ a@: f s @: @: 1 @:sign@:(a)}
35331@r{ a b@: f x @: @: 2 @:max@:(a,b)}
35332@r{ n a@: f y @: @: 2 @:besY@:(n,a)}
35333
35334@c
35335@r{ a@: f A @: @: 1 @:abssqr@:(a)}
35336@r{ x a b@: f B @: @: @:betaI@:(x,a,b)}
35337@r{ x a b@: H f B @: @: @:betaB@:(x,a,b)}
35338@r{ a@: f E @: @: 1 @:expm1@:(a)}
35339@r{ a x@: f G @: @: 2 @:gammaP@:(a,x)}
35340@r{ a x@: I f G @: @: 2 @:gammaQ@:(a,x)}
35341@r{ a x@: H f G @: @: 2 @:gammag@:(a,x)}
35342@r{ a x@: I H f G @: @: 2 @:gammaG@:(a,x)}
35343@r{ a b@: f I @: @: 2 @:ilog@:(a,b)}
35344@r{ a b@: I f I @: @: 2 @:alog@:(a,b) b^a}
35345@r{ a@: f L @: @: 1 @:lnp1@:(a)}
35346@r{ a@: f M @: @: 1 @:mant@:(a)}
35347@r{ a@: f Q @: @: 1 @:isqrt@:(a)}
35348@r{ a@: I f Q @: @: 1 @:sqr@:(a) a^2}
35349@r{ a n@: f S @: @: 2 @:scf@:(a,n)}
35350@r{ y x@: f T @: @: @:arctan2@:(y,x)}
35351@r{ a@: f X @: @: 1 @:xpon@:(a)}
35352
35353@c
35354@r{ x y@: g a @: @: 28,40 @:calc-graph-add@:}
35355@r{ @: g b @: @: 12 @:calc-graph-border@:}
35356@r{ @: g c @: @: @:calc-graph-clear@:}
35357@r{ @: g d @: @: 41 @:calc-graph-delete@:}
35358@r{ x y@: g f @: @: 28,40 @:calc-graph-fast@:}
35359@r{ @: g g @: @: 12 @:calc-graph-grid@:}
35360@r{ @: g h @:title @: @:calc-graph-header@:}
35361@r{ @: g j @: @: 4 @:calc-graph-juggle@:}
35362@r{ @: g k @: @: 12 @:calc-graph-key@:}
35363@r{ @: g l @: @: 12 @:calc-graph-log-x@:}
35364@r{ @: g n @:name @: @:calc-graph-name@:}
35365@r{ @: g p @: @: 42 @:calc-graph-plot@:}
35366@r{ @: g q @: @: @:calc-graph-quit@:}
35367@r{ @: g r @:range @: @:calc-graph-range-x@:}
35368@r{ @: g s @: @: 12,13 @:calc-graph-line-style@:}
35369@r{ @: g t @:title @: @:calc-graph-title-x@:}
35370@r{ @: g v @: @: @:calc-graph-view-commands@:}
35371@r{ @: g x @:display @: @:calc-graph-display@:}
35372@r{ @: g z @: @: 12 @:calc-graph-zero-x@:}
35373
35374@c
35375@r{ x y z@: g A @: @: 28,40 @:calc-graph-add-3d@:}
35376@r{ @: g C @:command @: @:calc-graph-command@:}
35377@r{ @: g D @:device @: 43,44 @:calc-graph-device@:}
35378@r{ x y z@: g F @: @: 28,40 @:calc-graph-fast-3d@:}
35379@r{ @: g H @: @: 12 @:calc-graph-hide@:}
35380@r{ @: g K @: @: @:calc-graph-kill@:}
35381@r{ @: g L @: @: 12 @:calc-graph-log-y@:}
35382@r{ @: g N @:number @: 43,51 @:calc-graph-num-points@:}
35383@r{ @: g O @:filename @: 43,44 @:calc-graph-output@:}
35384@r{ @: g P @: @: 42 @:calc-graph-print@:}
35385@r{ @: g R @:range @: @:calc-graph-range-y@:}
35386@r{ @: g S @: @: 12,13 @:calc-graph-point-style@:}
35387@r{ @: g T @:title @: @:calc-graph-title-y@:}
35388@r{ @: g V @: @: @:calc-graph-view-trail@:}
35389@r{ @: g X @:format @: @:calc-graph-geometry@:}
35390@r{ @: g Z @: @: 12 @:calc-graph-zero-y@:}
35391
35392@c
35393@r{ @: g C-l @: @: 12 @:calc-graph-log-z@:}
35394@r{ @: g C-r @:range @: @:calc-graph-range-z@:}
35395@r{ @: g C-t @:title @: @:calc-graph-title-z@:}
35396
35397@c
35398@r{ @: h b @: @: @:calc-describe-bindings@:}
35399@r{ @: h c @:key @: @:calc-describe-key-briefly@:}
35400@r{ @: h f @:function @: @:calc-describe-function@:}
35401@r{ @: h h @: @: @:calc-full-help@:}
35402@r{ @: h i @: @: @:calc-info@:}
35403@r{ @: h k @:key @: @:calc-describe-key@:}
35404@r{ @: h n @: @: @:calc-view-news@:}
35405@r{ @: h s @: @: @:calc-info-summary@:}
35406@r{ @: h t @: @: @:calc-tutorial@:}
35407@r{ @: h v @:var @: @:calc-describe-variable@:}
35408
35409@c
35410@r{ @: j 1-9 @: @: @:calc-select-part@:}
35411@r{ @: j @key{RET} @: @: 27 @:calc-copy-selection@:}
35412@r{ @: j @key{DEL} @: @: 27 @:calc-del-selection@:}
35413@r{ @: j ' @:formula @: 27 @:calc-enter-selection@:}
35414@r{ @: j ` @:editing @: 27,30 @:calc-edit-selection@:}
35415@r{ @: j " @: @: 7,27 @:calc-sel-expand-formula@:}
35416
35417@c
35418@r{ @: j + @:formula @: 27 @:calc-sel-add-both-sides@:}
35419@r{ @: j - @:formula @: 27 @:calc-sel-sub-both-sides@:}
35420@r{ @: j * @:formula @: 27 @:calc-sel-mul-both-sides@:}
35421@r{ @: j / @:formula @: 27 @:calc-sel-div-both-sides@:}
35422@r{ @: j & @: @: 27 @:calc-sel-invert@:}
35423
35424@c
35425@r{ @: j a @: @: 27 @:calc-select-additional@:}
35426@r{ @: j b @: @: 12 @:calc-break-selections@:}
35427@r{ @: j c @: @: @:calc-clear-selections@:}
35428@r{ @: j d @: @: 12,50 @:calc-show-selections@:}
35429@r{ @: j e @: @: 12 @:calc-enable-selections@:}
35430@r{ @: j l @: @: 4,27 @:calc-select-less@:}
35431@r{ @: j m @: @: 4,27 @:calc-select-more@:}
35432@r{ @: j n @: @: 4 @:calc-select-next@:}
35433@r{ @: j o @: @: 4,27 @:calc-select-once@:}
35434@r{ @: j p @: @: 4 @:calc-select-previous@:}
35435@r{ @: j r @:rules @:4,8,27 @:calc-rewrite-selection@:}
35436@r{ @: j s @: @: 4,27 @:calc-select-here@:}
35437@r{ @: j u @: @: 27 @:calc-unselect@:}
35438@r{ @: j v @: @: 7,27 @:calc-sel-evaluate@:}
35439
35440@c
35441@r{ @: j C @: @: 27 @:calc-sel-commute@:}
35442@r{ @: j D @: @: 4,27 @:calc-sel-distribute@:}
35443@r{ @: j E @: @: 27 @:calc-sel-jump-equals@:}
35444@r{ @: j I @: @: 27 @:calc-sel-isolate@:}
35445@r{ @: H j I @: @: 27 @:calc-sel-isolate@: (full)}
35446@r{ @: j L @: @: 4,27 @:calc-commute-left@:}
35447@r{ @: j M @: @: 27 @:calc-sel-merge@:}
35448@r{ @: j N @: @: 27 @:calc-sel-negate@:}
35449@r{ @: j O @: @: 4,27 @:calc-select-once-maybe@:}
35450@r{ @: j R @: @: 4,27 @:calc-commute-right@:}
35451@r{ @: j S @: @: 4,27 @:calc-select-here-maybe@:}
35452@r{ @: j U @: @: 27 @:calc-sel-unpack@:}
35453
35454@c
35455@r{ @: k a @: @: @:calc-random-again@:}
35456@r{ n@: k b @: @: 1 @:bern@:(n)}
35457@r{ n x@: H k b @: @: 2 @:bern@:(n,x)}
35458@r{ n m@: k c @: @: 2 @:choose@:(n,m)}
35459@r{ n m@: H k c @: @: 2 @:perm@:(n,m)}
35460@r{ n@: k d @: @: 1 @:dfact@:(n) n!!}
35461@r{ n@: k e @: @: 1 @:euler@:(n)}
35462@r{ n x@: H k e @: @: 2 @:euler@:(n,x)}
35463@r{ n@: k f @: @: 4 @:prfac@:(n)}
35464@r{ n m@: k g @: @: 2 @:gcd@:(n,m)}
35465@r{ m n@: k h @: @: 14 @:shuffle@:(n,m)}
35466@r{ n m@: k l @: @: 2 @:lcm@:(n,m)}
35467@r{ n@: k m @: @: 1 @:moebius@:(n)}
35468@r{ n@: k n @: @: 4 @:nextprime@:(n)}
35469@r{ n@: I k n @: @: 4 @:prevprime@:(n)}
35470@r{ n@: k p @: @: 4,28 @:calc-prime-test@:}
35471@r{ m@: k r @: @: 14 @:random@:(m)}
35472@r{ n m@: k s @: @: 2 @:stir1@:(n,m)}
35473@r{ n m@: H k s @: @: 2 @:stir2@:(n,m)}
35474@r{ n@: k t @: @: 1 @:totient@:(n)}
35475
35476@c
35477@r{ n p x@: k B @: @: @:utpb@:(x,n,p)}
35478@r{ n p x@: I k B @: @: @:ltpb@:(x,n,p)}
35479@r{ v x@: k C @: @: @:utpc@:(x,v)}
35480@r{ v x@: I k C @: @: @:ltpc@:(x,v)}
35481@r{ n m@: k E @: @: @:egcd@:(n,m)}
35482@r{v1 v2 x@: k F @: @: @:utpf@:(x,v1,v2)}
35483@r{v1 v2 x@: I k F @: @: @:ltpf@:(x,v1,v2)}
35484@r{ m s x@: k N @: @: @:utpn@:(x,m,s)}
35485@r{ m s x@: I k N @: @: @:ltpn@:(x,m,s)}
35486@r{ m x@: k P @: @: @:utpp@:(x,m)}
35487@r{ m x@: I k P @: @: @:ltpp@:(x,m)}
35488@r{ v x@: k T @: @: @:utpt@:(x,v)}
35489@r{ v x@: I k T @: @: @:ltpt@:(x,v)}
35490
35491@c
35492@r{ @: m a @: @: 12,13 @:calc-algebraic-mode@:}
35493@r{ @: m d @: @: @:calc-degrees-mode@:}
35494@r{ @: m e @: @: @:calc-embedded-preserve-modes@:}
35495@r{ @: m f @: @: 12 @:calc-frac-mode@:}
35496@r{ @: m g @: @: 52 @:calc-get-modes@:}
35497@r{ @: m h @: @: @:calc-hms-mode@:}
35498@r{ @: m i @: @: 12,13 @:calc-infinite-mode@:}
35499@r{ @: m m @: @: @:calc-save-modes@:}
35500@r{ @: m p @: @: 12 @:calc-polar-mode@:}
35501@r{ @: m r @: @: @:calc-radians-mode@:}
35502@r{ @: m s @: @: 12 @:calc-symbolic-mode@:}
35503@r{ @: m t @: @: 12 @:calc-total-algebraic-mode@:}
35504@r{ @: m v @: @: 12,13 @:calc-matrix-mode@:}
35505@r{ @: m w @: @: 13 @:calc-working@:}
35506@r{ @: m x @: @: @:calc-always-load-extensions@:}
35507
35508@c
35509@r{ @: m A @: @: 12 @:calc-alg-simplify-mode@:}
35510@r{ @: m B @: @: 12 @:calc-bin-simplify-mode@:}
35511@r{ @: m C @: @: 12 @:calc-auto-recompute@:}
35512@r{ @: m D @: @: @:calc-default-simplify-mode@:}
35513@r{ @: m E @: @: 12 @:calc-ext-simplify-mode@:}
35514@r{ @: m F @:filename @: 13 @:calc-settings-file-name@:}
35515@r{ @: m N @: @: 12 @:calc-num-simplify-mode@:}
35516@r{ @: m O @: @: 12 @:calc-no-simplify-mode@:}
35517@r{ @: m R @: @: 12,13 @:calc-mode-record-mode@:}
35518@r{ @: m S @: @: 12 @:calc-shift-prefix@:}
35519@r{ @: m U @: @: 12 @:calc-units-simplify-mode@:}
35520
35521@c
35522@r{ @: s c @:var1, var2 @: 29 @:calc-copy-variable@:}
35523@r{ @: s d @:var, decl @: @:calc-declare-variable@:}
35524@r{ @: s e @:var, editing @: 29,30 @:calc-edit-variable@:}
35525@r{ @: s i @:buffer @: @:calc-insert-variables@:}
35526@r{ @: s k @:const, var @: 29 @:calc-copy-special-constant@:}
35527@r{ a b@: s l @:var @: 29 @:@:a (letting var=b)}
35528@r{ a ...@: s m @:op, var @: 22,29 @:calc-store-map@:}
35529@r{ @: s n @:var @: 29,47 @:calc-store-neg@: (v/-1)}
35530@r{ @: s p @:var @: 29 @:calc-permanent-variable@:}
35531@r{ @: s r @:var @: 29 @:@:v (recalled value)}
35532@r{ @: r 0-9 @: @: @:calc-recall-quick@:}
35533@r{ a@: s s @:var @: 28,29 @:calc-store@:}
35534@r{ a@: s 0-9 @: @: @:calc-store-quick@:}
35535@r{ a@: s t @:var @: 29 @:calc-store-into@:}
35536@r{ a@: t 0-9 @: @: @:calc-store-into-quick@:}
35537@r{ @: s u @:var @: 29 @:calc-unstore@:}
35538@r{ a@: s x @:var @: 29 @:calc-store-exchange@:}
35539
35540@c
35541@r{ @: s A @:editing @: 30 @:calc-edit-AlgSimpRules@:}
35542@r{ @: s D @:editing @: 30 @:calc-edit-Decls@:}
35543@r{ @: s E @:editing @: 30 @:calc-edit-EvalRules@:}
35544@r{ @: s F @:editing @: 30 @:calc-edit-FitRules@:}
35545@r{ @: s G @:editing @: 30 @:calc-edit-GenCount@:}
35546@r{ @: s H @:editing @: 30 @:calc-edit-Holidays@:}
35547@r{ @: s I @:editing @: 30 @:calc-edit-IntegLimit@:}
35548@r{ @: s L @:editing @: 30 @:calc-edit-LineStyles@:}
35549@r{ @: s P @:editing @: 30 @:calc-edit-PointStyles@:}
35550@r{ @: s R @:editing @: 30 @:calc-edit-PlotRejects@:}
35551@r{ @: s T @:editing @: 30 @:calc-edit-TimeZone@:}
35552@r{ @: s U @:editing @: 30 @:calc-edit-Units@:}
35553@r{ @: s X @:editing @: 30 @:calc-edit-ExtSimpRules@:}
35554
35555@c
35556@r{ a@: s + @:var @: 29,47 @:calc-store-plus@: (v+a)}
35557@r{ a@: s - @:var @: 29,47 @:calc-store-minus@: (v-a)}
35558@r{ a@: s * @:var @: 29,47 @:calc-store-times@: (v*a)}
35559@r{ a@: s / @:var @: 29,47 @:calc-store-div@: (v/a)}
35560@r{ a@: s ^ @:var @: 29,47 @:calc-store-power@: (v^a)}
35561@r{ a@: s | @:var @: 29,47 @:calc-store-concat@: (v|a)}
35562@r{ @: s & @:var @: 29,47 @:calc-store-inv@: (v^-1)}
35563@r{ @: s [ @:var @: 29,47 @:calc-store-decr@: (v-1)}
35564@r{ @: s ] @:var @: 29,47 @:calc-store-incr@: (v-(-1))}
35565@r{ a b@: s : @: @: 2 @:assign@:(a,b) a @tfn{:=} b}
35566@r{ a@: s = @: @: 1 @:evalto@:(a,b) a @tfn{=>}}
35567
35568@c
35569@r{ @: t [ @: @: 4 @:calc-trail-first@:}
35570@r{ @: t ] @: @: 4 @:calc-trail-last@:}
35571@r{ @: t < @: @: 4 @:calc-trail-scroll-left@:}
35572@r{ @: t > @: @: 4 @:calc-trail-scroll-right@:}
35573@r{ @: t . @: @: 12 @:calc-full-trail-vectors@:}
35574
35575@c
35576@r{ @: t b @: @: 4 @:calc-trail-backward@:}
35577@r{ @: t d @: @: 12,50 @:calc-trail-display@:}
35578@r{ @: t f @: @: 4 @:calc-trail-forward@:}
35579@r{ @: t h @: @: @:calc-trail-here@:}
35580@r{ @: t i @: @: @:calc-trail-in@:}
35581@r{ @: t k @: @: 4 @:calc-trail-kill@:}
35582@r{ @: t m @:string @: @:calc-trail-marker@:}
35583@r{ @: t n @: @: 4 @:calc-trail-next@:}
35584@r{ @: t o @: @: @:calc-trail-out@:}
35585@r{ @: t p @: @: 4 @:calc-trail-previous@:}
35586@r{ @: t r @:string @: @:calc-trail-isearch-backward@:}
35587@r{ @: t s @:string @: @:calc-trail-isearch-forward@:}
35588@r{ @: t y @: @: 4 @:calc-trail-yank@:}
35589
35590@c
35591@r{ d@: t C @:oz, nz @: @:tzconv@:(d,oz,nz)}
35592@r{d oz nz@: t C @:$ @: @:tzconv@:(d,oz,nz)}
35593@r{ d@: t D @: @: 15 @:date@:(d)}
35594@r{ d@: t I @: @: 4 @:incmonth@:(d,n)}
35595@r{ d@: t J @: @: 16 @:julian@:(d,z)}
35596@r{ d@: t M @: @: 17 @:newmonth@:(d,n)}
35597@r{ @: t N @: @: 16 @:now@:(z)}
35598@r{ d@: t P @:1 @: 31 @:year@:(d)}
35599@r{ d@: t P @:2 @: 31 @:month@:(d)}
35600@r{ d@: t P @:3 @: 31 @:day@:(d)}
35601@r{ d@: t P @:4 @: 31 @:hour@:(d)}
35602@r{ d@: t P @:5 @: 31 @:minute@:(d)}
35603@r{ d@: t P @:6 @: 31 @:second@:(d)}
35604@r{ d@: t P @:7 @: 31 @:weekday@:(d)}
35605@r{ d@: t P @:8 @: 31 @:yearday@:(d)}
35606@r{ d@: t P @:9 @: 31 @:time@:(d)}
35607@r{ d@: t U @: @: 16 @:unixtime@:(d,z)}
35608@r{ d@: t W @: @: 17 @:newweek@:(d,w)}
35609@r{ d@: t Y @: @: 17 @:newyear@:(d,n)}
35610
35611@c
35612@r{ a b@: t + @: @: 2 @:badd@:(a,b)}
35613@r{ a b@: t - @: @: 2 @:bsub@:(a,b)}
35614
35615@c
35616@r{ @: u a @: @: 12 @:calc-autorange-units@:}
35617@r{ a@: u b @: @: @:calc-base-units@:}
35618@r{ a@: u c @:units @: 18 @:calc-convert-units@:}
35619@r{ defn@: u d @:unit, descr @: @:calc-define-unit@:}
35620@r{ @: u e @: @: @:calc-explain-units@:}
35621@r{ @: u g @:unit @: @:calc-get-unit-definition@:}
35622@r{ @: u p @: @: @:calc-permanent-units@:}
35623@r{ a@: u r @: @: @:calc-remove-units@:}
35624@r{ a@: u s @: @: @:usimplify@:(a)}
35625@r{ a@: u t @:units @: 18 @:calc-convert-temperature@:}
35626@r{ @: u u @:unit @: @:calc-undefine-unit@:}
35627@r{ @: u v @: @: @:calc-enter-units-table@:}
35628@r{ a@: u x @: @: @:calc-extract-units@:}
35629@r{ a@: u 0-9 @: @: @:calc-quick-units@:}
35630
35631@c
35632@r{ v1 v2@: u C @: @: 20 @:vcov@:(v1,v2)}
35633@r{ v1 v2@: I u C @: @: 20 @:vpcov@:(v1,v2)}
35634@r{ v1 v2@: H u C @: @: 20 @:vcorr@:(v1,v2)}
35635@r{ v@: u G @: @: 19 @:vgmean@:(v)}
35636@r{ a b@: H u G @: @: 2 @:agmean@:(a,b)}
35637@r{ v@: u M @: @: 19 @:vmean@:(v)}
35638@r{ v@: I u M @: @: 19 @:vmeane@:(v)}
35639@r{ v@: H u M @: @: 19 @:vmedian@:(v)}
35640@r{ v@: I H u M @: @: 19 @:vhmean@:(v)}
35641@r{ v@: u N @: @: 19 @:vmin@:(v)}
35642@r{ v@: u S @: @: 19 @:vsdev@:(v)}
35643@r{ v@: I u S @: @: 19 @:vpsdev@:(v)}
35644@r{ v@: H u S @: @: 19 @:vvar@:(v)}
35645@r{ v@: I H u S @: @: 19 @:vpvar@:(v)}
35646@r{ @: u V @: @: @:calc-view-units-table@:}
35647@r{ v@: u X @: @: 19 @:vmax@:(v)}
35648
35649@c
35650@r{ v@: u + @: @: 19 @:vsum@:(v)}
35651@r{ v@: u * @: @: 19 @:vprod@:(v)}
35652@r{ v@: u # @: @: 19 @:vcount@:(v)}
35653
35654@c
35655@r{ @: V ( @: @: 50 @:calc-vector-parens@:}
35656@r{ @: V @{ @: @: 50 @:calc-vector-braces@:}
35657@r{ @: V [ @: @: 50 @:calc-vector-brackets@:}
35658@r{ @: V ] @:ROCP @: 50 @:calc-matrix-brackets@:}
35659@r{ @: V , @: @: 50 @:calc-vector-commas@:}
35660@r{ @: V < @: @: 50 @:calc-matrix-left-justify@:}
35661@r{ @: V = @: @: 50 @:calc-matrix-center-justify@:}
35662@r{ @: V > @: @: 50 @:calc-matrix-right-justify@:}
35663@r{ @: V / @: @: 12,50 @:calc-break-vectors@:}
35664@r{ @: V . @: @: 12,50 @:calc-full-vectors@:}
35665
35666@c
35667@r{ s t@: V ^ @: @: 2 @:vint@:(s,t)}
35668@r{ s t@: V - @: @: 2 @:vdiff@:(s,t)}
35669@r{ s@: V ~ @: @: 1 @:vcompl@:(s)}
35670@r{ s@: V # @: @: 1 @:vcard@:(s)}
35671@r{ s@: V : @: @: 1 @:vspan@:(s)}
35672@r{ s@: V + @: @: 1 @:rdup@:(s)}
35673
35674@c
35675@r{ m@: V & @: @: 1 @:inv@:(m) 1/m}
35676
35677@c
35678@r{ v@: v a @:n @: @:arrange@:(v,n)}
35679@r{ a@: v b @:n @: @:cvec@:(a,n)}
35680@r{ v@: v c @:n >0 @: 21,31 @:mcol@:(v,n)}
35681@r{ v@: v c @:n <0 @: 31 @:mrcol@:(v,-n)}
35682@r{ m@: v c @:0 @: 31 @:getdiag@:(m)}
35683@r{ v@: v d @: @: 25 @:diag@:(v,n)}
35684@r{ v m@: v e @: @: 2 @:vexp@:(v,m)}
35685@r{ v m f@: H v e @: @: 2 @:vexp@:(v,m,f)}
35686@r{ v a@: v f @: @: 26 @:find@:(v,a,n)}
35687@r{ v@: v h @: @: 1 @:head@:(v)}
35688@r{ v@: I v h @: @: 1 @:tail@:(v)}
35689@r{ v@: H v h @: @: 1 @:rhead@:(v)}
35690@r{ v@: I H v h @: @: 1 @:rtail@:(v)}
35691@r{ @: v i @:n @: 31 @:idn@:(1,n)}
35692@r{ @: v i @:0 @: 31 @:idn@:(1)}
35693@r{ h t@: v k @: @: 2 @:cons@:(h,t)}
35694@r{ h t@: H v k @: @: 2 @:rcons@:(h,t)}
35695@r{ v@: v l @: @: 1 @:vlen@:(v)}
35696@r{ v@: H v l @: @: 1 @:mdims@:(v)}
35697@r{ v m@: v m @: @: 2 @:vmask@:(v,m)}
35698@r{ v@: v n @: @: 1 @:rnorm@:(v)}
35699@r{ a b c@: v p @: @: 24 @:calc-pack@:}
35700@r{ v@: v r @:n >0 @: 21,31 @:mrow@:(v,n)}
35701@r{ v@: v r @:n <0 @: 31 @:mrrow@:(v,-n)}
35702@r{ m@: v r @:0 @: 31 @:getdiag@:(m)}
35703@r{ v i j@: v s @: @: @:subvec@:(v,i,j)}
35704@r{ v i j@: I v s @: @: @:rsubvec@:(v,i,j)}
35705@r{ m@: v t @: @: 1 @:trn@:(m)}
35706@r{ v@: v u @: @: 24 @:calc-unpack@:}
35707@r{ v@: v v @: @: 1 @:rev@:(v)}
35708@r{ @: v x @:n @: 31 @:index@:(n)}
35709@r{ n s i@: C-u v x @: @: @:index@:(n,s,i)}
35710
35711@c
35712@r{ v@: V A @:op @: 22 @:apply@:(op,v)}
35713@r{ v1 v2@: V C @: @: 2 @:cross@:(v1,v2)}
35714@r{ m@: V D @: @: 1 @:det@:(m)}
35715@r{ s@: V E @: @: 1 @:venum@:(s)}
35716@r{ s@: V F @: @: 1 @:vfloor@:(s)}
35717@r{ v@: V G @: @: @:grade@:(v)}
35718@r{ v@: I V G @: @: @:rgrade@:(v)}
35719@r{ v@: V H @:n @: 31 @:histogram@:(v,n)}
35720@r{ v w@: H V H @:n @: 31 @:histogram@:(v,w,n)}
35721@r{ v1 v2@: V I @:mop aop @: 22 @:inner@:(mop,aop,v1,v2)}
35722@r{ m@: V J @: @: 1 @:ctrn@:(m)}
35723@r{ m@: V L @: @: 1 @:lud@:(m)}
35724@r{ v@: V M @:op @: 22,23 @:map@:(op,v)}
35725@r{ v@: V N @: @: 1 @:cnorm@:(v)}
35726@r{ v1 v2@: V O @:op @: 22 @:outer@:(op,v1,v2)}
35727@r{ v@: V R @:op @: 22,23 @:reduce@:(op,v)}
35728@r{ v@: I V R @:op @: 22,23 @:rreduce@:(op,v)}
35729@r{ a n@: H V R @:op @: 22 @:nest@:(op,a,n)}
35730@r{ a@: I H V R @:op @: 22 @:fixp@:(op,a)}
35731@r{ v@: V S @: @: @:sort@:(v)}
35732@r{ v@: I V S @: @: @:rsort@:(v)}
35733@r{ m@: V T @: @: 1 @:tr@:(m)}
35734@r{ v@: V U @:op @: 22 @:accum@:(op,v)}
35735@r{ v@: I V U @:op @: 22 @:raccum@:(op,v)}
35736@r{ a n@: H V U @:op @: 22 @:anest@:(op,a,n)}
35737@r{ a@: I H V U @:op @: 22 @:afixp@:(op,a)}
35738@r{ s t@: V V @: @: 2 @:vunion@:(s,t)}
35739@r{ s t@: V X @: @: 2 @:vxor@:(s,t)}
35740
35741@c
35742@r{ @: Y @: @: @:@:user commands}
35743
35744@c
35745@r{ @: z @: @: @:@:user commands}
35746
35747@c
35748@r{ c@: Z [ @: @: 45 @:calc-kbd-if@:}
35749@r{ c@: Z | @: @: 45 @:calc-kbd-else-if@:}
35750@r{ @: Z : @: @: @:calc-kbd-else@:}
35751@r{ @: Z ] @: @: @:calc-kbd-end-if@:}
35752
35753@c
35754@r{ @: Z @{ @: @: 4 @:calc-kbd-loop@:}
35755@r{ c@: Z / @: @: 45 @:calc-kbd-break@:}
35756@r{ @: Z @} @: @: @:calc-kbd-end-loop@:}
35757@r{ n@: Z < @: @: @:calc-kbd-repeat@:}
35758@r{ @: Z > @: @: @:calc-kbd-end-repeat@:}
35759@r{ n m@: Z ( @: @: @:calc-kbd-for@:}
35760@r{ s@: Z ) @: @: @:calc-kbd-end-for@:}
35761
35762@c
35763@r{ @: Z C-g @: @: @:@:cancel if/loop command}
35764
35765@c
35766@r{ @: Z ` @: @: @:calc-kbd-push@:}
35767@r{ @: Z ' @: @: @:calc-kbd-pop@:}
35768@r{ @: Z # @: @: @:calc-kbd-query@:}
35769
35770@c
35771@r{ comp@: Z C @:func, args @: 50 @:calc-user-define-composition@:}
35772@r{ @: Z D @:key, command @: @:calc-user-define@:}
35773@r{ @: Z E @:key, editing @: 30 @:calc-user-define-edit@:}
35774@r{ defn@: Z F @:k, c, f, a, n@: 28 @:calc-user-define-formula@:}
35775@r{ @: Z G @:key @: @:calc-get-user-defn@:}
35776@r{ @: Z I @: @: @:calc-user-define-invocation@:}
35777@r{ @: Z K @:key, command @: @:calc-user-define-kbd-macro@:}
35778@r{ @: Z P @:key @: @:calc-user-define-permanent@:}
35779@r{ @: Z S @: @: 30 @:calc-edit-user-syntax@:}
35780@r{ @: Z T @: @: 12 @:calc-timing@:}
35781@r{ @: Z U @:key @: @:calc-user-undefine@:}
35782
35783@end format
35784
35785@noindent
35786NOTES
35787
35788@enumerate
35789@c 1
35790@item
35791Positive prefix arguments apply to @expr{n} stack entries.
35792Negative prefix arguments apply to the @expr{-n}th stack entry.
35793A prefix of zero applies to the entire stack. (For @key{LFD} and
35794@kbd{M-@key{DEL}}, the meaning of the sign is reversed.)
35795
35796@c 2
35797@item
35798Positive prefix arguments apply to @expr{n} stack entries.
35799Negative prefix arguments apply to the top stack entry
35800and the next @expr{-n} stack entries.
35801
35802@c 3
35803@item
35804Positive prefix arguments rotate top @expr{n} stack entries by one.
35805Negative prefix arguments rotate the entire stack by @expr{-n}.
35806A prefix of zero reverses the entire stack.
35807
35808@c 4
35809@item
35810Prefix argument specifies a repeat count or distance.
35811
35812@c 5
35813@item
35814Positive prefix arguments specify a precision @expr{p}.
35815Negative prefix arguments reduce the current precision by @expr{-p}.
35816
35817@c 6
35818@item
35819A prefix argument is interpreted as an additional step-size parameter.
35820A plain @kbd{C-u} prefix means to prompt for the step size.
35821
35822@c 7
35823@item
35824A prefix argument specifies simplification level and depth.
358251=Default, 2=like @kbd{a s}, 3=like @kbd{a e}.
35826
35827@c 8
35828@item
35829A negative prefix operates only on the top level of the input formula.
35830
35831@c 9
35832@item
35833Positive prefix arguments specify a word size of @expr{w} bits, unsigned.
35834Negative prefix arguments specify a word size of @expr{w} bits, signed.
35835
35836@c 10
35837@item
35838Prefix arguments specify the shift amount @expr{n}. The @expr{w} argument
35839cannot be specified in the keyboard version of this command.
35840
35841@c 11
35842@item
35843From the keyboard, @expr{d} is omitted and defaults to zero.
35844
35845@c 12
35846@item
35847Mode is toggled; a positive prefix always sets the mode, and a negative
35848prefix always clears the mode.
35849
35850@c 13
35851@item
35852Some prefix argument values provide special variations of the mode.
35853
35854@c 14
35855@item
35856A prefix argument, if any, is used for @expr{m} instead of taking
35857@expr{m} from the stack. @expr{M} may take any of these values:
35858@iftex
35859{@advance@tableindent10pt
35860@end iftex
35861@table @asis
35862@item Integer
35863Random integer in the interval @expr{[0 .. m)}.
35864@item Float
35865Random floating-point number in the interval @expr{[0 .. m)}.
35866@item 0.0
35867Gaussian with mean 1 and standard deviation 0.
35868@item Error form
35869Gaussian with specified mean and standard deviation.
35870@item Interval
35871Random integer or floating-point number in that interval.
35872@item Vector
35873Random element from the vector.
35874@end table
35875@iftex
35876}
35877@end iftex
35878
35879@c 15
35880@item
35881A prefix argument from 1 to 6 specifies number of date components
35882to remove from the stack. @xref{Date Conversions}.
35883
35884@c 16
35885@item
35886A prefix argument specifies a time zone; @kbd{C-u} says to take the
35887time zone number or name from the top of the stack. @xref{Time Zones}.
35888
35889@c 17
35890@item
35891A prefix argument specifies a day number (0-6, 0-31, or 0-366).
35892
35893@c 18
35894@item
35895If the input has no units, you will be prompted for both the old and
35896the new units.
35897
35898@c 19
35899@item
35900With a prefix argument, collect that many stack entries to form the
35901input data set. Each entry may be a single value or a vector of values.
35902
35903@c 20
35904@item
35905With a prefix argument of 1, take a single
35906@texline @var{n}@math{\times2}
35907@infoline @mathit{@var{N}x2}
35908matrix from the stack instead of two separate data vectors.
35909
35910@c 21
35911@item
35912The row or column number @expr{n} may be given as a numeric prefix
35913argument instead. A plain @kbd{C-u} prefix says to take @expr{n}
35914from the top of the stack. If @expr{n} is a vector or interval,
35915a subvector/submatrix of the input is created.
35916
35917@c 22
35918@item
35919The @expr{op} prompt can be answered with the key sequence for the
35920desired function, or with @kbd{x} or @kbd{z} followed by a function name,
35921or with @kbd{$} to take a formula from the top of the stack, or with
35922@kbd{'} and a typed formula. In the last two cases, the formula may
35923be a nameless function like @samp{<#1+#2>} or @samp{<x, y : x+y>}, or it
35924may include @kbd{$}, @kbd{$$}, etc. (where @kbd{$} will correspond to the
35925last argument of the created function), or otherwise you will be
35926prompted for an argument list. The number of vectors popped from the
35927stack by @kbd{V M} depends on the number of arguments of the function.
35928
35929@c 23
35930@item
35931One of the mapping direction keys @kbd{_} (horizontal, i.e., map
35932by rows or reduce across), @kbd{:} (vertical, i.e., map by columns or
35933reduce down), or @kbd{=} (map or reduce by rows) may be used before
35934entering @expr{op}; these modify the function name by adding the letter
35935@code{r} for ``rows,'' @code{c} for ``columns,'' @code{a} for ``across,''
35936or @code{d} for ``down.''
35937
35938@c 24
35939@item
35940The prefix argument specifies a packing mode. A nonnegative mode
35941is the number of items (for @kbd{v p}) or the number of levels
35942(for @kbd{v u}). A negative mode is as described below. With no
35943prefix argument, the mode is taken from the top of the stack and
35944may be an integer or a vector of integers.
35945@iftex
35946{@advance@tableindent-20pt
35947@end iftex
35948@table @cite
35949@item -1
35950(@var{2}) Rectangular complex number.
35951@item -2
35952(@var{2}) Polar complex number.
35953@item -3
35954(@var{3}) HMS form.
35955@item -4
35956(@var{2}) Error form.
35957@item -5
35958(@var{2}) Modulo form.
35959@item -6
35960(@var{2}) Closed interval.
35961@item -7
35962(@var{2}) Closed .. open interval.
35963@item -8
35964(@var{2}) Open .. closed interval.
35965@item -9
35966(@var{2}) Open interval.
35967@item -10
35968(@var{2}) Fraction.
35969@item -11
35970(@var{2}) Float with integer mantissa.
35971@item -12
35972(@var{2}) Float with mantissa in @expr{[1 .. 10)}.
35973@item -13
35974(@var{1}) Date form (using date numbers).
35975@item -14
35976(@var{3}) Date form (using year, month, day).
35977@item -15
35978(@var{6}) Date form (using year, month, day, hour, minute, second).
35979@end table
35980@iftex
35981}
35982@end iftex
35983
35984@c 25
35985@item
35986A prefix argument specifies the size @expr{n} of the matrix. With no
35987prefix argument, @expr{n} is omitted and the size is inferred from
35988the input vector.
35989
35990@c 26
35991@item
35992The prefix argument specifies the starting position @expr{n} (default 1).
35993
35994@c 27
35995@item
35996Cursor position within stack buffer affects this command.
35997
35998@c 28
35999@item
36000Arguments are not actually removed from the stack by this command.
36001
36002@c 29
36003@item
36004Variable name may be a single digit or a full name.
36005
36006@c 30
36007@item
36008Editing occurs in a separate buffer. Press @kbd{C-c C-c} (or
36009@key{LFD}, or in some cases @key{RET}) to finish the edit, or kill the
36010buffer with @kbd{C-x k} to cancel the edit. The @key{LFD} key prevents evaluation
36011of the result of the edit.
36012
36013@c 31
36014@item
36015The number prompted for can also be provided as a prefix argument.
36016
36017@c 32
36018@item
36019Press this key a second time to cancel the prefix.
36020
36021@c 33
36022@item
36023With a negative prefix, deactivate all formulas. With a positive
36024prefix, deactivate and then reactivate from scratch.
36025
36026@c 34
36027@item
36028Default is to scan for nearest formula delimiter symbols. With a
36029prefix of zero, formula is delimited by mark and point. With a
36030non-zero prefix, formula is delimited by scanning forward or
36031backward by that many lines.
36032
36033@c 35
36034@item
36035Parse the region between point and mark as a vector. A nonzero prefix
36036parses @var{n} lines before or after point as a vector. A zero prefix
36037parses the current line as a vector. A @kbd{C-u} prefix parses the
36038region between point and mark as a single formula.
36039
36040@c 36
36041@item
36042Parse the rectangle defined by point and mark as a matrix. A positive
36043prefix @var{n} divides the rectangle into columns of width @var{n}.
36044A zero or @kbd{C-u} prefix parses each line as one formula. A negative
36045prefix suppresses special treatment of bracketed portions of a line.
36046
36047@c 37
36048@item
36049A numeric prefix causes the current language mode to be ignored.
36050
36051@c 38
36052@item
36053Responding to a prompt with a blank line answers that and all
36054later prompts by popping additional stack entries.
36055
36056@c 39
36057@item
36058Answer for @expr{v} may also be of the form @expr{v = v_0} or
36059@expr{v - v_0}.
36060
36061@c 40
36062@item
36063With a positive prefix argument, stack contains many @expr{y}'s and one
36064common @expr{x}. With a zero prefix, stack contains a vector of
36065@expr{y}s and a common @expr{x}. With a negative prefix, stack
36066contains many @expr{[x,y]} vectors. (For 3D plots, substitute
36067@expr{z} for @expr{y} and @expr{x,y} for @expr{x}.)
36068
36069@c 41
36070@item
36071With any prefix argument, all curves in the graph are deleted.
36072
36073@c 42
36074@item
36075With a positive prefix, refines an existing plot with more data points.
36076With a negative prefix, forces recomputation of the plot data.
36077
36078@c 43
36079@item
36080With any prefix argument, set the default value instead of the
36081value for this graph.
36082
36083@c 44
36084@item
36085With a negative prefix argument, set the value for the printer.
36086
36087@c 45
36088@item
36089Condition is considered ``true'' if it is a nonzero real or complex
36090number, or a formula whose value is known to be nonzero; it is ``false''
36091otherwise.
36092
36093@c 46
36094@item
36095Several formulas separated by commas are pushed as multiple stack
36096entries. Trailing @kbd{)}, @kbd{]}, @kbd{@}}, @kbd{>}, and @kbd{"}
36097delimiters may be omitted. The notation @kbd{$$$} refers to the value
36098in stack level three, and causes the formula to replace the top three
36099stack levels. The notation @kbd{$3} refers to stack level three without
36100causing that value to be removed from the stack. Use @key{LFD} in place
36101of @key{RET} to prevent evaluation; use @kbd{M-=} in place of @key{RET}
36102to evaluate variables.
36103
36104@c 47
36105@item
36106The variable is replaced by the formula shown on the right. The
36107Inverse flag reverses the order of the operands, e.g., @kbd{I s - x}
36108assigns
36109@texline @math{x \coloneq a-x}.
36110@infoline @expr{x := a-x}.
36111
36112@c 48
36113@item
36114Press @kbd{?} repeatedly to see how to choose a model. Answer the
36115variables prompt with @expr{iv} or @expr{iv;pv} to specify
36116independent and parameter variables. A positive prefix argument
36117takes @mathit{@var{n}+1} vectors from the stack; a zero prefix takes a matrix
36118and a vector from the stack.
36119
36120@c 49
36121@item
36122With a plain @kbd{C-u} prefix, replace the current region of the
36123destination buffer with the yanked text instead of inserting.
36124
36125@c 50
36126@item
36127All stack entries are reformatted; the @kbd{H} prefix inhibits this.
36128The @kbd{I} prefix sets the mode temporarily, redraws the top stack
36129entry, then restores the original setting of the mode.
36130
36131@c 51
36132@item
36133A negative prefix sets the default 3D resolution instead of the
36134default 2D resolution.
36135
36136@c 52
36137@item
36138This grabs a vector of the form [@var{prec}, @var{wsize}, @var{ssize},
36139@var{radix}, @var{flfmt}, @var{ang}, @var{frac}, @var{symb}, @var{polar},
36140@var{matrix}, @var{simp}, @var{inf}]. A prefix argument from 1 to 12
36141grabs the @var{n}th mode value only.
36142@end enumerate
36143
36144@iftex
36145(Space is provided below for you to keep your own written notes.)
36146@page
36147@endgroup
36148@end iftex
36149
36150
36151@c [end-summary]
36152
36153@node Key Index, Command Index, Summary, Top
36154@unnumbered Index of Key Sequences
36155
36156@printindex ky
36157
36158@node Command Index, Function Index, Key Index, Top
36159@unnumbered Index of Calculator Commands
36160
36161Since all Calculator commands begin with the prefix @samp{calc-}, the
36162@kbd{x} key has been provided as a variant of @kbd{M-x} which automatically
36163types @samp{calc-} for you. Thus, @kbd{x last-args} is short for
36164@kbd{M-x calc-last-args}.
36165
36166@printindex pg
36167
36168@node Function Index, Concept Index, Command Index, Top
36169@unnumbered Index of Algebraic Functions
36170
36171This is a list of built-in functions and operators usable in algebraic
36172expressions. Their full Lisp names are derived by adding the prefix
36173@samp{calcFunc-}, as in @code{calcFunc-sqrt}.
36174@iftex
36175All functions except those noted with ``*'' have corresponding
36176Calc keystrokes and can also be found in the Calc Summary.
36177@end iftex
36178
36179@printindex tp
36180
36181@node Concept Index, Variable Index, Function Index, Top
36182@unnumbered Concept Index
36183
36184@printindex cp
36185
36186@node Variable Index, Lisp Function Index, Concept Index, Top
36187@unnumbered Index of Variables
36188
36189The variables in this list that do not contain dashes are accessible
36190as Calc variables. Add a @samp{var-} prefix to get the name of the
36191corresponding Lisp variable.
36192
36193The remaining variables are Lisp variables suitable for @code{setq}ing
36194in your Calc init file or @file{.emacs} file.
36195
36196@printindex vr
36197
36198@node Lisp Function Index, , Variable Index, Top
36199@unnumbered Index of Lisp Math Functions
36200
36201The following functions are meant to be used with @code{defmath}, not
36202@code{defun} definitions. For names that do not start with @samp{calc-},
36203the corresponding full Lisp name is derived by adding a prefix of
36204@samp{math-}.
36205
36206@printindex fn
36207
36208@bye
36209
36210
36211@ignore
36212 arch-tag: 77a71809-fa4d-40be-b2cc-da3e8fb137c0
36213@end ignore