Patch by Martin.Lorentzson@telia.com.
[bpt/emacs.git] / man / calc.texi
CommitLineData
d7b8e6c6
EZ
1\input texinfo @c -*-texinfo-*-
2@comment %**start of header (This is for running Texinfo on a region.)
3@c smallbook
4@setfilename ../info/calc
5@c [title]
0d48e8aa 6@settitle GNU Emacs Calc 2.02g Manual
d7b8e6c6 7@setchapternewpage odd
2a7c85e3
PJ
8@dircategory Emacs
9@direntry
10* Calc: (calc). Advanced desk calculator and mathematical tool.
11@end direntry
d7b8e6c6
EZ
12@comment %**end of header (This is for running Texinfo on a region.)
13
14@tex
15% Some special kludges to make TeX formatting prettier.
16% Because makeinfo.c exists, we can't just define new commands.
17% So instead, we take over little-used existing commands.
18%
b275eac7
EZ
19% Suggested by Karl Berry <karl@@freefriends.org>
20\gdef\!{\mskip-\thinmuskip}
d7b8e6c6
EZ
21% Redefine @cite{text} to act like $text$ in regular TeX.
22% Info will typeset this same as @samp{text}.
23\gdef\goodtex{\tex \let\rm\goodrm \let\t\ttfont \turnoffactive}
24\gdef\goodrm{\fam0\tenrm}
25\gdef\cite{\goodtex$\citexxx}
26\gdef\citexxx#1{#1$\Etex}
27\global\let\oldxrefX=\xrefX
28\gdef\xrefX[#1]{\begingroup\let\cite=\dfn\oldxrefX[#1]\endgroup}
5d67986c 29
d7b8e6c6
EZ
30% Redefine @c{tex-stuff} \n @whatever{info-stuff}.
31\gdef\c{\futurelet\next\mycxxx}
32\gdef\mycxxx{%
33 \ifx\next\bgroup \goodtex\let\next\mycxxy
34 \else\ifx\next\mindex \let\next\relax
35 \else\ifx\next\kindex \let\next\relax
36 \else\ifx\next\starindex \let\next\relax \else \let\next\comment
37 \fi\fi\fi\fi \next
38}
39\gdef\mycxxy#1#2{#1\Etex\mycxxz}
40\gdef\mycxxz#1{}
41@end tex
42
43@c Fix some things to make math mode work properly.
44@iftex
45@textfont0=@tenrm
46@font@teni=cmmi10 scaled @magstephalf @textfont1=@teni
47@font@seveni=cmmi7 scaled @magstephalf @scriptfont1=@seveni
48@font@fivei=cmmi5 scaled @magstephalf @scriptscriptfont1=@fivei
49@font@tensy=cmsy10 scaled @magstephalf @textfont2=@tensy
50@font@sevensy=cmsy7 scaled @magstephalf @scriptfont2=@sevensy
51@font@fivesy=cmsy5 scaled @magstephalf @scriptscriptfont2=@fivesy
52@font@tenex=cmex10 scaled @magstephalf @textfont3=@tenex
53@scriptfont3=@tenex @scriptscriptfont3=@tenex
54@textfont7=@tentt @scriptfont7=@tentt @scriptscriptfont7=@tentt
55@end iftex
56
57@c Fix some other things specifically for this manual.
58@iftex
59@finalout
60@mathcode`@:=`@: @c Make Calc fractions come out right in math mode
d7b8e6c6
EZ
61@tex
62\gdef\coloneq{\mathrel{\mathord:\mathord=}}
5d67986c 63
d7b8e6c6
EZ
64\gdef\beforedisplay{\vskip-10pt}
65\gdef\afterdisplay{\vskip-5pt}
66\gdef\beforedisplayh{\vskip-25pt}
67\gdef\afterdisplayh{\vskip-10pt}
d7b8e6c6
EZ
68@end tex
69@newdimen@kyvpos @kyvpos=0pt
70@newdimen@kyhpos @kyhpos=0pt
71@newcount@calcclubpenalty @calcclubpenalty=1000
5d67986c 72@ignore
d7b8e6c6
EZ
73@newcount@calcpageno
74@newtoks@calcoldeverypar @calcoldeverypar=@everypar
75@everypar={@calceverypar@the@calcoldeverypar}
76@ifx@turnoffactive@undefinedzzz@def@turnoffactive{}@fi
77@ifx@ninett@undefinedzzz@font@ninett=cmtt9@fi
78@catcode`@\=0 \catcode`\@=11
79\r@ggedbottomtrue
80\catcode`\@=0 @catcode`@\=@active
5d67986c 81@end ignore
d7b8e6c6
EZ
82@end iftex
83
0d48e8aa 84@ifnottex
d7b8e6c6
EZ
85This file documents Calc, the GNU Emacs calculator.
86
0d48e8aa 87Copyright (C) 1990, 1991, 2001, 2002 Free Software Foundation, Inc.
d7b8e6c6 88
0d48e8aa
EZ
89Permission is granted to copy, distribute and/or modify this document
90under the terms of the GNU Free Documentation License, Version 1.1 or
91any later version published by the Free Software Foundation; with the
92Invariant Sections being just ``GNU GENERAL PUBLIC LICENSE'', with the
93Front-Cover texts being ``A GNU Manual,'' and with the Back-Cover
94Texts as in (a) below.
d7b8e6c6 95
0d48e8aa
EZ
96(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
97this GNU Manual, like GNU software. Copies published by the Free
98Software Foundation raise funds for GNU development.''
99@end ifnottex
d7b8e6c6
EZ
100
101@titlepage
102@sp 6
103@center @titlefont{Calc Manual}
104@sp 4
0d48e8aa 105@center GNU Emacs Calc Version 2.02g
d7b8e6c6
EZ
106@c [volume]
107@sp 1
0d48e8aa 108@center January 2002
d7b8e6c6
EZ
109@sp 5
110@center Dave Gillespie
111@center daveg@@synaptics.com
112@page
113
114@vskip 0pt plus 1filll
0d48e8aa
EZ
115Copyright @copyright{} 1990, 1991, 2001, 2002 Free Software Foundation, Inc.
116
117Permission is granted to copy, distribute and/or modify this document
118under the terms of the GNU Free Documentation License, Version 1.1 or
119any later version published by the Free Software Foundation; with the
120Invariant Sections being just ``GNU GENERAL PUBLIC LICENSE'', with the
121Front-Cover texts being ``A GNU Manual,'' and with the Back-Cover
122Texts as in (a) below.
123
124(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
125this GNU Manual, like GNU software. Copies published by the Free
126Software Foundation raise funds for GNU development.''
d7b8e6c6
EZ
127@end titlepage
128
129@c [begin]
130@ifinfo
b275eac7
EZ
131@node Top, , (dir), (dir)
132@chapter The GNU Emacs Calculator
d7b8e6c6
EZ
133
134@noindent
0d48e8aa 135@dfn{Calc} is an advanced desk calculator and mathematical tool
d7b8e6c6
EZ
136that runs as part of the GNU Emacs environment.
137
0d48e8aa
EZ
138This manual is divided into three major parts: ``Getting Started,''
139the ``Calc Tutorial,'' and the ``Calc Reference.'' The Tutorial
140introduces all the major aspects of Calculator use in an easy,
141hands-on way. The remainder of the manual is a complete reference to
142the features of the Calculator.
d7b8e6c6
EZ
143
144For help in the Emacs Info system (which you are using to read this
145file), type @kbd{?}. (You can also type @kbd{h} to run through a
146longer Info tutorial.)
147
148@end ifinfo
149@menu
150* Copying:: How you can copy and share Calc.
151
152* Getting Started:: General description and overview.
b275eac7 153* Interactive Tutorial::
d7b8e6c6
EZ
154* Tutorial:: A step-by-step introduction for beginners.
155
156* Introduction:: Introduction to the Calc reference manual.
157* Data Types:: Types of objects manipulated by Calc.
158* Stack and Trail:: Manipulating the stack and trail buffers.
159* Mode Settings:: Adjusting display format and other modes.
160* Arithmetic:: Basic arithmetic functions.
161* Scientific Functions:: Transcendentals and other scientific functions.
162* Matrix Functions:: Operations on vectors and matrices.
163* Algebra:: Manipulating expressions algebraically.
164* Units:: Operations on numbers with units.
165* Store and Recall:: Storing and recalling variables.
166* Graphics:: Commands for making graphs of data.
167* Kill and Yank:: Moving data into and out of Calc.
168* Embedded Mode:: Working with formulas embedded in a file.
169* Programming:: Calc as a programmable calculator.
170
171* Installation:: Installing Calc as a part of GNU Emacs.
172* Reporting Bugs:: How to report bugs and make suggestions.
173
174* Summary:: Summary of Calc commands and functions.
175
176* Key Index:: The standard Calc key sequences.
177* Command Index:: The interactive Calc commands.
178* Function Index:: Functions (in algebraic formulas).
179* Concept Index:: General concepts.
180* Variable Index:: Variables used by Calc (both user and internal).
181* Lisp Function Index:: Internal Lisp math functions.
182@end menu
183
184@node Copying, Getting Started, Top, Top
185@unnumbered GNU GENERAL PUBLIC LICENSE
186@center Version 1, February 1989
187
188@display
189Copyright @copyright{} 1989 Free Software Foundation, Inc.
190675 Mass Ave, Cambridge, MA 02139, USA
191
192Everyone is permitted to copy and distribute verbatim copies
193of this license document, but changing it is not allowed.
194@end display
195
196@unnumberedsec Preamble
197
198 The license agreements of most software companies try to keep users
199at the mercy of those companies. By contrast, our General Public
200License is intended to guarantee your freedom to share and change free
201software---to make sure the software is free for all its users. The
202General Public License applies to the Free Software Foundation's
203software and to any other program whose authors commit to using it.
204You can use it for your programs, too.
205
206 When we speak of free software, we are referring to freedom, not
207price. Specifically, the General Public License is designed to make
208sure that you have the freedom to give away or sell copies of free
209software, that you receive source code or can get it if you want it,
210that you can change the software or use pieces of it in new free
211programs; and that you know you can do these things.
212
213 To protect your rights, we need to make restrictions that forbid
214anyone to deny you these rights or to ask you to surrender the rights.
215These restrictions translate to certain responsibilities for you if you
216distribute copies of the software, or if you modify it.
217
218 For example, if you distribute copies of a such a program, whether
219gratis or for a fee, you must give the recipients all the rights that
220you have. You must make sure that they, too, receive or can get the
221source code. And you must tell them their rights.
222
223 We protect your rights with two steps: (1) copyright the software, and
224(2) offer you this license which gives you legal permission to copy,
225distribute and/or modify the software.
226
227 Also, for each author's protection and ours, we want to make certain
228that everyone understands that there is no warranty for this free
229software. If the software is modified by someone else and passed on, we
230want its recipients to know that what they have is not the original, so
231that any problems introduced by others will not reflect on the original
232authors' reputations.
233
234 The precise terms and conditions for copying, distribution and
235modification follow.
236
237@iftex
238@unnumberedsec TERMS AND CONDITIONS
239@end iftex
240@ifinfo
241@center TERMS AND CONDITIONS
242@end ifinfo
243
244@enumerate
245@item
246This License Agreement applies to any program or other work which
247contains a notice placed by the copyright holder saying it may be
248distributed under the terms of this General Public License. The
249``Program'', below, refers to any such program or work, and a ``work based
250on the Program'' means either the Program or any work containing the
251Program or a portion of it, either verbatim or with modifications. Each
252licensee is addressed as ``you''.
253
254@item
255You may copy and distribute verbatim copies of the Program's source
256code as you receive it, in any medium, provided that you conspicuously and
257appropriately publish on each copy an appropriate copyright notice and
258disclaimer of warranty; keep intact all the notices that refer to this
259General Public License and to the absence of any warranty; and give any
260other recipients of the Program a copy of this General Public License
261along with the Program. You may charge a fee for the physical act of
262transferring a copy.
263
264@item
265You may modify your copy or copies of the Program or any portion of
266it, and copy and distribute such modifications under the terms of Paragraph
2671 above, provided that you also do the following:
268
269@itemize @bullet
270@item
271cause the modified files to carry prominent notices stating that
272you changed the files and the date of any change; and
273
274@item
275cause the whole of any work that you distribute or publish, that
276in whole or in part contains the Program or any part thereof, either
277with or without modifications, to be licensed at no charge to all
278third parties under the terms of this General Public License (except
279that you may choose to grant warranty protection to some or all
280third parties, at your option).
281
282@item
283If the modified program normally reads commands interactively when
284run, you must cause it, when started running for such interactive use
285in the simplest and most usual way, to print or display an
286announcement including an appropriate copyright notice and a notice
287that there is no warranty (or else, saying that you provide a
288warranty) and that users may redistribute the program under these
289conditions, and telling the user how to view a copy of this General
290Public License.
291
292@item
293You may charge a fee for the physical act of transferring a
294copy, and you may at your option offer warranty protection in
295exchange for a fee.
296@end itemize
297
298Mere aggregation of another independent work with the Program (or its
299derivative) on a volume of a storage or distribution medium does not bring
300the other work under the scope of these terms.
301
302@item
303You may copy and distribute the Program (or a portion or derivative of
304it, under Paragraph 2) in object code or executable form under the terms of
305Paragraphs 1 and 2 above provided that you also do one of the following:
306
307@itemize @bullet
308@item
309accompany it with the complete corresponding machine-readable
310source code, which must be distributed under the terms of
311Paragraphs 1 and 2 above; or,
312
313@item
314accompany it with a written offer, valid for at least three
315years, to give any third party free (except for a nominal charge
316for the cost of distribution) a complete machine-readable copy of the
317corresponding source code, to be distributed under the terms of
318Paragraphs 1 and 2 above; or,
319
320@item
321accompany it with the information you received as to where the
322corresponding source code may be obtained. (This alternative is
323allowed only for noncommercial distribution and only if you
324received the program in object code or executable form alone.)
325@end itemize
326
327Source code for a work means the preferred form of the work for making
328modifications to it. For an executable file, complete source code means
329all the source code for all modules it contains; but, as a special
330exception, it need not include source code for modules which are standard
331libraries that accompany the operating system on which the executable
332file runs, or for standard header files or definitions files that
333accompany that operating system.
334
335@item
336You may not copy, modify, sublicense, distribute or transfer the
337Program except as expressly provided under this General Public License.
338Any attempt otherwise to copy, modify, sublicense, distribute or transfer
339the Program is void, and will automatically terminate your rights to use
340the Program under this License. However, parties who have received
341copies, or rights to use copies, from you under this General Public
342License will not have their licenses terminated so long as such parties
343remain in full compliance.
344
345@item
346By copying, distributing or modifying the Program (or any work based
347on the Program) you indicate your acceptance of this license to do so,
348and all its terms and conditions.
349
350@item
351Each time you redistribute the Program (or any work based on the
352Program), the recipient automatically receives a license from the original
353licensor to copy, distribute or modify the Program subject to these
354terms and conditions. You may not impose any further restrictions on the
355recipients' exercise of the rights granted herein.
356
357@item
358The Free Software Foundation may publish revised and/or new versions
359of the General Public License from time to time. Such new versions will
360be similar in spirit to the present version, but may differ in detail to
361address new problems or concerns.
362
363Each version is given a distinguishing version number. If the Program
364specifies a version number of the license which applies to it and ``any
365later version'', you have the option of following the terms and conditions
366either of that version or of any later version published by the Free
367Software Foundation. If the Program does not specify a version number of
368the license, you may choose any version ever published by the Free Software
369Foundation.
370
371@item
372If you wish to incorporate parts of the Program into other free
373programs whose distribution conditions are different, write to the author
374to ask for permission. For software which is copyrighted by the Free
375Software Foundation, write to the Free Software Foundation; we sometimes
376make exceptions for this. Our decision will be guided by the two goals
377of preserving the free status of all derivatives of our free software and
378of promoting the sharing and reuse of software generally.
379
380@iftex
381@heading NO WARRANTY
382@end iftex
383@ifinfo
384@center NO WARRANTY
385@end ifinfo
386
387@item
388BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
389FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
390OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
391PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
392OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
393MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
394TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
395PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
396REPAIR OR CORRECTION.
397
398@item
399IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
400ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
401REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
402INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
403ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
404LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES
405SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE
406WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
407ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
408@end enumerate
409
b275eac7 410@node Getting Started, Tutorial, Copying, Top
d7b8e6c6 411@chapter Getting Started
d7b8e6c6
EZ
412@noindent
413This chapter provides a general overview of Calc, the GNU Emacs
414Calculator: What it is, how to start it and how to exit from it,
415and what are the various ways that it can be used.
416
417@menu
418* What is Calc::
419* About This Manual::
420* Notations Used in This Manual::
421* Using Calc::
422* Demonstration of Calc::
423* History and Acknowledgements::
424@end menu
425
426@node What is Calc, About This Manual, Getting Started, Getting Started
427@section What is Calc?
428
429@noindent
430@dfn{Calc} is an advanced calculator and mathematical tool that runs as
431part of the GNU Emacs environment. Very roughly based on the HP-28/48
432series of calculators, its many features include:
433
434@itemize @bullet
435@item
436Choice of algebraic or RPN (stack-based) entry of calculations.
437
438@item
439Arbitrary precision integers and floating-point numbers.
440
441@item
442Arithmetic on rational numbers, complex numbers (rectangular and polar),
443error forms with standard deviations, open and closed intervals, vectors
444and matrices, dates and times, infinities, sets, quantities with units,
445and algebraic formulas.
446
447@item
448Mathematical operations such as logarithms and trigonometric functions.
449
450@item
451Programmer's features (bitwise operations, non-decimal numbers).
452
453@item
454Financial functions such as future value and internal rate of return.
455
456@item
457Number theoretical features such as prime factorization and arithmetic
5d67986c 458modulo @var{m} for any @var{m}.
d7b8e6c6
EZ
459
460@item
461Algebraic manipulation features, including symbolic calculus.
462
463@item
464Moving data to and from regular editing buffers.
465
466@item
467``Embedded mode'' for manipulating Calc formulas and data directly
468inside any editing buffer.
469
470@item
471Graphics using GNUPLOT, a versatile (and free) plotting program.
472
473@item
474Easy programming using keyboard macros, algebraic formulas,
475algebraic rewrite rules, or extended Emacs Lisp.
476@end itemize
477
478Calc tries to include a little something for everyone; as a result it is
479large and might be intimidating to the first-time user. If you plan to
480use Calc only as a traditional desk calculator, all you really need to
481read is the ``Getting Started'' chapter of this manual and possibly the
482first few sections of the tutorial. As you become more comfortable with
483the program you can learn its additional features. In terms of efficiency,
484scope and depth, Calc cannot replace a powerful tool like Mathematica.
d7b8e6c6
EZ
485But Calc has the advantages of convenience, portability, and availability
486of the source code. And, of course, it's free!
487
488@node About This Manual, Notations Used in This Manual, What is Calc, Getting Started
489@section About This Manual
490
491@noindent
492This document serves as a complete description of the GNU Emacs
493Calculator. It works both as an introduction for novices, and as
494a reference for experienced users. While it helps to have some
495experience with GNU Emacs in order to get the most out of Calc,
496this manual ought to be readable even if you don't know or use Emacs
497regularly.
498
499@ifinfo
500The manual is divided into three major parts:@: the ``Getting
501Started'' chapter you are reading now, the Calc tutorial (chapter 2),
502and the Calc reference manual (the remaining chapters and appendices).
503@end ifinfo
504@iftex
505The manual is divided into three major parts:@: the ``Getting
506Started'' chapter you are reading now, the Calc tutorial (chapter 2),
507and the Calc reference manual (the remaining chapters and appendices).
508@c [when-split]
509@c This manual has been printed in two volumes, the @dfn{Tutorial} and the
510@c @dfn{Reference}. Both volumes include a copy of the ``Getting Started''
511@c chapter.
512@end iftex
513
514If you are in a hurry to use Calc, there is a brief ``demonstration''
515below which illustrates the major features of Calc in just a couple of
516pages. If you don't have time to go through the full tutorial, this
517will show you everything you need to know to begin.
518@xref{Demonstration of Calc}.
519
520The tutorial chapter walks you through the various parts of Calc
521with lots of hands-on examples and explanations. If you are new
522to Calc and you have some time, try going through at least the
523beginning of the tutorial. The tutorial includes about 70 exercises
524with answers. These exercises give you some guided practice with
525Calc, as well as pointing out some interesting and unusual ways
526to use its features.
527
528The reference section discusses Calc in complete depth. You can read
529the reference from start to finish if you want to learn every aspect
530of Calc. Or, you can look in the table of contents or the Concept
531Index to find the parts of the manual that discuss the things you
532need to know.
533
534@cindex Marginal notes
535Every Calc keyboard command is listed in the Calc Summary, and also
536in the Key Index. Algebraic functions, @kbd{M-x} commands, and
537variables also have their own indices. @c{Each}
538@asis{In the printed manual, each}
539paragraph that is referenced in the Key or Function Index is marked
540in the margin with its index entry.
541
542@c [fix-ref Help Commands]
543You can access this manual on-line at any time within Calc by
544pressing the @kbd{h i} key sequence. Outside of the Calc window,
545you can press @kbd{M-# i} to read the manual on-line. Also, you
546can jump directly to the Tutorial by pressing @kbd{h t} or @kbd{M-# t},
547or to the Summary by pressing @kbd{h s} or @kbd{M-# s}. Within Calc,
548you can also go to the part of the manual describing any Calc key,
549function, or variable using @w{@kbd{h k}}, @kbd{h f}, or @kbd{h v},
550respectively. @xref{Help Commands}.
551
552Printed copies of this manual are also available from the Free Software
553Foundation.
554
555@node Notations Used in This Manual, Demonstration of Calc, About This Manual, Getting Started
556@section Notations Used in This Manual
557
558@noindent
559This section describes the various notations that are used
560throughout the Calc manual.
561
562In keystroke sequences, uppercase letters mean you must hold down
563the shift key while typing the letter. Keys pressed with Control
564held down are shown as @kbd{C-x}. Keys pressed with Meta held down
565are shown as @kbd{M-x}. Other notations are @key{RET} for the
566Return key, @key{SPC} for the space bar, @key{TAB} for the Tab key,
567@key{DEL} for the Delete key, and @key{LFD} for the Line-Feed key.
568
569(If you don't have the @key{LFD} or @key{TAB} keys on your keyboard,
570the @kbd{C-j} and @kbd{C-i} keys are equivalent to them, respectively.
571If you don't have a Meta key, look for Alt or Extend Char. You can
572also press @key{ESC} or @key{C-[} first to get the same effect, so
5d67986c 573that @kbd{M-x}, @kbd{@key{ESC} x}, and @kbd{C-[ x} are all equivalent.)
d7b8e6c6
EZ
574
575Sometimes the @key{RET} key is not shown when it is ``obvious''
5d67986c 576that you must press @key{RET} to proceed. For example, the @key{RET}
d7b8e6c6
EZ
577is usually omitted in key sequences like @kbd{M-x calc-keypad @key{RET}}.
578
579Commands are generally shown like this: @kbd{p} (@code{calc-precision})
580or @kbd{M-# k} (@code{calc-keypad}). This means that the command is
581normally used by pressing the @kbd{p} key or @kbd{M-# k} key sequence,
582but it also has the full-name equivalent shown, e.g., @kbd{M-x calc-precision}.
583
584Commands that correspond to functions in algebraic notation
585are written: @kbd{C} (@code{calc-cos}) [@code{cos}]. This means
586the @kbd{C} key is equivalent to @kbd{M-x calc-cos}, and that
587the corresponding function in an algebraic-style formula would
588be @samp{cos(@var{x})}.
589
590A few commands don't have key equivalents: @code{calc-sincos}
591[@code{sincos}].@refill
592
593@node Demonstration of Calc, Using Calc, Notations Used in This Manual, Getting Started
594@section A Demonstration of Calc
595
596@noindent
597@cindex Demonstration of Calc
598This section will show some typical small problems being solved with
599Calc. The focus is more on demonstration than explanation, but
600everything you see here will be covered more thoroughly in the
601Tutorial.
602
603To begin, start Emacs if necessary (usually the command @code{emacs}
5d67986c 604does this), and type @kbd{M-# c} (or @kbd{@key{ESC} # c}) to start the
d7b8e6c6
EZ
605Calculator. (@xref{Starting Calc}, if this doesn't work for you.)
606
607Be sure to type all the sample input exactly, especially noting the
608difference between lower-case and upper-case letters. Remember,
5d67986c 609@key{RET}, @key{TAB}, @key{DEL}, and @key{SPC} are the Return, Tab,
d7b8e6c6
EZ
610Delete, and Space keys.
611
612@strong{RPN calculation.} In RPN, you type the input number(s) first,
613then the command to operate on the numbers.
614
615@noindent
5d67986c 616Type @kbd{2 @key{RET} 3 + Q} to compute @c{$\sqrt{2+3} = 2.2360679775$}
d7b8e6c6
EZ
617@asis{the square root of 2+3, which is 2.2360679775}.
618
619@noindent
620Type @kbd{P 2 ^} to compute @c{$\pi^2 = 9.86960440109$}
621@asis{the value of `pi' squared, 9.86960440109}.
622
623@noindent
5d67986c 624Type @key{TAB} to exchange the order of these two results.
d7b8e6c6
EZ
625
626@noindent
627Type @kbd{- I H S} to subtract these results and compute the Inverse
628Hyperbolic sine of the difference, 2.72996136574.
629
630@noindent
5d67986c 631Type @key{DEL} to erase this result.
d7b8e6c6
EZ
632
633@strong{Algebraic calculation.} You can also enter calculations using
634conventional ``algebraic'' notation. To enter an algebraic formula,
635use the apostrophe key.
636
637@noindent
5d67986c 638Type @kbd{' sqrt(2+3) @key{RET}} to compute @c{$\sqrt{2+3}$}
d7b8e6c6
EZ
639@asis{the square root of 2+3}.
640
641@noindent
5d67986c 642Type @kbd{' pi^2 @key{RET}} to enter @c{$\pi^2$}
d7b8e6c6
EZ
643@asis{`pi' squared}. To evaluate this symbolic
644formula as a number, type @kbd{=}.
645
646@noindent
5d67986c 647Type @kbd{' arcsinh($ - $$) @key{RET}} to subtract the second-most-recent
d7b8e6c6
EZ
648result from the most-recent and compute the Inverse Hyperbolic sine.
649
650@strong{Keypad mode.} If you are using the X window system, press
651@w{@kbd{M-# k}} to get Keypad mode. (If you don't use X, skip to
652the next section.)
653
654@noindent
655Click on the @key{2}, @key{ENTER}, @key{3}, @key{+}, and @key{SQRT}
656``buttons'' using your left mouse button.
657
658@noindent
659Click on @key{PI}, @key{2}, and @t{y^x}.
660
661@noindent
662Click on @key{INV}, then @key{ENTER} to swap the two results.
663
664@noindent
665Click on @key{-}, @key{INV}, @key{HYP}, and @key{SIN}.
666
667@noindent
668Click on @key{<-} to erase the result, then click @key{OFF} to turn
669the Keypad Calculator off.
670
671@strong{Grabbing data.} Type @kbd{M-# x} if necessary to exit Calc.
672Now select the following numbers as an Emacs region: ``Mark'' the
5d67986c 673front of the list by typing @kbd{C-@key{SPC}} or @kbd{C-@@} there,
d7b8e6c6
EZ
674then move to the other end of the list. (Either get this list from
675the on-line copy of this manual, accessed by @w{@kbd{M-# i}}, or just
676type these numbers into a scratch file.) Now type @kbd{M-# g} to
677``grab'' these numbers into Calc.
678
d7b8e6c6 679@example
5d67986c 680@group
d7b8e6c6
EZ
6811.23 1.97
6821.6 2
6831.19 1.08
d7b8e6c6 684@end group
5d67986c 685@end example
d7b8e6c6
EZ
686
687@noindent
688The result @samp{[1.23, 1.97, 1.6, 2, 1.19, 1.08]} is a Calc ``vector.''
689Type @w{@kbd{V R +}} to compute the sum of these numbers.
690
691@noindent
692Type @kbd{U} to Undo this command, then type @kbd{V R *} to compute
693the product of the numbers.
694
695@noindent
696You can also grab data as a rectangular matrix. Place the cursor on
697the upper-leftmost @samp{1} and set the mark, then move to just after
698the lower-right @samp{8} and press @kbd{M-# r}.
699
700@noindent
701Type @kbd{v t} to transpose this @c{$3\times2$}
702@asis{3x2} matrix into a @c{$2\times3$}
703@asis{2x3} matrix. Type
704@w{@kbd{v u}} to unpack the rows into two separate vectors. Now type
5d67986c 705@w{@kbd{V R + @key{TAB} V R +}} to compute the sums of the two original columns.
d7b8e6c6
EZ
706(There is also a special grab-and-sum-columns command, @kbd{M-# :}.)
707
708@strong{Units conversion.} Units are entered algebraically.
5d67986c
RS
709Type @w{@kbd{' 43 mi/hr @key{RET}}} to enter the quantity 43 miles-per-hour.
710Type @w{@kbd{u c km/hr @key{RET}}}. Type @w{@kbd{u c m/s @key{RET}}}.
d7b8e6c6
EZ
711
712@strong{Date arithmetic.} Type @kbd{t N} to get the current date and
713time. Type @kbd{90 +} to find the date 90 days from now. Type
5d67986c 714@kbd{' <25 dec 87> @key{RET}} to enter a date, then @kbd{- 7 /} to see how
d7b8e6c6
EZ
715many weeks have passed since then.
716
717@strong{Algebra.} Algebraic entries can also include formulas
5d67986c 718or equations involving variables. Type @kbd{@w{' [x + y} = a, x y = 1] @key{RET}}
d7b8e6c6
EZ
719to enter a pair of equations involving three variables.
720(Note the leading apostrophe in this example; also, note that the space
5d67986c 721between @samp{x y} is required.) Type @w{@kbd{a S x,y @key{RET}}} to solve
d7b8e6c6
EZ
722these equations for the variables @cite{x} and @cite{y}.@refill
723
724@noindent
725Type @kbd{d B} to view the solutions in more readable notation.
726Type @w{@kbd{d C}} to view them in C language notation, and @kbd{d T}
727to view them in the notation for the @TeX{} typesetting system.
728Type @kbd{d N} to return to normal notation.
729
730@noindent
5d67986c 731Type @kbd{7.5}, then @kbd{s l a @key{RET}} to let @cite{a = 7.5} in these formulas.
d7b8e6c6
EZ
732(That's a letter @kbd{l}, not a numeral @kbd{1}.)
733
734@iftex
735@strong{Help functions.} You can read about any command in the on-line
736manual. Type @kbd{M-# c} to return to Calc after each of these
737commands: @kbd{h k t N} to read about the @kbd{t N} command,
5d67986c 738@kbd{h f sqrt @key{RET}} to read about the @code{sqrt} function, and
d7b8e6c6
EZ
739@kbd{h s} to read the Calc summary.
740@end iftex
741@ifinfo
742@strong{Help functions.} You can read about any command in the on-line
743manual. Remember to type the letter @kbd{l}, then @kbd{M-# c}, to
744return here after each of these commands: @w{@kbd{h k t N}} to read
5d67986c 745about the @w{@kbd{t N}} command, @kbd{h f sqrt @key{RET}} to read about the
d7b8e6c6
EZ
746@code{sqrt} function, and @kbd{h s} to read the Calc summary.
747@end ifinfo
748
5d67986c 749Press @key{DEL} repeatedly to remove any leftover results from the stack.
d7b8e6c6
EZ
750To exit from Calc, press @kbd{q} or @kbd{M-# c} again.
751
752@node Using Calc, History and Acknowledgements, Demonstration of Calc, Getting Started
753@section Using Calc
754
755@noindent
756Calc has several user interfaces that are specialized for
757different kinds of tasks. As well as Calc's standard interface,
758there are Quick Mode, Keypad Mode, and Embedded Mode.
759
760@c [fix-ref Installation]
761Calc must be @dfn{installed} before it can be used. @xref{Installation},
762for instructions on setting up and installing Calc. We will assume
763you or someone on your system has already installed Calc as described
764there.
765
766@menu
767* Starting Calc::
768* The Standard Interface::
769* Quick Mode Overview::
770* Keypad Mode Overview::
771* Standalone Operation::
772* Embedded Mode Overview::
773* Other M-# Commands::
774@end menu
775
776@node Starting Calc, The Standard Interface, Using Calc, Using Calc
777@subsection Starting Calc
778
779@noindent
780On most systems, you can type @kbd{M-#} to start the Calculator.
781The notation @kbd{M-#} is short for Meta-@kbd{#}. On most
782keyboards this means holding down the Meta (or Alt) and
783Shift keys while typing @kbd{3}.
784
785@cindex META key
786Once again, if you don't have a Meta key on your keyboard you can type
787@key{ESC} first, then @kbd{#}, to accomplish the same thing. If you
788don't even have an @key{ESC} key, you can fake it by holding down
789Control or @key{CTRL} while typing a left square bracket
790(that's @kbd{C-[} in Emacs notation).@refill
791
792@kbd{M-#} is a @dfn{prefix key}; when you press it, Emacs waits for
793you to press a second key to complete the command. In this case,
794you will follow @kbd{M-#} with a letter (upper- or lower-case, it
795doesn't matter for @kbd{M-#}) that says which Calc interface you
796want to use.
797
798To get Calc's standard interface, type @kbd{M-# c}. To get
799Keypad Mode, type @kbd{M-# k}. Type @kbd{M-# ?} to get a brief
800list of the available options, and type a second @kbd{?} to get
801a complete list.
802
803To ease typing, @kbd{M-# M-#} (or @kbd{M-# #} if that's easier)
804also works to start Calc. It starts the same interface (either
805@kbd{M-# c} or @w{@kbd{M-# k}}) that you last used, selecting the
806@kbd{M-# c} interface by default. (If your installation has
807a special function key set up to act like @kbd{M-#}, hitting that
808function key twice is just like hitting @kbd{M-# M-#}.)
809
810If @kbd{M-#} doesn't work for you, you can always type explicit
811commands like @kbd{M-x calc} (for the standard user interface) or
812@w{@kbd{M-x calc-keypad}} (for Keypad Mode). First type @kbd{M-x}
813(that's Meta with the letter @kbd{x}), then, at the prompt,
814type the full command (like @kbd{calc-keypad}) and press Return.
815
816If you type @kbd{M-x calc} and Emacs still doesn't recognize the
817command (it will say @samp{[No match]} when you try to press
818@key{RET}), then Calc has not been properly installed.
819
820The same commands (like @kbd{M-# c} or @kbd{M-# M-#}) that start
821the Calculator also turn it off if it is already on.
822
823@node The Standard Interface, Quick Mode Overview, Starting Calc, Using Calc
824@subsection The Standard Calc Interface
825
826@noindent
827@cindex Standard user interface
828Calc's standard interface acts like a traditional RPN calculator,
829operated by the normal Emacs keyboard. When you type @kbd{M-# c}
830to start the Calculator, the Emacs screen splits into two windows
831with the file you were editing on top and Calc on the bottom.
832
d7b8e6c6
EZ
833@iftex
834@advance@hsize20pt
835@end iftex
836@smallexample
5d67986c 837@group
d7b8e6c6
EZ
838
839...
840--**-Emacs: myfile (Fundamental)----All----------------------
841--- Emacs Calculator Mode --- |Emacs Calc Mode v2.00...
8422: 17.3 | 17.3
8431: -5 | 3
844 . | 2
845 | 4
846 | * 8
847 | ->-5
848 |
849--%%-Calc: 12 Deg (Calculator)----All----- --%%-Emacs: *Calc Trail*
d7b8e6c6 850@end group
5d67986c 851@end smallexample
d7b8e6c6
EZ
852
853In this figure, the mode-line for @file{myfile} has moved up and the
854``Calculator'' window has appeared below it. As you can see, Calc
855actually makes two windows side-by-side. The lefthand one is
856called the @dfn{stack window} and the righthand one is called the
857@dfn{trail window.} The stack holds the numbers involved in the
858calculation you are currently performing. The trail holds a complete
859record of all calculations you have done. In a desk calculator with
860a printer, the trail corresponds to the paper tape that records what
861you do.
862
863In this case, the trail shows that four numbers (17.3, 3, 2, and 4)
864were first entered into the Calculator, then the 2 and 4 were
865multiplied to get 8, then the 3 and 8 were subtracted to get @i{-5}.
866(The @samp{>} symbol shows that this was the most recent calculation.)
867The net result is the two numbers 17.3 and @i{-5} sitting on the stack.
868
869Most Calculator commands deal explicitly with the stack only, but
870there is a set of commands that allow you to search back through
871the trail and retrieve any previous result.
872
873Calc commands use the digits, letters, and punctuation keys.
874Shifted (i.e., upper-case) letters are different from lowercase
875letters. Some letters are @dfn{prefix} keys that begin two-letter
876commands. For example, @kbd{e} means ``enter exponent'' and shifted
877@kbd{E} means @cite{e^x}. With the @kbd{d} (``display modes'') prefix
878the letter ``e'' takes on very different meanings: @kbd{d e} means
879``engineering notation'' and @kbd{d E} means ``@dfn{eqn} language mode.''
880
881There is nothing stopping you from switching out of the Calc
882window and back into your editing window, say by using the Emacs
883@w{@kbd{C-x o}} (@code{other-window}) command. When the cursor is
884inside a regular window, Emacs acts just like normal. When the
885cursor is in the Calc stack or trail windows, keys are interpreted
886as Calc commands.
887
888When you quit by pressing @kbd{M-# c} a second time, the Calculator
889windows go away but the actual Stack and Trail are not gone, just
890hidden. When you press @kbd{M-# c} once again you will get the
891same stack and trail contents you had when you last used the
892Calculator.
893
894The Calculator does not remember its state between Emacs sessions.
895Thus if you quit Emacs and start it again, @kbd{M-# c} will give you
896a fresh stack and trail. There is a command (@kbd{m m}) that lets
897you save your favorite mode settings between sessions, though.
898One of the things it saves is which user interface (standard or
899Keypad) you last used; otherwise, a freshly started Emacs will
900always treat @kbd{M-# M-#} the same as @kbd{M-# c}.
901
902The @kbd{q} key is another equivalent way to turn the Calculator off.
903
904If you type @kbd{M-# b} first and then @kbd{M-# c}, you get a
905full-screen version of Calc (@code{full-calc}) in which the stack and
906trail windows are still side-by-side but are now as tall as the whole
907Emacs screen. When you press @kbd{q} or @kbd{M-# c} again to quit,
908the file you were editing before reappears. The @kbd{M-# b} key
909switches back and forth between ``big'' full-screen mode and the
910normal partial-screen mode.
911
912Finally, @kbd{M-# o} (@code{calc-other-window}) is like @kbd{M-# c}
913except that the Calc window is not selected. The buffer you were
914editing before remains selected instead. @kbd{M-# o} is a handy
915way to switch out of Calc momentarily to edit your file; type
916@kbd{M-# c} to switch back into Calc when you are done.
917
918@node Quick Mode Overview, Keypad Mode Overview, The Standard Interface, Using Calc
919@subsection Quick Mode (Overview)
920
921@noindent
922@dfn{Quick Mode} is a quick way to use Calc when you don't need the
923full complexity of the stack and trail. To use it, type @kbd{M-# q}
924(@code{quick-calc}) in any regular editing buffer.
925
926Quick Mode is very simple: It prompts you to type any formula in
927standard algebraic notation (like @samp{4 - 2/3}) and then displays
928the result at the bottom of the Emacs screen (@i{3.33333333333}
929in this case). You are then back in the same editing buffer you
930were in before, ready to continue editing or to type @kbd{M-# q}
931again to do another quick calculation. The result of the calculation
932will also be in the Emacs ``kill ring'' so that a @kbd{C-y} command
933at this point will yank the result into your editing buffer.
934
935Calc mode settings affect Quick Mode, too, though you will have to
936go into regular Calc (with @kbd{M-# c}) to change the mode settings.
937
938@c [fix-ref Quick Calculator mode]
939@xref{Quick Calculator}, for further information.
940
941@node Keypad Mode Overview, Standalone Operation, Quick Mode Overview, Using Calc
942@subsection Keypad Mode (Overview)
943
944@noindent
945@dfn{Keypad Mode} is a mouse-based interface to the Calculator.
946It is designed for use with the X window system. If you don't
947have X, you will have to operate keypad mode with your arrow
948keys (which is probably more trouble than it's worth). Keypad
949mode is currently not supported under Emacs 19.
950
951Type @kbd{M-# k} to turn Keypad Mode on or off. Once again you
952get two new windows, this time on the righthand side of the screen
953instead of at the bottom. The upper window is the familiar Calc
954Stack; the lower window is a picture of a typical calculator keypad.
955
956@tex
957\dimen0=\pagetotal%
958\advance \dimen0 by 24\baselineskip%
959\ifdim \dimen0>\pagegoal \vfill\eject \fi%
960\medskip
961@end tex
962@smallexample
963 |--- Emacs Calculator Mode ---
964 |2: 17.3
965 |1: -5
966 | .
967 |--%%-Calc: 12 Deg (Calcul
968 |----+-----Calc 2.00-----+----1
969 |FLR |CEIL|RND |TRNC|CLN2|FLT |
970 |----+----+----+----+----+----|
971 | LN |EXP | |ABS |IDIV|MOD |
972 |----+----+----+----+----+----|
973 |SIN |COS |TAN |SQRT|y^x |1/x |
974 |----+----+----+----+----+----|
975 | ENTER |+/- |EEX |UNDO| <- |
976 |-----+---+-+--+--+-+---++----|
977 | INV | 7 | 8 | 9 | / |
978 |-----+-----+-----+-----+-----|
979 | HYP | 4 | 5 | 6 | * |
980 |-----+-----+-----+-----+-----|
981 |EXEC | 1 | 2 | 3 | - |
982 |-----+-----+-----+-----+-----|
983 | OFF | 0 | . | PI | + |
984 |-----+-----+-----+-----+-----+
985@end smallexample
986@iftex
987@begingroup
988@ifdim@hsize=5in
989@vskip-3.7in
990@advance@hsize-2.2in
991@else
992@vskip-3.89in
993@advance@hsize-3.05in
994@advance@vsize.1in
995@fi
996@end iftex
997
998Keypad Mode is much easier for beginners to learn, because there
999is no need to memorize lots of obscure key sequences. But not all
1000commands in regular Calc are available on the Keypad. You can
1001always switch the cursor into the Calc stack window to use
1002standard Calc commands if you need. Serious Calc users, though,
1003often find they prefer the standard interface over Keypad Mode.
1004
1005To operate the Calculator, just click on the ``buttons'' of the
1006keypad using your left mouse button. To enter the two numbers
1007shown here you would click @w{@kbd{1 7 .@: 3 ENTER 5 +/- ENTER}}; to
1008add them together you would then click @kbd{+} (to get 12.3 on
1009the stack).
1010
1011If you click the right mouse button, the top three rows of the
1012keypad change to show other sets of commands, such as advanced
1013math functions, vector operations, and operations on binary
1014numbers.
1015
1016@iftex
1017@endgroup
1018@end iftex
1019Because Keypad Mode doesn't use the regular keyboard, Calc leaves
1020the cursor in your original editing buffer. You can type in
1021this buffer in the usual way while also clicking on the Calculator
1022keypad. One advantage of Keypad Mode is that you don't need an
1023explicit command to switch between editing and calculating.
1024
1025If you press @kbd{M-# b} first, you get a full-screen Keypad Mode
1026(@code{full-calc-keypad}) with three windows: The keypad in the lower
1027left, the stack in the lower right, and the trail on top.
1028
1029@c [fix-ref Keypad Mode]
1030@xref{Keypad Mode}, for further information.
1031
1032@node Standalone Operation, Embedded Mode Overview, Keypad Mode Overview, Using Calc
1033@subsection Standalone Operation
1034
1035@noindent
1036@cindex Standalone Operation
1037If you are not in Emacs at the moment but you wish to use Calc,
1038you must start Emacs first. If all you want is to run Calc, you
1039can give the commands:
1040
1041@example
1042emacs -f full-calc
1043@end example
1044
1045@noindent
1046or
1047
1048@example
1049emacs -f full-calc-keypad
1050@end example
1051
1052@noindent
1053which run a full-screen Calculator (as if by @kbd{M-# b M-# c}) or
1054a full-screen X-based Calculator (as if by @kbd{M-# b M-# k}).
1055In standalone operation, quitting the Calculator (by pressing
1056@kbd{q} or clicking on the keypad @key{EXIT} button) quits Emacs
1057itself.
1058
1059@node Embedded Mode Overview, Other M-# Commands, Standalone Operation, Using Calc
1060@subsection Embedded Mode (Overview)
1061
1062@noindent
1063@dfn{Embedded Mode} is a way to use Calc directly from inside an
1064editing buffer. Suppose you have a formula written as part of a
1065document like this:
1066
d7b8e6c6 1067@smallexample
5d67986c 1068@group
d7b8e6c6
EZ
1069The derivative of
1070
1071 ln(ln(x))
1072
1073is
d7b8e6c6 1074@end group
5d67986c 1075@end smallexample
d7b8e6c6
EZ
1076
1077@noindent
1078and you wish to have Calc compute and format the derivative for
1079you and store this derivative in the buffer automatically. To
1080do this with Embedded Mode, first copy the formula down to where
1081you want the result to be:
1082
d7b8e6c6 1083@smallexample
5d67986c 1084@group
d7b8e6c6
EZ
1085The derivative of
1086
1087 ln(ln(x))
1088
1089is
1090
1091 ln(ln(x))
d7b8e6c6 1092@end group
5d67986c 1093@end smallexample
d7b8e6c6
EZ
1094
1095Now, move the cursor onto this new formula and press @kbd{M-# e}.
1096Calc will read the formula (using the surrounding blank lines to
1097tell how much text to read), then push this formula (invisibly)
1098onto the Calc stack. The cursor will stay on the formula in the
1099editing buffer, but the buffer's mode line will change to look
1100like the Calc mode line (with mode indicators like @samp{12 Deg}
1101and so on). Even though you are still in your editing buffer,
1102the keyboard now acts like the Calc keyboard, and any new result
1103you get is copied from the stack back into the buffer. To take
1104the derivative, you would type @kbd{a d x @key{RET}}.
1105
d7b8e6c6 1106@smallexample
5d67986c 1107@group
d7b8e6c6
EZ
1108The derivative of
1109
1110 ln(ln(x))
1111
1112is
1113
11141 / ln(x) x
d7b8e6c6 1115@end group
5d67986c 1116@end smallexample
d7b8e6c6
EZ
1117
1118To make this look nicer, you might want to press @kbd{d =} to center
1119the formula, and even @kbd{d B} to use ``big'' display mode.
1120
d7b8e6c6 1121@smallexample
5d67986c 1122@group
d7b8e6c6
EZ
1123The derivative of
1124
1125 ln(ln(x))
1126
1127is
1128% [calc-mode: justify: center]
1129% [calc-mode: language: big]
1130
1131 1
1132 -------
1133 ln(x) x
d7b8e6c6 1134@end group
5d67986c 1135@end smallexample
d7b8e6c6
EZ
1136
1137Calc has added annotations to the file to help it remember the modes
1138that were used for this formula. They are formatted like comments
1139in the @TeX{} typesetting language, just in case you are using @TeX{}.
1140(In this example @TeX{} is not being used, so you might want to move
1141these comments up to the top of the file or otherwise put them out
1142of the way.)
1143
1144As an extra flourish, we can add an equation number using a
5d67986c 1145righthand label: Type @kbd{d @} (1) @key{RET}}.
d7b8e6c6 1146
d7b8e6c6 1147@smallexample
5d67986c 1148@group
d7b8e6c6
EZ
1149% [calc-mode: justify: center]
1150% [calc-mode: language: big]
1151% [calc-mode: right-label: " (1)"]
1152
1153 1
1154 ------- (1)
1155 ln(x) x
d7b8e6c6 1156@end group
5d67986c 1157@end smallexample
d7b8e6c6
EZ
1158
1159To leave Embedded Mode, type @kbd{M-# e} again. The mode line
1160and keyboard will revert to the way they were before. (If you have
1161actually been trying this as you read along, you'll want to press
1162@kbd{M-# 0} [with the digit zero] now to reset the modes you changed.)
1163
1164The related command @kbd{M-# w} operates on a single word, which
1165generally means a single number, inside text. It uses any
1166non-numeric characters rather than blank lines to delimit the
1167formula it reads. Here's an example of its use:
1168
1169@smallexample
1170A slope of one-third corresponds to an angle of 1 degrees.
1171@end smallexample
1172
1173Place the cursor on the @samp{1}, then type @kbd{M-# w} to enable
1174Embedded Mode on that number. Now type @kbd{3 /} (to get one-third),
1175and @kbd{I T} (the Inverse Tangent converts a slope into an angle),
1176then @w{@kbd{M-# w}} again to exit Embedded mode.
1177
1178@smallexample
1179A slope of one-third corresponds to an angle of 18.4349488229 degrees.
1180@end smallexample
1181
1182@c [fix-ref Embedded Mode]
1183@xref{Embedded Mode}, for full details.
1184
1185@node Other M-# Commands, , Embedded Mode Overview, Using Calc
1186@subsection Other @kbd{M-#} Commands
1187
1188@noindent
1189Two more Calc-related commands are @kbd{M-# g} and @kbd{M-# r},
1190which ``grab'' data from a selected region of a buffer into the
1191Calculator. The region is defined in the usual Emacs way, by
1192a ``mark'' placed at one end of the region, and the Emacs
1193cursor or ``point'' placed at the other.
1194
1195The @kbd{M-# g} command reads the region in the usual left-to-right,
1196top-to-bottom order. The result is packaged into a Calc vector
1197of numbers and placed on the stack. Calc (in its standard
1198user interface) is then started. Type @kbd{v u} if you want
1199to unpack this vector into separate numbers on the stack. Also,
1200@kbd{C-u M-# g} interprets the region as a single number or
1201formula.
1202
1203The @kbd{M-# r} command reads a rectangle, with the point and
1204mark defining opposite corners of the rectangle. The result
1205is a matrix of numbers on the Calculator stack.
1206
1207Complementary to these is @kbd{M-# y}, which ``yanks'' the
1208value at the top of the Calc stack back into an editing buffer.
1209If you type @w{@kbd{M-# y}} while in such a buffer, the value is
1210yanked at the current position. If you type @kbd{M-# y} while
1211in the Calc buffer, Calc makes an educated guess as to which
1212editing buffer you want to use. The Calc window does not have
1213to be visible in order to use this command, as long as there
1214is something on the Calc stack.
1215
1216Here, for reference, is the complete list of @kbd{M-#} commands.
1217The shift, control, and meta keys are ignored for the keystroke
1218following @kbd{M-#}.
1219
1220@noindent
1221Commands for turning Calc on and off:
1222
1223@table @kbd
1224@item #
1225Turn Calc on or off, employing the same user interface as last time.
1226
1227@item C
1228Turn Calc on or off using its standard bottom-of-the-screen
1229interface. If Calc is already turned on but the cursor is not
1230in the Calc window, move the cursor into the window.
1231
1232@item O
1233Same as @kbd{C}, but don't select the new Calc window. If
1234Calc is already turned on and the cursor is in the Calc window,
1235move it out of that window.
1236
1237@item B
1238Control whether @kbd{M-# c} and @kbd{M-# k} use the full screen.
1239
1240@item Q
1241Use Quick Mode for a single short calculation.
1242
1243@item K
1244Turn Calc Keypad mode on or off.
1245
1246@item E
1247Turn Calc Embedded mode on or off at the current formula.
1248
1249@item J
1250Turn Calc Embedded mode on or off, select the interesting part.
1251
1252@item W
1253Turn Calc Embedded mode on or off at the current word (number).
1254
1255@item Z
1256Turn Calc on in a user-defined way, as defined by a @kbd{Z I} command.
1257
1258@item X
1259Quit Calc; turn off standard, Keypad, or Embedded mode if on.
1260(This is like @kbd{q} or @key{OFF} inside of Calc.)
1261@end table
1262@iftex
1263@sp 2
1264@end iftex
1265
d7b8e6c6
EZ
1266@noindent
1267Commands for moving data into and out of the Calculator:
1268
1269@table @kbd
1270@item G
1271Grab the region into the Calculator as a vector.
1272
1273@item R
1274Grab the rectangular region into the Calculator as a matrix.
1275
1276@item :
1277Grab the rectangular region and compute the sums of its columns.
1278
1279@item _
1280Grab the rectangular region and compute the sums of its rows.
1281
1282@item Y
1283Yank a value from the Calculator into the current editing buffer.
1284@end table
1285@iftex
1286@sp 2
1287@end iftex
d7b8e6c6 1288
d7b8e6c6
EZ
1289@noindent
1290Commands for use with Embedded Mode:
1291
1292@table @kbd
1293@item A
1294``Activate'' the current buffer. Locate all formulas that
1295contain @samp{:=} or @samp{=>} symbols and record their locations
1296so that they can be updated automatically as variables are changed.
1297
1298@item D
1299Duplicate the current formula immediately below and select
1300the duplicate.
1301
1302@item F
1303Insert a new formula at the current point.
1304
1305@item N
1306Move the cursor to the next active formula in the buffer.
1307
1308@item P
1309Move the cursor to the previous active formula in the buffer.
1310
1311@item U
1312Update (i.e., as if by the @kbd{=} key) the formula at the current point.
1313
1314@item `
1315Edit (as if by @code{calc-edit}) the formula at the current point.
1316@end table
1317@iftex
1318@sp 2
1319@end iftex
d7b8e6c6 1320
d7b8e6c6
EZ
1321@noindent
1322Miscellaneous commands:
1323
1324@table @kbd
1325@item I
1326Run the Emacs Info system to read the Calc manual.
1327(This is the same as @kbd{h i} inside of Calc.)
1328
1329@item T
1330Run the Emacs Info system to read the Calc Tutorial.
1331
1332@item S
1333Run the Emacs Info system to read the Calc Summary.
1334
1335@item L
1336Load Calc entirely into memory. (Normally the various parts
1337are loaded only as they are needed.)
1338
1339@item M
5d67986c 1340Read a region of written keystroke names (like @kbd{C-n a b c @key{RET}})
d7b8e6c6
EZ
1341and record them as the current keyboard macro.
1342
1343@item 0
1344(This is the ``zero'' digit key.) Reset the Calculator to
1345its default state: Empty stack, and default mode settings.
1346With any prefix argument, reset everything but the stack.
1347@end table
d7b8e6c6
EZ
1348
1349@node History and Acknowledgements, , Using Calc, Getting Started
1350@section History and Acknowledgements
1351
1352@noindent
1353Calc was originally started as a two-week project to occupy a lull
1354in the author's schedule. Basically, a friend asked if I remembered
1355the value of @c{$2^{32}$}
1356@cite{2^32}. I didn't offhand, but I said, ``that's
1357easy, just call up an @code{xcalc}.'' @code{Xcalc} duly reported
1358that the answer to our question was @samp{4.294967e+09}---with no way to
1359see the full ten digits even though we knew they were there in the
1360program's memory! I was so annoyed, I vowed to write a calculator
1361of my own, once and for all.
1362
1363I chose Emacs Lisp, a) because I had always been curious about it
1364and b) because, being only a text editor extension language after
1365all, Emacs Lisp would surely reach its limits long before the project
1366got too far out of hand.
1367
1368To make a long story short, Emacs Lisp turned out to be a distressingly
1369solid implementation of Lisp, and the humble task of calculating
1370turned out to be more open-ended than one might have expected.
1371
1372Emacs Lisp doesn't have built-in floating point math, so it had to be
1373simulated in software. In fact, Emacs integers will only comfortably
1374fit six decimal digits or so---not enough for a decent calculator. So
1375I had to write my own high-precision integer code as well, and once I had
1376this I figured that arbitrary-size integers were just as easy as large
1377integers. Arbitrary floating-point precision was the logical next step.
1378Also, since the large integer arithmetic was there anyway it seemed only
1379fair to give the user direct access to it, which in turn made it practical
1380to support fractions as well as floats. All these features inspired me
1381to look around for other data types that might be worth having.
1382
1383Around this time, my friend Rick Koshi showed me his nifty new HP-28
1384calculator. It allowed the user to manipulate formulas as well as
1385numerical quantities, and it could also operate on matrices. I decided
1386that these would be good for Calc to have, too. And once things had
1387gone this far, I figured I might as well take a look at serious algebra
1388systems like Mathematica, Macsyma, and Maple for further ideas. Since
1389these systems did far more than I could ever hope to implement, I decided
1390to focus on rewrite rules and other programming features so that users
1391could implement what they needed for themselves.
1392
1393Rick complained that matrices were hard to read, so I put in code to
1394format them in a 2D style. Once these routines were in place, Big mode
1395was obligatory. Gee, what other language modes would be useful?
1396
1397Scott Hemphill and Allen Knutson, two friends with a strong mathematical
1398bent, contributed ideas and algorithms for a number of Calc features
1399including modulo forms, primality testing, and float-to-fraction conversion.
1400
1401Units were added at the eager insistence of Mass Sivilotti. Later,
1402Ulrich Mueller at CERN and Przemek Klosowski at NIST provided invaluable
1403expert assistance with the units table. As far as I can remember, the
1404idea of using algebraic formulas and variables to represent units dates
1405back to an ancient article in Byte magazine about muMath, an early
1406algebra system for microcomputers.
1407
1408Many people have contributed to Calc by reporting bugs and suggesting
1409features, large and small. A few deserve special mention: Tim Peters,
1410who helped develop the ideas that led to the selection commands, rewrite
1411rules, and many other algebra features; @c{Fran\c cois}
1412@asis{Francois} Pinard, who contributed
1413an early prototype of the Calc Summary appendix as well as providing
1414valuable suggestions in many other areas of Calc; Carl Witty, whose eagle
1415eyes discovered many typographical and factual errors in the Calc manual;
1416Tim Kay, who drove the development of Embedded mode; Ove Ewerlid, who
1417made many suggestions relating to the algebra commands and contributed
1418some code for polynomial operations; Randal Schwartz, who suggested the
1419@code{calc-eval} function; Robert J. Chassell, who suggested the Calc
1420Tutorial and exercises; and Juha Sarlin, who first worked out how to split
1421Calc into quickly-loading parts. Bob Weiner helped immensely with the
1422Lucid Emacs port.
1423
1424@cindex Bibliography
1425@cindex Knuth, Art of Computer Programming
1426@cindex Numerical Recipes
1427@c Should these be expanded into more complete references?
1428Among the books used in the development of Calc were Knuth's @emph{Art
1429of Computer Programming} (especially volume II, @emph{Seminumerical
1430Algorithms}); @emph{Numerical Recipes} by Press, Flannery, Teukolsky,
1431and Vetterling; Bevington's @emph{Data Reduction and Error Analysis for
1432the Physical Sciences}; @emph{Concrete Mathematics} by Graham, Knuth,
1433and Patashnik; Steele's @emph{Common Lisp, the Language}; the @emph{CRC
1434Standard Math Tables} (William H. Beyer, ed.); and Abramowitz and
1435Stegun's venerable @emph{Handbook of Mathematical Functions}. I
1436consulted the user's manuals for the HP-28 and HP-48 calculators, as
1437well as for the programs Mathematica, SMP, Macsyma, Maple, MathCAD,
1438Gnuplot, and others. Also, of course, Calc could not have been written
1439without the excellent @emph{GNU Emacs Lisp Reference Manual}, by Bil
1440Lewis and Dan LaLiberte.
1441
1442Final thanks go to Richard Stallman, without whose fine implementations
1443of the Emacs editor, language, and environment, Calc would have been
1444finished in two weeks.
1445
1446@c [tutorial]
1447
1448@ifinfo
1449@c This node is accessed by the `M-# t' command.
1450@node Interactive Tutorial, , , Top
1451@chapter Tutorial
1452
1453@noindent
1454Some brief instructions on using the Emacs Info system for this tutorial:
1455
1456Press the space bar and Delete keys to go forward and backward in a
1457section by screenfuls (or use the regular Emacs scrolling commands
1458for this).
1459
1460Press @kbd{n} or @kbd{p} to go to the Next or Previous section.
1461If the section has a @dfn{menu}, press a digit key like @kbd{1}
1462or @kbd{2} to go to a sub-section from the menu. Press @kbd{u} to
1463go back up from a sub-section to the menu it is part of.
1464
1465Exercises in the tutorial all have cross-references to the
1466appropriate page of the ``answers'' section. Press @kbd{f}, then
1467the exercise number, to see the answer to an exercise. After
1468you have followed a cross-reference, you can press the letter
1469@kbd{l} to return to where you were before.
1470
1471You can press @kbd{?} at any time for a brief summary of Info commands.
1472
1473Press @kbd{1} now to enter the first section of the Tutorial.
1474
1475@menu
1476* Tutorial::
1477@end menu
1478@end ifinfo
1479
1480@node Tutorial, Introduction, Getting Started, Top
1481@chapter Tutorial
1482
1483@noindent
1484This chapter explains how to use Calc and its many features, in
1485a step-by-step, tutorial way. You are encouraged to run Calc and
1486work along with the examples as you read (@pxref{Starting Calc}).
1487If you are already familiar with advanced calculators, you may wish
1488@c [not-split]
1489to skip on to the rest of this manual.
1490@c [when-split]
1491@c to skip on to volume II of this manual, the @dfn{Calc Reference}.
1492
1493@c [fix-ref Embedded Mode]
1494This tutorial describes the standard user interface of Calc only.
1495The ``Quick Mode'' and ``Keypad Mode'' interfaces are fairly
1496self-explanatory. @xref{Embedded Mode}, for a description of
1497the ``Embedded Mode'' interface.
1498
1499@ifinfo
1500The easiest way to read this tutorial on-line is to have two windows on
1501your Emacs screen, one with Calc and one with the Info system. (If you
1502have a printed copy of the manual you can use that instead.) Press
1503@kbd{M-# c} to turn Calc on or to switch into the Calc window, and
1504press @kbd{M-# i} to start the Info system or to switch into its window.
1505Or, you may prefer to use the tutorial in printed form.
1506@end ifinfo
1507@iftex
1508The easiest way to read this tutorial on-line is to have two windows on
1509your Emacs screen, one with Calc and one with the Info system. (If you
1510have a printed copy of the manual you can use that instead.) Press
1511@kbd{M-# c} to turn Calc on or to switch into the Calc window, and
1512press @kbd{M-# i} to start the Info system or to switch into its window.
1513@end iftex
1514
1515This tutorial is designed to be done in sequence. But the rest of this
1516manual does not assume you have gone through the tutorial. The tutorial
1517does not cover everything in the Calculator, but it touches on most
1518general areas.
1519
1520@ifinfo
1521You may wish to print out a copy of the Calc Summary and keep notes on
1522it as you learn Calc. @xref{Installation}, to see how to make a printed
1523summary. @xref{Summary}.
1524@end ifinfo
1525@iftex
1526The Calc Summary at the end of the reference manual includes some blank
1527space for your own use. You may wish to keep notes there as you learn
1528Calc.
1529@end iftex
1530
1531@menu
1532* Basic Tutorial::
1533* Arithmetic Tutorial::
1534* Vector/Matrix Tutorial::
1535* Types Tutorial::
1536* Algebra Tutorial::
1537* Programming Tutorial::
1538
1539* Answers to Exercises::
1540@end menu
1541
1542@node Basic Tutorial, Arithmetic Tutorial, Tutorial, Tutorial
1543@section Basic Tutorial
1544
1545@noindent
1546In this section, we learn how RPN and algebraic-style calculations
1547work, how to undo and redo an operation done by mistake, and how
1548to control various modes of the Calculator.
1549
1550@menu
1551* RPN Tutorial:: Basic operations with the stack.
1552* Algebraic Tutorial:: Algebraic entry; variables.
1553* Undo Tutorial:: If you make a mistake: Undo and the trail.
1554* Modes Tutorial:: Common mode-setting commands.
1555@end menu
1556
1557@node RPN Tutorial, Algebraic Tutorial, Basic Tutorial, Basic Tutorial
1558@subsection RPN Calculations and the Stack
1559
1560@cindex RPN notation
1561@ifinfo
1562@noindent
1563Calc normally uses RPN notation. You may be familiar with the RPN
1564system from Hewlett-Packard calculators, FORTH, or PostScript.
1565(Reverse Polish Notation, RPN, is named after the Polish mathematician
1566Jan Lukasiewicz.)
1567@end ifinfo
1568@tex
1569\noindent
1570Calc normally uses RPN notation. You may be familiar with the RPN
1571system from Hewlett-Packard calculators, FORTH, or PostScript.
1572(Reverse Polish Notation, RPN, is named after the Polish mathematician
1573Jan \L ukasiewicz.)
1574@end tex
1575
1576The central component of an RPN calculator is the @dfn{stack}. A
1577calculator stack is like a stack of dishes. New dishes (numbers) are
1578added at the top of the stack, and numbers are normally only removed
1579from the top of the stack.
1580
1581@cindex Operators
1582@cindex Operands
1583In an operation like @cite{2+3}, the 2 and 3 are called the @dfn{operands}
1584and the @cite{+} is the @dfn{operator}. In an RPN calculator you always
1585enter the operands first, then the operator. Each time you type a
1586number, Calc adds or @dfn{pushes} it onto the top of the Stack.
1587When you press an operator key like @kbd{+}, Calc @dfn{pops} the appropriate
1588number of operands from the stack and pushes back the result.
1589
1590Thus we could add the numbers 2 and 3 in an RPN calculator by typing:
1591@kbd{2 @key{RET} 3 @key{RET} +}. (The @key{RET} key, Return, corresponds to
1592the @key{ENTER} key on traditional RPN calculators.) Try this now if
1593you wish; type @kbd{M-# c} to switch into the Calc window (you can type
1594@kbd{M-# c} again or @kbd{M-# o} to switch back to the Tutorial window).
1595The first four keystrokes ``push'' the numbers 2 and 3 onto the stack.
1596The @kbd{+} key ``pops'' the top two numbers from the stack, adds them,
1597and pushes the result (5) back onto the stack. Here's how the stack
1598will look at various points throughout the calculation:@refill
1599
d7b8e6c6 1600@smallexample
5d67986c 1601@group
d7b8e6c6
EZ
1602 . 1: 2 2: 2 1: 5 .
1603 . 1: 3 .
1604 .
1605
5d67986c 1606 M-# c 2 @key{RET} 3 @key{RET} + @key{DEL}
d7b8e6c6 1607@end group
5d67986c 1608@end smallexample
d7b8e6c6
EZ
1609
1610The @samp{.} symbol is a marker that represents the top of the stack.
1611Note that the ``top'' of the stack is really shown at the bottom of
1612the Stack window. This may seem backwards, but it turns out to be
1613less distracting in regular use.
1614
1615@cindex Stack levels
1616@cindex Levels of stack
1617The numbers @samp{1:} and @samp{2:} on the left are @dfn{stack level
1618numbers}. Old RPN calculators always had four stack levels called
1619@cite{x}, @cite{y}, @cite{z}, and @cite{t}. Calc's stack can grow
1620as large as you like, so it uses numbers instead of letters. Some
1621stack-manipulation commands accept a numeric argument that says
1622which stack level to work on. Normal commands like @kbd{+} always
1623work on the top few levels of the stack.@refill
1624
1625@c [fix-ref Truncating the Stack]
1626The Stack buffer is just an Emacs buffer, and you can move around in
1627it using the regular Emacs motion commands. But no matter where the
1628cursor is, even if you have scrolled the @samp{.} marker out of
1629view, most Calc commands always move the cursor back down to level 1
1630before doing anything. It is possible to move the @samp{.} marker
1631upwards through the stack, temporarily ``hiding'' some numbers from
1632commands like @kbd{+}. This is called @dfn{stack truncation} and
1633we will not cover it in this tutorial; @pxref{Truncating the Stack},
1634if you are interested.
1635
1636You don't really need the second @key{RET} in @kbd{2 @key{RET} 3
1637@key{RET} +}. That's because if you type any operator name or
1638other non-numeric key when you are entering a number, the Calculator
1639automatically enters that number and then does the requested command.
1640Thus @kbd{2 @key{RET} 3 +} will work just as well.@refill
1641
1642Examples in this tutorial will often omit @key{RET} even when the
1643stack displays shown would only happen if you did press @key{RET}:
1644
d7b8e6c6 1645@smallexample
5d67986c 1646@group
d7b8e6c6
EZ
16471: 2 2: 2 1: 5
1648 . 1: 3 .
1649 .
1650
5d67986c 1651 2 @key{RET} 3 +
d7b8e6c6 1652@end group
5d67986c 1653@end smallexample
d7b8e6c6
EZ
1654
1655@noindent
1656Here, after pressing @kbd{3} the stack would really show @samp{1: 2}
1657with @samp{Calc:@: 3} in the minibuffer. In these situations, you can
1658press the optional @key{RET} to see the stack as the figure shows.
1659
1660(@bullet{}) @strong{Exercise 1.} (This tutorial will include exercises
1661at various points. Try them if you wish. Answers to all the exercises
1662are located at the end of the Tutorial chapter. Each exercise will
1663include a cross-reference to its particular answer. If you are
1664reading with the Emacs Info system, press @kbd{f} and the
1665exercise number to go to the answer, then the letter @kbd{l} to
1666return to where you were.)
1667
1668@noindent
1669Here's the first exercise: What will the keystrokes @kbd{1 @key{RET} 2
1670@key{RET} 3 @key{RET} 4 + * -} compute? (@samp{*} is the symbol for
1671multiplication.) Figure it out by hand, then try it with Calc to see
1672if you're right. @xref{RPN Answer 1, 1}. (@bullet{})
1673
1674(@bullet{}) @strong{Exercise 2.} Compute @c{$(2\times4) + (7\times9.4) + {5\over4}$}
1675@cite{2*4 + 7*9.5 + 5/4} using the
1676stack. @xref{RPN Answer 2, 2}. (@bullet{})
1677
1678The @key{DEL} key is called Backspace on some keyboards. It is
1679whatever key you would use to correct a simple typing error when
1680regularly using Emacs. The @key{DEL} key pops and throws away the
1681top value on the stack. (You can still get that value back from
1682the Trail if you should need it later on.) There are many places
1683in this tutorial where we assume you have used @key{DEL} to erase the
1684results of the previous example at the beginning of a new example.
1685In the few places where it is really important to use @key{DEL} to
1686clear away old results, the text will remind you to do so.
1687
1688(It won't hurt to let things accumulate on the stack, except that
1689whenever you give a display-mode-changing command Calc will have to
1690spend a long time reformatting such a large stack.)
1691
1692Since the @kbd{-} key is also an operator (it subtracts the top two
1693stack elements), how does one enter a negative number? Calc uses
1694the @kbd{_} (underscore) key to act like the minus sign in a number.
1695So, typing @kbd{-5 @key{RET}} won't work because the @kbd{-} key
1696will try to do a subtraction, but @kbd{_5 @key{RET}} works just fine.
1697
1698You can also press @kbd{n}, which means ``change sign.'' It changes
1699the number at the top of the stack (or the number being entered)
1700from positive to negative or vice-versa: @kbd{5 n @key{RET}}.
1701
1702@cindex Duplicating a stack entry
1703If you press @key{RET} when you're not entering a number, the effect
1704is to duplicate the top number on the stack. Consider this calculation:
1705
d7b8e6c6 1706@smallexample
5d67986c 1707@group
d7b8e6c6
EZ
17081: 3 2: 3 1: 9 2: 9 1: 81
1709 . 1: 3 . 1: 9 .
1710 . .
1711
5d67986c 1712 3 @key{RET} @key{RET} * @key{RET} *
d7b8e6c6 1713@end group
5d67986c 1714@end smallexample
d7b8e6c6
EZ
1715
1716@noindent
1717(Of course, an easier way to do this would be @kbd{3 @key{RET} 4 ^},
1718to raise 3 to the fourth power.)
1719
1720The space-bar key (denoted @key{SPC} here) performs the same function
1721as @key{RET}; you could replace all three occurrences of @key{RET} in
1722the above example with @key{SPC} and the effect would be the same.
1723
1724@cindex Exchanging stack entries
1725Another stack manipulation key is @key{TAB}. This exchanges the top
1726two stack entries. Suppose you have computed @kbd{2 @key{RET} 3 +}
1727to get 5, and then you realize what you really wanted to compute
1728was @cite{20 / (2+3)}.
1729
d7b8e6c6 1730@smallexample
5d67986c 1731@group
d7b8e6c6
EZ
17321: 5 2: 5 2: 20 1: 4
1733 . 1: 20 1: 5 .
1734 . .
1735
5d67986c 1736 2 @key{RET} 3 + 20 @key{TAB} /
d7b8e6c6 1737@end group
5d67986c 1738@end smallexample
d7b8e6c6
EZ
1739
1740@noindent
1741Planning ahead, the calculation would have gone like this:
1742
d7b8e6c6 1743@smallexample
5d67986c 1744@group
d7b8e6c6
EZ
17451: 20 2: 20 3: 20 2: 20 1: 4
1746 . 1: 2 2: 2 1: 5 .
1747 . 1: 3 .
1748 .
1749
5d67986c 1750 20 @key{RET} 2 @key{RET} 3 + /
d7b8e6c6 1751@end group
5d67986c 1752@end smallexample
d7b8e6c6
EZ
1753
1754A related stack command is @kbd{M-@key{TAB}} (hold @key{META} and type
1755@key{TAB}). It rotates the top three elements of the stack upward,
1756bringing the object in level 3 to the top.
1757
d7b8e6c6 1758@smallexample
5d67986c 1759@group
d7b8e6c6
EZ
17601: 10 2: 10 3: 10 3: 20 3: 30
1761 . 1: 20 2: 20 2: 30 2: 10
1762 . 1: 30 1: 10 1: 20
1763 . . .
1764
5d67986c 1765 10 @key{RET} 20 @key{RET} 30 @key{RET} M-@key{TAB} M-@key{TAB}
d7b8e6c6 1766@end group
5d67986c 1767@end smallexample
d7b8e6c6
EZ
1768
1769(@bullet{}) @strong{Exercise 3.} Suppose the numbers 10, 20, and 30 are
1770on the stack. Figure out how to add one to the number in level 2
1771without affecting the rest of the stack. Also figure out how to add
1772one to the number in level 3. @xref{RPN Answer 3, 3}. (@bullet{})
1773
1774Operations like @kbd{+}, @kbd{-}, @kbd{*}, @kbd{/}, and @kbd{^} pop two
1775arguments from the stack and push a result. Operations like @kbd{n} and
1776@kbd{Q} (square root) pop a single number and push the result. You can
1777think of them as simply operating on the top element of the stack.
1778
d7b8e6c6 1779@smallexample
5d67986c 1780@group
d7b8e6c6
EZ
17811: 3 1: 9 2: 9 1: 25 1: 5
1782 . . 1: 16 . .
1783 .
1784
5d67986c 1785 3 @key{RET} @key{RET} * 4 @key{RET} @key{RET} * + Q
d7b8e6c6 1786@end group
5d67986c 1787@end smallexample
d7b8e6c6
EZ
1788
1789@noindent
1790(Note that capital @kbd{Q} means to hold down the Shift key while
1791typing @kbd{q}. Remember, plain unshifted @kbd{q} is the Quit command.)
1792
1793@cindex Pythagorean Theorem
1794Here we've used the Pythagorean Theorem to determine the hypotenuse of a
1795right triangle. Calc actually has a built-in command for that called
1796@kbd{f h}, but let's suppose we can't remember the necessary keystrokes.
1797We can still enter it by its full name using @kbd{M-x} notation:
1798
d7b8e6c6 1799@smallexample
5d67986c 1800@group
d7b8e6c6
EZ
18011: 3 2: 3 1: 5
1802 . 1: 4 .
1803 .
1804
5d67986c 1805 3 @key{RET} 4 @key{RET} M-x calc-hypot
d7b8e6c6 1806@end group
5d67986c 1807@end smallexample
d7b8e6c6
EZ
1808
1809All Calculator commands begin with the word @samp{calc-}. Since it
1810gets tiring to type this, Calc provides an @kbd{x} key which is just
1811like the regular Emacs @kbd{M-x} key except that it types the @samp{calc-}
1812prefix for you:
1813
d7b8e6c6 1814@smallexample
5d67986c 1815@group
d7b8e6c6
EZ
18161: 3 2: 3 1: 5
1817 . 1: 4 .
1818 .
1819
5d67986c 1820 3 @key{RET} 4 @key{RET} x hypot
d7b8e6c6 1821@end group
5d67986c 1822@end smallexample
d7b8e6c6
EZ
1823
1824What happens if you take the square root of a negative number?
1825
d7b8e6c6 1826@smallexample
5d67986c 1827@group
d7b8e6c6
EZ
18281: 4 1: -4 1: (0, 2)
1829 . . .
1830
5d67986c 1831 4 @key{RET} n Q
d7b8e6c6 1832@end group
5d67986c 1833@end smallexample
d7b8e6c6
EZ
1834
1835@noindent
1836The notation @cite{(a, b)} represents a complex number.
1837Complex numbers are more traditionally written @c{$a + b i$}
1838@cite{a + b i};
1839Calc can display in this format, too, but for now we'll stick to the
1840@cite{(a, b)} notation.
1841
1842If you don't know how complex numbers work, you can safely ignore this
1843feature. Complex numbers only arise from operations that would be
1844errors in a calculator that didn't have complex numbers. (For example,
1845taking the square root or logarithm of a negative number produces a
1846complex result.)
1847
1848Complex numbers are entered in the notation shown. The @kbd{(} and
1849@kbd{,} and @kbd{)} keys manipulate ``incomplete complex numbers.''
1850
d7b8e6c6 1851@smallexample
5d67986c 1852@group
d7b8e6c6
EZ
18531: ( ... 2: ( ... 1: (2, ... 1: (2, ... 1: (2, 3)
1854 . 1: 2 . 3 .
1855 . .
1856
1857 ( 2 , 3 )
d7b8e6c6 1858@end group
5d67986c 1859@end smallexample
d7b8e6c6
EZ
1860
1861You can perform calculations while entering parts of incomplete objects.
1862However, an incomplete object cannot actually participate in a calculation:
1863
d7b8e6c6 1864@smallexample
5d67986c 1865@group
d7b8e6c6
EZ
18661: ( ... 2: ( ... 3: ( ... 1: ( ... 1: ( ...
1867 . 1: 2 2: 2 5 5
1868 . 1: 3 . .
1869 .
1870 (error)
5d67986c 1871 ( 2 @key{RET} 3 + +
d7b8e6c6 1872@end group
5d67986c 1873@end smallexample
d7b8e6c6
EZ
1874
1875@noindent
1876Adding 5 to an incomplete object makes no sense, so the last command
1877produces an error message and leaves the stack the same.
1878
1879Incomplete objects can't participate in arithmetic, but they can be
1880moved around by the regular stack commands.
1881
d7b8e6c6 1882@smallexample
5d67986c 1883@group
d7b8e6c6
EZ
18842: 2 3: 2 3: 3 1: ( ... 1: (2, 3)
18851: 3 2: 3 2: ( ... 2 .
1886 . 1: ( ... 1: 2 3
1887 . . .
1888
5d67986c 18892 @key{RET} 3 @key{RET} ( M-@key{TAB} M-@key{TAB} )
d7b8e6c6 1890@end group
5d67986c 1891@end smallexample
d7b8e6c6
EZ
1892
1893@noindent
1894Note that the @kbd{,} (comma) key did not have to be used here.
1895When you press @kbd{)} all the stack entries between the incomplete
1896entry and the top are collected, so there's never really a reason
1897to use the comma. It's up to you.
1898
1899(@bullet{}) @strong{Exercise 4.} To enter the complex number @cite{(2, 3)},
1900your friend Joe typed @kbd{( 2 , @key{SPC} 3 )}. What happened?
1901(Joe thought of a clever way to correct his mistake in only two
1902keystrokes, but it didn't quite work. Try it to find out why.)
1903@xref{RPN Answer 4, 4}. (@bullet{})
1904
1905Vectors are entered the same way as complex numbers, but with square
1906brackets in place of parentheses. We'll meet vectors again later in
1907the tutorial.
1908
1909Any Emacs command can be given a @dfn{numeric prefix argument} by
1910typing a series of @key{META}-digits beforehand. If @key{META} is
1911awkward for you, you can instead type @kbd{C-u} followed by the
1912necessary digits. Numeric prefix arguments can be negative, as in
1913@kbd{M-- M-3 M-5} or @w{@kbd{C-u - 3 5}}. Calc commands use numeric
1914prefix arguments in a variety of ways. For example, a numeric prefix
1915on the @kbd{+} operator adds any number of stack entries at once:
1916
d7b8e6c6 1917@smallexample
5d67986c 1918@group
d7b8e6c6
EZ
19191: 10 2: 10 3: 10 3: 10 1: 60
1920 . 1: 20 2: 20 2: 20 .
1921 . 1: 30 1: 30
1922 . .
1923
5d67986c 1924 10 @key{RET} 20 @key{RET} 30 @key{RET} C-u 3 +
d7b8e6c6 1925@end group
5d67986c 1926@end smallexample
d7b8e6c6
EZ
1927
1928For stack manipulation commands like @key{RET}, a positive numeric
1929prefix argument operates on the top @var{n} stack entries at once. A
1930negative argument operates on the entry in level @var{n} only. An
1931argument of zero operates on the entire stack. In this example, we copy
1932the second-to-top element of the stack:
1933
d7b8e6c6 1934@smallexample
5d67986c 1935@group
d7b8e6c6
EZ
19361: 10 2: 10 3: 10 3: 10 4: 10
1937 . 1: 20 2: 20 2: 20 3: 20
1938 . 1: 30 1: 30 2: 30
1939 . . 1: 20
1940 .
1941
5d67986c 1942 10 @key{RET} 20 @key{RET} 30 @key{RET} C-u -2 @key{RET}
d7b8e6c6 1943@end group
5d67986c 1944@end smallexample
d7b8e6c6
EZ
1945
1946@cindex Clearing the stack
1947@cindex Emptying the stack
5d67986c 1948Another common idiom is @kbd{M-0 @key{DEL}}, which clears the stack.
d7b8e6c6
EZ
1949(The @kbd{M-0} numeric prefix tells @key{DEL} to operate on the
1950entire stack.)
1951
1952@node Algebraic Tutorial, Undo Tutorial, RPN Tutorial, Basic Tutorial
1953@subsection Algebraic-Style Calculations
1954
1955@noindent
1956If you are not used to RPN notation, you may prefer to operate the
1957Calculator in ``algebraic mode,'' which is closer to the way
1958non-RPN calculators work. In algebraic mode, you enter formulas
1959in traditional @cite{2+3} notation.
1960
1961You don't really need any special ``mode'' to enter algebraic formulas.
1962You can enter a formula at any time by pressing the apostrophe (@kbd{'})
1963key. Answer the prompt with the desired formula, then press @key{RET}.
1964The formula is evaluated and the result is pushed onto the RPN stack.
1965If you don't want to think in RPN at all, you can enter your whole
1966computation as a formula, read the result from the stack, then press
1967@key{DEL} to delete it from the stack.
1968
1969Try pressing the apostrophe key, then @kbd{2+3+4}, then @key{RET}.
1970The result should be the number 9.
1971
1972Algebraic formulas use the operators @samp{+}, @samp{-}, @samp{*},
1973@samp{/}, and @samp{^}. You can use parentheses to make the order
1974of evaluation clear. In the absence of parentheses, @samp{^} is
1975evaluated first, then @samp{*}, then @samp{/}, then finally
1976@samp{+} and @samp{-}. For example, the expression
1977
1978@example
19792 + 3*4*5 / 6*7^8 - 9
1980@end example
1981
1982@noindent
1983is equivalent to
1984
1985@example
19862 + ((3*4*5) / (6*(7^8)) - 9
1987@end example
1988
1989@noindent
1990or, in large mathematical notation,
1991
1992@ifinfo
d7b8e6c6 1993@example
5d67986c 1994@group
d7b8e6c6
EZ
1995 3 * 4 * 5
19962 + --------- - 9
1997 8
1998 6 * 7
d7b8e6c6 1999@end group
5d67986c 2000@end example
d7b8e6c6
EZ
2001@end ifinfo
2002@tex
2003\turnoffactive
2004\beforedisplay
2005$$ 2 + { 3 \times 4 \times 5 \over 6 \times 7^8 } - 9 $$
2006\afterdisplay
2007@end tex
2008
2009@noindent
2010The result of this expression will be the number @i{-6.99999826533}.
2011
2012Calc's order of evaluation is the same as for most computer languages,
2013except that @samp{*} binds more strongly than @samp{/}, as the above
2014example shows. As in normal mathematical notation, the @samp{*} symbol
2015can often be omitted: @samp{2 a} is the same as @samp{2*a}.
2016
2017Operators at the same level are evaluated from left to right, except
2018that @samp{^} is evaluated from right to left. Thus, @samp{2-3-4} is
2019equivalent to @samp{(2-3)-4} or @i{-5}, whereas @samp{2^3^4} is equivalent
2020to @samp{2^(3^4)} (a very large integer; try it!).
2021
2022If you tire of typing the apostrophe all the time, there is an
2023``algebraic mode'' you can select in which Calc automatically senses
2024when you are about to type an algebraic expression. To enter this
2025mode, press the two letters @w{@kbd{m a}}. (An @samp{Alg} indicator
2026should appear in the Calc window's mode line.)
2027
2028Press @kbd{m a}, then @kbd{2+3+4} with no apostrophe, then @key{RET}.
2029
2030In algebraic mode, when you press any key that would normally begin
2031entering a number (such as a digit, a decimal point, or the @kbd{_}
2032key), or if you press @kbd{(} or @kbd{[}, Calc automatically begins
2033an algebraic entry.
2034
2035Functions which do not have operator symbols like @samp{+} and @samp{*}
2036must be entered in formulas using function-call notation. For example,
2037the function name corresponding to the square-root key @kbd{Q} is
2038@code{sqrt}. To compute a square root in a formula, you would use
2039the notation @samp{sqrt(@var{x})}.
2040
2041Press the apostrophe, then type @kbd{sqrt(5*2) - 3}. The result should
2042be @cite{0.16227766017}.
2043
2044Note that if the formula begins with a function name, you need to use
2045the apostrophe even if you are in algebraic mode. If you type @kbd{arcsin}
2046out of the blue, the @kbd{a r} will be taken as an Algebraic Rewrite
2047command, and the @kbd{csin} will be taken as the name of the rewrite
2048rule to use!
2049
2050Some people prefer to enter complex numbers and vectors in algebraic
2051form because they find RPN entry with incomplete objects to be too
2052distracting, even though they otherwise use Calc as an RPN calculator.
2053
2054Still in algebraic mode, type:
2055
d7b8e6c6 2056@smallexample
5d67986c 2057@group
d7b8e6c6
EZ
20581: (2, 3) 2: (2, 3) 1: (8, -1) 2: (8, -1) 1: (9, -1)
2059 . 1: (1, -2) . 1: 1 .
2060 . .
2061
5d67986c 2062 (2,3) @key{RET} (1,-2) @key{RET} * 1 @key{RET} +
d7b8e6c6 2063@end group
5d67986c 2064@end smallexample
d7b8e6c6
EZ
2065
2066Algebraic mode allows us to enter complex numbers without pressing
2067an apostrophe first, but it also means we need to press @key{RET}
2068after every entry, even for a simple number like @cite{1}.
2069
2070(You can type @kbd{C-u m a} to enable a special ``incomplete algebraic
2071mode'' in which the @kbd{(} and @kbd{[} keys use algebraic entry even
2072though regular numeric keys still use RPN numeric entry. There is also
2073a ``total algebraic mode,'' started by typing @kbd{m t}, in which all
2074normal keys begin algebraic entry. You must then use the @key{META} key
2075to type Calc commands: @kbd{M-m t} to get back out of total algebraic
2076mode, @kbd{M-q} to quit, etc. Total algebraic mode is not supported
2077under Emacs 19.)
2078
2079If you're still in algebraic mode, press @kbd{m a} again to turn it off.
2080
2081Actual non-RPN calculators use a mixture of algebraic and RPN styles.
2082In general, operators of two numbers (like @kbd{+} and @kbd{*})
2083use algebraic form, but operators of one number (like @kbd{n} and @kbd{Q})
2084use RPN form. Also, a non-RPN calculator allows you to see the
2085intermediate results of a calculation as you go along. You can
2086accomplish this in Calc by performing your calculation as a series
2087of algebraic entries, using the @kbd{$} sign to tie them together.
2088In an algebraic formula, @kbd{$} represents the number on the top
2089of the stack. Here, we perform the calculation @c{$\sqrt{2\times4+1}$}
2090@cite{sqrt(2*4+1)},
2091which on a traditional calculator would be done by pressing
2092@kbd{2 * 4 + 1 =} and then the square-root key.
2093
d7b8e6c6 2094@smallexample
5d67986c 2095@group
d7b8e6c6
EZ
20961: 8 1: 9 1: 3
2097 . . .
2098
5d67986c 2099 ' 2*4 @key{RET} $+1 @key{RET} Q
d7b8e6c6 2100@end group
5d67986c 2101@end smallexample
d7b8e6c6
EZ
2102
2103@noindent
2104Notice that we didn't need to press an apostrophe for the @kbd{$+1},
2105because the dollar sign always begins an algebraic entry.
2106
2107(@bullet{}) @strong{Exercise 1.} How could you get the same effect as
2108pressing @kbd{Q} but using an algebraic entry instead? How about
2109if the @kbd{Q} key on your keyboard were broken?
2110@xref{Algebraic Answer 1, 1}. (@bullet{})
2111
2112The notations @kbd{$$}, @kbd{$$$}, and so on stand for higher stack
5d67986c 2113entries. For example, @kbd{' $$+$ @key{RET}} is just like typing @kbd{+}.
d7b8e6c6
EZ
2114
2115Algebraic formulas can include @dfn{variables}. To store in a
2116variable, press @kbd{s s}, then type the variable name, then press
2117@key{RET}. (There are actually two flavors of store command:
2118@kbd{s s} stores a number in a variable but also leaves the number
2119on the stack, while @w{@kbd{s t}} removes a number from the stack and
2120stores it in the variable.) A variable name should consist of one
2121or more letters or digits, beginning with a letter.
2122
d7b8e6c6 2123@smallexample
5d67986c 2124@group
d7b8e6c6
EZ
21251: 17 . 1: a + a^2 1: 306
2126 . . .
2127
5d67986c 2128 17 s t a @key{RET} ' a+a^2 @key{RET} =
d7b8e6c6 2129@end group
5d67986c 2130@end smallexample
d7b8e6c6
EZ
2131
2132@noindent
2133The @kbd{=} key @dfn{evaluates} a formula by replacing all its
2134variables by the values that were stored in them.
2135
2136For RPN calculations, you can recall a variable's value on the
2137stack either by entering its name as a formula and pressing @kbd{=},
2138or by using the @kbd{s r} command.
2139
d7b8e6c6 2140@smallexample
5d67986c 2141@group
d7b8e6c6
EZ
21421: 17 2: 17 3: 17 2: 17 1: 306
2143 . 1: 17 2: 17 1: 289 .
2144 . 1: 2 .
2145 .
2146
5d67986c 2147 s r a @key{RET} ' a @key{RET} = 2 ^ +
d7b8e6c6 2148@end group
5d67986c 2149@end smallexample
d7b8e6c6
EZ
2150
2151If you press a single digit for a variable name (as in @kbd{s t 3}, you
2152get one of ten @dfn{quick variables} @code{q0} through @code{q9}.
2153They are ``quick'' simply because you don't have to type the letter
2154@code{q} or the @key{RET} after their names. In fact, you can type
2155simply @kbd{s 3} as a shorthand for @kbd{s s 3}, and likewise for
2156@kbd{t 3} and @w{@kbd{r 3}}.
2157
2158Any variables in an algebraic formula for which you have not stored
2159values are left alone, even when you evaluate the formula.
2160
d7b8e6c6 2161@smallexample
5d67986c 2162@group
d7b8e6c6
EZ
21631: 2 a + 2 b 1: 34 + 2 b
2164 . .
2165
5d67986c 2166 ' 2a+2b @key{RET} =
d7b8e6c6 2167@end group
5d67986c 2168@end smallexample
d7b8e6c6
EZ
2169
2170Calls to function names which are undefined in Calc are also left
2171alone, as are calls for which the value is undefined.
2172
d7b8e6c6 2173@smallexample
5d67986c 2174@group
d7b8e6c6
EZ
21751: 2 + log10(0) + log10(x) + log10(5, 6) + foo(3)
2176 .
2177
5d67986c 2178 ' log10(100) + log10(0) + log10(x) + log10(5,6) + foo(3) @key{RET}
d7b8e6c6 2179@end group
5d67986c 2180@end smallexample
d7b8e6c6
EZ
2181
2182@noindent
2183In this example, the first call to @code{log10} works, but the other
2184calls are not evaluated. In the second call, the logarithm is
2185undefined for that value of the argument; in the third, the argument
2186is symbolic, and in the fourth, there are too many arguments. In the
2187fifth case, there is no function called @code{foo}. You will see a
2188``Wrong number of arguments'' message referring to @samp{log10(5,6)}.
2189Press the @kbd{w} (``why'') key to see any other messages that may
2190have arisen from the last calculation. In this case you will get
2191``logarithm of zero,'' then ``number expected: @code{x}''. Calc
2192automatically displays the first message only if the message is
2193sufficiently important; for example, Calc considers ``wrong number
2194of arguments'' and ``logarithm of zero'' to be important enough to
2195report automatically, while a message like ``number expected: @code{x}''
2196will only show up if you explicitly press the @kbd{w} key.
2197
2198(@bullet{}) @strong{Exercise 2.} Joe entered the formula @samp{2 x y},
2199stored 5 in @code{x}, pressed @kbd{=}, and got the expected result,
2200@samp{10 y}. He then tried the same for the formula @samp{2 x (1+y)},
2201expecting @samp{10 (1+y)}, but it didn't work. Why not?
2202@xref{Algebraic Answer 2, 2}. (@bullet{})
2203
2204(@bullet{}) @strong{Exercise 3.} What result would you expect
2205@kbd{1 @key{RET} 0 /} to give? What if you then type @kbd{0 *}?
2206@xref{Algebraic Answer 3, 3}. (@bullet{})
2207
2208One interesting way to work with variables is to use the
2209@dfn{evaluates-to} (@samp{=>}) operator. It works like this:
2210Enter a formula algebraically in the usual way, but follow
2211the formula with an @samp{=>} symbol. (There is also an @kbd{s =}
2212command which builds an @samp{=>} formula using the stack.) On
2213the stack, you will see two copies of the formula with an @samp{=>}
2214between them. The lefthand formula is exactly like you typed it;
2215the righthand formula has been evaluated as if by typing @kbd{=}.
2216
d7b8e6c6 2217@smallexample
5d67986c 2218@group
d7b8e6c6
EZ
22192: 2 + 3 => 5 2: 2 + 3 => 5
22201: 2 a + 2 b => 34 + 2 b 1: 2 a + 2 b => 20 + 2 b
2221 . .
2222
5d67986c 2223' 2+3 => @key{RET} ' 2a+2b @key{RET} s = 10 s t a @key{RET}
d7b8e6c6 2224@end group
5d67986c 2225@end smallexample
d7b8e6c6
EZ
2226
2227@noindent
2228Notice that the instant we stored a new value in @code{a}, all
2229@samp{=>} operators already on the stack that referred to @cite{a}
2230were updated to use the new value. With @samp{=>}, you can push a
2231set of formulas on the stack, then change the variables experimentally
2232to see the effects on the formulas' values.
2233
2234You can also ``unstore'' a variable when you are through with it:
2235
d7b8e6c6 2236@smallexample
5d67986c 2237@group
d7b8e6c6
EZ
22382: 2 + 5 => 5
22391: 2 a + 2 b => 2 a + 2 b
2240 .
2241
5d67986c 2242 s u a @key{RET}
d7b8e6c6 2243@end group
5d67986c 2244@end smallexample
d7b8e6c6
EZ
2245
2246We will encounter formulas involving variables and functions again
2247when we discuss the algebra and calculus features of the Calculator.
2248
2249@node Undo Tutorial, Modes Tutorial, Algebraic Tutorial, Basic Tutorial
2250@subsection Undo and Redo
2251
2252@noindent
2253If you make a mistake, you can usually correct it by pressing shift-@kbd{U},
5d67986c 2254the ``undo'' command. First, clear the stack (@kbd{M-0 @key{DEL}}) and exit
d7b8e6c6
EZ
2255and restart Calc (@kbd{M-# M-# M-# M-#}) to make sure things start off
2256with a clean slate. Now:
2257
d7b8e6c6 2258@smallexample
5d67986c 2259@group
d7b8e6c6
EZ
22601: 2 2: 2 1: 8 2: 2 1: 6
2261 . 1: 3 . 1: 3 .
2262 . .
2263
5d67986c 2264 2 @key{RET} 3 ^ U *
d7b8e6c6 2265@end group
5d67986c 2266@end smallexample
d7b8e6c6
EZ
2267
2268You can undo any number of times. Calc keeps a complete record of
2269all you have done since you last opened the Calc window. After the
2270above example, you could type:
2271
d7b8e6c6 2272@smallexample
5d67986c 2273@group
d7b8e6c6
EZ
22741: 6 2: 2 1: 2 . .
2275 . 1: 3 .
2276 .
2277 (error)
2278 U U U U
d7b8e6c6 2279@end group
5d67986c 2280@end smallexample
d7b8e6c6
EZ
2281
2282You can also type @kbd{D} to ``redo'' a command that you have undone
2283mistakenly.
2284
d7b8e6c6 2285@smallexample
5d67986c 2286@group
d7b8e6c6
EZ
2287 . 1: 2 2: 2 1: 6 1: 6
2288 . 1: 3 . .
2289 .
2290 (error)
2291 D D D D
d7b8e6c6 2292@end group
5d67986c 2293@end smallexample
d7b8e6c6
EZ
2294
2295@noindent
2296It was not possible to redo past the @cite{6}, since that was placed there
2297by something other than an undo command.
2298
2299@cindex Time travel
2300You can think of undo and redo as a sort of ``time machine.'' Press
2301@kbd{U} to go backward in time, @kbd{D} to go forward. If you go
2302backward and do something (like @kbd{*}) then, as any science fiction
2303reader knows, you have changed your future and you cannot go forward
2304again. Thus, the inability to redo past the @cite{6} even though there
2305was an earlier undo command.
2306
2307You can always recall an earlier result using the Trail. We've ignored
2308the trail so far, but it has been faithfully recording everything we
2309did since we loaded the Calculator. If the Trail is not displayed,
2310press @kbd{t d} now to turn it on.
2311
2312Let's try grabbing an earlier result. The @cite{8} we computed was
2313undone by a @kbd{U} command, and was lost even to Redo when we pressed
2314@kbd{*}, but it's still there in the trail. There should be a little
2315@samp{>} arrow (the @dfn{trail pointer}) resting on the last trail
2316entry. If there isn't, press @kbd{t ]} to reset the trail pointer.
2317Now, press @w{@kbd{t p}} to move the arrow onto the line containing
2318@cite{8}, and press @w{@kbd{t y}} to ``yank'' that number back onto the
2319stack.
2320
2321If you press @kbd{t ]} again, you will see that even our Yank command
2322went into the trail.
2323
2324Let's go further back in time. Earlier in the tutorial we computed
2325a huge integer using the formula @samp{2^3^4}. We don't remember
2326what it was, but the first digits were ``241''. Press @kbd{t r}
2327(which stands for trail-search-reverse), then type @kbd{241}.
2328The trail cursor will jump back to the next previous occurrence of
2329the string ``241'' in the trail. This is just a regular Emacs
2330incremental search; you can now press @kbd{C-s} or @kbd{C-r} to
2331continue the search forwards or backwards as you like.
2332
2333To finish the search, press @key{RET}. This halts the incremental
2334search and leaves the trail pointer at the thing we found. Now we
2335can type @kbd{t y} to yank that number onto the stack. If we hadn't
2336remembered the ``241'', we could simply have searched for @kbd{2^3^4},
2337then pressed @kbd{@key{RET} t n} to halt and then move to the next item.
2338
2339You may have noticed that all the trail-related commands begin with
2340the letter @kbd{t}. (The store-and-recall commands, on the other hand,
2341all began with @kbd{s}.) Calc has so many commands that there aren't
2342enough keys for all of them, so various commands are grouped into
2343two-letter sequences where the first letter is called the @dfn{prefix}
2344key. If you type a prefix key by accident, you can press @kbd{C-g}
2345to cancel it. (In fact, you can press @kbd{C-g} to cancel almost
2346anything in Emacs.) To get help on a prefix key, press that key
2347followed by @kbd{?}. Some prefixes have several lines of help,
2348so you need to press @kbd{?} repeatedly to see them all. This may
2349not work under Lucid Emacs, but you can also type @kbd{h h} to
2350see all the help at once.
2351
2352Try pressing @kbd{t ?} now. You will see a line of the form,
2353
2354@smallexample
2355trail/time: Display; Fwd, Back; Next, Prev, Here, [, ]; Yank: [MORE] t-
2356@end smallexample
2357
2358@noindent
2359The word ``trail'' indicates that the @kbd{t} prefix key contains
2360trail-related commands. Each entry on the line shows one command,
2361with a single capital letter showing which letter you press to get
2362that command. We have used @kbd{t n}, @kbd{t p}, @kbd{t ]}, and
2363@kbd{t y} so far. The @samp{[MORE]} means you can press @kbd{?}
2364again to see more @kbd{t}-prefix comands. Notice that the commands
2365are roughly divided (by semicolons) into related groups.
2366
2367When you are in the help display for a prefix key, the prefix is
2368still active. If you press another key, like @kbd{y} for example,
2369it will be interpreted as a @kbd{t y} command. If all you wanted
2370was to look at the help messages, press @kbd{C-g} afterwards to cancel
2371the prefix.
2372
2373One more way to correct an error is by editing the stack entries.
2374The actual Stack buffer is marked read-only and must not be edited
2375directly, but you can press @kbd{`} (the backquote or accent grave)
2376to edit a stack entry.
2377
2378Try entering @samp{3.141439} now. If this is supposed to represent
2379@c{$\pi$}
2380@cite{pi}, it's got several errors. Press @kbd{`} to edit this number.
2381Now use the normal Emacs cursor motion and editing keys to change
2382the second 4 to a 5, and to transpose the 3 and the 9. When you
2383press @key{RET}, the number on the stack will be replaced by your
2384new number. This works for formulas, vectors, and all other types
2385of values you can put on the stack. The @kbd{`} key also works
2386during entry of a number or algebraic formula.
2387
2388@node Modes Tutorial, , Undo Tutorial, Basic Tutorial
2389@subsection Mode-Setting Commands
2390
2391@noindent
2392Calc has many types of @dfn{modes} that affect the way it interprets
2393your commands or the way it displays data. We have already seen one
2394mode, namely algebraic mode. There are many others, too; we'll
2395try some of the most common ones here.
2396
2397Perhaps the most fundamental mode in Calc is the current @dfn{precision}.
2398Notice the @samp{12} on the Calc window's mode line:
2399
2400@smallexample
2401--%%-Calc: 12 Deg (Calculator)----All------
2402@end smallexample
2403
2404@noindent
2405Most of the symbols there are Emacs things you don't need to worry
2406about, but the @samp{12} and the @samp{Deg} are mode indicators.
2407The @samp{12} means that calculations should always be carried to
240812 significant figures. That is why, when we type @kbd{1 @key{RET} 7 /},
2409we get @cite{0.142857142857} with exactly 12 digits, not counting
2410leading and trailing zeros.
2411
2412You can set the precision to anything you like by pressing @kbd{p},
2413then entering a suitable number. Try pressing @kbd{p 30 @key{RET}},
2414then doing @kbd{1 @key{RET} 7 /} again:
2415
d7b8e6c6 2416@smallexample
5d67986c 2417@group
d7b8e6c6
EZ
24181: 0.142857142857
24192: 0.142857142857142857142857142857
2420 .
d7b8e6c6 2421@end group
5d67986c 2422@end smallexample
d7b8e6c6
EZ
2423
2424Although the precision can be set arbitrarily high, Calc always
2425has to have @emph{some} value for the current precision. After
2426all, the true value @cite{1/7} is an infinitely repeating decimal;
2427Calc has to stop somewhere.
2428
2429Of course, calculations are slower the more digits you request.
2430Press @w{@kbd{p 12}} now to set the precision back down to the default.
2431
2432Calculations always use the current precision. For example, even
2433though we have a 30-digit value for @cite{1/7} on the stack, if
2434we use it in a calculation in 12-digit mode it will be rounded
2435down to 12 digits before it is used. Try it; press @key{RET} to
2436duplicate the number, then @w{@kbd{1 +}}. Notice that the @key{RET}
2437key didn't round the number, because it doesn't do any calculation.
2438But the instant we pressed @kbd{+}, the number was rounded down.
2439
d7b8e6c6 2440@smallexample
5d67986c 2441@group
d7b8e6c6
EZ
24421: 0.142857142857
24432: 0.142857142857142857142857142857
24443: 1.14285714286
2445 .
d7b8e6c6 2446@end group
5d67986c 2447@end smallexample
d7b8e6c6
EZ
2448
2449@noindent
2450In fact, since we added a digit on the left, we had to lose one
2451digit on the right from even the 12-digit value of @cite{1/7}.
2452
2453How did we get more than 12 digits when we computed @samp{2^3^4}? The
2454answer is that Calc makes a distinction between @dfn{integers} and
2455@dfn{floating-point} numbers, or @dfn{floats}. An integer is a number
2456that does not contain a decimal point. There is no such thing as an
2457``infinitely repeating fraction integer,'' so Calc doesn't have to limit
2458itself. If you asked for @samp{2^10000} (don't try this!), you would
2459have to wait a long time but you would eventually get an exact answer.
2460If you ask for @samp{2.^10000}, you will quickly get an answer which is
2461correct only to 12 places. The decimal point tells Calc that it should
2462use floating-point arithmetic to get the answer, not exact integer
2463arithmetic.
2464
2465You can use the @kbd{F} (@code{calc-floor}) command to convert a
2466floating-point value to an integer, and @kbd{c f} (@code{calc-float})
2467to convert an integer to floating-point form.
2468
2469Let's try entering that last calculation:
2470
d7b8e6c6 2471@smallexample
5d67986c 2472@group
d7b8e6c6
EZ
24731: 2. 2: 2. 1: 1.99506311689e3010
2474 . 1: 10000 .
2475 .
2476
5d67986c 2477 2.0 @key{RET} 10000 @key{RET} ^
d7b8e6c6 2478@end group
5d67986c 2479@end smallexample
d7b8e6c6
EZ
2480
2481@noindent
2482@cindex Scientific notation, entry of
2483Notice the letter @samp{e} in there. It represents ``times ten to the
2484power of,'' and is used by Calc automatically whenever writing the
2485number out fully would introduce more extra zeros than you probably
2486want to see. You can enter numbers in this notation, too.
2487
d7b8e6c6 2488@smallexample
5d67986c 2489@group
d7b8e6c6
EZ
24901: 2. 2: 2. 1: 1.99506311678e3010
2491 . 1: 10000. .
2492 .
2493
5d67986c 2494 2.0 @key{RET} 1e4 @key{RET} ^
d7b8e6c6 2495@end group
5d67986c 2496@end smallexample
d7b8e6c6
EZ
2497
2498@cindex Round-off errors
2499@noindent
2500Hey, the answer is different! Look closely at the middle columns
2501of the two examples. In the first, the stack contained the
2502exact integer @cite{10000}, but in the second it contained
2503a floating-point value with a decimal point. When you raise a
2504number to an integer power, Calc uses repeated squaring and
2505multiplication to get the answer. When you use a floating-point
2506power, Calc uses logarithms and exponentials. As you can see,
2507a slight error crept in during one of these methods. Which
2508one should we trust? Let's raise the precision a bit and find
2509out:
2510
d7b8e6c6 2511@smallexample
5d67986c 2512@group
d7b8e6c6
EZ
2513 . 1: 2. 2: 2. 1: 1.995063116880828e3010
2514 . 1: 10000. .
2515 .
2516
5d67986c 2517 p 16 @key{RET} 2. @key{RET} 1e4 ^ p 12 @key{RET}
d7b8e6c6 2518@end group
5d67986c 2519@end smallexample
d7b8e6c6
EZ
2520
2521@noindent
2522@cindex Guard digits
2523Presumably, it doesn't matter whether we do this higher-precision
2524calculation using an integer or floating-point power, since we
2525have added enough ``guard digits'' to trust the first 12 digits
2526no matter what. And the verdict is@dots{} Integer powers were more
2527accurate; in fact, the result was only off by one unit in the
2528last place.
2529
2530@cindex Guard digits
2531Calc does many of its internal calculations to a slightly higher
2532precision, but it doesn't always bump the precision up enough.
2533In each case, Calc added about two digits of precision during
2534its calculation and then rounded back down to 12 digits
2535afterward. In one case, it was enough; in the the other, it
2536wasn't. If you really need @var{x} digits of precision, it
2537never hurts to do the calculation with a few extra guard digits.
2538
2539What if we want guard digits but don't want to look at them?
2540We can set the @dfn{float format}. Calc supports four major
2541formats for floating-point numbers, called @dfn{normal},
2542@dfn{fixed-point}, @dfn{scientific notation}, and @dfn{engineering
2543notation}. You get them by pressing @w{@kbd{d n}}, @kbd{d f},
2544@kbd{d s}, and @kbd{d e}, respectively. In each case, you can
2545supply a numeric prefix argument which says how many digits
2546should be displayed. As an example, let's put a few numbers
2547onto the stack and try some different display modes. First,
5d67986c 2548use @kbd{M-0 @key{DEL}} to clear the stack, then enter the four
d7b8e6c6
EZ
2549numbers shown here:
2550
d7b8e6c6 2551@smallexample
5d67986c 2552@group
d7b8e6c6
EZ
25534: 12345 4: 12345 4: 12345 4: 12345 4: 12345
25543: 12345. 3: 12300. 3: 1.2345e4 3: 1.23e4 3: 12345.000
25552: 123.45 2: 123. 2: 1.2345e2 2: 1.23e2 2: 123.450
25561: 12.345 1: 12.3 1: 1.2345e1 1: 1.23e1 1: 12.345
2557 . . . . .
2558
2559 d n M-3 d n d s M-3 d s M-3 d f
d7b8e6c6 2560@end group
5d67986c 2561@end smallexample
d7b8e6c6
EZ
2562
2563@noindent
2564Notice that when we typed @kbd{M-3 d n}, the numbers were rounded down
2565to three significant digits, but then when we typed @kbd{d s} all
2566five significant figures reappeared. The float format does not
2567affect how numbers are stored, it only affects how they are
2568displayed. Only the current precision governs the actual rounding
2569of numbers in the Calculator's memory.
2570
2571Engineering notation, not shown here, is like scientific notation
2572except the exponent (the power-of-ten part) is always adjusted to be
2573a multiple of three (as in ``kilo,'' ``micro,'' etc.). As a result
2574there will be one, two, or three digits before the decimal point.
2575
2576Whenever you change a display-related mode, Calc redraws everything
2577in the stack. This may be slow if there are many things on the stack,
2578so Calc allows you to type shift-@kbd{H} before any mode command to
2579prevent it from updating the stack. Anything Calc displays after the
2580mode-changing command will appear in the new format.
2581
d7b8e6c6 2582@smallexample
5d67986c 2583@group
d7b8e6c6
EZ
25844: 12345 4: 12345 4: 12345 4: 12345 4: 12345
25853: 12345.000 3: 12345.000 3: 12345.000 3: 1.2345e4 3: 12345.
25862: 123.450 2: 123.450 2: 1.2345e1 2: 1.2345e1 2: 123.45
25871: 12.345 1: 1.2345e1 1: 1.2345e2 1: 1.2345e2 1: 12.345
2588 . . . . .
2589
5d67986c 2590 H d s @key{DEL} U @key{TAB} d @key{SPC} d n
d7b8e6c6 2591@end group
5d67986c 2592@end smallexample
d7b8e6c6
EZ
2593
2594@noindent
2595Here the @kbd{H d s} command changes to scientific notation but without
2596updating the screen. Deleting the top stack entry and undoing it back
2597causes it to show up in the new format; swapping the top two stack
5d67986c 2598entries reformats both entries. The @kbd{d @key{SPC}} command refreshes the
d7b8e6c6
EZ
2599whole stack. The @kbd{d n} command changes back to the normal float
2600format; since it doesn't have an @kbd{H} prefix, it also updates all
2601the stack entries to be in @kbd{d n} format.
2602
2603Notice that the integer @cite{12345} was not affected by any
2604of the float formats. Integers are integers, and are always
2605displayed exactly.
2606
2607@cindex Large numbers, readability
2608Large integers have their own problems. Let's look back at
2609the result of @kbd{2^3^4}.
2610
2611@example
26122417851639229258349412352
2613@end example
2614
2615@noindent
2616Quick---how many digits does this have? Try typing @kbd{d g}:
2617
2618@example
26192,417,851,639,229,258,349,412,352
2620@end example
2621
2622@noindent
2623Now how many digits does this have? It's much easier to tell!
2624We can actually group digits into clumps of any size. Some
2625people prefer @kbd{M-5 d g}:
2626
2627@example
262824178,51639,22925,83494,12352
2629@end example
2630
2631Let's see what happens to floating-point numbers when they are grouped.
2632First, type @kbd{p 25 @key{RET}} to make sure we have enough precision
2633to get ourselves into trouble. Now, type @kbd{1e13 /}:
2634
2635@example
263624,17851,63922.9258349412352
2637@end example
2638
2639@noindent
2640The integer part is grouped but the fractional part isn't. Now try
2641@kbd{M-- M-5 d g} (that's meta-minus-sign, meta-five):
2642
2643@example
264424,17851,63922.92583,49412,352
2645@end example
2646
2647If you find it hard to tell the decimal point from the commas, try
2648changing the grouping character to a space with @kbd{d , @key{SPC}}:
2649
2650@example
265124 17851 63922.92583 49412 352
2652@end example
2653
2654Type @kbd{d , ,} to restore the normal grouping character, then
2655@kbd{d g} again to turn grouping off. Also, press @kbd{p 12} to
2656restore the default precision.
2657
2658Press @kbd{U} enough times to get the original big integer back.
2659(Notice that @kbd{U} does not undo each mode-setting command; if
2660you want to undo a mode-setting command, you have to do it yourself.)
2661Now, type @kbd{d r 16 @key{RET}}:
2662
2663@example
266416#200000000000000000000
2665@end example
2666
2667@noindent
2668The number is now displayed in @dfn{hexadecimal}, or ``base-16'' form.
2669Suddenly it looks pretty simple; this should be no surprise, since we
2670got this number by computing a power of two, and 16 is a power of 2.
2671In fact, we can use @w{@kbd{d r 2 @key{RET}}} to see it in actual binary
2672form:
2673
2674@example
26752#1000000000000000000000000000000000000000000000000000000 @dots{}
2676@end example
2677
2678@noindent
2679We don't have enough space here to show all the zeros! They won't
2680fit on a typical screen, either, so you will have to use horizontal
2681scrolling to see them all. Press @kbd{<} and @kbd{>} to scroll the
2682stack window left and right by half its width. Another way to view
2683something large is to press @kbd{`} (back-quote) to edit the top of
2684stack in a separate window. (Press @kbd{M-# M-#} when you are done.)
2685
2686You can enter non-decimal numbers using the @kbd{#} symbol, too.
2687Let's see what the hexadecimal number @samp{5FE} looks like in
2688binary. Type @kbd{16#5FE} (the letters can be typed in upper or
2689lower case; they will always appear in upper case). It will also
2690help to turn grouping on with @kbd{d g}:
2691
2692@example
26932#101,1111,1110
2694@end example
2695
2696Notice that @kbd{d g} groups by fours by default if the display radix
2697is binary or hexadecimal, but by threes if it is decimal, octal, or any
2698other radix.
2699
2700Now let's see that number in decimal; type @kbd{d r 10}:
2701
2702@example
27031,534
2704@end example
2705
2706Numbers are not @emph{stored} with any particular radix attached. They're
2707just numbers; they can be entered in any radix, and are always displayed
2708in whatever radix you've chosen with @kbd{d r}. The current radix applies
2709to integers, fractions, and floats.
2710
2711@cindex Roundoff errors, in non-decimal numbers
2712(@bullet{}) @strong{Exercise 1.} Your friend Joe tried to enter one-third
2713as @samp{3#0.1} in @kbd{d r 3} mode with a precision of 12. He got
2714@samp{3#0.0222222...} (with 25 2's) in the display. When he multiplied
2715that by three, he got @samp{3#0.222222...} instead of the expected
2716@samp{3#1}. Next, Joe entered @samp{3#0.2} and, to his great relief,
2717saw @samp{3#0.2} on the screen. But when he typed @kbd{2 /}, he got
2718@samp{3#0.10000001} (some zeros omitted). What's going on here?
2719@xref{Modes Answer 1, 1}. (@bullet{})
2720
2721@cindex Scientific notation, in non-decimal numbers
2722(@bullet{}) @strong{Exercise 2.} Scientific notation works in non-decimal
2723modes in the natural way (the exponent is a power of the radix instead of
2724a power of ten, although the exponent itself is always written in decimal).
2725Thus @samp{8#1.23e3 = 8#1230.0}. Suppose we have the hexadecimal number
2726@samp{f.e8f} times 16 to the 15th power: We write @samp{16#f.e8fe15}.
2727What is wrong with this picture? What could we write instead that would
2728work better? @xref{Modes Answer 2, 2}. (@bullet{})
2729
2730The @kbd{m} prefix key has another set of modes, relating to the way
2731Calc interprets your inputs and does computations. Whereas @kbd{d}-prefix
2732modes generally affect the way things look, @kbd{m}-prefix modes affect
2733the way they are actually computed.
2734
2735The most popular @kbd{m}-prefix mode is the @dfn{angular mode}. Notice
2736the @samp{Deg} indicator in the mode line. This means that if you use
2737a command that interprets a number as an angle, it will assume the
2738angle is measured in degrees. For example,
2739
d7b8e6c6 2740@smallexample
5d67986c 2741@group
d7b8e6c6
EZ
27421: 45 1: 0.707106781187 1: 0.500000000001 1: 0.5
2743 . . . .
2744
2745 45 S 2 ^ c 1
d7b8e6c6 2746@end group
5d67986c 2747@end smallexample
d7b8e6c6
EZ
2748
2749@noindent
2750The shift-@kbd{S} command computes the sine of an angle. The sine
2751of 45 degrees is @c{$\sqrt{2}/2$}
2752@cite{sqrt(2)/2}; squaring this yields @cite{2/4 = 0.5}.
2753However, there has been a slight roundoff error because the
2754representation of @c{$\sqrt{2}/2$}
2755@cite{sqrt(2)/2} wasn't exact. The @kbd{c 1}
2756command is a handy way to clean up numbers in this case; it
2757temporarily reduces the precision by one digit while it
2758re-rounds the number on the top of the stack.
2759
2760@cindex Roundoff errors, examples
2761(@bullet{}) @strong{Exercise 3.} Your friend Joe computed the sine
2762of 45 degrees as shown above, then, hoping to avoid an inexact
2763result, he increased the precision to 16 digits before squaring.
2764What happened? @xref{Modes Answer 3, 3}. (@bullet{})
2765
2766To do this calculation in radians, we would type @kbd{m r} first.
2767(The indicator changes to @samp{Rad}.) 45 degrees corresponds to
2768@c{$\pi\over4$}
2769@cite{pi/4} radians. To get @c{$\pi$}
2770@cite{pi}, press the @kbd{P} key. (Once
2771again, this is a shifted capital @kbd{P}. Remember, unshifted
2772@kbd{p} sets the precision.)
2773
d7b8e6c6 2774@smallexample
5d67986c 2775@group
d7b8e6c6
EZ
27761: 3.14159265359 1: 0.785398163398 1: 0.707106781187
2777 . . .
2778
2779 P 4 / m r S
d7b8e6c6 2780@end group
5d67986c 2781@end smallexample
d7b8e6c6
EZ
2782
2783Likewise, inverse trigonometric functions generate results in
2784either radians or degrees, depending on the current angular mode.
2785
d7b8e6c6 2786@smallexample
5d67986c 2787@group
d7b8e6c6
EZ
27881: 0.707106781187 1: 0.785398163398 1: 45.
2789 . . .
2790
2791 .5 Q m r I S m d U I S
d7b8e6c6 2792@end group
5d67986c 2793@end smallexample
d7b8e6c6
EZ
2794
2795@noindent
2796Here we compute the Inverse Sine of @c{$\sqrt{0.5}$}
2797@cite{sqrt(0.5)}, first in
2798radians, then in degrees.
2799
2800Use @kbd{c d} and @kbd{c r} to convert a number from radians to degrees
2801and vice-versa.
2802
d7b8e6c6 2803@smallexample
5d67986c 2804@group
d7b8e6c6
EZ
28051: 45 1: 0.785398163397 1: 45.
2806 . . .
2807
2808 45 c r c d
d7b8e6c6 2809@end group
5d67986c 2810@end smallexample
d7b8e6c6
EZ
2811
2812Another interesting mode is @dfn{fraction mode}. Normally,
2813dividing two integers produces a floating-point result if the
2814quotient can't be expressed as an exact integer. Fraction mode
2815causes integer division to produce a fraction, i.e., a rational
2816number, instead.
2817
d7b8e6c6 2818@smallexample
5d67986c 2819@group
d7b8e6c6
EZ
28202: 12 1: 1.33333333333 1: 4:3
28211: 9 . .
2822 .
2823
5d67986c 2824 12 @key{RET} 9 / m f U / m f
d7b8e6c6 2825@end group
5d67986c 2826@end smallexample
d7b8e6c6
EZ
2827
2828@noindent
2829In the first case, we get an approximate floating-point result.
2830In the second case, we get an exact fractional result (four-thirds).
2831
2832You can enter a fraction at any time using @kbd{:} notation.
2833(Calc uses @kbd{:} instead of @kbd{/} as the fraction separator
2834because @kbd{/} is already used to divide the top two stack
2835elements.) Calculations involving fractions will always
2836produce exact fractional results; fraction mode only says
2837what to do when dividing two integers.
2838
2839@cindex Fractions vs. floats
2840@cindex Floats vs. fractions
2841(@bullet{}) @strong{Exercise 4.} If fractional arithmetic is exact,
2842why would you ever use floating-point numbers instead?
2843@xref{Modes Answer 4, 4}. (@bullet{})
2844
2845Typing @kbd{m f} doesn't change any existing values in the stack.
2846In the above example, we had to Undo the division and do it over
2847again when we changed to fraction mode. But if you use the
2848evaluates-to operator you can get commands like @kbd{m f} to
2849recompute for you.
2850
d7b8e6c6 2851@smallexample
5d67986c 2852@group
d7b8e6c6
EZ
28531: 12 / 9 => 1.33333333333 1: 12 / 9 => 1.333 1: 12 / 9 => 4:3
2854 . . .
2855
5d67986c 2856 ' 12/9 => @key{RET} p 4 @key{RET} m f
d7b8e6c6 2857@end group
5d67986c 2858@end smallexample
d7b8e6c6
EZ
2859
2860@noindent
2861In this example, the righthand side of the @samp{=>} operator
2862on the stack is recomputed when we change the precision, then
2863again when we change to fraction mode. All @samp{=>} expressions
2864on the stack are recomputed every time you change any mode that
2865might affect their values.
2866
2867@node Arithmetic Tutorial, Vector/Matrix Tutorial, Basic Tutorial, Tutorial
2868@section Arithmetic Tutorial
2869
2870@noindent
2871In this section, we explore the arithmetic and scientific functions
2872available in the Calculator.
2873
2874The standard arithmetic commands are @kbd{+}, @kbd{-}, @kbd{*}, @kbd{/},
2875and @kbd{^}. Each normally takes two numbers from the top of the stack
2876and pushes back a result. The @kbd{n} and @kbd{&} keys perform
2877change-sign and reciprocal operations, respectively.
2878
d7b8e6c6 2879@smallexample
5d67986c 2880@group
d7b8e6c6
EZ
28811: 5 1: 0.2 1: 5. 1: -5. 1: 5.
2882 . . . . .
2883
2884 5 & & n n
d7b8e6c6 2885@end group
5d67986c 2886@end smallexample
d7b8e6c6
EZ
2887
2888@cindex Binary operators
2889You can apply a ``binary operator'' like @kbd{+} across any number of
2890stack entries by giving it a numeric prefix. You can also apply it
2891pairwise to several stack elements along with the top one if you use
2892a negative prefix.
2893
d7b8e6c6 2894@smallexample
5d67986c 2895@group
d7b8e6c6
EZ
28963: 2 1: 9 3: 2 4: 2 3: 12
28972: 3 . 2: 3 3: 3 2: 13
28981: 4 1: 4 2: 4 1: 14
2899 . . 1: 10 .
2900 .
2901
5d67986c 29022 @key{RET} 3 @key{RET} 4 M-3 + U 10 M-- M-3 +
d7b8e6c6 2903@end group
5d67986c 2904@end smallexample
d7b8e6c6
EZ
2905
2906@cindex Unary operators
2907You can apply a ``unary operator'' like @kbd{&} to the top @var{n}
2908stack entries with a numeric prefix, too.
2909
d7b8e6c6 2910@smallexample
5d67986c 2911@group
d7b8e6c6
EZ
29123: 2 3: 0.5 3: 0.5
29132: 3 2: 0.333333333333 2: 3.
29141: 4 1: 0.25 1: 4.
2915 . . .
2916
5d67986c 29172 @key{RET} 3 @key{RET} 4 M-3 & M-2 &
d7b8e6c6 2918@end group
5d67986c 2919@end smallexample
d7b8e6c6
EZ
2920
2921Notice that the results here are left in floating-point form.
2922We can convert them back to integers by pressing @kbd{F}, the
2923``floor'' function. This function rounds down to the next lower
2924integer. There is also @kbd{R}, which rounds to the nearest
2925integer.
2926
d7b8e6c6 2927@smallexample
5d67986c 2928@group
d7b8e6c6
EZ
29297: 2. 7: 2 7: 2
29306: 2.4 6: 2 6: 2
29315: 2.5 5: 2 5: 3
29324: 2.6 4: 2 4: 3
29333: -2. 3: -2 3: -2
29342: -2.4 2: -3 2: -2
29351: -2.6 1: -3 1: -3
2936 . . .
2937
2938 M-7 F U M-7 R
d7b8e6c6 2939@end group
5d67986c 2940@end smallexample
d7b8e6c6
EZ
2941
2942Since dividing-and-flooring (i.e., ``integer quotient'') is such a
2943common operation, Calc provides a special command for that purpose, the
2944backslash @kbd{\}. Another common arithmetic operator is @kbd{%}, which
2945computes the remainder that would arise from a @kbd{\} operation, i.e.,
2946the ``modulo'' of two numbers. For example,
2947
d7b8e6c6 2948@smallexample
5d67986c 2949@group
d7b8e6c6
EZ
29502: 1234 1: 12 2: 1234 1: 34
29511: 100 . 1: 100 .
2952 . .
2953
5d67986c 29541234 @key{RET} 100 \ U %
d7b8e6c6 2955@end group
5d67986c 2956@end smallexample
d7b8e6c6
EZ
2957
2958These commands actually work for any real numbers, not just integers.
2959
d7b8e6c6 2960@smallexample
5d67986c 2961@group
d7b8e6c6
EZ
29622: 3.1415 1: 3 2: 3.1415 1: 0.1415
29631: 1 . 1: 1 .
2964 . .
2965
5d67986c 29663.1415 @key{RET} 1 \ U %
d7b8e6c6 2967@end group
5d67986c 2968@end smallexample
d7b8e6c6
EZ
2969
2970(@bullet{}) @strong{Exercise 1.} The @kbd{\} command would appear to be a
2971frill, since you could always do the same thing with @kbd{/ F}. Think
2972of a situation where this is not true---@kbd{/ F} would be inadequate.
2973Now think of a way you could get around the problem if Calc didn't
2974provide a @kbd{\} command. @xref{Arithmetic Answer 1, 1}. (@bullet{})
2975
2976We've already seen the @kbd{Q} (square root) and @kbd{S} (sine)
2977commands. Other commands along those lines are @kbd{C} (cosine),
2978@kbd{T} (tangent), @kbd{E} (@cite{e^x}) and @kbd{L} (natural
2979logarithm). These can be modified by the @kbd{I} (inverse) and
2980@kbd{H} (hyperbolic) prefix keys.
2981
2982Let's compute the sine and cosine of an angle, and verify the
2983identity @c{$\sin^2x + \cos^2x = 1$}
2984@cite{sin(x)^2 + cos(x)^2 = 1}. We'll
2985arbitrarily pick @i{-64} degrees as a good value for @cite{x}. With
2986the angular mode set to degrees (type @w{@kbd{m d}}), do:
2987
d7b8e6c6 2988@smallexample
5d67986c 2989@group
d7b8e6c6
EZ
29902: -64 2: -64 2: -0.89879 2: -0.89879 1: 1.
29911: -64 1: -0.89879 1: -64 1: 0.43837 .
2992 . . . .
2993
5d67986c 2994 64 n @key{RET} @key{RET} S @key{TAB} C f h
d7b8e6c6 2995@end group
5d67986c 2996@end smallexample
d7b8e6c6
EZ
2997
2998@noindent
2999(For brevity, we're showing only five digits of the results here.
3000You can of course do these calculations to any precision you like.)
3001
3002Remember, @kbd{f h} is the @code{calc-hypot}, or square-root of sum
3003of squares, command.
3004
3005Another identity is @c{$\displaystyle\tan x = {\sin x \over \cos x}$}
3006@cite{tan(x) = sin(x) / cos(x)}.
d7b8e6c6 3007@smallexample
5d67986c 3008@group
d7b8e6c6
EZ
3009
30102: -0.89879 1: -2.0503 1: -64.
30111: 0.43837 . .
3012 .
3013
3014 U / I T
d7b8e6c6 3015@end group
5d67986c 3016@end smallexample
d7b8e6c6
EZ
3017
3018A physical interpretation of this calculation is that if you move
3019@cite{0.89879} units downward and @cite{0.43837} units to the right,
3020your direction of motion is @i{-64} degrees from horizontal. Suppose
3021we move in the opposite direction, up and to the left:
3022
d7b8e6c6 3023@smallexample
5d67986c 3024@group
d7b8e6c6
EZ
30252: -0.89879 2: 0.89879 1: -2.0503 1: -64.
30261: 0.43837 1: -0.43837 . .
3027 . .
3028
3029 U U M-2 n / I T
d7b8e6c6 3030@end group
5d67986c 3031@end smallexample
d7b8e6c6
EZ
3032
3033@noindent
3034How can the angle be the same? The answer is that the @kbd{/} operation
3035loses information about the signs of its inputs. Because the quotient
3036is negative, we know exactly one of the inputs was negative, but we
3037can't tell which one. There is an @kbd{f T} [@code{arctan2}] function which
3038computes the inverse tangent of the quotient of a pair of numbers.
3039Since you feed it the two original numbers, it has enough information
3040to give you a full 360-degree answer.
3041
d7b8e6c6 3042@smallexample
5d67986c 3043@group
d7b8e6c6
EZ
30442: 0.89879 1: 116. 3: 116. 2: 116. 1: 180.
30451: -0.43837 . 2: -0.89879 1: -64. .
3046 . 1: 0.43837 .
3047 .
3048
5d67986c 3049 U U f T M-@key{RET} M-2 n f T -
d7b8e6c6 3050@end group
5d67986c 3051@end smallexample
d7b8e6c6
EZ
3052
3053@noindent
3054The resulting angles differ by 180 degrees; in other words, they
3055point in opposite directions, just as we would expect.
3056
3057The @key{META}-@key{RET} we used in the third step is the
3058``last-arguments'' command. It is sort of like Undo, except that it
3059restores the arguments of the last command to the stack without removing
3060the command's result. It is useful in situations like this one,
3061where we need to do several operations on the same inputs. We could
3062have accomplished the same thing by using @kbd{M-2 @key{RET}} to duplicate
3063the top two stack elements right after the @kbd{U U}, then a pair of
3064@kbd{M-@key{TAB}} commands to cycle the 116 up around the duplicates.
3065
3066A similar identity is supposed to hold for hyperbolic sines and cosines,
3067except that it is the @emph{difference}
3068@c{$\cosh^2x - \sinh^2x$}
3069@cite{cosh(x)^2 - sinh(x)^2} that always equals one.
3070Let's try to verify this identity.@refill
3071
d7b8e6c6 3072@smallexample
5d67986c 3073@group
d7b8e6c6
EZ
30742: -64 2: -64 2: -64 2: 9.7192e54 2: 9.7192e54
30751: -64 1: -3.1175e27 1: 9.7192e54 1: -64 1: 9.7192e54
3076 . . . . .
3077
5d67986c 3078 64 n @key{RET} @key{RET} H C 2 ^ @key{TAB} H S 2 ^
d7b8e6c6 3079@end group
5d67986c 3080@end smallexample
d7b8e6c6
EZ
3081
3082@noindent
3083@cindex Roundoff errors, examples
3084Something's obviously wrong, because when we subtract these numbers
3085the answer will clearly be zero! But if you think about it, if these
3086numbers @emph{did} differ by one, it would be in the 55th decimal
3087place. The difference we seek has been lost entirely to roundoff
3088error.
3089
3090We could verify this hypothesis by doing the actual calculation with,
3091say, 60 decimal places of precision. This will be slow, but not
3092enormously so. Try it if you wish; sure enough, the answer is
30930.99999, reasonably close to 1.
3094
3095Of course, a more reasonable way to verify the identity is to use
3096a more reasonable value for @cite{x}!
3097
3098@cindex Common logarithm
3099Some Calculator commands use the Hyperbolic prefix for other purposes.
3100The logarithm and exponential functions, for example, work to the base
3101@cite{e} normally but use base-10 instead if you use the Hyperbolic
3102prefix.
3103
d7b8e6c6 3104@smallexample
5d67986c 3105@group
d7b8e6c6
EZ
31061: 1000 1: 6.9077 1: 1000 1: 3
3107 . . . .
3108
3109 1000 L U H L
d7b8e6c6 3110@end group
5d67986c 3111@end smallexample
d7b8e6c6
EZ
3112
3113@noindent
3114First, we mistakenly compute a natural logarithm. Then we undo
3115and compute a common logarithm instead.
3116
3117The @kbd{B} key computes a general base-@var{b} logarithm for any
3118value of @var{b}.
3119
d7b8e6c6 3120@smallexample
5d67986c 3121@group
d7b8e6c6
EZ
31222: 1000 1: 3 1: 1000. 2: 1000. 1: 6.9077
31231: 10 . . 1: 2.71828 .
3124 . .
3125
5d67986c 3126 1000 @key{RET} 10 B H E H P B
d7b8e6c6 3127@end group
5d67986c 3128@end smallexample
d7b8e6c6
EZ
3129
3130@noindent
3131Here we first use @kbd{B} to compute the base-10 logarithm, then use
3132the ``hyperbolic'' exponential as a cheap hack to recover the number
31331000, then use @kbd{B} again to compute the natural logarithm. Note
3134that @kbd{P} with the hyperbolic prefix pushes the constant @cite{e}
3135onto the stack.
3136
3137You may have noticed that both times we took the base-10 logarithm
3138of 1000, we got an exact integer result. Calc always tries to give
3139an exact rational result for calculations involving rational numbers
3140where possible. But when we used @kbd{H E}, the result was a
3141floating-point number for no apparent reason. In fact, if we had
3142computed @kbd{10 @key{RET} 3 ^} we @emph{would} have gotten an
3143exact integer 1000. But the @kbd{H E} command is rigged to generate
3144a floating-point result all of the time so that @kbd{1000 H E} will
3145not waste time computing a thousand-digit integer when all you
3146probably wanted was @samp{1e1000}.
3147
3148(@bullet{}) @strong{Exercise 2.} Find a pair of integer inputs to
3149the @kbd{B} command for which Calc could find an exact rational
3150result but doesn't. @xref{Arithmetic Answer 2, 2}. (@bullet{})
3151
3152The Calculator also has a set of functions relating to combinatorics
3153and statistics. You may be familiar with the @dfn{factorial} function,
3154which computes the product of all the integers up to a given number.
3155
d7b8e6c6 3156@smallexample
5d67986c 3157@group
d7b8e6c6
EZ
31581: 100 1: 93326215443... 1: 100. 1: 9.3326e157
3159 . . . .
3160
3161 100 ! U c f !
d7b8e6c6 3162@end group
5d67986c 3163@end smallexample
d7b8e6c6
EZ
3164
3165@noindent
3166Recall, the @kbd{c f} command converts the integer or fraction at the
3167top of the stack to floating-point format. If you take the factorial
3168of a floating-point number, you get a floating-point result
3169accurate to the current precision. But if you give @kbd{!} an
3170exact integer, you get an exact integer result (158 digits long
3171in this case).
3172
3173If you take the factorial of a non-integer, Calc uses a generalized
3174factorial function defined in terms of Euler's Gamma function
3175@c{$\Gamma(n)$}
3176@cite{gamma(n)}
3177(which is itself available as the @kbd{f g} command).
3178
d7b8e6c6 3179@smallexample
5d67986c 3180@group
d7b8e6c6
EZ
31813: 4. 3: 24. 1: 5.5 1: 52.342777847
31822: 4.5 2: 52.3427777847 . .
31831: 5. 1: 120.
3184 . .
3185
5d67986c 3186 M-3 ! M-0 @key{DEL} 5.5 f g
d7b8e6c6 3187@end group
5d67986c 3188@end smallexample
d7b8e6c6
EZ
3189
3190@noindent
3191Here we verify the identity @c{$n! = \Gamma(n+1)$}
3192@cite{@var{n}!@: = gamma(@var{n}+1)}.
3193
3194The binomial coefficient @var{n}-choose-@var{m}@c{ or $\displaystyle {n \choose m}$}
3195@asis{} is defined by
3196@c{$\displaystyle {n! \over m! \, (n-m)!}$}
3197@cite{n!@: / m!@: (n-m)!} for all reals @cite{n} and
3198@cite{m}. The intermediate results in this formula can become quite
3199large even if the final result is small; the @kbd{k c} command computes
3200a binomial coefficient in a way that avoids large intermediate
3201values.
3202
3203The @kbd{k} prefix key defines several common functions out of
3204combinatorics and number theory. Here we compute the binomial
3205coefficient 30-choose-20, then determine its prime factorization.
3206
d7b8e6c6 3207@smallexample
5d67986c 3208@group
d7b8e6c6
EZ
32092: 30 1: 30045015 1: [3, 3, 5, 7, 11, 13, 23, 29]
32101: 20 . .
3211 .
3212
5d67986c 3213 30 @key{RET} 20 k c k f
d7b8e6c6 3214@end group
5d67986c 3215@end smallexample
d7b8e6c6
EZ
3216
3217@noindent
3218You can verify these prime factors by using @kbd{v u} to ``unpack''
3219this vector into 8 separate stack entries, then @kbd{M-8 *} to
3220multiply them back together. The result is the original number,
322130045015.
3222
3223@cindex Hash tables
3224Suppose a program you are writing needs a hash table with at least
322510000 entries. It's best to use a prime number as the actual size
3226of a hash table. Calc can compute the next prime number after 10000:
3227
d7b8e6c6 3228@smallexample
5d67986c 3229@group
d7b8e6c6
EZ
32301: 10000 1: 10007 1: 9973
3231 . . .
3232
3233 10000 k n I k n
d7b8e6c6 3234@end group
5d67986c 3235@end smallexample
d7b8e6c6
EZ
3236
3237@noindent
3238Just for kicks we've also computed the next prime @emph{less} than
323910000.
3240
3241@c [fix-ref Financial Functions]
3242@xref{Financial Functions}, for a description of the Calculator
3243commands that deal with business and financial calculations (functions
3244like @code{pv}, @code{rate}, and @code{sln}).
3245
3246@c [fix-ref Binary Number Functions]
3247@xref{Binary Functions}, to read about the commands for operating
3248on binary numbers (like @code{and}, @code{xor}, and @code{lsh}).
3249
3250@node Vector/Matrix Tutorial, Types Tutorial, Arithmetic Tutorial, Tutorial
3251@section Vector/Matrix Tutorial
3252
3253@noindent
3254A @dfn{vector} is a list of numbers or other Calc data objects.
3255Calc provides a large set of commands that operate on vectors. Some
3256are familiar operations from vector analysis. Others simply treat
3257a vector as a list of objects.
3258
3259@menu
3260* Vector Analysis Tutorial::
3261* Matrix Tutorial::
3262* List Tutorial::
3263@end menu
3264
3265@node Vector Analysis Tutorial, Matrix Tutorial, Vector/Matrix Tutorial, Vector/Matrix Tutorial
3266@subsection Vector Analysis
3267
3268@noindent
3269If you add two vectors, the result is a vector of the sums of the
3270elements, taken pairwise.
3271
d7b8e6c6 3272@smallexample
5d67986c 3273@group
d7b8e6c6
EZ
32741: [1, 2, 3] 2: [1, 2, 3] 1: [8, 8, 3]
3275 . 1: [7, 6, 0] .
3276 .
3277
3278 [1,2,3] s 1 [7 6 0] s 2 +
d7b8e6c6 3279@end group
5d67986c 3280@end smallexample
d7b8e6c6
EZ
3281
3282@noindent
3283Note that we can separate the vector elements with either commas or
3284spaces. This is true whether we are using incomplete vectors or
3285algebraic entry. The @kbd{s 1} and @kbd{s 2} commands save these
3286vectors so we can easily reuse them later.
3287
3288If you multiply two vectors, the result is the sum of the products
3289of the elements taken pairwise. This is called the @dfn{dot product}
3290of the vectors.
3291
d7b8e6c6 3292@smallexample
5d67986c 3293@group
d7b8e6c6
EZ
32942: [1, 2, 3] 1: 19
32951: [7, 6, 0] .
3296 .
3297
3298 r 1 r 2 *
d7b8e6c6 3299@end group
5d67986c 3300@end smallexample
d7b8e6c6
EZ
3301
3302@cindex Dot product
3303The dot product of two vectors is equal to the product of their
3304lengths times the cosine of the angle between them. (Here the vector
3305is interpreted as a line from the origin @cite{(0,0,0)} to the
3306specified point in three-dimensional space.) The @kbd{A}
3307(absolute value) command can be used to compute the length of a
3308vector.
3309
d7b8e6c6 3310@smallexample
5d67986c 3311@group
d7b8e6c6
EZ
33123: 19 3: 19 1: 0.550782 1: 56.579
33132: [1, 2, 3] 2: 3.741657 . .
33141: [7, 6, 0] 1: 9.219544
3315 . .
3316
5d67986c 3317 M-@key{RET} M-2 A * / I C
d7b8e6c6 3318@end group
5d67986c 3319@end smallexample
d7b8e6c6
EZ
3320
3321@noindent
3322First we recall the arguments to the dot product command, then
3323we compute the absolute values of the top two stack entries to
3324obtain the lengths of the vectors, then we divide the dot product
3325by the product of the lengths to get the cosine of the angle.
3326The inverse cosine finds that the angle between the vectors
3327is about 56 degrees.
3328
3329@cindex Cross product
3330@cindex Perpendicular vectors
3331The @dfn{cross product} of two vectors is a vector whose length
3332is the product of the lengths of the inputs times the sine of the
3333angle between them, and whose direction is perpendicular to both
3334input vectors. Unlike the dot product, the cross product is
3335defined only for three-dimensional vectors. Let's double-check
3336our computation of the angle using the cross product.
3337
d7b8e6c6 3338@smallexample
5d67986c 3339@group
d7b8e6c6
EZ
33402: [1, 2, 3] 3: [-18, 21, -8] 1: [-0.52, 0.61, -0.23] 1: 56.579
33411: [7, 6, 0] 2: [1, 2, 3] . .
3342 . 1: [7, 6, 0]
3343 .
3344
5d67986c 3345 r 1 r 2 V C s 3 M-@key{RET} M-2 A * / A I S
d7b8e6c6 3346@end group
5d67986c 3347@end smallexample
d7b8e6c6
EZ
3348
3349@noindent
3350First we recall the original vectors and compute their cross product,
3351which we also store for later reference. Now we divide the vector
3352by the product of the lengths of the original vectors. The length of
3353this vector should be the sine of the angle; sure enough, it is!
3354
3355@c [fix-ref General Mode Commands]
3356Vector-related commands generally begin with the @kbd{v} prefix key.
3357Some are uppercase letters and some are lowercase. To make it easier
3358to type these commands, the shift-@kbd{V} prefix key acts the same as
3359the @kbd{v} key. (@xref{General Mode Commands}, for a way to make all
3360prefix keys have this property.)
3361
3362If we take the dot product of two perpendicular vectors we expect
3363to get zero, since the cosine of 90 degrees is zero. Let's check
3364that the cross product is indeed perpendicular to both inputs:
3365
d7b8e6c6 3366@smallexample
5d67986c 3367@group
d7b8e6c6
EZ
33682: [1, 2, 3] 1: 0 2: [7, 6, 0] 1: 0
33691: [-18, 21, -8] . 1: [-18, 21, -8] .
3370 . .
3371
5d67986c 3372 r 1 r 3 * @key{DEL} r 2 r 3 *
d7b8e6c6 3373@end group
5d67986c 3374@end smallexample
d7b8e6c6
EZ
3375
3376@cindex Normalizing a vector
3377@cindex Unit vectors
3378(@bullet{}) @strong{Exercise 1.} Given a vector on the top of the
3379stack, what keystrokes would you use to @dfn{normalize} the
3380vector, i.e., to reduce its length to one without changing its
3381direction? @xref{Vector Answer 1, 1}. (@bullet{})
3382
3383(@bullet{}) @strong{Exercise 2.} Suppose a certain particle can be
3384at any of several positions along a ruler. You have a list of
3385those positions in the form of a vector, and another list of the
3386probabilities for the particle to be at the corresponding positions.
3387Find the average position of the particle.
3388@xref{Vector Answer 2, 2}. (@bullet{})
3389
3390@node Matrix Tutorial, List Tutorial, Vector Analysis Tutorial, Vector/Matrix Tutorial
3391@subsection Matrices
3392
3393@noindent
3394A @dfn{matrix} is just a vector of vectors, all the same length.
3395This means you can enter a matrix using nested brackets. You can
3396also use the semicolon character to enter a matrix. We'll show
3397both methods here:
3398
d7b8e6c6 3399@smallexample
5d67986c 3400@group
d7b8e6c6
EZ
34011: [ [ 1, 2, 3 ] 1: [ [ 1, 2, 3 ]
3402 [ 4, 5, 6 ] ] [ 4, 5, 6 ] ]
3403 . .
3404
5d67986c 3405 [[1 2 3] [4 5 6]] ' [1 2 3; 4 5 6] @key{RET}
d7b8e6c6 3406@end group
5d67986c 3407@end smallexample
d7b8e6c6
EZ
3408
3409@noindent
3410We'll be using this matrix again, so type @kbd{s 4} to save it now.
3411
3412Note that semicolons work with incomplete vectors, but they work
3413better in algebraic entry. That's why we use the apostrophe in
3414the second example.
3415
3416When two matrices are multiplied, the lefthand matrix must have
3417the same number of columns as the righthand matrix has rows.
3418Row @cite{i}, column @cite{j} of the result is effectively the
3419dot product of row @cite{i} of the left matrix by column @cite{j}
3420of the right matrix.
3421
3422If we try to duplicate this matrix and multiply it by itself,
3423the dimensions are wrong and the multiplication cannot take place:
3424
d7b8e6c6 3425@smallexample
5d67986c 3426@group
d7b8e6c6
EZ
34271: [ [ 1, 2, 3 ] * [ [ 1, 2, 3 ]
3428 [ 4, 5, 6 ] ] [ 4, 5, 6 ] ]
3429 .
3430
5d67986c 3431 @key{RET} *
d7b8e6c6 3432@end group
5d67986c 3433@end smallexample
d7b8e6c6
EZ
3434
3435@noindent
3436Though rather hard to read, this is a formula which shows the product
3437of two matrices. The @samp{*} function, having invalid arguments, has
3438been left in symbolic form.
3439
3440We can multiply the matrices if we @dfn{transpose} one of them first.
3441
d7b8e6c6 3442@smallexample
5d67986c 3443@group
d7b8e6c6
EZ
34442: [ [ 1, 2, 3 ] 1: [ [ 14, 32 ] 1: [ [ 17, 22, 27 ]
3445 [ 4, 5, 6 ] ] [ 32, 77 ] ] [ 22, 29, 36 ]
34461: [ [ 1, 4 ] . [ 27, 36, 45 ] ]
3447 [ 2, 5 ] .
3448 [ 3, 6 ] ]
3449 .
3450
5d67986c 3451 U v t * U @key{TAB} *
d7b8e6c6 3452@end group
5d67986c 3453@end smallexample
d7b8e6c6
EZ
3454
3455Matrix multiplication is not commutative; indeed, switching the
3456order of the operands can even change the dimensions of the result
3457matrix, as happened here!
3458
3459If you multiply a plain vector by a matrix, it is treated as a
3460single row or column depending on which side of the matrix it is
3461on. The result is a plain vector which should also be interpreted
3462as a row or column as appropriate.
3463
d7b8e6c6 3464@smallexample
5d67986c 3465@group
d7b8e6c6
EZ
34662: [ [ 1, 2, 3 ] 1: [14, 32]
3467 [ 4, 5, 6 ] ] .
34681: [1, 2, 3]
3469 .
3470
3471 r 4 r 1 *
d7b8e6c6 3472@end group
5d67986c 3473@end smallexample
d7b8e6c6
EZ
3474
3475Multiplying in the other order wouldn't work because the number of
3476rows in the matrix is different from the number of elements in the
3477vector.
3478
3479(@bullet{}) @strong{Exercise 1.} Use @samp{*} to sum along the rows
3480of the above @c{$2\times3$}
3481@asis{2x3} matrix to get @cite{[6, 15]}. Now use @samp{*} to
3482sum along the columns to get @cite{[5, 7, 9]}.
3483@xref{Matrix Answer 1, 1}. (@bullet{})
3484
3485@cindex Identity matrix
3486An @dfn{identity matrix} is a square matrix with ones along the
3487diagonal and zeros elsewhere. It has the property that multiplication
3488by an identity matrix, on the left or on the right, always produces
3489the original matrix.
3490
d7b8e6c6 3491@smallexample
5d67986c 3492@group
d7b8e6c6
EZ
34931: [ [ 1, 2, 3 ] 2: [ [ 1, 2, 3 ] 1: [ [ 1, 2, 3 ]
3494 [ 4, 5, 6 ] ] [ 4, 5, 6 ] ] [ 4, 5, 6 ] ]
3495 . 1: [ [ 1, 0, 0 ] .
3496 [ 0, 1, 0 ]
3497 [ 0, 0, 1 ] ]
3498 .
3499
5d67986c 3500 r 4 v i 3 @key{RET} *
d7b8e6c6 3501@end group
5d67986c 3502@end smallexample
d7b8e6c6
EZ
3503
3504If a matrix is square, it is often possible to find its @dfn{inverse},
3505that is, a matrix which, when multiplied by the original matrix, yields
3506an identity matrix. The @kbd{&} (reciprocal) key also computes the
3507inverse of a matrix.
3508
d7b8e6c6 3509@smallexample
5d67986c 3510@group
d7b8e6c6
EZ
35111: [ [ 1, 2, 3 ] 1: [ [ -2.4, 1.2, -0.2 ]
3512 [ 4, 5, 6 ] [ 2.8, -1.4, 0.4 ]
3513 [ 7, 6, 0 ] ] [ -0.73333, 0.53333, -0.2 ] ]
3514 . .
3515
3516 r 4 r 2 | s 5 &
d7b8e6c6 3517@end group
5d67986c 3518@end smallexample
d7b8e6c6
EZ
3519
3520@noindent
3521The vertical bar @kbd{|} @dfn{concatenates} numbers, vectors, and
3522matrices together. Here we have used it to add a new row onto
3523our matrix to make it square.
3524
3525We can multiply these two matrices in either order to get an identity.
3526
d7b8e6c6 3527@smallexample
5d67986c 3528@group
d7b8e6c6
EZ
35291: [ [ 1., 0., 0. ] 1: [ [ 1., 0., 0. ]
3530 [ 0., 1., 0. ] [ 0., 1., 0. ]
3531 [ 0., 0., 1. ] ] [ 0., 0., 1. ] ]
3532 . .
3533
5d67986c 3534 M-@key{RET} * U @key{TAB} *
d7b8e6c6 3535@end group
5d67986c 3536@end smallexample
d7b8e6c6
EZ
3537
3538@cindex Systems of linear equations
3539@cindex Linear equations, systems of
3540Matrix inverses are related to systems of linear equations in algebra.
3541Suppose we had the following set of equations:
3542
3543@ifinfo
3544@group
3545@example
3546 a + 2b + 3c = 6
3547 4a + 5b + 6c = 2
3548 7a + 6b = 3
3549@end example
3550@end group
3551@end ifinfo
3552@tex
3553\turnoffactive
3554\beforedisplayh
3555$$ \openup1\jot \tabskip=0pt plus1fil
3556\halign to\displaywidth{\tabskip=0pt
3557 $\hfil#$&$\hfil{}#{}$&
3558 $\hfil#$&$\hfil{}#{}$&
3559 $\hfil#$&${}#\hfil$\tabskip=0pt plus1fil\cr
3560 a&+&2b&+&3c&=6 \cr
3561 4a&+&5b&+&6c&=2 \cr
3562 7a&+&6b& & &=3 \cr}
3563$$
3564\afterdisplayh
3565@end tex
3566
3567@noindent
3568This can be cast into the matrix equation,
3569
3570@ifinfo
3571@group
3572@example
3573 [ [ 1, 2, 3 ] [ [ a ] [ [ 6 ]
3574 [ 4, 5, 6 ] * [ b ] = [ 2 ]
3575 [ 7, 6, 0 ] ] [ c ] ] [ 3 ] ]
3576@end example
3577@end group
3578@end ifinfo
3579@tex
3580\turnoffactive
3581\beforedisplay
3582$$ \pmatrix{ 1 & 2 & 3 \cr 4 & 5 & 6 \cr 7 & 6 & 0 }
3583 \times
3584 \pmatrix{ a \cr b \cr c } = \pmatrix{ 6 \cr 2 \cr 3 }
3585$$
3586\afterdisplay
3587@end tex
3588
3589We can solve this system of equations by multiplying both sides by the
3590inverse of the matrix. Calc can do this all in one step:
3591
d7b8e6c6 3592@smallexample
5d67986c 3593@group
d7b8e6c6
EZ
35942: [6, 2, 3] 1: [-12.6, 15.2, -3.93333]
35951: [ [ 1, 2, 3 ] .
3596 [ 4, 5, 6 ]
3597 [ 7, 6, 0 ] ]
3598 .
3599
3600 [6,2,3] r 5 /
d7b8e6c6 3601@end group
5d67986c 3602@end smallexample
d7b8e6c6
EZ
3603
3604@noindent
3605The result is the @cite{[a, b, c]} vector that solves the equations.
3606(Dividing by a square matrix is equivalent to multiplying by its
3607inverse.)
3608
3609Let's verify this solution:
3610
d7b8e6c6 3611@smallexample
5d67986c 3612@group
d7b8e6c6
EZ
36132: [ [ 1, 2, 3 ] 1: [6., 2., 3.]
3614 [ 4, 5, 6 ] .
3615 [ 7, 6, 0 ] ]
36161: [-12.6, 15.2, -3.93333]
3617 .
3618
5d67986c 3619 r 5 @key{TAB} *
d7b8e6c6 3620@end group
5d67986c 3621@end smallexample
d7b8e6c6
EZ
3622
3623@noindent
3624Note that we had to be careful about the order in which we multiplied
3625the matrix and vector. If we multiplied in the other order, Calc would
3626assume the vector was a row vector in order to make the dimensions
3627come out right, and the answer would be incorrect. If you
3628don't feel safe letting Calc take either interpretation of your
3629vectors, use explicit @c{$N\times1$}
3630@asis{Nx1} or @c{$1\times N$}
3631@asis{1xN} matrices instead.
3632In this case, you would enter the original column vector as
3633@samp{[[6], [2], [3]]} or @samp{[6; 2; 3]}.
3634
3635(@bullet{}) @strong{Exercise 2.} Algebraic entry allows you to make
3636vectors and matrices that include variables. Solve the following
3637system of equations to get expressions for @cite{x} and @cite{y}
3638in terms of @cite{a} and @cite{b}.
3639
3640@ifinfo
3641@group
3642@example
3643 x + a y = 6
3644 x + b y = 10
3645@end example
3646@end group
3647@end ifinfo
3648@tex
3649\turnoffactive
3650\beforedisplay
3651$$ \eqalign{ x &+ a y = 6 \cr
3652 x &+ b y = 10}
3653$$
3654\afterdisplay
3655@end tex
3656
3657@noindent
3658@xref{Matrix Answer 2, 2}. (@bullet{})
3659
3660@cindex Least-squares for over-determined systems
3661@cindex Over-determined systems of equations
3662(@bullet{}) @strong{Exercise 3.} A system of equations is ``over-determined''
3663if it has more equations than variables. It is often the case that
3664there are no values for the variables that will satisfy all the
3665equations at once, but it is still useful to find a set of values
3666which ``nearly'' satisfy all the equations. In terms of matrix equations,
3667you can't solve @cite{A X = B} directly because the matrix @cite{A}
3668is not square for an over-determined system. Matrix inversion works
3669only for square matrices. One common trick is to multiply both sides
3670on the left by the transpose of @cite{A}:
3671@ifinfo
3672@samp{trn(A)*A*X = trn(A)*B}.
3673@end ifinfo
3674@tex
3675\turnoffactive
3676$A^T A \, X = A^T B$, where $A^T$ is the transpose \samp{trn(A)}.
3677@end tex
3678Now @c{$A^T A$}
3679@cite{trn(A)*A} is a square matrix so a solution is possible. It
3680turns out that the @cite{X} vector you compute in this way will be a
3681``least-squares'' solution, which can be regarded as the ``closest''
3682solution to the set of equations. Use Calc to solve the following
3683over-determined system:@refill
3684
3685@ifinfo
3686@group
3687@example
3688 a + 2b + 3c = 6
3689 4a + 5b + 6c = 2
3690 7a + 6b = 3
3691 2a + 4b + 6c = 11
3692@end example
3693@end group
3694@end ifinfo
3695@tex
3696\turnoffactive
3697\beforedisplayh
3698$$ \openup1\jot \tabskip=0pt plus1fil
3699\halign to\displaywidth{\tabskip=0pt
3700 $\hfil#$&$\hfil{}#{}$&
3701 $\hfil#$&$\hfil{}#{}$&
3702 $\hfil#$&${}#\hfil$\tabskip=0pt plus1fil\cr
3703 a&+&2b&+&3c&=6 \cr
3704 4a&+&5b&+&6c&=2 \cr
3705 7a&+&6b& & &=3 \cr
3706 2a&+&4b&+&6c&=11 \cr}
3707$$
3708\afterdisplayh
3709@end tex
3710
3711@noindent
3712@xref{Matrix Answer 3, 3}. (@bullet{})
3713
3714@node List Tutorial, , Matrix Tutorial, Vector/Matrix Tutorial
3715@subsection Vectors as Lists
3716
3717@noindent
3718@cindex Lists
3719Although Calc has a number of features for manipulating vectors and
3720matrices as mathematical objects, you can also treat vectors as
3721simple lists of values. For example, we saw that the @kbd{k f}
3722command returns a vector which is a list of the prime factors of a
3723number.
3724
3725You can pack and unpack stack entries into vectors:
3726
d7b8e6c6 3727@smallexample
5d67986c 3728@group
d7b8e6c6
EZ
37293: 10 1: [10, 20, 30] 3: 10
37302: 20 . 2: 20
37311: 30 1: 30
3732 . .
3733
3734 M-3 v p v u
d7b8e6c6 3735@end group
5d67986c 3736@end smallexample
d7b8e6c6
EZ
3737
3738You can also build vectors out of consecutive integers, or out
3739of many copies of a given value:
3740
d7b8e6c6 3741@smallexample
5d67986c 3742@group
d7b8e6c6
EZ
37431: [1, 2, 3, 4] 2: [1, 2, 3, 4] 2: [1, 2, 3, 4]
3744 . 1: 17 1: [17, 17, 17, 17]
3745 . .
3746
5d67986c 3747 v x 4 @key{RET} 17 v b 4 @key{RET}
d7b8e6c6 3748@end group
5d67986c 3749@end smallexample
d7b8e6c6
EZ
3750
3751You can apply an operator to every element of a vector using the
3752@dfn{map} command.
3753
d7b8e6c6 3754@smallexample
5d67986c 3755@group
d7b8e6c6
EZ
37561: [17, 34, 51, 68] 1: [289, 1156, 2601, 4624] 1: [17, 34, 51, 68]
3757 . . .
3758
3759 V M * 2 V M ^ V M Q
d7b8e6c6 3760@end group
5d67986c 3761@end smallexample
d7b8e6c6
EZ
3762
3763@noindent
3764In the first step, we multiply the vector of integers by the vector
3765of 17's elementwise. In the second step, we raise each element to
3766the power two. (The general rule is that both operands must be
3767vectors of the same length, or else one must be a vector and the
3768other a plain number.) In the final step, we take the square root
3769of each element.
3770
3771(@bullet{}) @strong{Exercise 1.} Compute a vector of powers of two
3772from @c{$2^{-4}$}
3773@cite{2^-4} to @cite{2^4}. @xref{List Answer 1, 1}. (@bullet{})
3774
3775You can also @dfn{reduce} a binary operator across a vector.
3776For example, reducing @samp{*} computes the product of all the
3777elements in the vector:
3778
d7b8e6c6 3779@smallexample
5d67986c 3780@group
d7b8e6c6
EZ
37811: 123123 1: [3, 7, 11, 13, 41] 1: 123123
3782 . . .
3783
3784 123123 k f V R *
d7b8e6c6 3785@end group
5d67986c 3786@end smallexample
d7b8e6c6
EZ
3787
3788@noindent
3789In this example, we decompose 123123 into its prime factors, then
3790multiply those factors together again to yield the original number.
3791
3792We could compute a dot product ``by hand'' using mapping and
3793reduction:
3794
d7b8e6c6 3795@smallexample
5d67986c 3796@group
d7b8e6c6
EZ
37972: [1, 2, 3] 1: [7, 12, 0] 1: 19
37981: [7, 6, 0] . .
3799 .
3800
3801 r 1 r 2 V M * V R +
d7b8e6c6 3802@end group
5d67986c 3803@end smallexample
d7b8e6c6
EZ
3804
3805@noindent
3806Recalling two vectors from the previous section, we compute the
3807sum of pairwise products of the elements to get the same answer
3808for the dot product as before.
3809
3810A slight variant of vector reduction is the @dfn{accumulate} operation,
3811@kbd{V U}. This produces a vector of the intermediate results from
3812a corresponding reduction. Here we compute a table of factorials:
3813
d7b8e6c6 3814@smallexample
5d67986c 3815@group
d7b8e6c6
EZ
38161: [1, 2, 3, 4, 5, 6] 1: [1, 2, 6, 24, 120, 720]
3817 . .
3818
5d67986c 3819 v x 6 @key{RET} V U *
d7b8e6c6 3820@end group
5d67986c 3821@end smallexample
d7b8e6c6
EZ
3822
3823Calc allows vectors to grow as large as you like, although it gets
3824rather slow if vectors have more than about a hundred elements.
3825Actually, most of the time is spent formatting these large vectors
3826for display, not calculating on them. Try the following experiment
3827(if your computer is very fast you may need to substitute a larger
3828vector size).
3829
d7b8e6c6 3830@smallexample
5d67986c 3831@group
d7b8e6c6
EZ
38321: [1, 2, 3, 4, ... 1: [2, 3, 4, 5, ...
3833 . .
3834
5d67986c 3835 v x 500 @key{RET} 1 V M +
d7b8e6c6 3836@end group
5d67986c 3837@end smallexample
d7b8e6c6
EZ
3838
3839Now press @kbd{v .} (the letter @kbd{v}, then a period) and try the
3840experiment again. In @kbd{v .} mode, long vectors are displayed
3841``abbreviated'' like this:
3842
d7b8e6c6 3843@smallexample
5d67986c 3844@group
d7b8e6c6
EZ
38451: [1, 2, 3, ..., 500] 1: [2, 3, 4, ..., 501]
3846 . .
3847
5d67986c 3848 v x 500 @key{RET} 1 V M +
d7b8e6c6 3849@end group
5d67986c 3850@end smallexample
d7b8e6c6
EZ
3851
3852@noindent
3853(where now the @samp{...} is actually part of the Calc display).
3854You will find both operations are now much faster. But notice that
3855even in @w{@kbd{v .}} mode, the full vectors are still shown in the Trail.
3856Type @w{@kbd{t .}} to cause the trail to abbreviate as well, and try the
3857experiment one more time. Operations on long vectors are now quite
3858fast! (But of course if you use @kbd{t .} you will lose the ability
3859to get old vectors back using the @kbd{t y} command.)
3860
3861An easy way to view a full vector when @kbd{v .} mode is active is
3862to press @kbd{`} (back-quote) to edit the vector; editing always works
3863with the full, unabbreviated value.
3864
3865@cindex Least-squares for fitting a straight line
3866@cindex Fitting data to a line
3867@cindex Line, fitting data to
3868@cindex Data, extracting from buffers
3869@cindex Columns of data, extracting
3870As a larger example, let's try to fit a straight line to some data,
3871using the method of least squares. (Calc has a built-in command for
3872least-squares curve fitting, but we'll do it by hand here just to
3873practice working with vectors.) Suppose we have the following list
3874of values in a file we have loaded into Emacs:
3875
3876@smallexample
3877 x y
3878 --- ---
3879 1.34 0.234
3880 1.41 0.298
3881 1.49 0.402
3882 1.56 0.412
3883 1.64 0.466
3884 1.73 0.473
3885 1.82 0.601
3886 1.91 0.519
3887 2.01 0.603
3888 2.11 0.637
3889 2.22 0.645
3890 2.33 0.705
3891 2.45 0.917
3892 2.58 1.009
3893 2.71 0.971
3894 2.85 1.062
3895 3.00 1.148
3896 3.15 1.157
3897 3.32 1.354
3898@end smallexample
3899
3900@noindent
3901If you are reading this tutorial in printed form, you will find it
3902easiest to press @kbd{M-# i} to enter the on-line Info version of
3903the manual and find this table there. (Press @kbd{g}, then type
3904@kbd{List Tutorial}, to jump straight to this section.)
3905
3906Position the cursor at the upper-left corner of this table, just
3907to the left of the @cite{1.34}. Press @kbd{C-@@} to set the mark.
5d67986c 3908(On your system this may be @kbd{C-2}, @kbd{C-@key{SPC}}, or @kbd{NUL}.)
d7b8e6c6
EZ
3909Now position the cursor to the lower-right, just after the @cite{1.354}.
3910You have now defined this region as an Emacs ``rectangle.'' Still
3911in the Info buffer, type @kbd{M-# r}. This command
3912(@code{calc-grab-rectangle}) will pop you back into the Calculator, with
3913the contents of the rectangle you specified in the form of a matrix.@refill
3914
d7b8e6c6 3915@smallexample
5d67986c 3916@group
d7b8e6c6
EZ
39171: [ [ 1.34, 0.234 ]
3918 [ 1.41, 0.298 ]
3919 @dots{}
d7b8e6c6 3920@end group
5d67986c 3921@end smallexample
d7b8e6c6
EZ
3922
3923@noindent
3924(You may wish to use @kbd{v .} mode to abbreviate the display of this
3925large matrix.)
3926
3927We want to treat this as a pair of lists. The first step is to
3928transpose this matrix into a pair of rows. Remember, a matrix is
3929just a vector of vectors. So we can unpack the matrix into a pair
3930of row vectors on the stack.
3931
d7b8e6c6 3932@smallexample
5d67986c 3933@group
d7b8e6c6
EZ
39341: [ [ 1.34, 1.41, 1.49, ... ] 2: [1.34, 1.41, 1.49, ... ]
3935 [ 0.234, 0.298, 0.402, ... ] ] 1: [0.234, 0.298, 0.402, ... ]
3936 . .
3937
3938 v t v u
d7b8e6c6 3939@end group
5d67986c 3940@end smallexample
d7b8e6c6
EZ
3941
3942@noindent
3943Let's store these in quick variables 1 and 2, respectively.
3944
d7b8e6c6 3945@smallexample
5d67986c 3946@group
d7b8e6c6
EZ
39471: [1.34, 1.41, 1.49, ... ] .
3948 .
3949
3950 t 2 t 1
d7b8e6c6 3951@end group
5d67986c 3952@end smallexample
d7b8e6c6
EZ
3953
3954@noindent
3955(Recall that @kbd{t 2} is a variant of @kbd{s 2} that removes the
3956stored value from the stack.)
3957
3958In a least squares fit, the slope @cite{m} is given by the formula
3959
3960@ifinfo
3961@example
3962m = (N sum(x y) - sum(x) sum(y)) / (N sum(x^2) - sum(x)^2)
3963@end example
3964@end ifinfo
3965@tex
3966\turnoffactive
3967\beforedisplay
3968$$ m = {N \sum x y - \sum x \sum y \over
3969 N \sum x^2 - \left( \sum x \right)^2} $$
3970\afterdisplay
3971@end tex
3972
3973@noindent
3974where @c{$\sum x$}
3975@cite{sum(x)} represents the sum of all the values of @cite{x}.
3976While there is an actual @code{sum} function in Calc, it's easier to
3977sum a vector using a simple reduction. First, let's compute the four
3978different sums that this formula uses.
3979
d7b8e6c6 3980@smallexample
5d67986c 3981@group
d7b8e6c6
EZ
39821: 41.63 1: 98.0003
3983 . .
3984
3985 r 1 V R + t 3 r 1 2 V M ^ V R + t 4
3986
d7b8e6c6 3987@end group
5d67986c 3988@end smallexample
d7b8e6c6 3989@noindent
d7b8e6c6 3990@smallexample
5d67986c 3991@group
d7b8e6c6
EZ
39921: 13.613 1: 33.36554
3993 . .
3994
3995 r 2 V R + t 5 r 1 r 2 V M * V R + t 6
d7b8e6c6 3996@end group
5d67986c 3997@end smallexample
d7b8e6c6
EZ
3998
3999@ifinfo
4000@noindent
4001These are @samp{sum(x)}, @samp{sum(x^2)}, @samp{sum(y)}, and @samp{sum(x y)},
4002respectively. (We could have used @kbd{*} to compute @samp{sum(x^2)} and
4003@samp{sum(x y)}.)
4004@end ifinfo
4005@tex
4006\turnoffactive
4007These are $\sum x$, $\sum x^2$, $\sum y$, and $\sum x y$,
4008respectively. (We could have used \kbd{*} to compute $\sum x^2$ and
4009$\sum x y$.)
4010@end tex
4011
4012Finally, we also need @cite{N}, the number of data points. This is just
4013the length of either of our lists.
4014
d7b8e6c6 4015@smallexample
5d67986c 4016@group
d7b8e6c6
EZ
40171: 19
4018 .
4019
4020 r 1 v l t 7
d7b8e6c6 4021@end group
5d67986c 4022@end smallexample
d7b8e6c6
EZ
4023
4024@noindent
4025(That's @kbd{v} followed by a lower-case @kbd{l}.)
4026
4027Now we grind through the formula:
4028
d7b8e6c6 4029@smallexample
5d67986c 4030@group
d7b8e6c6
EZ
40311: 633.94526 2: 633.94526 1: 67.23607
4032 . 1: 566.70919 .
4033 .
4034
4035 r 7 r 6 * r 3 r 5 * -
4036
d7b8e6c6 4037@end group
5d67986c 4038@end smallexample
d7b8e6c6 4039@noindent
d7b8e6c6 4040@smallexample
5d67986c 4041@group
d7b8e6c6
EZ
40422: 67.23607 3: 67.23607 2: 67.23607 1: 0.52141679
40431: 1862.0057 2: 1862.0057 1: 128.9488 .
4044 . 1: 1733.0569 .
4045 .
4046
4047 r 7 r 4 * r 3 2 ^ - / t 8
d7b8e6c6 4048@end group
5d67986c 4049@end smallexample
d7b8e6c6
EZ
4050
4051That gives us the slope @cite{m}. The y-intercept @cite{b} can now
4052be found with the simple formula,
4053
4054@ifinfo
4055@example
4056b = (sum(y) - m sum(x)) / N
4057@end example
4058@end ifinfo
4059@tex
4060\turnoffactive
4061\beforedisplay
4062$$ b = {\sum y - m \sum x \over N} $$
4063\afterdisplay
4064\vskip10pt
4065@end tex
4066
d7b8e6c6 4067@smallexample
5d67986c 4068@group
d7b8e6c6
EZ
40691: 13.613 2: 13.613 1: -8.09358 1: -0.425978
4070 . 1: 21.70658 . .
4071 .
4072
4073 r 5 r 8 r 3 * - r 7 / t 9
d7b8e6c6 4074@end group
5d67986c 4075@end smallexample
d7b8e6c6
EZ
4076
4077Let's ``plot'' this straight line approximation, @c{$y \approx m x + b$}
4078@cite{m x + b}, and compare it with the original data.@refill
4079
d7b8e6c6 4080@smallexample
5d67986c 4081@group
d7b8e6c6
EZ
40821: [0.699, 0.735, ... ] 1: [0.273, 0.309, ... ]
4083 . .
4084
4085 r 1 r 8 * r 9 + s 0
d7b8e6c6 4086@end group
5d67986c 4087@end smallexample
d7b8e6c6
EZ
4088
4089@noindent
4090Notice that multiplying a vector by a constant, and adding a constant
4091to a vector, can be done without mapping commands since these are
4092common operations from vector algebra. As far as Calc is concerned,
4093we've just been doing geometry in 19-dimensional space!
4094
4095We can subtract this vector from our original @cite{y} vector to get
4096a feel for the error of our fit. Let's find the maximum error:
4097
d7b8e6c6 4098@smallexample
5d67986c 4099@group
d7b8e6c6
EZ
41001: [0.0387, 0.0112, ... ] 1: [0.0387, 0.0112, ... ] 1: 0.0897
4101 . . .
4102
4103 r 2 - V M A V R X
d7b8e6c6 4104@end group
5d67986c 4105@end smallexample
d7b8e6c6
EZ
4106
4107@noindent
4108First we compute a vector of differences, then we take the absolute
4109values of these differences, then we reduce the @code{max} function
4110across the vector. (The @code{max} function is on the two-key sequence
4111@kbd{f x}; because it is so common to use @code{max} in a vector
4112operation, the letters @kbd{X} and @kbd{N} are also accepted for
4113@code{max} and @code{min} in this context. In general, you answer
4114the @kbd{V M} or @kbd{V R} prompt with the actual key sequence that
4115invokes the function you want. You could have typed @kbd{V R f x} or
4116even @kbd{V R x max @key{RET}} if you had preferred.)
4117
4118If your system has the GNUPLOT program, you can see graphs of your
4119data and your straight line to see how well they match. (If you have
4120GNUPLOT 3.0, the following instructions will work regardless of the
4121kind of display you have. Some GNUPLOT 2.0, non-X-windows systems
4122may require additional steps to view the graphs.)
4123
5d67986c 4124Let's start by plotting the original data. Recall the ``@var{x}'' and ``@var{y}''
d7b8e6c6
EZ
4125vectors onto the stack and press @kbd{g f}. This ``fast'' graphing
4126command does everything you need to do for simple, straightforward
4127plotting of data.
4128
d7b8e6c6 4129@smallexample
5d67986c 4130@group
d7b8e6c6
EZ
41312: [1.34, 1.41, 1.49, ... ]
41321: [0.234, 0.298, 0.402, ... ]
4133 .
4134
4135 r 1 r 2 g f
d7b8e6c6 4136@end group
5d67986c 4137@end smallexample
d7b8e6c6
EZ
4138
4139If all goes well, you will shortly get a new window containing a graph
4140of the data. (If not, contact your GNUPLOT or Calc installer to find
4141out what went wrong.) In the X window system, this will be a separate
4142graphics window. For other kinds of displays, the default is to
4143display the graph in Emacs itself using rough character graphics.
4144Press @kbd{q} when you are done viewing the character graphics.
4145
4146Next, let's add the line we got from our least-squares fit:
4147
d7b8e6c6 4148@smallexample
5d67986c 4149@group
d7b8e6c6
EZ
41502: [1.34, 1.41, 1.49, ... ]
41511: [0.273, 0.309, 0.351, ... ]
4152 .
4153
5d67986c 4154 @key{DEL} r 0 g a g p
d7b8e6c6 4155@end group
5d67986c 4156@end smallexample
d7b8e6c6
EZ
4157
4158It's not very useful to get symbols to mark the data points on this
4159second curve; you can type @kbd{g S g p} to remove them. Type @kbd{g q}
4160when you are done to remove the X graphics window and terminate GNUPLOT.
4161
4162(@bullet{}) @strong{Exercise 2.} An earlier exercise showed how to do
4163least squares fitting to a general system of equations. Our 19 data
4164points are really 19 equations of the form @cite{y_i = m x_i + b} for
4165different pairs of @cite{(x_i,y_i)}. Use the matrix-transpose method
4166to solve for @cite{m} and @cite{b}, duplicating the above result.
4167@xref{List Answer 2, 2}. (@bullet{})
4168
4169@cindex Geometric mean
4170(@bullet{}) @strong{Exercise 3.} If the input data do not form a
4171rectangle, you can use @w{@kbd{M-# g}} (@code{calc-grab-region})
4172to grab the data the way Emacs normally works with regions---it reads
4173left-to-right, top-to-bottom, treating line breaks the same as spaces.
4174Use this command to find the geometric mean of the following numbers.
4175(The geometric mean is the @var{n}th root of the product of @var{n} numbers.)
4176
4177@example
41782.3 6 22 15.1 7
4179 15 14 7.5
4180 2.5
4181@end example
4182
4183@noindent
4184The @kbd{M-# g} command accepts numbers separated by spaces or commas,
4185with or without surrounding vector brackets.
4186@xref{List Answer 3, 3}. (@bullet{})
4187
4188@ifinfo
4189As another example, a theorem about binomial coefficients tells
4190us that the alternating sum of binomial coefficients
4191@var{n}-choose-0 minus @var{n}-choose-1 plus @var{n}-choose-2, and so
4192on up to @var{n}-choose-@var{n},
4193always comes out to zero. Let's verify this
4194for @cite{n=6}.@refill
4195@end ifinfo
4196@tex
4197As another example, a theorem about binomial coefficients tells
4198us that the alternating sum of binomial coefficients
4199${n \choose 0} - {n \choose 1} + {n \choose 2} - \cdots \pm {n \choose n}$
4200always comes out to zero. Let's verify this
4201for \cite{n=6}.
4202@end tex
4203
d7b8e6c6 4204@smallexample
5d67986c 4205@group
d7b8e6c6
EZ
42061: [1, 2, 3, 4, 5, 6, 7] 1: [0, 1, 2, 3, 4, 5, 6]
4207 . .
4208
5d67986c 4209 v x 7 @key{RET} 1 -
d7b8e6c6 4210
d7b8e6c6 4211@end group
5d67986c 4212@end smallexample
d7b8e6c6 4213@noindent
d7b8e6c6 4214@smallexample
5d67986c 4215@group
d7b8e6c6
EZ
42161: [1, -6, 15, -20, 15, -6, 1] 1: 0
4217 . .
4218
5d67986c 4219 V M ' (-1)^$ choose(6,$) @key{RET} V R +
d7b8e6c6 4220@end group
5d67986c 4221@end smallexample
d7b8e6c6
EZ
4222
4223The @kbd{V M '} command prompts you to enter any algebraic expression
4224to define the function to map over the vector. The symbol @samp{$}
4225inside this expression represents the argument to the function.
4226The Calculator applies this formula to each element of the vector,
4227substituting each element's value for the @samp{$} sign(s) in turn.
4228
4229To define a two-argument function, use @samp{$$} for the first
5d67986c 4230argument and @samp{$} for the second: @kbd{V M ' $$-$ @key{RET}} is
d7b8e6c6
EZ
4231equivalent to @kbd{V M -}. This is analogous to regular algebraic
4232entry, where @samp{$$} would refer to the next-to-top stack entry
5d67986c 4233and @samp{$} would refer to the top stack entry, and @kbd{' $$-$ @key{RET}}
d7b8e6c6
EZ
4234would act exactly like @kbd{-}.
4235
4236Notice that the @kbd{V M '} command has recorded two things in the
4237trail: The result, as usual, and also a funny-looking thing marked
4238@samp{oper} that represents the operator function you typed in.
4239The function is enclosed in @samp{< >} brackets, and the argument is
4240denoted by a @samp{#} sign. If there were several arguments, they
4241would be shown as @samp{#1}, @samp{#2}, and so on. (For example,
4242@kbd{V M ' $$-$} will put the function @samp{<#1 - #2>} on the
4243trail.) This object is a ``nameless function''; you can use nameless
4244@w{@samp{< >}} notation to answer the @kbd{V M '} prompt if you like.
4245Nameless function notation has the interesting, occasionally useful
4246property that a nameless function is not actually evaluated until
4247it is used. For example, @kbd{V M ' $+random(2.0)} evaluates
4248@samp{random(2.0)} once and adds that random number to all elements
4249of the vector, but @kbd{V M ' <#+random(2.0)>} evaluates the
4250@samp{random(2.0)} separately for each vector element.
4251
4252Another group of operators that are often useful with @kbd{V M} are
4253the relational operators: @kbd{a =}, for example, compares two numbers
4254and gives the result 1 if they are equal, or 0 if not. Similarly,
4255@w{@kbd{a <}} checks for one number being less than another.
4256
4257Other useful vector operations include @kbd{v v}, to reverse a
4258vector end-for-end; @kbd{V S}, to sort the elements of a vector
4259into increasing order; and @kbd{v r} and @w{@kbd{v c}}, to extract
4260one row or column of a matrix, or (in both cases) to extract one
4261element of a plain vector. With a negative argument, @kbd{v r}
4262and @kbd{v c} instead delete one row, column, or vector element.
4263
4264@cindex Divisor functions
4265(@bullet{}) @strong{Exercise 4.} The @cite{k}th @dfn{divisor function}
4266@tex
4267$\sigma_k(n)$
4268@end tex
4269is the sum of the @cite{k}th powers of all the divisors of an
4270integer @cite{n}. Figure out a method for computing the divisor
4271function for reasonably small values of @cite{n}. As a test,
4272the 0th and 1st divisor functions of 30 are 8 and 72, respectively.
4273@xref{List Answer 4, 4}. (@bullet{})
4274
4275@cindex Square-free numbers
4276@cindex Duplicate values in a list
4277(@bullet{}) @strong{Exercise 5.} The @kbd{k f} command produces a
4278list of prime factors for a number. Sometimes it is important to
4279know that a number is @dfn{square-free}, i.e., that no prime occurs
4280more than once in its list of prime factors. Find a sequence of
4281keystrokes to tell if a number is square-free; your method should
4282leave 1 on the stack if it is, or 0 if it isn't.
4283@xref{List Answer 5, 5}. (@bullet{})
4284
4285@cindex Triangular lists
4286(@bullet{}) @strong{Exercise 6.} Build a list of lists that looks
4287like the following diagram. (You may wish to use the @kbd{v /}
4288command to enable multi-line display of vectors.)
4289
d7b8e6c6 4290@smallexample
5d67986c 4291@group
d7b8e6c6
EZ
42921: [ [1],
4293 [1, 2],
4294 [1, 2, 3],
4295 [1, 2, 3, 4],
4296 [1, 2, 3, 4, 5],
4297 [1, 2, 3, 4, 5, 6] ]
d7b8e6c6 4298@end group
5d67986c 4299@end smallexample
d7b8e6c6
EZ
4300
4301@noindent
4302@xref{List Answer 6, 6}. (@bullet{})
4303
4304(@bullet{}) @strong{Exercise 7.} Build the following list of lists.
4305
d7b8e6c6 4306@smallexample
5d67986c 4307@group
d7b8e6c6
EZ
43081: [ [0],
4309 [1, 2],
4310 [3, 4, 5],
4311 [6, 7, 8, 9],
4312 [10, 11, 12, 13, 14],
4313 [15, 16, 17, 18, 19, 20] ]
d7b8e6c6 4314@end group
5d67986c 4315@end smallexample
d7b8e6c6
EZ
4316
4317@noindent
4318@xref{List Answer 7, 7}. (@bullet{})
4319
4320@cindex Maximizing a function over a list of values
4321@c [fix-ref Numerical Solutions]
4322(@bullet{}) @strong{Exercise 8.} Compute a list of values of Bessel's
4323@c{$J_1(x)$}
4324@cite{J1} function @samp{besJ(1,x)} for @cite{x} from 0 to 5
4325in steps of 0.25.
4326Find the value of @cite{x} (from among the above set of values) for
4327which @samp{besJ(1,x)} is a maximum. Use an ``automatic'' method,
4328i.e., just reading along the list by hand to find the largest value
4329is not allowed! (There is an @kbd{a X} command which does this kind
4330of thing automatically; @pxref{Numerical Solutions}.)
4331@xref{List Answer 8, 8}. (@bullet{})@refill
4332
4333@cindex Digits, vectors of
4334(@bullet{}) @strong{Exercise 9.} You are given an integer in the range
4335@c{$0 \le N < 10^m$}
4336@cite{0 <= N < 10^m} for @cite{m=12} (i.e., an integer of less than
4337twelve digits). Convert this integer into a vector of @cite{m}
4338digits, each in the range from 0 to 9. In vector-of-digits notation,
4339add one to this integer to produce a vector of @cite{m+1} digits
4340(since there could be a carry out of the most significant digit).
4341Convert this vector back into a regular integer. A good integer
4342to try is 25129925999. @xref{List Answer 9, 9}. (@bullet{})
4343
4344(@bullet{}) @strong{Exercise 10.} Your friend Joe tried to use
4345@kbd{V R a =} to test if all numbers in a list were equal. What
4346happened? How would you do this test? @xref{List Answer 10, 10}. (@bullet{})
4347
4348(@bullet{}) @strong{Exercise 11.} The area of a circle of radius one
4349is @c{$\pi$}
4350@cite{pi}. The area of the @c{$2\times2$}
4351@asis{2x2} square that encloses that
5d67986c 4352circle is 4. So if we throw @var{n} darts at random points in the square,
d7b8e6c6
EZ
4353about @c{$\pi/4$}
4354@cite{pi/4} of them will land inside the circle. This gives us
4355an entertaining way to estimate the value of @c{$\pi$}
4356@cite{pi}. The @w{@kbd{k r}}
4357command picks a random number between zero and the value on the stack.
4358We could get a random floating-point number between @i{-1} and 1 by typing
4359@w{@kbd{2.0 k r 1 -}}. Build a vector of 100 random @cite{(x,y)} points in
4360this square, then use vector mapping and reduction to count how many
4361points lie inside the unit circle. Hint: Use the @kbd{v b} command.
4362@xref{List Answer 11, 11}. (@bullet{})
4363
4364@cindex Matchstick problem
4365(@bullet{}) @strong{Exercise 12.} The @dfn{matchstick problem} provides
4366another way to calculate @c{$\pi$}
4367@cite{pi}. Say you have an infinite field
4368of vertical lines with a spacing of one inch. Toss a one-inch matchstick
4369onto the field. The probability that the matchstick will land crossing
4370a line turns out to be @c{$2/\pi$}
4371@cite{2/pi}. Toss 100 matchsticks to estimate
4372@c{$\pi$}
4373@cite{pi}. (If you want still more fun, the probability that the GCD
4374(@w{@kbd{k g}}) of two large integers is one turns out to be @c{$6/\pi^2$}
4375@cite{6/pi^2}.
4376That provides yet another way to estimate @c{$\pi$}
4377@cite{pi}.)
4378@xref{List Answer 12, 12}. (@bullet{})
4379
4380(@bullet{}) @strong{Exercise 13.} An algebraic entry of a string in
4381double-quote marks, @samp{"hello"}, creates a vector of the numerical
4382(ASCII) codes of the characters (here, @cite{[104, 101, 108, 108, 111]}).
4383Sometimes it is convenient to compute a @dfn{hash code} of a string,
4384which is just an integer that represents the value of that string.
4385Two equal strings have the same hash code; two different strings
4386@dfn{probably} have different hash codes. (For example, Calc has
4387over 400 function names, but Emacs can quickly find the definition for
4388any given name because it has sorted the functions into ``buckets'' by
4389their hash codes. Sometimes a few names will hash into the same bucket,
4390but it is easier to search among a few names than among all the names.)
4391One popular hash function is computed as follows: First set @cite{h = 0}.
4392Then, for each character from the string in turn, set @cite{h = 3h + c_i}
4393where @cite{c_i} is the character's ASCII code. If we have 511 buckets,
4394we then take the hash code modulo 511 to get the bucket number. Develop a
4395simple command or commands for converting string vectors into hash codes.
4396The hash code for @samp{"Testing, 1, 2, 3"} is 1960915098, which modulo
4397511 is 121. @xref{List Answer 13, 13}. (@bullet{})
4398
4399(@bullet{}) @strong{Exercise 14.} The @kbd{H V R} and @kbd{H V U}
4400commands do nested function evaluations. @kbd{H V U} takes a starting
4401value and a number of steps @var{n} from the stack; it then applies the
4402function you give to the starting value 0, 1, 2, up to @var{n} times
4403and returns a vector of the results. Use this command to create a
4404``random walk'' of 50 steps. Start with the two-dimensional point
4405@cite{(0,0)}; then take one step a random distance between @i{-1} and 1
4406in both @cite{x} and @cite{y}; then take another step, and so on. Use the
4407@kbd{g f} command to display this random walk. Now modify your random
4408walk to walk a unit distance, but in a random direction, at each step.
4409(Hint: The @code{sincos} function returns a vector of the cosine and
4410sine of an angle.) @xref{List Answer 14, 14}. (@bullet{})
4411
4412@node Types Tutorial, Algebra Tutorial, Vector/Matrix Tutorial, Tutorial
4413@section Types Tutorial
4414
4415@noindent
4416Calc understands a variety of data types as well as simple numbers.
4417In this section, we'll experiment with each of these types in turn.
4418
4419The numbers we've been using so far have mainly been either @dfn{integers}
4420or @dfn{floats}. We saw that floats are usually a good approximation to
4421the mathematical concept of real numbers, but they are only approximations
4422and are susceptible to roundoff error. Calc also supports @dfn{fractions},
4423which can exactly represent any rational number.
4424
d7b8e6c6 4425@smallexample
5d67986c 4426@group
d7b8e6c6
EZ
44271: 3628800 2: 3628800 1: 518400:7 1: 518414:7 1: 7:518414
4428 . 1: 49 . . .
4429 .
4430
5d67986c 4431 10 ! 49 @key{RET} : 2 + &
d7b8e6c6 4432@end group
5d67986c 4433@end smallexample
d7b8e6c6
EZ
4434
4435@noindent
4436The @kbd{:} command divides two integers to get a fraction; @kbd{/}
4437would normally divide integers to get a floating-point result.
4438Notice we had to type @key{RET} between the @kbd{49} and the @kbd{:}
4439since the @kbd{:} would otherwise be interpreted as part of a
4440fraction beginning with 49.
4441
4442You can convert between floating-point and fractional format using
4443@kbd{c f} and @kbd{c F}:
4444
d7b8e6c6 4445@smallexample
5d67986c 4446@group
d7b8e6c6
EZ
44471: 1.35027217629e-5 1: 7:518414
4448 . .
4449
4450 c f c F
d7b8e6c6 4451@end group
5d67986c 4452@end smallexample
d7b8e6c6
EZ
4453
4454The @kbd{c F} command replaces a floating-point number with the
4455``simplest'' fraction whose floating-point representation is the
4456same, to within the current precision.
4457
d7b8e6c6 4458@smallexample
5d67986c 4459@group
d7b8e6c6
EZ
44601: 3.14159265359 1: 1146408:364913 1: 3.1416 1: 355:113
4461 . . . .
4462
5d67986c 4463 P c F @key{DEL} p 5 @key{RET} P c F
d7b8e6c6 4464@end group
5d67986c 4465@end smallexample
d7b8e6c6
EZ
4466
4467(@bullet{}) @strong{Exercise 1.} A calculation has produced the
4468result 1.26508260337. You suspect it is the square root of the
4469product of @c{$\pi$}
4470@cite{pi} and some rational number. Is it? (Be sure
4471to allow for roundoff error!) @xref{Types Answer 1, 1}. (@bullet{})
4472
4473@dfn{Complex numbers} can be stored in both rectangular and polar form.
4474
d7b8e6c6 4475@smallexample
5d67986c 4476@group
d7b8e6c6
EZ
44771: -9 1: (0, 3) 1: (3; 90.) 1: (6; 90.) 1: (2.4495; 45.)
4478 . . . . .
4479
4480 9 n Q c p 2 * Q
d7b8e6c6 4481@end group
5d67986c 4482@end smallexample
d7b8e6c6
EZ
4483
4484@noindent
4485The square root of @i{-9} is by default rendered in rectangular form
4486(@w{@cite{0 + 3i}}), but we can convert it to polar form (3 with a
4487phase angle of 90 degrees). All the usual arithmetic and scientific
4488operations are defined on both types of complex numbers.
4489
4490Another generalized kind of number is @dfn{infinity}. Infinity
4491isn't really a number, but it can sometimes be treated like one.
4492Calc uses the symbol @code{inf} to represent positive infinity,
4493i.e., a value greater than any real number. Naturally, you can
4494also write @samp{-inf} for minus infinity, a value less than any
4495real number. The word @code{inf} can only be input using
4496algebraic entry.
4497
d7b8e6c6 4498@smallexample
5d67986c 4499@group
d7b8e6c6
EZ
45002: inf 2: -inf 2: -inf 2: -inf 1: nan
45011: -17 1: -inf 1: -inf 1: inf .
4502 . . . .
4503
5d67986c 4504' inf @key{RET} 17 n * @key{RET} 72 + A +
d7b8e6c6 4505@end group
5d67986c 4506@end smallexample
d7b8e6c6
EZ
4507
4508@noindent
4509Since infinity is infinitely large, multiplying it by any finite
4510number (like @i{-17}) has no effect, except that since @i{-17}
4511is negative, it changes a plus infinity to a minus infinity.
4512(``A huge positive number, multiplied by @i{-17}, yields a huge
4513negative number.'') Adding any finite number to infinity also
4514leaves it unchanged. Taking an absolute value gives us plus
4515infinity again. Finally, we add this plus infinity to the minus
4516infinity we had earlier. If you work it out, you might expect
4517the answer to be @i{-72} for this. But the 72 has been completely
4518lost next to the infinities; by the time we compute @w{@samp{inf - inf}}
4519the finite difference between them, if any, is indetectable.
4520So we say the result is @dfn{indeterminate}, which Calc writes
4521with the symbol @code{nan} (for Not A Number).
4522
4523Dividing by zero is normally treated as an error, but you can get
4524Calc to write an answer in terms of infinity by pressing @kbd{m i}
4525to turn on ``infinite mode.''
4526
d7b8e6c6 4527@smallexample
5d67986c 4528@group
d7b8e6c6
EZ
45293: nan 2: nan 2: nan 2: nan 1: nan
45302: 1 1: 1 / 0 1: uinf 1: uinf .
45311: 0 . . .
4532 .
4533
5d67986c 4534 1 @key{RET} 0 / m i U / 17 n * +
d7b8e6c6 4535@end group
5d67986c 4536@end smallexample
d7b8e6c6
EZ
4537
4538@noindent
4539Dividing by zero normally is left unevaluated, but after @kbd{m i}
4540it instead gives an infinite result. The answer is actually
4541@code{uinf}, ``undirected infinity.'' If you look at a graph of
4542@cite{1 / x} around @w{@cite{x = 0}}, you'll see that it goes toward
4543plus infinity as you approach zero from above, but toward minus
4544infinity as you approach from below. Since we said only @cite{1 / 0},
4545Calc knows that the answer is infinite but not in which direction.
4546That's what @code{uinf} means. Notice that multiplying @code{uinf}
4547by a negative number still leaves plain @code{uinf}; there's no
4548point in saying @samp{-uinf} because the sign of @code{uinf} is
4549unknown anyway. Finally, we add @code{uinf} to our @code{nan},
4550yielding @code{nan} again. It's easy to see that, because
4551@code{nan} means ``totally unknown'' while @code{uinf} means
4552``unknown sign but known to be infinite,'' the more mysterious
4553@code{nan} wins out when it is combined with @code{uinf}, or, for
4554that matter, with anything else.
4555
4556(@bullet{}) @strong{Exercise 2.} Predict what Calc will answer
4557for each of these formulas: @samp{inf / inf}, @samp{exp(inf)},
4558@samp{exp(-inf)}, @samp{sqrt(-inf)}, @samp{sqrt(uinf)},
4559@samp{abs(uinf)}, @samp{ln(0)}.
4560@xref{Types Answer 2, 2}. (@bullet{})
4561
4562(@bullet{}) @strong{Exercise 3.} We saw that @samp{inf - inf = nan},
4563which stands for an unknown value. Can @code{nan} stand for
4564a complex number? Can it stand for infinity?
4565@xref{Types Answer 3, 3}. (@bullet{})
4566
4567@dfn{HMS forms} represent a value in terms of hours, minutes, and
4568seconds.
4569
d7b8e6c6 4570@smallexample
5d67986c 4571@group
d7b8e6c6
EZ
45721: 2@@ 30' 0" 1: 3@@ 30' 0" 2: 3@@ 30' 0" 1: 2.
4573 . . 1: 1@@ 45' 0." .
4574 .
4575
5d67986c 4576 2@@ 30' @key{RET} 1 + @key{RET} 2 / /
d7b8e6c6 4577@end group
5d67986c 4578@end smallexample
d7b8e6c6
EZ
4579
4580HMS forms can also be used to hold angles in degrees, minutes, and
4581seconds.
4582
d7b8e6c6 4583@smallexample
5d67986c 4584@group
d7b8e6c6
EZ
45851: 0.5 1: 26.56505 1: 26@@ 33' 54.18" 1: 0.44721
4586 . . . .
4587
4588 0.5 I T c h S
d7b8e6c6 4589@end group
5d67986c 4590@end smallexample
d7b8e6c6
EZ
4591
4592@noindent
4593First we convert the inverse tangent of 0.5 to degrees-minutes-seconds
4594form, then we take the sine of that angle. Note that the trigonometric
4595functions will accept HMS forms directly as input.
4596
4597@cindex Beatles
4598(@bullet{}) @strong{Exercise 4.} The Beatles' @emph{Abbey Road} is
459947 minutes and 26 seconds long, and contains 17 songs. What is the
4600average length of a song on @emph{Abbey Road}? If the Extended Disco
4601Version of @emph{Abbey Road} added 20 seconds to the length of each
4602song, how long would the album be? @xref{Types Answer 4, 4}. (@bullet{})
4603
4604A @dfn{date form} represents a date, or a date and time. Dates must
4605be entered using algebraic entry. Date forms are surrounded by
4606@samp{< >} symbols; most standard formats for dates are recognized.
4607
d7b8e6c6 4608@smallexample
5d67986c 4609@group
d7b8e6c6
EZ
46102: <Sun Jan 13, 1991> 1: 2.25
46111: <6:00pm Thu Jan 10, 1991> .
4612 .
4613
5d67986c 4614' <13 Jan 1991>, <1/10/91, 6pm> @key{RET} -
d7b8e6c6 4615@end group
5d67986c 4616@end smallexample
d7b8e6c6
EZ
4617
4618@noindent
4619In this example, we enter two dates, then subtract to find the
4620number of days between them. It is also possible to add an
4621HMS form or a number (of days) to a date form to get another
4622date form.
4623
d7b8e6c6 4624@smallexample
5d67986c 4625@group
d7b8e6c6
EZ
46261: <4:45:59pm Mon Jan 14, 1991> 1: <2:50:59am Thu Jan 17, 1991>
4627 . .
4628
4629 t N 2 + 10@@ 5' +
d7b8e6c6 4630@end group
5d67986c 4631@end smallexample
d7b8e6c6
EZ
4632
4633@c [fix-ref Date Arithmetic]
4634@noindent
4635The @kbd{t N} (``now'') command pushes the current date and time on the
4636stack; then we add two days, ten hours and five minutes to the date and
4637time. Other date-and-time related commands include @kbd{t J}, which
4638does Julian day conversions, @kbd{t W}, which finds the beginning of
4639the week in which a date form lies, and @kbd{t I}, which increments a
4640date by one or several months. @xref{Date Arithmetic}, for more.
4641
4642(@bullet{}) @strong{Exercise 5.} How many days until the next
4643Friday the 13th? @xref{Types Answer 5, 5}. (@bullet{})
4644
4645(@bullet{}) @strong{Exercise 6.} How many leap years will there be
4646between now and the year 10001 A.D.? @xref{Types Answer 6, 6}. (@bullet{})
4647
4648@cindex Slope and angle of a line
4649@cindex Angle and slope of a line
4650An @dfn{error form} represents a mean value with an attached standard
4651deviation, or error estimate. Suppose our measurements indicate that
4652a certain telephone pole is about 30 meters away, with an estimated
4653error of 1 meter, and 8 meters tall, with an estimated error of 0.2
4654meters. What is the slope of a line from here to the top of the
4655pole, and what is the equivalent angle in degrees?
4656
d7b8e6c6 4657@smallexample
5d67986c 4658@group
d7b8e6c6
EZ
46591: 8 +/- 0.2 2: 8 +/- 0.2 1: 0.266 +/- 0.011 1: 14.93 +/- 0.594
4660 . 1: 30 +/- 1 . .
4661 .
4662
5d67986c 4663 8 p .2 @key{RET} 30 p 1 / I T
d7b8e6c6 4664@end group
5d67986c 4665@end smallexample
d7b8e6c6
EZ
4666
4667@noindent
4668This means that the angle is about 15 degrees, and, assuming our
4669original error estimates were valid standard deviations, there is about
4670a 60% chance that the result is correct within 0.59 degrees.
4671
4672@cindex Torus, volume of
4673(@bullet{}) @strong{Exercise 7.} The volume of a torus (a donut shape) is
4674@c{$2 \pi^2 R r^2$}
4675@w{@cite{2 pi^2 R r^2}} where @cite{R} is the radius of the circle that
4676defines the center of the tube and @cite{r} is the radius of the tube
4677itself. Suppose @cite{R} is 20 cm and @cite{r} is 4 cm, each known to
4678within 5 percent. What is the volume and the relative uncertainty of
4679the volume? @xref{Types Answer 7, 7}. (@bullet{})
4680
4681An @dfn{interval form} represents a range of values. While an
4682error form is best for making statistical estimates, intervals give
4683you exact bounds on an answer. Suppose we additionally know that
4684our telephone pole is definitely between 28 and 31 meters away,
4685and that it is between 7.7 and 8.1 meters tall.
4686
d7b8e6c6 4687@smallexample
5d67986c 4688@group
d7b8e6c6
EZ
46891: [7.7 .. 8.1] 2: [7.7 .. 8.1] 1: [0.24 .. 0.28] 1: [13.9 .. 16.1]
4690 . 1: [28 .. 31] . .
4691 .
4692
4693 [ 7.7 .. 8.1 ] [ 28 .. 31 ] / I T
d7b8e6c6 4694@end group
5d67986c 4695@end smallexample
d7b8e6c6
EZ
4696
4697@noindent
4698If our bounds were correct, then the angle to the top of the pole
4699is sure to lie in the range shown.
4700
4701The square brackets around these intervals indicate that the endpoints
4702themselves are allowable values. In other words, the distance to the
4703telephone pole is between 28 and 31, @emph{inclusive}. You can also
4704make an interval that is exclusive of its endpoints by writing
4705parentheses instead of square brackets. You can even make an interval
4706which is inclusive (``closed'') on one end and exclusive (``open'') on
4707the other.
4708
d7b8e6c6 4709@smallexample
5d67986c 4710@group
d7b8e6c6
EZ
47111: [1 .. 10) 1: (0.1 .. 1] 2: (0.1 .. 1] 1: (0.2 .. 3)
4712 . . 1: [2 .. 3) .
4713 .
4714
4715 [ 1 .. 10 ) & [ 2 .. 3 ) *
d7b8e6c6 4716@end group
5d67986c 4717@end smallexample
d7b8e6c6
EZ
4718
4719@noindent
4720The Calculator automatically keeps track of which end values should
4721be open and which should be closed. You can also make infinite or
4722semi-infinite intervals by using @samp{-inf} or @samp{inf} for one
4723or both endpoints.
4724
4725(@bullet{}) @strong{Exercise 8.} What answer would you expect from
4726@samp{@w{1 /} @w{(0 .. 10)}}? What about @samp{@w{1 /} @w{(-10 .. 0)}}? What
4727about @samp{@w{1 /} @w{[0 .. 10]}} (where the interval actually includes
4728zero)? What about @samp{@w{1 /} @w{(-10 .. 10)}}?
4729@xref{Types Answer 8, 8}. (@bullet{})
4730
4731(@bullet{}) @strong{Exercise 9.} Two easy ways of squaring a number
5d67986c 4732are @kbd{@key{RET} *} and @w{@kbd{2 ^}}. Normally these produce the same
d7b8e6c6
EZ
4733answer. Would you expect this still to hold true for interval forms?
4734If not, which of these will result in a larger interval?
4735@xref{Types Answer 9, 9}. (@bullet{})
4736
5d67986c 4737A @dfn{modulo form} is used for performing arithmetic modulo @var{m}.
d7b8e6c6
EZ
4738For example, arithmetic involving time is generally done modulo 12
4739or 24 hours.
4740
d7b8e6c6 4741@smallexample
5d67986c 4742@group
d7b8e6c6
EZ
47431: 17 mod 24 1: 3 mod 24 1: 21 mod 24 1: 9 mod 24
4744 . . . .
4745
5d67986c 4746 17 M 24 @key{RET} 10 + n 5 /
d7b8e6c6 4747@end group
5d67986c 4748@end smallexample
d7b8e6c6
EZ
4749
4750@noindent
4751In this last step, Calc has found a new number which, when multiplied
5d67986c
RS
4752by 5 modulo 24, produces the original number, 21. If @var{m} is prime
4753it is always possible to find such a number. For non-prime @var{m}
d7b8e6c6
EZ
4754like 24, it is only sometimes possible.
4755
d7b8e6c6 4756@smallexample
5d67986c 4757@group
d7b8e6c6
EZ
47581: 10 mod 24 1: 16 mod 24 1: 1000000... 1: 16
4759 . . . .
4760
5d67986c 4761 10 M 24 @key{RET} 100 ^ 10 @key{RET} 100 ^ 24 %
d7b8e6c6 4762@end group
5d67986c 4763@end smallexample
d7b8e6c6
EZ
4764
4765@noindent
4766These two calculations get the same answer, but the first one is
4767much more efficient because it avoids the huge intermediate value
4768that arises in the second one.
4769
4770@cindex Fermat, primality test of
4771(@bullet{}) @strong{Exercise 10.} A theorem of Pierre de Fermat
4772says that @c{\w{$x^{n-1} \bmod n = 1$}}
4773@cite{x^(n-1) mod n = 1} if @cite{n} is a prime number
4774and @cite{x} is an integer less than @cite{n}. If @cite{n} is
4775@emph{not} a prime number, this will @emph{not} be true for most
4776values of @cite{x}. Thus we can test informally if a number is
4777prime by trying this formula for several values of @cite{x}.
4778Use this test to tell whether the following numbers are prime:
4779811749613, 15485863. @xref{Types Answer 10, 10}. (@bullet{})
4780
4781It is possible to use HMS forms as parts of error forms, intervals,
4782modulo forms, or as the phase part of a polar complex number.
4783For example, the @code{calc-time} command pushes the current time
4784of day on the stack as an HMS/modulo form.
4785
d7b8e6c6 4786@smallexample
5d67986c 4787@group
d7b8e6c6
EZ
47881: 17@@ 34' 45" mod 24@@ 0' 0" 1: 6@@ 22' 15" mod 24@@ 0' 0"
4789 . .
4790
5d67986c 4791 x time @key{RET} n
d7b8e6c6 4792@end group
5d67986c 4793@end smallexample
d7b8e6c6
EZ
4794
4795@noindent
4796This calculation tells me it is six hours and 22 minutes until midnight.
4797
4798(@bullet{}) @strong{Exercise 11.} A rule of thumb is that one year
4799is about @c{$\pi \times 10^7$}
4800@w{@cite{pi * 10^7}} seconds. What time will it be that
4801many seconds from right now? @xref{Types Answer 11, 11}. (@bullet{})
4802
4803(@bullet{}) @strong{Exercise 12.} You are preparing to order packaging
4804for the CD release of the Extended Disco Version of @emph{Abbey Road}.
4805You are told that the songs will actually be anywhere from 20 to 60
4806seconds longer than the originals. One CD can hold about 75 minutes
4807of music. Should you order single or double packages?
4808@xref{Types Answer 12, 12}. (@bullet{})
4809
4810Another kind of data the Calculator can manipulate is numbers with
4811@dfn{units}. This isn't strictly a new data type; it's simply an
4812application of algebraic expressions, where we use variables with
4813suggestive names like @samp{cm} and @samp{in} to represent units
4814like centimeters and inches.
4815
d7b8e6c6 4816@smallexample
5d67986c 4817@group
d7b8e6c6
EZ
48181: 2 in 1: 5.08 cm 1: 0.027778 fath 1: 0.0508 m
4819 . . . .
4820
5d67986c 4821 ' 2in @key{RET} u c cm @key{RET} u c fath @key{RET} u b
d7b8e6c6 4822@end group
5d67986c 4823@end smallexample
d7b8e6c6
EZ
4824
4825@noindent
4826We enter the quantity ``2 inches'' (actually an algebraic expression
4827which means two times the variable @samp{in}), then we convert it
4828first to centimeters, then to fathoms, then finally to ``base'' units,
4829which in this case means meters.
4830
d7b8e6c6 4831@smallexample
5d67986c 4832@group
d7b8e6c6
EZ
48331: 9 acre 1: 3 sqrt(acre) 1: 190.84 m 1: 190.84 m + 30 cm
4834 . . . .
4835
5d67986c 4836 ' 9 acre @key{RET} Q u s ' $+30 cm @key{RET}
d7b8e6c6 4837
d7b8e6c6 4838@end group
5d67986c 4839@end smallexample
d7b8e6c6 4840@noindent
d7b8e6c6 4841@smallexample
5d67986c 4842@group
d7b8e6c6
EZ
48431: 191.14 m 1: 36536.3046 m^2 1: 365363046 cm^2
4844 . . .
4845
4846 u s 2 ^ u c cgs
d7b8e6c6 4847@end group
5d67986c 4848@end smallexample
d7b8e6c6
EZ
4849
4850@noindent
4851Since units expressions are really just formulas, taking the square
4852root of @samp{acre} is undefined. After all, @code{acre} might be an
4853algebraic variable that you will someday assign a value. We use the
4854``units-simplify'' command to simplify the expression with variables
4855being interpreted as unit names.
4856
4857In the final step, we have converted not to a particular unit, but to a
4858units system. The ``cgs'' system uses centimeters instead of meters
4859as its standard unit of length.
4860
4861There is a wide variety of units defined in the Calculator.
4862
d7b8e6c6 4863@smallexample
5d67986c 4864@group
d7b8e6c6
EZ
48651: 55 mph 1: 88.5139 kph 1: 88.5139 km / hr 1: 8.201407e-8 c
4866 . . . .
4867
5d67986c 4868 ' 55 mph @key{RET} u c kph @key{RET} u c km/hr @key{RET} u c c @key{RET}
d7b8e6c6 4869@end group
5d67986c 4870@end smallexample
d7b8e6c6
EZ
4871
4872@noindent
4873We express a speed first in miles per hour, then in kilometers per
4874hour, then again using a slightly more explicit notation, then
4875finally in terms of fractions of the speed of light.
4876
4877Temperature conversions are a bit more tricky. There are two ways to
4878interpret ``20 degrees Fahrenheit''---it could mean an actual
4879temperature, or it could mean a change in temperature. For normal
4880units there is no difference, but temperature units have an offset
4881as well as a scale factor and so there must be two explicit commands
4882for them.
4883
d7b8e6c6 4884@smallexample
5d67986c 4885@group
d7b8e6c6
EZ
48861: 20 degF 1: 11.1111 degC 1: -20:3 degC 1: -6.666 degC
4887 . . . .
4888
5d67986c 4889 ' 20 degF @key{RET} u c degC @key{RET} U u t degC @key{RET} c f
d7b8e6c6 4890@end group
5d67986c 4891@end smallexample
d7b8e6c6
EZ
4892
4893@noindent
4894First we convert a change of 20 degrees Fahrenheit into an equivalent
4895change in degrees Celsius (or Centigrade). Then, we convert the
4896absolute temperature 20 degrees Fahrenheit into Celsius. Since
4897this comes out as an exact fraction, we then convert to floating-point
4898for easier comparison with the other result.
4899
4900For simple unit conversions, you can put a plain number on the stack.
4901Then @kbd{u c} and @kbd{u t} will prompt for both old and new units.
4902When you use this method, you're responsible for remembering which
4903numbers are in which units:
4904
d7b8e6c6 4905@smallexample
5d67986c 4906@group
d7b8e6c6
EZ
49071: 55 1: 88.5139 1: 8.201407e-8
4908 . . .
4909
5d67986c 4910 55 u c mph @key{RET} kph @key{RET} u c km/hr @key{RET} c @key{RET}
d7b8e6c6 4911@end group
5d67986c 4912@end smallexample
d7b8e6c6
EZ
4913
4914To see a complete list of built-in units, type @kbd{u v}. Press
4915@w{@kbd{M-# c}} again to re-enter the Calculator when you're done looking
4916at the units table.
4917
4918(@bullet{}) @strong{Exercise 13.} How many seconds are there really
4919in a year? @xref{Types Answer 13, 13}. (@bullet{})
4920
4921@cindex Speed of light
4922(@bullet{}) @strong{Exercise 14.} Supercomputer designs are limited by
4923the speed of light (and of electricity, which is nearly as fast).
4924Suppose a computer has a 4.1 ns (nanosecond) clock cycle, and its
4925cabinet is one meter across. Is speed of light going to be a
4926significant factor in its design? @xref{Types Answer 14, 14}. (@bullet{})
4927
4928(@bullet{}) @strong{Exercise 15.} Sam the Slug normally travels about
4929five yards in an hour. He has obtained a supply of Power Pills; each
4930Power Pill he eats doubles his speed. How many Power Pills can he
4931swallow and still travel legally on most US highways?
4932@xref{Types Answer 15, 15}. (@bullet{})
4933
4934@node Algebra Tutorial, Programming Tutorial, Types Tutorial, Tutorial
4935@section Algebra and Calculus Tutorial
4936
4937@noindent
4938This section shows how to use Calc's algebra facilities to solve
4939equations, do simple calculus problems, and manipulate algebraic
4940formulas.
4941
4942@menu
4943* Basic Algebra Tutorial::
4944* Rewrites Tutorial::
4945@end menu
4946
4947@node Basic Algebra Tutorial, Rewrites Tutorial, Algebra Tutorial, Algebra Tutorial
4948@subsection Basic Algebra
4949
4950@noindent
4951If you enter a formula in algebraic mode that refers to variables,
4952the formula itself is pushed onto the stack. You can manipulate
4953formulas as regular data objects.
4954
d7b8e6c6 4955@smallexample
5d67986c 4956@group
d7b8e6c6
EZ
49571: 2 x^2 - 6 1: 6 - 2 x^2 1: (6 - 2 x^2) (3 x^2 + y)
4958 . . .
4959
5d67986c 4960 ' 2x^2-6 @key{RET} n ' 3x^2+y @key{RET} *
d7b8e6c6 4961@end group
5d67986c 4962@end smallexample
d7b8e6c6 4963
5d67986c
RS
4964(@bullet{}) @strong{Exercise 1.} Do @kbd{' x @key{RET} Q 2 ^} and
4965@kbd{' x @key{RET} 2 ^ Q} both wind up with the same result (@samp{x})?
d7b8e6c6
EZ
4966Why or why not? @xref{Algebra Answer 1, 1}. (@bullet{})
4967
4968There are also commands for doing common algebraic operations on
4969formulas. Continuing with the formula from the last example,
4970
d7b8e6c6 4971@smallexample
5d67986c 4972@group
d7b8e6c6
EZ
49731: 18 x^2 + 6 y - 6 x^4 - 2 x^2 y 1: (18 - 2 y) x^2 - 6 x^4 + 6 y
4974 . .
4975
5d67986c 4976 a x a c x @key{RET}
d7b8e6c6 4977@end group
5d67986c 4978@end smallexample
d7b8e6c6
EZ
4979
4980@noindent
4981First we ``expand'' using the distributive law, then we ``collect''
4982terms involving like powers of @cite{x}.
4983
4984Let's find the value of this expression when @cite{x} is 2 and @cite{y}
4985is one-half.
4986
d7b8e6c6 4987@smallexample
5d67986c 4988@group
d7b8e6c6
EZ
49891: 17 x^2 - 6 x^4 + 3 1: -25
4990 . .
4991
5d67986c 4992 1:2 s l y @key{RET} 2 s l x @key{RET}
d7b8e6c6 4993@end group
5d67986c 4994@end smallexample
d7b8e6c6
EZ
4995
4996@noindent
4997The @kbd{s l} command means ``let''; it takes a number from the top of
4998the stack and temporarily assigns it as the value of the variable
4999you specify. It then evaluates (as if by the @kbd{=} key) the
5000next expression on the stack. After this command, the variable goes
5001back to its original value, if any.
5002
5003(An earlier exercise in this tutorial involved storing a value in the
5004variable @code{x}; if this value is still there, you will have to
5d67986c 5005unstore it with @kbd{s u x @key{RET}} before the above example will work
d7b8e6c6
EZ
5006properly.)
5007
5008@cindex Maximum of a function using Calculus
5009Let's find the maximum value of our original expression when @cite{y}
5010is one-half and @cite{x} ranges over all possible values. We can
5011do this by taking the derivative with respect to @cite{x} and examining
5012values of @cite{x} for which the derivative is zero. If the second
5013derivative of the function at that value of @cite{x} is negative,
5014the function has a local maximum there.
5015
d7b8e6c6 5016@smallexample
5d67986c 5017@group
d7b8e6c6
EZ
50181: 17 x^2 - 6 x^4 + 3 1: 34 x - 24 x^3
5019 . .
5020
5d67986c 5021 U @key{DEL} s 1 a d x @key{RET} s 2
d7b8e6c6 5022@end group
5d67986c 5023@end smallexample
d7b8e6c6
EZ
5024
5025@noindent
5026Well, the derivative is clearly zero when @cite{x} is zero. To find
5027the other root(s), let's divide through by @cite{x} and then solve:
5028
d7b8e6c6 5029@smallexample
5d67986c 5030@group
d7b8e6c6
EZ
50311: (34 x - 24 x^3) / x 1: 34 x / x - 24 x^3 / x 1: 34 - 24 x^2
5032 . . .
5033
5d67986c 5034 ' x @key{RET} / a x a s
d7b8e6c6 5035
d7b8e6c6 5036@end group
5d67986c 5037@end smallexample
d7b8e6c6 5038@noindent
d7b8e6c6 5039@smallexample
5d67986c 5040@group
d7b8e6c6
EZ
50411: 34 - 24 x^2 = 0 1: x = 1.19023
5042 . .
5043
5d67986c 5044 0 a = s 3 a S x @key{RET}
d7b8e6c6 5045@end group
5d67986c 5046@end smallexample
d7b8e6c6
EZ
5047
5048@noindent
5049Notice the use of @kbd{a s} to ``simplify'' the formula. When the
5050default algebraic simplifications don't do enough, you can use
5051@kbd{a s} to tell Calc to spend more time on the job.
5052
5053Now we compute the second derivative and plug in our values of @cite{x}:
5054
d7b8e6c6 5055@smallexample
5d67986c 5056@group
d7b8e6c6
EZ
50571: 1.19023 2: 1.19023 2: 1.19023
5058 . 1: 34 x - 24 x^3 1: 34 - 72 x^2
5059 . .
5060
5d67986c 5061 a . r 2 a d x @key{RET} s 4
d7b8e6c6 5062@end group
5d67986c 5063@end smallexample
d7b8e6c6
EZ
5064
5065@noindent
5066(The @kbd{a .} command extracts just the righthand side of an equation.
5067Another method would have been to use @kbd{v u} to unpack the equation
5d67986c 5068@w{@samp{x = 1.19}} to @samp{x} and @samp{1.19}, then use @kbd{M-- M-2 @key{DEL}}
d7b8e6c6
EZ
5069to delete the @samp{x}.)
5070
d7b8e6c6 5071@smallexample
5d67986c 5072@group
d7b8e6c6
EZ
50732: 34 - 72 x^2 1: -68. 2: 34 - 72 x^2 1: 34
50741: 1.19023 . 1: 0 .
5075 . .
5076
5d67986c 5077 @key{TAB} s l x @key{RET} U @key{DEL} 0 s l x @key{RET}
d7b8e6c6 5078@end group
5d67986c 5079@end smallexample
d7b8e6c6
EZ
5080
5081@noindent
5082The first of these second derivatives is negative, so we know the function
5083has a maximum value at @cite{x = 1.19023}. (The function also has a
5084local @emph{minimum} at @cite{x = 0}.)
5085
5086When we solved for @cite{x}, we got only one value even though
5087@cite{34 - 24 x^2 = 0} is a quadratic equation that ought to have
5088two solutions. The reason is that @w{@kbd{a S}} normally returns a
5089single ``principal'' solution. If it needs to come up with an
5090arbitrary sign (as occurs in the quadratic formula) it picks @cite{+}.
5091If it needs an arbitrary integer, it picks zero. We can get a full
5092solution by pressing @kbd{H} (the Hyperbolic flag) before @kbd{a S}.
5093
d7b8e6c6 5094@smallexample
5d67986c 5095@group
d7b8e6c6
EZ
50961: 34 - 24 x^2 = 0 1: x = 1.19023 s1 1: x = -1.19023
5097 . . .
5098
5d67986c 5099 r 3 H a S x @key{RET} s 5 1 n s l s1 @key{RET}
d7b8e6c6 5100@end group
5d67986c 5101@end smallexample
d7b8e6c6
EZ
5102
5103@noindent
5104Calc has invented the variable @samp{s1} to represent an unknown sign;
5105it is supposed to be either @i{+1} or @i{-1}. Here we have used
5106the ``let'' command to evaluate the expression when the sign is negative.
5107If we plugged this into our second derivative we would get the same,
5108negative, answer, so @cite{x = -1.19023} is also a maximum.
5109
5110To find the actual maximum value, we must plug our two values of @cite{x}
5111into the original formula.
5112
d7b8e6c6 5113@smallexample
5d67986c 5114@group
d7b8e6c6
EZ
51152: 17 x^2 - 6 x^4 + 3 1: 24.08333 s1^2 - 12.04166 s1^4 + 3
51161: x = 1.19023 s1 .
5117 .
5118
5d67986c 5119 r 1 r 5 s l @key{RET}
d7b8e6c6 5120@end group
5d67986c 5121@end smallexample
d7b8e6c6
EZ
5122
5123@noindent
5124(Here we see another way to use @kbd{s l}; if its input is an equation
5125with a variable on the lefthand side, then @kbd{s l} treats the equation
5126like an assignment to that variable if you don't give a variable name.)
5127
5128It's clear that this will have the same value for either sign of
5129@code{s1}, but let's work it out anyway, just for the exercise:
5130
d7b8e6c6 5131@smallexample
5d67986c 5132@group
d7b8e6c6
EZ
51332: [-1, 1] 1: [15.04166, 15.04166]
51341: 24.08333 s1^2 ... .
5135 .
5136
5d67986c 5137 [ 1 n , 1 ] @key{TAB} V M $ @key{RET}
d7b8e6c6 5138@end group
5d67986c 5139@end smallexample
d7b8e6c6
EZ
5140
5141@noindent
5142Here we have used a vector mapping operation to evaluate the function
5143at several values of @samp{s1} at once. @kbd{V M $} is like @kbd{V M '}
5144except that it takes the formula from the top of the stack. The
5145formula is interpreted as a function to apply across the vector at the
5146next-to-top stack level. Since a formula on the stack can't contain
5147@samp{$} signs, Calc assumes the variables in the formula stand for
5148different arguments. It prompts you for an @dfn{argument list}, giving
5149the list of all variables in the formula in alphabetical order as the
5150default list. In this case the default is @samp{(s1)}, which is just
5151what we want so we simply press @key{RET} at the prompt.
5152
5153If there had been several different values, we could have used
5154@w{@kbd{V R X}} to find the global maximum.
5155
5156Calc has a built-in @kbd{a P} command that solves an equation using
5157@w{@kbd{H a S}} and returns a vector of all the solutions. It simply
5158automates the job we just did by hand. Applied to our original
5159cubic polynomial, it would produce the vector of solutions
5160@cite{[1.19023, -1.19023, 0]}. (There is also an @kbd{a X} command
5161which finds a local maximum of a function. It uses a numerical search
5162method rather than examining the derivatives, and thus requires you
5163to provide some kind of initial guess to show it where to look.)
5164
5165(@bullet{}) @strong{Exercise 2.} Given a vector of the roots of a
5166polynomial (such as the output of an @kbd{a P} command), what
5167sequence of commands would you use to reconstruct the original
5168polynomial? (The answer will be unique to within a constant
5169multiple; choose the solution where the leading coefficient is one.)
5170@xref{Algebra Answer 2, 2}. (@bullet{})
5171
5172The @kbd{m s} command enables ``symbolic mode,'' in which formulas
5173like @samp{sqrt(5)} that can't be evaluated exactly are left in
5174symbolic form rather than giving a floating-point approximate answer.
5175Fraction mode (@kbd{m f}) is also useful when doing algebra.
5176
d7b8e6c6 5177@smallexample
5d67986c 5178@group
d7b8e6c6
EZ
51792: 34 x - 24 x^3 2: 34 x - 24 x^3
51801: 34 x - 24 x^3 1: [sqrt(51) / 6, sqrt(51) / -6, 0]
5181 . .
5182
5d67986c 5183 r 2 @key{RET} m s m f a P x @key{RET}
d7b8e6c6 5184@end group
5d67986c 5185@end smallexample
d7b8e6c6
EZ
5186
5187One more mode that makes reading formulas easier is ``Big mode.''
5188
d7b8e6c6 5189@smallexample
5d67986c 5190@group
d7b8e6c6
EZ
5191 3
51922: 34 x - 24 x
5193
5194 ____ ____
5195 V 51 V 51
51961: [-----, -----, 0]
5197 6 -6
5198
5199 .
5200
5201 d B
d7b8e6c6 5202@end group
5d67986c 5203@end smallexample
d7b8e6c6
EZ
5204
5205Here things like powers, square roots, and quotients and fractions
5206are displayed in a two-dimensional pictorial form. Calc has other
5207language modes as well, such as C mode, FORTRAN mode, and @TeX{} mode.
5208
d7b8e6c6 5209@smallexample
5d67986c 5210@group
d7b8e6c6
EZ
52112: 34*x - 24*pow(x, 3) 2: 34*x - 24*x**3
52121: @{sqrt(51) / 6, sqrt(51) / -6, 0@} 1: /sqrt(51) / 6, sqrt(51) / -6, 0/
5213 . .
5214
5215 d C d F
5216
d7b8e6c6 5217@end group
5d67986c 5218@end smallexample
d7b8e6c6 5219@noindent
d7b8e6c6 5220@smallexample
5d67986c 5221@group
d7b8e6c6
EZ
52223: 34 x - 24 x^3
52232: [@{\sqrt@{51@} \over 6@}, @{\sqrt@{51@} \over -6@}, 0]
52241: @{2 \over 3@} \sqrt@{5@}
5225 .
5226
5d67986c 5227 d T ' 2 \sqrt@{5@} \over 3 @key{RET}
d7b8e6c6 5228@end group
5d67986c 5229@end smallexample
d7b8e6c6
EZ
5230
5231@noindent
5232As you can see, language modes affect both entry and display of
5233formulas. They affect such things as the names used for built-in
5234functions, the set of arithmetic operators and their precedences,
5235and notations for vectors and matrices.
5236
5237Notice that @samp{sqrt(51)} may cause problems with older
5238implementations of C and FORTRAN, which would require something more
5239like @samp{sqrt(51.0)}. It is always wise to check over the formulas
5240produced by the various language modes to make sure they are fully
5241correct.
5242
5243Type @kbd{m s}, @kbd{m f}, and @kbd{d N} to reset these modes. (You
5244may prefer to remain in Big mode, but all the examples in the tutorial
5245are shown in normal mode.)
5246
5247@cindex Area under a curve
5248What is the area under the portion of this curve from @cite{x = 1} to @cite{2}?
5249This is simply the integral of the function:
5250
d7b8e6c6 5251@smallexample
5d67986c 5252@group
d7b8e6c6
EZ
52531: 17 x^2 - 6 x^4 + 3 1: 5.6666 x^3 - 1.2 x^5 + 3 x
5254 . .
5255
5256 r 1 a i x
d7b8e6c6 5257@end group
5d67986c 5258@end smallexample
d7b8e6c6
EZ
5259
5260@noindent
5261We want to evaluate this at our two values for @cite{x} and subtract.
5262One way to do it is again with vector mapping and reduction:
5263
d7b8e6c6 5264@smallexample
5d67986c 5265@group
d7b8e6c6
EZ
52662: [2, 1] 1: [12.93333, 7.46666] 1: 5.46666
52671: 5.6666 x^3 ... . .
5268
5d67986c 5269 [ 2 , 1 ] @key{TAB} V M $ @key{RET} V R -
d7b8e6c6 5270@end group
5d67986c 5271@end smallexample
d7b8e6c6
EZ
5272
5273(@bullet{}) @strong{Exercise 3.} Find the integral from 1 to @cite{y}
5274of @c{$x \sin \pi x$}
5275@w{@cite{x sin(pi x)}} (where the sine is calculated in radians).
5276Find the values of the integral for integers @cite{y} from 1 to 5.
5277@xref{Algebra Answer 3, 3}. (@bullet{})
5278
5279Calc's integrator can do many simple integrals symbolically, but many
5280others are beyond its capabilities. Suppose we wish to find the area
5281under the curve @c{$\sin x \ln x$}
5282@cite{sin(x) ln(x)} over the same range of @cite{x}. If
5d67986c 5283you entered this formula and typed @kbd{a i x @key{RET}} (don't bother to try
d7b8e6c6
EZ
5284this), Calc would work for a long time but would be unable to find a
5285solution. In fact, there is no closed-form solution to this integral.
5286Now what do we do?
5287
5288@cindex Integration, numerical
5289@cindex Numerical integration
5290One approach would be to do the integral numerically. It is not hard
5291to do this by hand using vector mapping and reduction. It is rather
5292slow, though, since the sine and logarithm functions take a long time.
5293We can save some time by reducing the working precision.
5294
d7b8e6c6 5295@smallexample
5d67986c 5296@group
d7b8e6c6
EZ
52973: 10 1: [1, 1.1, 1.2, ... , 1.8, 1.9]
52982: 1 .
52991: 0.1
5300 .
5301
5d67986c 5302 10 @key{RET} 1 @key{RET} .1 @key{RET} C-u v x
d7b8e6c6 5303@end group
5d67986c 5304@end smallexample
d7b8e6c6
EZ
5305
5306@noindent
5307(Note that we have used the extended version of @kbd{v x}; we could
5d67986c 5308also have used plain @kbd{v x} as follows: @kbd{v x 10 @key{RET} 9 + .1 *}.)
d7b8e6c6 5309
d7b8e6c6 5310@smallexample
5d67986c 5311@group
d7b8e6c6
EZ
53122: [1, 1.1, ... ] 1: [0., 0.084941, 0.16993, ... ]
53131: sin(x) ln(x) .
5314 .
5315
5d67986c 5316 ' sin(x) ln(x) @key{RET} s 1 m r p 5 @key{RET} V M $ @key{RET}
d7b8e6c6 5317
d7b8e6c6 5318@end group
5d67986c 5319@end smallexample
d7b8e6c6 5320@noindent
d7b8e6c6 5321@smallexample
5d67986c 5322@group
d7b8e6c6
EZ
53231: 3.4195 0.34195
5324 . .
5325
5326 V R + 0.1 *
d7b8e6c6 5327@end group
5d67986c 5328@end smallexample
d7b8e6c6
EZ
5329
5330@noindent
5331(If you got wildly different results, did you remember to switch
5332to radians mode?)
5333
5334Here we have divided the curve into ten segments of equal width;
5335approximating these segments as rectangular boxes (i.e., assuming
5336the curve is nearly flat at that resolution), we compute the areas
5337of the boxes (height times width), then sum the areas. (It is
5338faster to sum first, then multiply by the width, since the width
5339is the same for every box.)
5340
5341The true value of this integral turns out to be about 0.374, so
5342we're not doing too well. Let's try another approach.
5343
d7b8e6c6 5344@smallexample
5d67986c 5345@group
d7b8e6c6
EZ
53461: sin(x) ln(x) 1: 0.84147 x - 0.84147 + 0.11957 (x - 1)^2 - ...
5347 . .
5348
5d67986c 5349 r 1 a t x=1 @key{RET} 4 @key{RET}
d7b8e6c6 5350@end group
5d67986c 5351@end smallexample
d7b8e6c6
EZ
5352
5353@noindent
5354Here we have computed the Taylor series expansion of the function
5355about the point @cite{x=1}. We can now integrate this polynomial
5356approximation, since polynomials are easy to integrate.
5357
d7b8e6c6 5358@smallexample
5d67986c 5359@group
d7b8e6c6
EZ
53601: 0.42074 x^2 + ... 1: [-0.0446, -0.42073] 1: 0.3761
5361 . . .
5362
5d67986c 5363 a i x @key{RET} [ 2 , 1 ] @key{TAB} V M $ @key{RET} V R -
d7b8e6c6 5364@end group
5d67986c 5365@end smallexample
d7b8e6c6
EZ
5366
5367@noindent
5368Better! By increasing the precision and/or asking for more terms
5369in the Taylor series, we can get a result as accurate as we like.
5370(Taylor series converge better away from singularities in the
5371function such as the one at @code{ln(0)}, so it would also help to
5372expand the series about the points @cite{x=2} or @cite{x=1.5} instead
5373of @cite{x=1}.)
5374
5375@cindex Simpson's rule
5376@cindex Integration by Simpson's rule
5377(@bullet{}) @strong{Exercise 4.} Our first method approximated the
5378curve by stairsteps of width 0.1; the total area was then the sum
5379of the areas of the rectangles under these stairsteps. Our second
5380method approximated the function by a polynomial, which turned out
5381to be a better approximation than stairsteps. A third method is
5382@dfn{Simpson's rule}, which is like the stairstep method except
5383that the steps are not required to be flat. Simpson's rule boils
5384down to the formula,
5385
5386@ifinfo
5387@example
5388(h/3) * (f(a) + 4 f(a+h) + 2 f(a+2h) + 4 f(a+3h) + ...
5389 + 2 f(a+(n-2)*h) + 4 f(a+(n-1)*h) + f(a+n*h))
5390@end example
5391@end ifinfo
5392@tex
5393\turnoffactive
5394\beforedisplay
5395$$ \displaylines{
5396 \qquad {h \over 3} (f(a) + 4 f(a+h) + 2 f(a+2h) + 4 f(a+3h) + \cdots
5397 \hfill \cr \hfill {} + 2 f(a+(n-2)h) + 4 f(a+(n-1)h) + f(a+n h)) \qquad
5398} $$
5399\afterdisplay
5400@end tex
5401
5402@noindent
5403where @cite{n} (which must be even) is the number of slices and @cite{h}
5404is the width of each slice. These are 10 and 0.1 in our example.
5405For reference, here is the corresponding formula for the stairstep
5406method:
5407
5408@ifinfo
5409@example
5410h * (f(a) + f(a+h) + f(a+2h) + f(a+3h) + ...
5411 + f(a+(n-2)*h) + f(a+(n-1)*h))
5412@end example
5413@end ifinfo
5414@tex
5415\turnoffactive
5416\beforedisplay
5417$$ h (f(a) + f(a+h) + f(a+2h) + f(a+3h) + \cdots
5418 + f(a+(n-2)h) + f(a+(n-1)h)) $$
5419\afterdisplay
5420@end tex
5421
5422Compute the integral from 1 to 2 of @c{$\sin x \ln x$}
5423@cite{sin(x) ln(x)} using
5424Simpson's rule with 10 slices. @xref{Algebra Answer 4, 4}. (@bullet{})
5425
5426Calc has a built-in @kbd{a I} command for doing numerical integration.
5427It uses @dfn{Romberg's method}, which is a more sophisticated cousin
5428of Simpson's rule. In particular, it knows how to keep refining the
5429result until the current precision is satisfied.
5430
5431@c [fix-ref Selecting Sub-Formulas]
5432Aside from the commands we've seen so far, Calc also provides a
5433large set of commands for operating on parts of formulas. You
5434indicate the desired sub-formula by placing the cursor on any part
5435of the formula before giving a @dfn{selection} command. Selections won't
5436be covered in the tutorial; @pxref{Selecting Subformulas}, for
5437details and examples.
5438
5439@c hard exercise: simplify (2^(n r) - 2^(r*(n - 1))) / (2^r - 1) 2^(n - 1)
5440@c to 2^((n-1)*(r-1)).
5441
5442@node Rewrites Tutorial, , Basic Algebra Tutorial, Algebra Tutorial
5443@subsection Rewrite Rules
5444
5445@noindent
5446No matter how many built-in commands Calc provided for doing algebra,
5447there would always be something you wanted to do that Calc didn't have
5448in its repertoire. So Calc also provides a @dfn{rewrite rule} system
5449that you can use to define your own algebraic manipulations.
5450
5451Suppose we want to simplify this trigonometric formula:
5452
d7b8e6c6 5453@smallexample
5d67986c 5454@group
d7b8e6c6
EZ
54551: 1 / cos(x) - sin(x) tan(x)
5456 .
5457
5d67986c 5458 ' 1/cos(x) - sin(x) tan(x) @key{RET} s 1
d7b8e6c6 5459@end group
5d67986c 5460@end smallexample
d7b8e6c6
EZ
5461
5462@noindent
5463If we were simplifying this by hand, we'd probably replace the
5464@samp{tan} with a @samp{sin/cos} first, then combine over a common
5465denominator. There is no Calc command to do the former; the @kbd{a n}
5466algebra command will do the latter but we'll do both with rewrite
5467rules just for practice.
5468
5469Rewrite rules are written with the @samp{:=} symbol.
5470
d7b8e6c6 5471@smallexample
5d67986c 5472@group
d7b8e6c6
EZ
54731: 1 / cos(x) - sin(x)^2 / cos(x)
5474 .
5475
5d67986c 5476 a r tan(a) := sin(a)/cos(a) @key{RET}
d7b8e6c6 5477@end group
5d67986c 5478@end smallexample
d7b8e6c6
EZ
5479
5480@noindent
5481(The ``assignment operator'' @samp{:=} has several uses in Calc. All
5482by itself the formula @samp{tan(a) := sin(a)/cos(a)} doesn't do anything,
5483but when it is given to the @kbd{a r} command, that command interprets
5484it as a rewrite rule.)
5485
5486The lefthand side, @samp{tan(a)}, is called the @dfn{pattern} of the
5487rewrite rule. Calc searches the formula on the stack for parts that
5488match the pattern. Variables in a rewrite pattern are called
5489@dfn{meta-variables}, and when matching the pattern each meta-variable
5490can match any sub-formula. Here, the meta-variable @samp{a} matched
5491the actual variable @samp{x}.
5492
5493When the pattern part of a rewrite rule matches a part of the formula,
5494that part is replaced by the righthand side with all the meta-variables
5495substituted with the things they matched. So the result is
5496@samp{sin(x) / cos(x)}. Calc's normal algebraic simplifications then
5497mix this in with the rest of the original formula.
5498
5499To merge over a common denominator, we can use another simple rule:
5500
d7b8e6c6 5501@smallexample
5d67986c 5502@group
d7b8e6c6
EZ
55031: (1 - sin(x)^2) / cos(x)
5504 .
5505
5d67986c 5506 a r a/x + b/x := (a+b)/x @key{RET}
d7b8e6c6 5507@end group
5d67986c 5508@end smallexample
d7b8e6c6
EZ
5509
5510This rule points out several interesting features of rewrite patterns.
5511First, if a meta-variable appears several times in a pattern, it must
5512match the same thing everywhere. This rule detects common denominators
5513because the same meta-variable @samp{x} is used in both of the
5514denominators.
5515
5516Second, meta-variable names are independent from variables in the
5517target formula. Notice that the meta-variable @samp{x} here matches
5518the subformula @samp{cos(x)}; Calc never confuses the two meanings of
5519@samp{x}.
5520
5521And third, rewrite patterns know a little bit about the algebraic
5522properties of formulas. The pattern called for a sum of two quotients;
5523Calc was able to match a difference of two quotients by matching
5524@samp{a = 1}, @samp{b = -sin(x)^2}, and @samp{x = cos(x)}.
5525
5526@c [fix-ref Algebraic Properties of Rewrite Rules]
5527We could just as easily have written @samp{a/x - b/x := (a-b)/x} for
5528the rule. It would have worked just the same in all cases. (If we
5529really wanted the rule to apply only to @samp{+} or only to @samp{-},
5530we could have used the @code{plain} symbol. @xref{Algebraic Properties
5531of Rewrite Rules}, for some examples of this.)
5532
5533One more rewrite will complete the job. We want to use the identity
5534@samp{sin(x)^2 + cos(x)^2 = 1}, but of course we must first rearrange
5535the identity in a way that matches our formula. The obvious rule
5536would be @samp{@w{1 - sin(x)^2} := cos(x)^2}, but a little thought shows
5537that the rule @samp{sin(x)^2 := 1 - cos(x)^2} will also work. The
5538latter rule has a more general pattern so it will work in many other
5539situations, too.
5540
d7b8e6c6 5541@smallexample
5d67986c 5542@group
d7b8e6c6
EZ
55431: (1 + cos(x)^2 - 1) / cos(x) 1: cos(x)
5544 . .
5545
5d67986c 5546 a r sin(x)^2 := 1 - cos(x)^2 @key{RET} a s
d7b8e6c6 5547@end group
5d67986c 5548@end smallexample
d7b8e6c6
EZ
5549
5550You may ask, what's the point of using the most general rule if you
5551have to type it in every time anyway? The answer is that Calc allows
5552you to store a rewrite rule in a variable, then give the variable
5553name in the @kbd{a r} command. In fact, this is the preferred way to
5554use rewrites. For one, if you need a rule once you'll most likely
5555need it again later. Also, if the rule doesn't work quite right you
5556can simply Undo, edit the variable, and run the rule again without
5557having to retype it.
5558
d7b8e6c6 5559@smallexample
5d67986c
RS
5560@group
5561' tan(x) := sin(x)/cos(x) @key{RET} s t tsc @key{RET}
5562' a/x + b/x := (a+b)/x @key{RET} s t merge @key{RET}
5563' sin(x)^2 := 1 - cos(x)^2 @key{RET} s t sinsqr @key{RET}
d7b8e6c6
EZ
5564
55651: 1 / cos(x) - sin(x) tan(x) 1: cos(x)
5566 . .
5567
5d67986c 5568 r 1 a r tsc @key{RET} a r merge @key{RET} a r sinsqr @key{RET} a s
d7b8e6c6 5569@end group
5d67986c 5570@end smallexample
d7b8e6c6
EZ
5571
5572To edit a variable, type @kbd{s e} and the variable name, use regular
5573Emacs editing commands as necessary, then type @kbd{M-# M-#} or
5574@kbd{C-c C-c} to store the edited value back into the variable.
5575You can also use @w{@kbd{s e}} to create a new variable if you wish.
5576
5577Notice that the first time you use each rule, Calc puts up a ``compiling''
5578message briefly. The pattern matcher converts rules into a special
5579optimized pattern-matching language rather than using them directly.
5580This allows @kbd{a r} to apply even rather complicated rules very
5581efficiently. If the rule is stored in a variable, Calc compiles it
5582only once and stores the compiled form along with the variable. That's
5583another good reason to store your rules in variables rather than
5584entering them on the fly.
5585
5586(@bullet{}) @strong{Exercise 1.} Type @kbd{m s} to get symbolic
5587mode, then enter the formula @samp{@w{(2 + sqrt(2))} / @w{(1 + sqrt(2))}}.
5588Using a rewrite rule, simplify this formula by multiplying both
5589sides by the conjugate @w{@samp{1 - sqrt(2)}}. The result will have
5590to be expanded by the distributive law; do this with another
5591rewrite. @xref{Rewrites Answer 1, 1}. (@bullet{})
5592
5593The @kbd{a r} command can also accept a vector of rewrite rules, or
5594a variable containing a vector of rules.
5595
d7b8e6c6 5596@smallexample
5d67986c 5597@group
d7b8e6c6
EZ
55981: [tsc, merge, sinsqr] 1: [tan(x) := sin(x) / cos(x), ... ]
5599 . .
5600
5d67986c 5601 ' [tsc,merge,sinsqr] @key{RET} =
d7b8e6c6 5602
d7b8e6c6 5603@end group
5d67986c 5604@end smallexample
d7b8e6c6 5605@noindent
d7b8e6c6 5606@smallexample
5d67986c 5607@group
d7b8e6c6
EZ
56081: 1 / cos(x) - sin(x) tan(x) 1: cos(x)
5609 . .
5610
5d67986c 5611 s t trig @key{RET} r 1 a r trig @key{RET} a s
d7b8e6c6 5612@end group
5d67986c 5613@end smallexample
d7b8e6c6
EZ
5614
5615@c [fix-ref Nested Formulas with Rewrite Rules]
5616Calc tries all the rules you give against all parts of the formula,
5617repeating until no further change is possible. (The exact order in
5618which things are tried is rather complex, but for simple rules like
5619the ones we've used here the order doesn't really matter.
5620@xref{Nested Formulas with Rewrite Rules}.)
5621
5622Calc actually repeats only up to 100 times, just in case your rule set
5623has gotten into an infinite loop. You can give a numeric prefix argument
5624to @kbd{a r} to specify any limit. In particular, @kbd{M-1 a r} does
5625only one rewrite at a time.
5626
d7b8e6c6 5627@smallexample
5d67986c 5628@group
d7b8e6c6
EZ
56291: 1 / cos(x) - sin(x)^2 / cos(x) 1: (1 - sin(x)^2) / cos(x)
5630 . .
5631
5d67986c 5632 r 1 M-1 a r trig @key{RET} M-1 a r trig @key{RET}
d7b8e6c6 5633@end group
5d67986c 5634@end smallexample
d7b8e6c6
EZ
5635
5636You can type @kbd{M-0 a r} if you want no limit at all on the number
5637of rewrites that occur.
5638
5639Rewrite rules can also be @dfn{conditional}. Simply follow the rule
5640with a @samp{::} symbol and the desired condition. For example,
5641
d7b8e6c6 5642@smallexample
5d67986c 5643@group
d7b8e6c6
EZ
56441: exp(2 pi i) + exp(3 pi i) + exp(4 pi i)
5645 .
5646
5d67986c 5647 ' exp(2 pi i) + exp(3 pi i) + exp(4 pi i) @key{RET}
d7b8e6c6 5648
d7b8e6c6 5649@end group
5d67986c 5650@end smallexample
d7b8e6c6 5651@noindent
d7b8e6c6 5652@smallexample
5d67986c 5653@group
d7b8e6c6
EZ
56541: 1 + exp(3 pi i) + 1
5655 .
5656
5d67986c 5657 a r exp(k pi i) := 1 :: k % 2 = 0 @key{RET}
d7b8e6c6 5658@end group
5d67986c 5659@end smallexample
d7b8e6c6
EZ
5660
5661@noindent
5662(Recall, @samp{k % 2} is the remainder from dividing @samp{k} by 2,
5663which will be zero only when @samp{k} is an even integer.)
5664
5665An interesting point is that the variables @samp{pi} and @samp{i}
5666were matched literally rather than acting as meta-variables.
5667This is because they are special-constant variables. The special
5668constants @samp{e}, @samp{phi}, and so on also match literally.
5669A common error with rewrite
5670rules is to write, say, @samp{f(a,b,c,d,e) := g(a+b+c+d+e)}, expecting
5671to match any @samp{f} with five arguments but in fact matching
5672only when the fifth argument is literally @samp{e}!@refill
5673
5674@cindex Fibonacci numbers
5d67986c
RS
5675@ignore
5676@starindex
5677@end ignore
d7b8e6c6
EZ
5678@tindex fib
5679Rewrite rules provide an interesting way to define your own functions.
5680Suppose we want to define @samp{fib(n)} to produce the @var{n}th
5681Fibonacci number. The first two Fibonacci numbers are each 1;
5682later numbers are formed by summing the two preceding numbers in
5683the sequence. This is easy to express in a set of three rules:
5684
d7b8e6c6 5685@smallexample
5d67986c
RS
5686@group
5687' [fib(1) := 1, fib(2) := 1, fib(n) := fib(n-1) + fib(n-2)] @key{RET} s t fib
d7b8e6c6
EZ
5688
56891: fib(7) 1: 13
5690 . .
5691
5d67986c 5692 ' fib(7) @key{RET} a r fib @key{RET}
d7b8e6c6 5693@end group
5d67986c 5694@end smallexample
d7b8e6c6
EZ
5695
5696One thing that is guaranteed about the order that rewrites are tried
5697is that, for any given subformula, earlier rules in the rule set will
5698be tried for that subformula before later ones. So even though the
5699first and third rules both match @samp{fib(1)}, we know the first will
5700be used preferentially.
5701
5702This rule set has one dangerous bug: Suppose we apply it to the
5703formula @samp{fib(x)}? (Don't actually try this.) The third rule
5704will match @samp{fib(x)} and replace it with @w{@samp{fib(x-1) + fib(x-2)}}.
5705Each of these will then be replaced to get @samp{fib(x-2) + 2 fib(x-3) +
5706fib(x-4)}, and so on, expanding forever. What we really want is to apply
5707the third rule only when @samp{n} is an integer greater than two. Type
5d67986c 5708@w{@kbd{s e fib @key{RET}}}, then edit the third rule to:
d7b8e6c6
EZ
5709
5710@smallexample
5711fib(n) := fib(n-1) + fib(n-2) :: integer(n) :: n > 2
5712@end smallexample
5713
5714@noindent
5715Now:
5716
d7b8e6c6 5717@smallexample
5d67986c 5718@group
d7b8e6c6
EZ
57191: fib(6) + fib(x) + fib(0) 1: 8 + fib(x) + fib(0)
5720 . .
5721
5d67986c 5722 ' fib(6)+fib(x)+fib(0) @key{RET} a r fib @key{RET}
d7b8e6c6 5723@end group
5d67986c 5724@end smallexample
d7b8e6c6
EZ
5725
5726@noindent
5727We've created a new function, @code{fib}, and a new command,
5d67986c 5728@w{@kbd{a r fib @key{RET}}}, which means ``evaluate all @code{fib} calls in
d7b8e6c6
EZ
5729this formula.'' To make things easier still, we can tell Calc to
5730apply these rules automatically by storing them in the special
5731variable @code{EvalRules}.
5732
d7b8e6c6 5733@smallexample
5d67986c 5734@group
d7b8e6c6
EZ
57351: [fib(1) := ...] . 1: [8, 13]
5736 . .
5737
5d67986c 5738 s r fib @key{RET} s t EvalRules @key{RET} ' [fib(6), fib(7)] @key{RET}
d7b8e6c6 5739@end group
5d67986c 5740@end smallexample
d7b8e6c6
EZ
5741
5742It turns out that this rule set has the problem that it does far
5743more work than it needs to when @samp{n} is large. Consider the
5744first few steps of the computation of @samp{fib(6)}:
5745
d7b8e6c6 5746@smallexample
5d67986c 5747@group
d7b8e6c6
EZ
5748fib(6) =
5749fib(5) + fib(4) =
5750fib(4) + fib(3) + fib(3) + fib(2) =
5751fib(3) + fib(2) + fib(2) + fib(1) + fib(2) + fib(1) + 1 = ...
d7b8e6c6 5752@end group
5d67986c 5753@end smallexample
d7b8e6c6
EZ
5754
5755@noindent
5756Note that @samp{fib(3)} appears three times here. Unless Calc's
5757algebraic simplifier notices the multiple @samp{fib(3)}s and combines
5758them (and, as it happens, it doesn't), this rule set does lots of
5759needless recomputation. To cure the problem, type @code{s e EvalRules}
5760to edit the rules (or just @kbd{s E}, a shorthand command for editing
5761@code{EvalRules}) and add another condition:
5762
5763@smallexample
5764fib(n) := fib(n-1) + fib(n-2) :: integer(n) :: n > 2 :: remember
5765@end smallexample
5766
5767@noindent
5768If a @samp{:: remember} condition appears anywhere in a rule, then if
5769that rule succeeds Calc will add another rule that describes that match
5770to the front of the rule set. (Remembering works in any rule set, but
5771for technical reasons it is most effective in @code{EvalRules}.) For
5772example, if the rule rewrites @samp{fib(7)} to something that evaluates
5773to 13, then the rule @samp{fib(7) := 13} will be added to the rule set.
5774
5d67986c 5775Type @kbd{' fib(8) @key{RET}} to compute the eighth Fibonacci number, then
d7b8e6c6
EZ
5776type @kbd{s E} again to see what has happened to the rule set.
5777
5778With the @code{remember} feature, our rule set can now compute
5779@samp{fib(@var{n})} in just @var{n} steps. In the process it builds
5780up a table of all Fibonacci numbers up to @var{n}. After we have
5781computed the result for a particular @var{n}, we can get it back
5782(and the results for all smaller @var{n}) later in just one step.
5783
5784All Calc operations will run somewhat slower whenever @code{EvalRules}
5d67986c 5785contains any rules. You should type @kbd{s u EvalRules @key{RET}} now to
d7b8e6c6
EZ
5786un-store the variable.
5787
5788(@bullet{}) @strong{Exercise 2.} Sometimes it is possible to reformulate
5789a problem to reduce the amount of recursion necessary to solve it.
5790Create a rule that, in about @var{n} simple steps and without recourse
5791to the @code{remember} option, replaces @samp{fib(@var{n}, 1, 1)} with
5792@samp{fib(1, @var{x}, @var{y})} where @var{x} and @var{y} are the
5793@var{n}th and @var{n+1}st Fibonacci numbers, respectively. This rule is
5794rather clunky to use, so add a couple more rules to make the ``user
5795interface'' the same as for our first version: enter @samp{fib(@var{n})},
5796get back a plain number. @xref{Rewrites Answer 2, 2}. (@bullet{})
5797
5798There are many more things that rewrites can do. For example, there
5799are @samp{&&&} and @samp{|||} pattern operators that create ``and''
5800and ``or'' combinations of rules. As one really simple example, we
5801could combine our first two Fibonacci rules thusly:
5802
5803@example
5804[fib(1 ||| 2) := 1, fib(n) := ... ]
5805@end example
5806
5807@noindent
5808That means ``@code{fib} of something matching either 1 or 2 rewrites
5809to 1.''
5810
5811You can also make meta-variables optional by enclosing them in @code{opt}.
5812For example, the pattern @samp{a + b x} matches @samp{2 + 3 x} but not
5813@samp{2 + x} or @samp{3 x} or @samp{x}. The pattern @samp{opt(a) + opt(b) x}
5814matches all of these forms, filling in a default of zero for @samp{a}
5815and one for @samp{b}.
5816
5817(@bullet{}) @strong{Exercise 3.} Your friend Joe had @samp{2 + 3 x}
5818on the stack and tried to use the rule
5819@samp{opt(a) + opt(b) x := f(a, b, x)}. What happened?
5820@xref{Rewrites Answer 3, 3}. (@bullet{})
5821
5822(@bullet{}) @strong{Exercise 4.} Starting with a positive integer @cite{a},
5823divide @cite{a} by two if it is even, otherwise compute @cite{3 a + 1}.
5824Now repeat this step over and over. A famous unproved conjecture
5825is that for any starting @cite{a}, the sequence always eventually
5826reaches 1. Given the formula @samp{seq(@var{a}, 0)}, write a set of
5827rules that convert this into @samp{seq(1, @var{n})} where @var{n}
5828is the number of steps it took the sequence to reach the value 1.
5829Now enhance the rules to accept @samp{seq(@var{a})} as a starting
5830configuration, and to stop with just the number @var{n} by itself.
5831Now make the result be a vector of values in the sequence, from @var{a}
5832to 1. (The formula @samp{@var{x}|@var{y}} appends the vectors @var{x}
5833and @var{y}.) For example, rewriting @samp{seq(6)} should yield the
5834vector @cite{[6, 3, 10, 5, 16, 8, 4, 2, 1]}.
5835@xref{Rewrites Answer 4, 4}. (@bullet{})
5836
5837(@bullet{}) @strong{Exercise 5.} Define, using rewrite rules, a function
5838@samp{nterms(@var{x})} that returns the number of terms in the sum
5839@var{x}, or 1 if @var{x} is not a sum. (A @dfn{sum} for our purposes
5840is one or more non-sum terms separated by @samp{+} or @samp{-} signs,
5841so that @cite{2 - 3 (x + y) + x y} is a sum of three terms.)
5842@xref{Rewrites Answer 5, 5}. (@bullet{})
5843
5844(@bullet{}) @strong{Exercise 6.} Calc considers the form @cite{0^0}
5845to be ``indeterminate,'' and leaves it unevaluated (assuming infinite
5846mode is not enabled). Some people prefer to define @cite{0^0 = 1},
5847so that the identity @cite{x^0 = 1} can safely be used for all @cite{x}.
5848Find a way to make Calc follow this convention. What happens if you
5849now type @kbd{m i} to turn on infinite mode?
5850@xref{Rewrites Answer 6, 6}. (@bullet{})
5851
5852(@bullet{}) @strong{Exercise 7.} A Taylor series for a function is an
5853infinite series that exactly equals the value of that function at
5854values of @cite{x} near zero.
5855
5856@ifinfo
5857@example
5858cos(x) = 1 - x^2 / 2! + x^4 / 4! - x^6 / 6! + ...
5859@end example
5860@end ifinfo
5861@tex
5862\turnoffactive \let\rm\goodrm
5863\beforedisplay
5864$$ \cos x = 1 - {x^2 \over 2!} + {x^4 \over 4!} - {x^6 \over 6!} + \cdots $$
5865\afterdisplay
5866@end tex
5867
5868The @kbd{a t} command produces a @dfn{truncated Taylor series} which
5869is obtained by dropping all the terms higher than, say, @cite{x^2}.
5870Calc represents the truncated Taylor series as a polynomial in @cite{x}.
5871Mathematicians often write a truncated series using a ``big-O'' notation
5872that records what was the lowest term that was truncated.
5873
5874@ifinfo
5875@example
5876cos(x) = 1 - x^2 / 2! + O(x^3)
5877@end example
5878@end ifinfo
5879@tex
5880\turnoffactive \let\rm\goodrm
5881\beforedisplay
5882$$ \cos x = 1 - {x^2 \over 2!} + O(x^3) $$
5883\afterdisplay
5884@end tex
5885
5886@noindent
5887The meaning of @cite{O(x^3)} is ``a quantity which is negligibly small
5888if @cite{x^3} is considered negligibly small as @cite{x} goes to zero.''
5889
5890The exercise is to create rewrite rules that simplify sums and products of
5891power series represented as @samp{@var{polynomial} + O(@var{var}^@var{n})}.
5892For example, given @samp{1 - x^2 / 2 + O(x^3)} and @samp{x - x^3 / 6 + O(x^4)}
5893on the stack, we want to be able to type @kbd{*} and get the result
5894@samp{x - 2:3 x^3 + O(x^4)}. Don't worry if the terms of the sum are
5895rearranged or if @kbd{a s} needs to be typed after rewriting. (This one
5896is rather tricky; the solution at the end of this chapter uses 6 rewrite
5897rules. Hint: The @samp{constant(x)} condition tests whether @samp{x} is
5898a number.) @xref{Rewrites Answer 7, 7}. (@bullet{})
5899
5900@c [fix-ref Rewrite Rules]
5901@xref{Rewrite Rules}, for the whole story on rewrite rules.
5902
5903@node Programming Tutorial, Answers to Exercises, Algebra Tutorial, Tutorial
5904@section Programming Tutorial
5905
5906@noindent
5907The Calculator is written entirely in Emacs Lisp, a highly extensible
5908language. If you know Lisp, you can program the Calculator to do
5909anything you like. Rewrite rules also work as a powerful programming
5910system. But Lisp and rewrite rules take a while to master, and often
5911all you want to do is define a new function or repeat a command a few
5912times. Calc has features that allow you to do these things easily.
5913
5914(Note that the programming commands relating to user-defined keys
5915are not yet supported under Lucid Emacs 19.)
5916
5917One very limited form of programming is defining your own functions.
5918Calc's @kbd{Z F} command allows you to define a function name and
5919key sequence to correspond to any formula. Programming commands use
5920the shift-@kbd{Z} prefix; the user commands they create use the lower
5921case @kbd{z} prefix.
5922
d7b8e6c6 5923@smallexample
5d67986c 5924@group
d7b8e6c6
EZ
59251: 1 + x + x^2 / 2 + x^3 / 6 1: 1 + x + x^2 / 2 + x^3 / 6
5926 . .
5927
5d67986c 5928 ' 1 + x + x^2/2! + x^3/3! @key{RET} Z F e myexp @key{RET} @key{RET} @key{RET} y
d7b8e6c6 5929@end group
5d67986c 5930@end smallexample
d7b8e6c6
EZ
5931
5932This polynomial is a Taylor series approximation to @samp{exp(x)}.
5933The @kbd{Z F} command asks a number of questions. The above answers
5934say that the key sequence for our function should be @kbd{z e}; the
5935@kbd{M-x} equivalent should be @code{calc-myexp}; the name of the
5936function in algebraic formulas should also be @code{myexp}; the
5937default argument list @samp{(x)} is acceptable; and finally @kbd{y}
5938answers the question ``leave it in symbolic form for non-constant
5939arguments?''
5940
d7b8e6c6 5941@smallexample
5d67986c 5942@group
d7b8e6c6
EZ
59431: 1.3495 2: 1.3495 3: 1.3495
5944 . 1: 1.34986 2: 1.34986
5945 . 1: myexp(a + 1)
5946 .
5947
5d67986c 5948 .3 z e .3 E ' a+1 @key{RET} z e
d7b8e6c6 5949@end group
5d67986c 5950@end smallexample
d7b8e6c6
EZ
5951
5952@noindent
5953First we call our new @code{exp} approximation with 0.3 as an
5954argument, and compare it with the true @code{exp} function. Then
5955we note that, as requested, if we try to give @kbd{z e} an
5956argument that isn't a plain number, it leaves the @code{myexp}
5957function call in symbolic form. If we had answered @kbd{n} to the
5958final question, @samp{myexp(a + 1)} would have evaluated by plugging
5959in @samp{a + 1} for @samp{x} in the defining formula.
5960
5961@cindex Sine integral Si(x)
5d67986c
RS
5962@ignore
5963@starindex
5964@end ignore
d7b8e6c6
EZ
5965@tindex Si
5966(@bullet{}) @strong{Exercise 1.} The ``sine integral'' function
5967@c{${\rm Si}(x)$}
5968@cite{Si(x)} is defined as the integral of @samp{sin(t)/t} for
5969@cite{t = 0} to @cite{x} in radians. (It was invented because this
5970integral has no solution in terms of basic functions; if you give it
5971to Calc's @kbd{a i} command, it will ponder it for a long time and then
5972give up.) We can use the numerical integration command, however,
5973which in algebraic notation is written like @samp{ninteg(f(t), t, 0, x)}
5974with any integrand @samp{f(t)}. Define a @kbd{z s} command and
5975@code{Si} function that implement this. You will need to edit the
5976default argument list a bit. As a test, @samp{Si(1)} should return
59770.946083. (Hint: @code{ninteg} will run a lot faster if you reduce
5978the precision to, say, six digits beforehand.)
5979@xref{Programming Answer 1, 1}. (@bullet{})
5980
5981The simplest way to do real ``programming'' of Emacs is to define a
5982@dfn{keyboard macro}. A keyboard macro is simply a sequence of
5983keystrokes which Emacs has stored away and can play back on demand.
5984For example, if you find yourself typing @kbd{H a S x @key{RET}} often,
5985you may wish to program a keyboard macro to type this for you.
5986
d7b8e6c6 5987@smallexample
5d67986c 5988@group
d7b8e6c6
EZ
59891: y = sqrt(x) 1: x = y^2
5990 . .
5991
5d67986c 5992 ' y=sqrt(x) @key{RET} C-x ( H a S x @key{RET} C-x )
d7b8e6c6
EZ
5993
59941: y = cos(x) 1: x = s1 arccos(y) + 2 pi n1
5995 . .
5996
5d67986c 5997 ' y=cos(x) @key{RET} X
d7b8e6c6 5998@end group
5d67986c 5999@end smallexample
d7b8e6c6
EZ
6000
6001@noindent
6002When you type @kbd{C-x (}, Emacs begins recording. But it is also
6003still ready to execute your keystrokes, so you're really ``training''
6004Emacs by walking it through the procedure once. When you type
6005@w{@kbd{C-x )}}, the macro is recorded. You can now type @kbd{X} to
6006re-execute the same keystrokes.
6007
6008You can give a name to your macro by typing @kbd{Z K}.
6009
d7b8e6c6 6010@smallexample
5d67986c 6011@group
d7b8e6c6
EZ
60121: . 1: y = x^4 1: x = s2 sqrt(s1 sqrt(y))
6013 . .
6014
5d67986c 6015 Z K x @key{RET} ' y=x^4 @key{RET} z x
d7b8e6c6 6016@end group
5d67986c 6017@end smallexample
d7b8e6c6
EZ
6018
6019@noindent
6020Notice that we use shift-@kbd{Z} to define the command, and lower-case
6021@kbd{z} to call it up.
6022
6023Keyboard macros can call other macros.
6024
d7b8e6c6 6025@smallexample
5d67986c 6026@group
d7b8e6c6
EZ
60271: abs(x) 1: x = s1 y 1: 2 / x 1: x = 2 / y
6028 . . . .
6029
5d67986c 6030 ' abs(x) @key{RET} C-x ( ' y @key{RET} a = z x C-x ) ' 2/x @key{RET} X
d7b8e6c6 6031@end group
5d67986c 6032@end smallexample
d7b8e6c6
EZ
6033
6034(@bullet{}) @strong{Exercise 2.} Define a keyboard macro to negate
6035the item in level 3 of the stack, without disturbing the rest of
6036the stack. @xref{Programming Answer 2, 2}. (@bullet{})
6037
6038(@bullet{}) @strong{Exercise 3.} Define keyboard macros to compute
6039the following functions:
6040
6041@enumerate
6042@item
6043Compute @c{$\displaystyle{\sin x \over x}$}
6044@cite{sin(x) / x}, where @cite{x} is the number on the
6045top of the stack.
6046
6047@item
6048Compute the base-@cite{b} logarithm, just like the @kbd{B} key except
6049the arguments are taken in the opposite order.
6050
6051@item
6052Produce a vector of integers from 1 to the integer on the top of
6053the stack.
6054@end enumerate
6055@noindent
6056@xref{Programming Answer 3, 3}. (@bullet{})
6057
6058(@bullet{}) @strong{Exercise 4.} Define a keyboard macro to compute
6059the average (mean) value of a list of numbers.
6060@xref{Programming Answer 4, 4}. (@bullet{})
6061
6062In many programs, some of the steps must execute several times.
6063Calc has @dfn{looping} commands that allow this. Loops are useful
6064inside keyboard macros, but actually work at any time.
6065
d7b8e6c6 6066@smallexample
5d67986c 6067@group
d7b8e6c6
EZ
60681: x^6 2: x^6 1: 360 x^2
6069 . 1: 4 .
6070 .
6071
5d67986c 6072 ' x^6 @key{RET} 4 Z < a d x @key{RET} Z >
d7b8e6c6 6073@end group
5d67986c 6074@end smallexample
d7b8e6c6
EZ
6075
6076@noindent
6077Here we have computed the fourth derivative of @cite{x^6} by
6078enclosing a derivative command in a ``repeat loop'' structure.
6079This structure pops a repeat count from the stack, then
6080executes the body of the loop that many times.
6081
6082If you make a mistake while entering the body of the loop,
6083type @w{@kbd{Z C-g}} to cancel the loop command.
6084
6085@cindex Fibonacci numbers
6086Here's another example:
6087
d7b8e6c6 6088@smallexample
5d67986c 6089@group
d7b8e6c6
EZ
60903: 1 2: 10946
60912: 1 1: 17711
60921: 20 .
6093 .
6094
5d67986c 60951 @key{RET} @key{RET} 20 Z < @key{TAB} C-j + Z >
d7b8e6c6 6096@end group
5d67986c 6097@end smallexample
d7b8e6c6
EZ
6098
6099@noindent
6100The numbers in levels 2 and 1 should be the 21st and 22nd Fibonacci
6101numbers, respectively. (To see what's going on, try a few repetitions
6102of the loop body by hand; @kbd{C-j}, also on the Line-Feed or @key{LFD}
6103key if you have one, makes a copy of the number in level 2.)
6104
6105@cindex Golden ratio
6106@cindex Phi, golden ratio
6107A fascinating property of the Fibonacci numbers is that the @cite{n}th
6108Fibonacci number can be found directly by computing @c{$\phi^n / \sqrt{5}$}
6109@cite{phi^n / sqrt(5)}
6110and then rounding to the nearest integer, where @c{$\phi$ (``phi'')}
6111@cite{phi}, the
6112``golden ratio,'' is @c{$(1 + \sqrt{5}) / 2$}
6113@cite{(1 + sqrt(5)) / 2}. (For convenience, this constant is available
6114from the @code{phi} variable, or the @kbd{I H P} command.)
6115
d7b8e6c6 6116@smallexample
5d67986c 6117@group
d7b8e6c6
EZ
61181: 1.61803 1: 24476.0000409 1: 10945.9999817 1: 10946
6119 . . . .
6120
6121 I H P 21 ^ 5 Q / R
d7b8e6c6 6122@end group
5d67986c 6123@end smallexample
d7b8e6c6
EZ
6124
6125@cindex Continued fractions
6126(@bullet{}) @strong{Exercise 5.} The @dfn{continued fraction}
6127representation of @c{$\phi$}
6128@cite{phi} is @c{$1 + 1/(1 + 1/(1 + 1/( \ldots )))$}
6129@cite{1 + 1/(1 + 1/(1 + 1/( ...@: )))}.
6130We can compute an approximate value by carrying this however far
6131and then replacing the innermost @c{$1/( \ldots )$}
6132@cite{1/( ...@: )} by 1. Approximate
6133@c{$\phi$}
6134@cite{phi} using a twenty-term continued fraction.
6135@xref{Programming Answer 5, 5}. (@bullet{})
6136
6137(@bullet{}) @strong{Exercise 6.} Linear recurrences like the one for
6138Fibonacci numbers can be expressed in terms of matrices. Given a
6139vector @w{@cite{[a, b]}} determine a matrix which, when multiplied by this
6140vector, produces the vector @cite{[b, c]}, where @cite{a}, @cite{b} and
6141@cite{c} are three successive Fibonacci numbers. Now write a program
6142that, given an integer @cite{n}, computes the @cite{n}th Fibonacci number
6143using matrix arithmetic. @xref{Programming Answer 6, 6}. (@bullet{})
6144
6145@cindex Harmonic numbers
6146A more sophisticated kind of loop is the @dfn{for} loop. Suppose
6147we wish to compute the 20th ``harmonic'' number, which is equal to
6148the sum of the reciprocals of the integers from 1 to 20.
6149
d7b8e6c6 6150@smallexample
5d67986c 6151@group
d7b8e6c6
EZ
61523: 0 1: 3.597739
61532: 1 .
61541: 20
6155 .
6156
5d67986c 61570 @key{RET} 1 @key{RET} 20 Z ( & + 1 Z )
d7b8e6c6 6158@end group
5d67986c 6159@end smallexample
d7b8e6c6
EZ
6160
6161@noindent
6162The ``for'' loop pops two numbers, the lower and upper limits, then
6163repeats the body of the loop as an internal counter increases from
6164the lower limit to the upper one. Just before executing the loop
6165body, it pushes the current loop counter. When the loop body
6166finishes, it pops the ``step,'' i.e., the amount by which to
6167increment the loop counter. As you can see, our loop always
6168uses a step of one.
6169
6170This harmonic number function uses the stack to hold the running
6171total as well as for the various loop housekeeping functions. If
6172you find this disorienting, you can sum in a variable instead:
6173
d7b8e6c6 6174@smallexample
5d67986c 6175@group
d7b8e6c6
EZ
61761: 0 2: 1 . 1: 3.597739
6177 . 1: 20 .
6178 .
6179
5d67986c 6180 0 t 7 1 @key{RET} 20 Z ( & s + 7 1 Z ) r 7
d7b8e6c6 6181@end group
5d67986c 6182@end smallexample
d7b8e6c6
EZ
6183
6184@noindent
6185The @kbd{s +} command adds the top-of-stack into the value in a
6186variable (and removes that value from the stack).
6187
6188It's worth noting that many jobs that call for a ``for'' loop can
6189also be done more easily by Calc's high-level operations. Two
6190other ways to compute harmonic numbers are to use vector mapping
6191and reduction (@kbd{v x 20}, then @w{@kbd{V M &}}, then @kbd{V R +}),
6192or to use the summation command @kbd{a +}. Both of these are
6193probably easier than using loops. However, there are some
6194situations where loops really are the way to go:
6195
6196(@bullet{}) @strong{Exercise 7.} Use a ``for'' loop to find the first
6197harmonic number which is greater than 4.0.
6198@xref{Programming Answer 7, 7}. (@bullet{})
6199
6200Of course, if we're going to be using variables in our programs,
6201we have to worry about the programs clobbering values that the
6202caller was keeping in those same variables. This is easy to
6203fix, though:
6204
d7b8e6c6 6205@smallexample
5d67986c 6206@group
d7b8e6c6
EZ
6207 . 1: 0.6667 1: 0.6667 3: 0.6667
6208 . . 2: 3.597739
6209 1: 0.6667
6210 .
6211
5d67986c 6212 Z ` p 4 @key{RET} 2 @key{RET} 3 / s 7 s s a @key{RET} Z ' r 7 s r a @key{RET}
d7b8e6c6 6213@end group
5d67986c 6214@end smallexample
d7b8e6c6
EZ
6215
6216@noindent
6217When we type @kbd{Z `} (that's a back-quote character), Calc saves
6218its mode settings and the contents of the ten ``quick variables''
6219for later reference. When we type @kbd{Z '} (that's an apostrophe
6220now), Calc restores those saved values. Thus the @kbd{p 4} and
6221@kbd{s 7} commands have no effect outside this sequence. Wrapping
6222this around the body of a keyboard macro ensures that it doesn't
6223interfere with what the user of the macro was doing. Notice that
6224the contents of the stack, and the values of named variables,
6225survive past the @kbd{Z '} command.
6226
6227@cindex Bernoulli numbers, approximate
6228The @dfn{Bernoulli numbers} are a sequence with the interesting
6229property that all of the odd Bernoulli numbers are zero, and the
6230even ones, while difficult to compute, can be roughly approximated
6231by the formula @c{$\displaystyle{2 n! \over (2 \pi)^n}$}
6232@cite{2 n!@: / (2 pi)^n}. Let's write a keyboard
6233macro to compute (approximate) Bernoulli numbers. (Calc has a
6234command, @kbd{k b}, to compute exact Bernoulli numbers, but
6235this command is very slow for large @cite{n} since the higher
6236Bernoulli numbers are very large fractions.)
6237
d7b8e6c6 6238@smallexample
5d67986c 6239@group
d7b8e6c6
EZ
62401: 10 1: 0.0756823
6241 . .
6242
5d67986c 6243 10 C-x ( @key{RET} 2 % Z [ @key{DEL} 0 Z : ' 2 $! / (2 pi)^$ @key{RET} = Z ] C-x )
d7b8e6c6 6244@end group
5d67986c 6245@end smallexample
d7b8e6c6
EZ
6246
6247@noindent
6248You can read @kbd{Z [} as ``then,'' @kbd{Z :} as ``else,'' and
6249@kbd{Z ]} as ``end-if.'' There is no need for an explicit ``if''
6250command. For the purposes of @w{@kbd{Z [}}, the condition is ``true''
6251if the value it pops from the stack is a nonzero number, or ``false''
6252if it pops zero or something that is not a number (like a formula).
6253Here we take our integer argument modulo 2; this will be nonzero
6254if we're asking for an odd Bernoulli number.
6255
6256The actual tenth Bernoulli number is @cite{5/66}.
6257
d7b8e6c6 6258@smallexample
5d67986c 6259@group
d7b8e6c6
EZ
62603: 0.0756823 1: 0 1: 0.25305 1: 0 1: 1.16659
62612: 5:66 . . . .
62621: 0.0757575
6263 .
6264
5d67986c 626510 k b @key{RET} c f M-0 @key{DEL} 11 X @key{DEL} 12 X @key{DEL} 13 X @key{DEL} 14 X
d7b8e6c6 6266@end group
5d67986c 6267@end smallexample
d7b8e6c6
EZ
6268
6269Just to exercise loops a bit more, let's compute a table of even
6270Bernoulli numbers.
6271
d7b8e6c6 6272@smallexample
5d67986c 6273@group
d7b8e6c6
EZ
62743: [] 1: [0.10132, 0.03079, 0.02340, 0.033197, ...]
62752: 2 .
62761: 30
6277 .
6278
5d67986c 6279 [ ] 2 @key{RET} 30 Z ( X | 2 Z )
d7b8e6c6 6280@end group
5d67986c 6281@end smallexample
d7b8e6c6
EZ
6282
6283@noindent
6284The vertical-bar @kbd{|} is the vector-concatenation command. When
6285we execute it, the list we are building will be in stack level 2
6286(initially this is an empty list), and the next Bernoulli number
6287will be in level 1. The effect is to append the Bernoulli number
6288onto the end of the list. (To create a table of exact fractional
6289Bernoulli numbers, just replace @kbd{X} with @kbd{k b} in the above
6290sequence of keystrokes.)
6291
6292With loops and conditionals, you can program essentially anything
6293in Calc. One other command that makes looping easier is @kbd{Z /},
6294which takes a condition from the stack and breaks out of the enclosing
6295loop if the condition is true (non-zero). You can use this to make
6296``while'' and ``until'' style loops.
6297
6298If you make a mistake when entering a keyboard macro, you can edit
6299it using @kbd{Z E}. First, you must attach it to a key with @kbd{Z K}.
6300One technique is to enter a throwaway dummy definition for the macro,
6301then enter the real one in the edit command.
6302
d7b8e6c6 6303@smallexample
5d67986c 6304@group
d7b8e6c6 63051: 3 1: 3 Keyboard Macro Editor.
5d67986c 6306 . . Original keys: 1 @key{RET} 2 +
d7b8e6c6
EZ
6307
6308 type "1\r"
6309 type "2"
6310 calc-plus
6311
5d67986c 6312C-x ( 1 @key{RET} 2 + C-x ) Z K h @key{RET} Z E h
d7b8e6c6 6313@end group
5d67986c 6314@end smallexample
d7b8e6c6
EZ
6315
6316@noindent
6317This shows the screen display assuming you have the @file{macedit}
6318keyboard macro editing package installed, which is usually the case
6319since a copy of @file{macedit} comes bundled with Calc.
6320
6321A keyboard macro is stored as a pure keystroke sequence. The
6322@file{macedit} package (invoked by @kbd{Z E}) scans along the
6323macro and tries to decode it back into human-readable steps.
6324If a key or keys are simply shorthand for some command with a
6325@kbd{M-x} name, that name is shown. Anything that doesn't correspond
6326to a @kbd{M-x} command is written as a @samp{type} command.
6327
6328Let's edit in a new definition, for computing harmonic numbers.
6329First, erase the three lines of the old definition. Then, type
6330in the new definition (or use Emacs @kbd{M-w} and @kbd{C-y} commands
6331to copy it from this page of the Info file; you can skip typing
6332the comments that begin with @samp{#}).
6333
6334@smallexample
6335calc-kbd-push # Save local values (Z `)
6336type "0" # Push a zero
6337calc-store-into # Store it in variable 1
6338type "1"
6339type "1" # Initial value for loop
5d67986c 6340calc-roll-down # This is the @key{TAB} key; swap initial & final
d7b8e6c6
EZ
6341calc-kbd-for # Begin "for" loop...
6342calc-inv # Take reciprocal
6343calc-store-plus # Add to accumulator
6344type "1"
6345type "1" # Loop step is 1
6346calc-kbd-end-for # End "for" loop
6347calc-recall # Now recall final accumulated value
6348type "1"
6349calc-kbd-pop # Restore values (Z ')
6350@end smallexample
6351
6352@noindent
6353Press @kbd{M-# M-#} to finish editing and return to the Calculator.
6354
d7b8e6c6 6355@smallexample
5d67986c 6356@group
d7b8e6c6
EZ
63571: 20 1: 3.597739
6358 . .
6359
6360 20 z h
d7b8e6c6 6361@end group
5d67986c 6362@end smallexample
d7b8e6c6
EZ
6363
6364If you don't know how to write a particular command in @file{macedit}
6365format, you can always write it as keystrokes in a @code{type} command.
6366There is also a @code{keys} command which interprets the rest of the
6367line as standard Emacs keystroke names. In fact, @file{macedit} defines
6368a handy @code{read-kbd-macro} command which reads the current region
6369of the current buffer as a sequence of keystroke names, and defines that
6370sequence on the @kbd{X} (and @kbd{C-x e}) key. Because this is so
6371useful, Calc puts this command on the @kbd{M-# m} key. Try reading in
5d67986c 6372this macro in the following form: Press @kbd{C-@@} (or @kbd{C-@key{SPC}}) at
d7b8e6c6
EZ
6373one end of the text below, then type @kbd{M-# m} at the other.
6374
d7b8e6c6 6375@example
5d67986c 6376@group
d7b8e6c6 6377Z ` 0 t 1
5d67986c 6378 1 @key{TAB}
d7b8e6c6
EZ
6379 Z ( & s + 1 1 Z )
6380 r 1
6381Z '
d7b8e6c6 6382@end group
5d67986c 6383@end example
d7b8e6c6
EZ
6384
6385(@bullet{}) @strong{Exercise 8.} A general algorithm for solving
6386equations numerically is @dfn{Newton's Method}. Given the equation
6387@cite{f(x) = 0} for any function @cite{f}, and an initial guess
6388@cite{x_0} which is reasonably close to the desired solution, apply
6389this formula over and over:
6390
6391@ifinfo
6392@example
6393new_x = x - f(x)/f'(x)
6394@end example
6395@end ifinfo
6396@tex
6397\beforedisplay
6398$$ x_{\goodrm new} = x - {f(x) \over f'(x)} $$
6399\afterdisplay
6400@end tex
6401
6402@noindent
6403where @cite{f'(x)} is the derivative of @cite{f}. The @cite{x}
6404values will quickly converge to a solution, i.e., eventually
6405@c{$x_{\rm new}$}
6406@cite{new_x} and @cite{x} will be equal to within the limits
6407of the current precision. Write a program which takes a formula
6408involving the variable @cite{x}, and an initial guess @cite{x_0},
6409on the stack, and produces a value of @cite{x} for which the formula
6410is zero. Use it to find a solution of @c{$\sin(\cos x) = 0.5$}
6411@cite{sin(cos(x)) = 0.5}
6412near @cite{x = 4.5}. (Use angles measured in radians.) Note that
6413the built-in @w{@kbd{a R}} (@code{calc-find-root}) command uses Newton's
6414method when it is able. @xref{Programming Answer 8, 8}. (@bullet{})
6415
6416@cindex Digamma function
6417@cindex Gamma constant, Euler's
6418@cindex Euler's gamma constant
6419(@bullet{}) @strong{Exercise 9.} The @dfn{digamma} function @c{$\psi(z)$ (``psi'')}
6420@cite{psi(z)}
6421is defined as the derivative of @c{$\ln \Gamma(z)$}
6422@cite{ln(gamma(z))}. For large
6423values of @cite{z}, it can be approximated by the infinite sum
6424
6425@ifinfo
6426@example
6427psi(z) ~= ln(z) - 1/2z - sum(bern(2 n) / 2 n z^(2 n), n, 1, inf)
6428@end example
6429@end ifinfo
6430@tex
6431\let\rm\goodrm
6432\beforedisplay
6433$$ \psi(z) \approx \ln z - {1\over2z} -
6434 \sum_{n=1}^\infty {\code{bern}(2 n) \over 2 n z^{2n}}
6435$$
6436\afterdisplay
6437@end tex
6438
6439@noindent
6440where @c{$\sum$}
6441@cite{sum} represents the sum over @cite{n} from 1 to infinity
6442(or to some limit high enough to give the desired accuracy), and
6443the @code{bern} function produces (exact) Bernoulli numbers.
6444While this sum is not guaranteed to converge, in practice it is safe.
6445An interesting mathematical constant is Euler's gamma, which is equal
6446to about 0.5772. One way to compute it is by the formula,
6447@c{$\gamma = -\psi(1)$}
6448@cite{gamma = -psi(1)}. Unfortunately, 1 isn't a large enough argument
6449for the above formula to work (5 is a much safer value for @cite{z}).
6450Fortunately, we can compute @c{$\psi(1)$}
6451@cite{psi(1)} from @c{$\psi(5)$}
6452@cite{psi(5)} using
6453the recurrence @c{$\psi(z+1) = \psi(z) + {1 \over z}$}
6454@cite{psi(z+1) = psi(z) + 1/z}. Your task: Develop
6455a program to compute @c{$\psi(z)$}
6456@cite{psi(z)}; it should ``pump up'' @cite{z}
6457if necessary to be greater than 5, then use the above summation
6458formula. Use looping commands to compute the sum. Use your function
6459to compute @c{$\gamma$}
6460@cite{gamma} to twelve decimal places. (Calc has a built-in command
6461for Euler's constant, @kbd{I P}, which you can use to check your answer.)
6462@xref{Programming Answer 9, 9}. (@bullet{})
6463
6464@cindex Polynomial, list of coefficients
6465(@bullet{}) @strong{Exercise 10.} Given a polynomial in @cite{x} and
6466a number @cite{m} on the stack, where the polynomial is of degree
6467@cite{m} or less (i.e., does not have any terms higher than @cite{x^m}),
6468write a program to convert the polynomial into a list-of-coefficients
6469notation. For example, @cite{5 x^4 + (x + 1)^2} with @cite{m = 6}
6470should produce the list @cite{[1, 2, 1, 0, 5, 0, 0]}. Also develop
6471a way to convert from this form back to the standard algebraic form.
6472@xref{Programming Answer 10, 10}. (@bullet{})
6473
6474@cindex Recursion
6475(@bullet{}) @strong{Exercise 11.} The @dfn{Stirling numbers of the
6476first kind} are defined by the recurrences,
6477
6478@ifinfo
6479@example
6480s(n,n) = 1 for n >= 0,
6481s(n,0) = 0 for n > 0,
6482s(n+1,m) = s(n,m-1) - n s(n,m) for n >= m >= 1.
6483@end example
6484@end ifinfo
6485@tex
6486\turnoffactive
6487\beforedisplay
6488$$ \eqalign{ s(n,n) &= 1 \qquad \hbox{for } n \ge 0, \cr
6489 s(n,0) &= 0 \qquad \hbox{for } n > 0, \cr
6490 s(n+1,m) &= s(n,m-1) - n \, s(n,m) \qquad
6491 \hbox{for } n \ge m \ge 1.}
6492$$
6493\afterdisplay
6494\vskip5pt
6495(These numbers are also sometimes written $\displaystyle{n \brack m}$.)
6496@end tex
6497
6498This can be implemented using a @dfn{recursive} program in Calc; the
6499program must invoke itself in order to calculate the two righthand
6500terms in the general formula. Since it always invokes itself with
6501``simpler'' arguments, it's easy to see that it must eventually finish
6502the computation. Recursion is a little difficult with Emacs keyboard
6503macros since the macro is executed before its definition is complete.
6504So here's the recommended strategy: Create a ``dummy macro'' and assign
6505it to a key with, e.g., @kbd{Z K s}. Now enter the true definition,
6506using the @kbd{z s} command to call itself recursively, then assign it
6507to the same key with @kbd{Z K s}. Now the @kbd{z s} command will run
6508the complete recursive program. (Another way is to use @w{@kbd{Z E}}
6509or @kbd{M-# m} (@code{read-kbd-macro}) to read the whole macro at once,
6510thus avoiding the ``training'' phase.) The task: Write a program
6511that computes Stirling numbers of the first kind, given @cite{n} and
6512@cite{m} on the stack. Test it with @emph{small} inputs like
6513@cite{s(4,2)}. (There is a built-in command for Stirling numbers,
6514@kbd{k s}, which you can use to check your answers.)
6515@xref{Programming Answer 11, 11}. (@bullet{})
6516
6517The programming commands we've seen in this part of the tutorial
6518are low-level, general-purpose operations. Often you will find
6519that a higher-level function, such as vector mapping or rewrite
6520rules, will do the job much more easily than a detailed, step-by-step
6521program can:
6522
6523(@bullet{}) @strong{Exercise 12.} Write another program for
6524computing Stirling numbers of the first kind, this time using
6525rewrite rules. Once again, @cite{n} and @cite{m} should be taken
6526from the stack. @xref{Programming Answer 12, 12}. (@bullet{})
6527
6528@example
6529
6530@end example
6531This ends the tutorial section of the Calc manual. Now you know enough
6532about Calc to use it effectively for many kinds of calculations. But
6533Calc has many features that were not even touched upon in this tutorial.
6534@c [not-split]
6535The rest of this manual tells the whole story.
6536@c [when-split]
6537@c Volume II of this manual, the @dfn{Calc Reference}, tells the whole story.
6538
6539@page
6540@node Answers to Exercises, , Programming Tutorial, Tutorial
6541@section Answers to Exercises
6542
6543@noindent
6544This section includes answers to all the exercises in the Calc tutorial.
6545
6546@menu
5d67986c 6547* RPN Answer 1:: 1 @key{RET} 2 @key{RET} 3 @key{RET} 4 + * -
d7b8e6c6
EZ
6548* RPN Answer 2:: 2*4 + 7*9.5 + 5/4
6549* RPN Answer 3:: Operating on levels 2 and 3
6550* RPN Answer 4:: Joe's complex problems
6551* Algebraic Answer 1:: Simulating Q command
6552* Algebraic Answer 2:: Joe's algebraic woes
6553* Algebraic Answer 3:: 1 / 0
6554* Modes Answer 1:: 3#0.1 = 3#0.0222222?
6555* Modes Answer 2:: 16#f.e8fe15
6556* Modes Answer 3:: Joe's rounding bug
6557* Modes Answer 4:: Why floating point?
6558* Arithmetic Answer 1:: Why the \ command?
6559* Arithmetic Answer 2:: Tripping up the B command
6560* Vector Answer 1:: Normalizing a vector
6561* Vector Answer 2:: Average position
6562* Matrix Answer 1:: Row and column sums
6563* Matrix Answer 2:: Symbolic system of equations
6564* Matrix Answer 3:: Over-determined system
6565* List Answer 1:: Powers of two
6566* List Answer 2:: Least-squares fit with matrices
6567* List Answer 3:: Geometric mean
6568* List Answer 4:: Divisor function
6569* List Answer 5:: Duplicate factors
6570* List Answer 6:: Triangular list
6571* List Answer 7:: Another triangular list
6572* List Answer 8:: Maximum of Bessel function
6573* List Answer 9:: Integers the hard way
6574* List Answer 10:: All elements equal
6575* List Answer 11:: Estimating pi with darts
6576* List Answer 12:: Estimating pi with matchsticks
6577* List Answer 13:: Hash codes
6578* List Answer 14:: Random walk
6579* Types Answer 1:: Square root of pi times rational
6580* Types Answer 2:: Infinities
6581* Types Answer 3:: What can "nan" be?
6582* Types Answer 4:: Abbey Road
6583* Types Answer 5:: Friday the 13th
6584* Types Answer 6:: Leap years
6585* Types Answer 7:: Erroneous donut
6586* Types Answer 8:: Dividing intervals
6587* Types Answer 9:: Squaring intervals
6588* Types Answer 10:: Fermat's primality test
6589* Types Answer 11:: pi * 10^7 seconds
6590* Types Answer 12:: Abbey Road on CD
6591* Types Answer 13:: Not quite pi * 10^7 seconds
6592* Types Answer 14:: Supercomputers and c
6593* Types Answer 15:: Sam the Slug
6594* Algebra Answer 1:: Squares and square roots
6595* Algebra Answer 2:: Building polynomial from roots
6596* Algebra Answer 3:: Integral of x sin(pi x)
6597* Algebra Answer 4:: Simpson's rule
6598* Rewrites Answer 1:: Multiplying by conjugate
6599* Rewrites Answer 2:: Alternative fib rule
6600* Rewrites Answer 3:: Rewriting opt(a) + opt(b) x
6601* Rewrites Answer 4:: Sequence of integers
6602* Rewrites Answer 5:: Number of terms in sum
6603* Rewrites Answer 6:: Defining 0^0 = 1
6604* Rewrites Answer 7:: Truncated Taylor series
6605* Programming Answer 1:: Fresnel's C(x)
6606* Programming Answer 2:: Negate third stack element
6607* Programming Answer 3:: Compute sin(x) / x, etc.
6608* Programming Answer 4:: Average value of a list
6609* Programming Answer 5:: Continued fraction phi
6610* Programming Answer 6:: Matrix Fibonacci numbers
6611* Programming Answer 7:: Harmonic number greater than 4
6612* Programming Answer 8:: Newton's method
6613* Programming Answer 9:: Digamma function
6614* Programming Answer 10:: Unpacking a polynomial
6615* Programming Answer 11:: Recursive Stirling numbers
6616* Programming Answer 12:: Stirling numbers with rewrites
6617@end menu
6618
6619@c The following kludgery prevents the individual answers from
6620@c being entered on the table of contents.
6621@tex
6622\global\let\oldwrite=\write
6623\gdef\skipwrite#1#2{\let\write=\oldwrite}
6624\global\let\oldchapternofonts=\chapternofonts
6625\gdef\chapternofonts{\let\write=\skipwrite\oldchapternofonts}
6626@end tex
6627
6628@node RPN Answer 1, RPN Answer 2, Answers to Exercises, Answers to Exercises
6629@subsection RPN Tutorial Exercise 1
6630
6631@noindent
6632@kbd{1 @key{RET} 2 @key{RET} 3 @key{RET} 4 + * -}
6633
6634The result is @c{$1 - (2 \times (3 + 4)) = -13$}
6635@cite{1 - (2 * (3 + 4)) = -13}.
6636
6637@node RPN Answer 2, RPN Answer 3, RPN Answer 1, Answers to Exercises
6638@subsection RPN Tutorial Exercise 2
6639
6640@noindent
6641@c{$2\times4 + 7\times9.5 + {5\over4} = 75.75$}
6642@cite{2*4 + 7*9.5 + 5/4 = 75.75}
6643
6644After computing the intermediate term @c{$2\times4 = 8$}
6645@cite{2*4 = 8}, you can leave
6646that result on the stack while you compute the second term. With
6647both of these results waiting on the stack you can then compute the
6648final term, then press @kbd{+ +} to add everything up.
6649
d7b8e6c6 6650@smallexample
5d67986c 6651@group
d7b8e6c6
EZ
66522: 2 1: 8 3: 8 2: 8
66531: 4 . 2: 7 1: 66.5
6654 . 1: 9.5 .
6655 .
6656
5d67986c 6657 2 @key{RET} 4 * 7 @key{RET} 9.5 *
d7b8e6c6 6658
d7b8e6c6 6659@end group
5d67986c 6660@end smallexample
d7b8e6c6 6661@noindent
d7b8e6c6 6662@smallexample
5d67986c 6663@group
d7b8e6c6
EZ
66644: 8 3: 8 2: 8 1: 75.75
66653: 66.5 2: 66.5 1: 67.75 .
66662: 5 1: 1.25 .
66671: 4 .
6668 .
6669
5d67986c 6670 5 @key{RET} 4 / + +
d7b8e6c6 6671@end group
5d67986c 6672@end smallexample
d7b8e6c6
EZ
6673
6674Alternatively, you could add the first two terms before going on
6675with the third term.
6676
d7b8e6c6 6677@smallexample
5d67986c 6678@group
d7b8e6c6
EZ
66792: 8 1: 74.5 3: 74.5 2: 74.5 1: 75.75
66801: 66.5 . 2: 5 1: 1.25 .
6681 . 1: 4 .
6682 .
6683
5d67986c 6684 ... + 5 @key{RET} 4 / +
d7b8e6c6 6685@end group
5d67986c 6686@end smallexample
d7b8e6c6
EZ
6687
6688On an old-style RPN calculator this second method would have the
6689advantage of using only three stack levels. But since Calc's stack
6690can grow arbitrarily large this isn't really an issue. Which method
6691you choose is purely a matter of taste.
6692
6693@node RPN Answer 3, RPN Answer 4, RPN Answer 2, Answers to Exercises
6694@subsection RPN Tutorial Exercise 3
6695
6696@noindent
6697The @key{TAB} key provides a way to operate on the number in level 2.
6698
d7b8e6c6 6699@smallexample
5d67986c 6700@group
d7b8e6c6
EZ
67013: 10 3: 10 4: 10 3: 10 3: 10
67022: 20 2: 30 3: 30 2: 30 2: 21
67031: 30 1: 20 2: 20 1: 21 1: 30
6704 . . 1: 1 . .
6705 .
6706
5d67986c 6707 @key{TAB} 1 + @key{TAB}
d7b8e6c6 6708@end group
5d67986c 6709@end smallexample
d7b8e6c6 6710
5d67986c 6711Similarly, @kbd{M-@key{TAB}} gives you access to the number in level 3.
d7b8e6c6 6712
d7b8e6c6 6713@smallexample
5d67986c 6714@group
d7b8e6c6
EZ
67153: 10 3: 21 3: 21 3: 30 3: 11
67162: 21 2: 30 2: 30 2: 11 2: 21
67171: 30 1: 10 1: 11 1: 21 1: 30
6718 . . . . .
6719
5d67986c 6720 M-@key{TAB} 1 + M-@key{TAB} M-@key{TAB}
d7b8e6c6 6721@end group
5d67986c 6722@end smallexample
d7b8e6c6
EZ
6723
6724@node RPN Answer 4, Algebraic Answer 1, RPN Answer 3, Answers to Exercises
6725@subsection RPN Tutorial Exercise 4
6726
6727@noindent
6728Either @kbd{( 2 , 3 )} or @kbd{( 2 @key{SPC} 3 )} would have worked,
6729but using both the comma and the space at once yields:
6730
d7b8e6c6 6731@smallexample
5d67986c 6732@group
d7b8e6c6
EZ
67331: ( ... 2: ( ... 1: (2, ... 2: (2, ... 2: (2, ...
6734 . 1: 2 . 1: (2, ... 1: (2, 3)
6735 . . .
6736
5d67986c 6737 ( 2 , @key{SPC} 3 )
d7b8e6c6 6738@end group
5d67986c 6739@end smallexample
d7b8e6c6
EZ
6740
6741Joe probably tried to type @kbd{@key{TAB} @key{DEL}} to swap the
6742extra incomplete object to the top of the stack and delete it.
6743But a feature of Calc is that @key{DEL} on an incomplete object
6744deletes just one component out of that object, so he had to press
6745@key{DEL} twice to finish the job.
6746
d7b8e6c6 6747@smallexample
5d67986c 6748@group
d7b8e6c6
EZ
67492: (2, ... 2: (2, 3) 2: (2, 3) 1: (2, 3)
67501: (2, 3) 1: (2, ... 1: ( ... .
6751 . . .
6752
5d67986c 6753 @key{TAB} @key{DEL} @key{DEL}
d7b8e6c6 6754@end group
5d67986c 6755@end smallexample
d7b8e6c6
EZ
6756
6757(As it turns out, deleting the second-to-top stack entry happens often
5d67986c
RS
6758enough that Calc provides a special key, @kbd{M-@key{DEL}}, to do just that.
6759@kbd{M-@key{DEL}} is just like @kbd{@key{TAB} @key{DEL}}, except that it doesn't exhibit
d7b8e6c6
EZ
6760the ``feature'' that tripped poor Joe.)
6761
6762@node Algebraic Answer 1, Algebraic Answer 2, RPN Answer 4, Answers to Exercises
6763@subsection Algebraic Entry Tutorial Exercise 1
6764
6765@noindent
6766Type @kbd{' sqrt($) @key{RET}}.
6767
6768If the @kbd{Q} key is broken, you could use @kbd{' $^0.5 @key{RET}}.
6769Or, RPN style, @kbd{0.5 ^}.
6770
6771(Actually, @samp{$^1:2}, using the fraction one-half as the power, is
6772a closer equivalent, since @samp{9^0.5} yields @cite{3.0} whereas
6773@samp{sqrt(9)} and @samp{9^1:2} yield the exact integer @cite{3}.)
6774
6775@node Algebraic Answer 2, Algebraic Answer 3, Algebraic Answer 1, Answers to Exercises
6776@subsection Algebraic Entry Tutorial Exercise 2
6777
6778@noindent
6779In the formula @samp{2 x (1+y)}, @samp{x} was interpreted as a function
6780name with @samp{1+y} as its argument. Assigning a value to a variable
6781has no relation to a function by the same name. Joe needed to use an
6782explicit @samp{*} symbol here: @samp{2 x*(1+y)}.
6783
6784@node Algebraic Answer 3, Modes Answer 1, Algebraic Answer 2, Answers to Exercises
6785@subsection Algebraic Entry Tutorial Exercise 3
6786
6787@noindent
6788The result from @kbd{1 @key{RET} 0 /} will be the formula @cite{1 / 0}.
6789The ``function'' @samp{/} cannot be evaluated when its second argument
6790is zero, so it is left in symbolic form. When you now type @kbd{0 *},
6791the result will be zero because Calc uses the general rule that ``zero
6792times anything is zero.''
6793
6794@c [fix-ref Infinities]
6795The @kbd{m i} command enables an @dfn{infinite mode} in which @cite{1 / 0}
6796results in a special symbol that represents ``infinity.'' If you
6797multiply infinity by zero, Calc uses another special new symbol to
6798show that the answer is ``indeterminate.'' @xref{Infinities}, for
6799further discussion of infinite and indeterminate values.
6800
6801@node Modes Answer 1, Modes Answer 2, Algebraic Answer 3, Answers to Exercises
6802@subsection Modes Tutorial Exercise 1
6803
6804@noindent
6805Calc always stores its numbers in decimal, so even though one-third has
6806an exact base-3 representation (@samp{3#0.1}), it is still stored as
68070.3333333 (chopped off after 12 or however many decimal digits) inside
6808the calculator's memory. When this inexact number is converted back
6809to base 3 for display, it may still be slightly inexact. When we
6810multiply this number by 3, we get 0.999999, also an inexact value.
6811
6812When Calc displays a number in base 3, it has to decide how many digits
6813to show. If the current precision is 12 (decimal) digits, that corresponds
6814to @samp{12 / log10(3) = 25.15} base-3 digits. Because 25.15 is not an
6815exact integer, Calc shows only 25 digits, with the result that stored
6816numbers carry a little bit of extra information that may not show up on
6817the screen. When Joe entered @samp{3#0.2}, the stored number 0.666666
6818happened to round to a pleasing value when it lost that last 0.15 of a
6819digit, but it was still inexact in Calc's memory. When he divided by 2,
6820he still got the dreaded inexact value 0.333333. (Actually, he divided
68210.666667 by 2 to get 0.333334, which is why he got something a little
6822higher than @code{3#0.1} instead of a little lower.)
6823
6824If Joe didn't want to be bothered with all this, he could have typed
6825@kbd{M-24 d n} to display with one less digit than the default. (If
6826you give @kbd{d n} a negative argument, it uses default-minus-that,
6827so @kbd{M-- d n} would be an easier way to get the same effect.) Those
6828inexact results would still be lurking there, but they would now be
6829rounded to nice, natural-looking values for display purposes. (Remember,
6830@samp{0.022222} in base 3 is like @samp{0.099999} in base 10; rounding
6831off one digit will round the number up to @samp{0.1}.) Depending on the
6832nature of your work, this hiding of the inexactness may be a benefit or
6833a danger. With the @kbd{d n} command, Calc gives you the choice.
6834
6835Incidentally, another consequence of all this is that if you type
6836@kbd{M-30 d n} to display more digits than are ``really there,''
6837you'll see garbage digits at the end of the number. (In decimal
6838display mode, with decimally-stored numbers, these garbage digits are
6839always zero so they vanish and you don't notice them.) Because Calc
6840rounds off that 0.15 digit, there is the danger that two numbers could
6841be slightly different internally but still look the same. If you feel
6842uneasy about this, set the @kbd{d n} precision to be a little higher
6843than normal; you'll get ugly garbage digits, but you'll always be able
6844to tell two distinct numbers apart.
6845
6846An interesting side note is that most computers store their
6847floating-point numbers in binary, and convert to decimal for display.
6848Thus everyday programs have the same problem: Decimal 0.1 cannot be
6849represented exactly in binary (try it: @kbd{0.1 d 2}), so @samp{0.1 * 10}
6850comes out as an inexact approximation to 1 on some machines (though
6851they generally arrange to hide it from you by rounding off one digit as
6852we did above). Because Calc works in decimal instead of binary, you can
6853be sure that numbers that look exact @emph{are} exact as long as you stay
6854in decimal display mode.
6855
6856It's not hard to show that any number that can be represented exactly
6857in binary, octal, or hexadecimal is also exact in decimal, so the kinds
6858of problems we saw in this exercise are likely to be severe only when
6859you use a relatively unusual radix like 3.
6860
6861@node Modes Answer 2, Modes Answer 3, Modes Answer 1, Answers to Exercises
6862@subsection Modes Tutorial Exercise 2
6863
6864If the radix is 15 or higher, we can't use the letter @samp{e} to mark
6865the exponent because @samp{e} is interpreted as a digit. When Calc
6866needs to display scientific notation in a high radix, it writes
6867@samp{16#F.E8F*16.^15}. You can enter a number like this as an
6868algebraic entry. Also, pressing @kbd{e} without any digits before it
6869normally types @kbd{1e}, but in a high radix it types @kbd{16.^} and
5d67986c 6870puts you in algebraic entry: @kbd{16#f.e8f @key{RET} e 15 @key{RET} *} is another
d7b8e6c6
EZ
6871way to enter this number.
6872
6873The reason Calc puts a decimal point in the @samp{16.^} is to prevent
6874huge integers from being generated if the exponent is large (consider
6875@samp{16#1.23*16^1000}, where we compute @samp{16^1000} as a giant
6876exact integer and then throw away most of the digits when we multiply
6877it by the floating-point @samp{16#1.23}). While this wouldn't normally
6878matter for display purposes, it could give you a nasty surprise if you
6879copied that number into a file and later moved it back into Calc.
6880
6881@node Modes Answer 3, Modes Answer 4, Modes Answer 2, Answers to Exercises
6882@subsection Modes Tutorial Exercise 3
6883
6884@noindent
6885The answer he got was @cite{0.5000000000006399}.
6886
6887The problem is not that the square operation is inexact, but that the
6888sine of 45 that was already on the stack was accurate to only 12 places.
6889Arbitrary-precision calculations still only give answers as good as
6890their inputs.
6891
6892The real problem is that there is no 12-digit number which, when
6893squared, comes out to 0.5 exactly. The @kbd{f [} and @kbd{f ]}
6894commands decrease or increase a number by one unit in the last
6895place (according to the current precision). They are useful for
6896determining facts like this.
6897
d7b8e6c6 6898@smallexample
5d67986c 6899@group
d7b8e6c6
EZ
69001: 0.707106781187 1: 0.500000000001
6901 . .
6902
6903 45 S 2 ^
6904
d7b8e6c6 6905@end group
5d67986c 6906@end smallexample
d7b8e6c6 6907@noindent
d7b8e6c6 6908@smallexample
5d67986c 6909@group
d7b8e6c6
EZ
69101: 0.707106781187 1: 0.707106781186 1: 0.499999999999
6911 . . .
6912
5d67986c 6913 U @key{DEL} f [ 2 ^
d7b8e6c6 6914@end group
5d67986c 6915@end smallexample
d7b8e6c6
EZ
6916
6917A high-precision calculation must be carried out in high precision
6918all the way. The only number in the original problem which was known
6919exactly was the quantity 45 degrees, so the precision must be raised
6920before anything is done after the number 45 has been entered in order
6921for the higher precision to be meaningful.
6922
6923@node Modes Answer 4, Arithmetic Answer 1, Modes Answer 3, Answers to Exercises
6924@subsection Modes Tutorial Exercise 4
6925
6926@noindent
6927Many calculations involve real-world quantities, like the width and
6928height of a piece of wood or the volume of a jar. Such quantities
6929can't be measured exactly anyway, and if the data that is input to
6930a calculation is inexact, doing exact arithmetic on it is a waste
6931of time.
6932
6933Fractions become unwieldy after too many calculations have been
6934done with them. For example, the sum of the reciprocals of the
6935integers from 1 to 10 is 7381:2520. The sum from 1 to 30 is
69369304682830147:2329089562800. After a point it will take a long
6937time to add even one more term to this sum, but a floating-point
6938calculation of the sum will not have this problem.
6939
6940Also, rational numbers cannot express the results of all calculations.
6941There is no fractional form for the square root of two, so if you type
6942@w{@kbd{2 Q}}, Calc has no choice but to give you a floating-point answer.
6943
6944@node Arithmetic Answer 1, Arithmetic Answer 2, Modes Answer 4, Answers to Exercises
6945@subsection Arithmetic Tutorial Exercise 1
6946
6947@noindent
6948Dividing two integers that are larger than the current precision may
6949give a floating-point result that is inaccurate even when rounded
6950down to an integer. Consider @cite{123456789 / 2} when the current
6951precision is 6 digits. The true answer is @cite{61728394.5}, but
6952with a precision of 6 this will be rounded to @c{$12345700.0/2.0 = 61728500.0$}
6953@cite{12345700.@: / 2.@: = 61728500.}.
6954The result, when converted to an integer, will be off by 106.
6955
6956Here are two solutions: Raise the precision enough that the
6957floating-point round-off error is strictly to the right of the
6958decimal point. Or, convert to fraction mode so that @cite{123456789 / 2}
6959produces the exact fraction @cite{123456789:2}, which can be rounded
6960down by the @kbd{F} command without ever switching to floating-point
6961format.
6962
6963@node Arithmetic Answer 2, Vector Answer 1, Arithmetic Answer 1, Answers to Exercises
6964@subsection Arithmetic Tutorial Exercise 2
6965
6966@noindent
6967@kbd{27 @key{RET} 9 B} could give the exact result @cite{3:2}, but it
6968does a floating-point calculation instead and produces @cite{1.5}.
6969
6970Calc will find an exact result for a logarithm if the result is an integer
6971or the reciprocal of an integer. But there is no efficient way to search
6972the space of all possible rational numbers for an exact answer, so Calc
6973doesn't try.
6974
6975@node Vector Answer 1, Vector Answer 2, Arithmetic Answer 2, Answers to Exercises
6976@subsection Vector Tutorial Exercise 1
6977
6978@noindent
6979Duplicate the vector, compute its length, then divide the vector
6980by its length: @kbd{@key{RET} A /}.
6981
d7b8e6c6 6982@smallexample
5d67986c 6983@group
d7b8e6c6
EZ
69841: [1, 2, 3] 2: [1, 2, 3] 1: [0.27, 0.53, 0.80] 1: 1.
6985 . 1: 3.74165738677 . .
6986 .
6987
5d67986c 6988 r 1 @key{RET} A / A
d7b8e6c6 6989@end group
5d67986c 6990@end smallexample
d7b8e6c6
EZ
6991
6992The final @kbd{A} command shows that the normalized vector does
6993indeed have unit length.
6994
6995@node Vector Answer 2, Matrix Answer 1, Vector Answer 1, Answers to Exercises
6996@subsection Vector Tutorial Exercise 2
6997
6998@noindent
6999The average position is equal to the sum of the products of the
7000positions times their corresponding probabilities. This is the
7001definition of the dot product operation. So all you need to do
7002is to put the two vectors on the stack and press @kbd{*}.
7003
7004@node Matrix Answer 1, Matrix Answer 2, Vector Answer 2, Answers to Exercises
7005@subsection Matrix Tutorial Exercise 1
7006
7007@noindent
7008The trick is to multiply by a vector of ones. Use @kbd{r 4 [1 1 1] *} to
7009get the row sum. Similarly, use @kbd{[1 1] r 4 *} to get the column sum.
7010
7011@node Matrix Answer 2, Matrix Answer 3, Matrix Answer 1, Answers to Exercises
7012@subsection Matrix Tutorial Exercise 2
7013
7014@ifinfo
d7b8e6c6 7015@example
5d67986c 7016@group
d7b8e6c6
EZ
7017 x + a y = 6
7018 x + b y = 10
d7b8e6c6 7019@end group
5d67986c 7020@end example
d7b8e6c6
EZ
7021@end ifinfo
7022@tex
7023\turnoffactive
7024\beforedisplay
7025$$ \eqalign{ x &+ a y = 6 \cr
7026 x &+ b y = 10}
7027$$
7028\afterdisplay
7029@end tex
7030
7031Just enter the righthand side vector, then divide by the lefthand side
7032matrix as usual.
7033
d7b8e6c6 7034@smallexample
5d67986c 7035@group
d7b8e6c6
EZ
70361: [6, 10] 2: [6, 10] 1: [6 - 4 a / (b - a), 4 / (b - a) ]
7037 . 1: [ [ 1, a ] .
7038 [ 1, b ] ]
7039 .
7040
5d67986c 7041' [6 10] @key{RET} ' [1 a; 1 b] @key{RET} /
d7b8e6c6 7042@end group
5d67986c 7043@end smallexample
d7b8e6c6
EZ
7044
7045This can be made more readable using @kbd{d B} to enable ``big'' display
7046mode:
7047
d7b8e6c6 7048@smallexample
5d67986c 7049@group
d7b8e6c6
EZ
7050 4 a 4
70511: [6 - -----, -----]
7052 b - a b - a
d7b8e6c6 7053@end group
5d67986c 7054@end smallexample
d7b8e6c6
EZ
7055
7056Type @kbd{d N} to return to ``normal'' display mode afterwards.
7057
7058@node Matrix Answer 3, List Answer 1, Matrix Answer 2, Answers to Exercises
7059@subsection Matrix Tutorial Exercise 3
7060
7061@noindent
7062To solve @c{$A^T A \, X = A^T B$}
7063@cite{trn(A) * A * X = trn(A) * B}, first we compute
7064@c{$A' = A^T A$}
7065@cite{A2 = trn(A) * A} and @c{$B' = A^T B$}
7066@cite{B2 = trn(A) * B}; now, we have a
7067system @c{$A' X = B'$}
7068@cite{A2 * X = B2} which we can solve using Calc's @samp{/}
7069command.
7070
7071@ifinfo
d7b8e6c6 7072@example
5d67986c 7073@group
d7b8e6c6
EZ
7074 a + 2b + 3c = 6
7075 4a + 5b + 6c = 2
7076 7a + 6b = 3
7077 2a + 4b + 6c = 11
d7b8e6c6 7078@end group
5d67986c 7079@end example
d7b8e6c6
EZ
7080@end ifinfo
7081@tex
7082\turnoffactive
7083\beforedisplayh
7084$$ \openup1\jot \tabskip=0pt plus1fil
7085\halign to\displaywidth{\tabskip=0pt
7086 $\hfil#$&$\hfil{}#{}$&
7087 $\hfil#$&$\hfil{}#{}$&
7088 $\hfil#$&${}#\hfil$\tabskip=0pt plus1fil\cr
7089 a&+&2b&+&3c&=6 \cr
7090 4a&+&5b&+&6c&=2 \cr
7091 7a&+&6b& & &=3 \cr
7092 2a&+&4b&+&6c&=11 \cr}
7093$$
7094\afterdisplayh
7095@end tex
7096
7097The first step is to enter the coefficient matrix. We'll store it in
7098quick variable number 7 for later reference. Next, we compute the
7099@c{$B'$}
7100@cite{B2} vector.
7101
d7b8e6c6 7102@smallexample
5d67986c 7103@group
d7b8e6c6
EZ
71041: [ [ 1, 2, 3 ] 2: [ [ 1, 4, 7, 2 ] 1: [57, 84, 96]
7105 [ 4, 5, 6 ] [ 2, 5, 6, 4 ] .
7106 [ 7, 6, 0 ] [ 3, 6, 0, 6 ] ]
7107 [ 2, 4, 6 ] ] 1: [6, 2, 3, 11]
7108 . .
7109
5d67986c 7110' [1 2 3; 4 5 6; 7 6 0; 2 4 6] @key{RET} s 7 v t [6 2 3 11] *
d7b8e6c6 7111@end group
5d67986c 7112@end smallexample
d7b8e6c6
EZ
7113
7114@noindent
7115Now we compute the matrix @c{$A'$}
7116@cite{A2} and divide.
7117
d7b8e6c6 7118@smallexample
5d67986c 7119@group
d7b8e6c6
EZ
71202: [57, 84, 96] 1: [-11.64, 14.08, -3.64]
71211: [ [ 70, 72, 39 ] .
7122 [ 72, 81, 60 ]
7123 [ 39, 60, 81 ] ]
7124 .
7125
7126 r 7 v t r 7 * /
d7b8e6c6 7127@end group
5d67986c 7128@end smallexample
d7b8e6c6
EZ
7129
7130@noindent
7131(The actual computed answer will be slightly inexact due to
7132round-off error.)
7133
7134Notice that the answers are similar to those for the @c{$3\times3$}
7135@asis{3x3} system
7136solved in the text. That's because the fourth equation that was
7137added to the system is almost identical to the first one multiplied
7138by two. (If it were identical, we would have gotten the exact same
7139answer since the @c{$4\times3$}
7140@asis{4x3} system would be equivalent to the original @c{$3\times3$}
7141@asis{3x3}
7142system.)
7143
7144Since the first and fourth equations aren't quite equivalent, they
7145can't both be satisfied at once. Let's plug our answers back into
7146the original system of equations to see how well they match.
7147
d7b8e6c6 7148@smallexample
5d67986c 7149@group
d7b8e6c6
EZ
71502: [-11.64, 14.08, -3.64] 1: [5.6, 2., 3., 11.2]
71511: [ [ 1, 2, 3 ] .
7152 [ 4, 5, 6 ]
7153 [ 7, 6, 0 ]
7154 [ 2, 4, 6 ] ]
7155 .
7156
5d67986c 7157 r 7 @key{TAB} *
d7b8e6c6 7158@end group
5d67986c 7159@end smallexample
d7b8e6c6
EZ
7160
7161@noindent
7162This is reasonably close to our original @cite{B} vector,
7163@cite{[6, 2, 3, 11]}.
7164
7165@node List Answer 1, List Answer 2, Matrix Answer 3, Answers to Exercises
7166@subsection List Tutorial Exercise 1
7167
7168@noindent
7169We can use @kbd{v x} to build a vector of integers. This needs to be
7170adjusted to get the range of integers we desire. Mapping @samp{-}
7171across the vector will accomplish this, although it turns out the
7172plain @samp{-} key will work just as well.
7173
d7b8e6c6 7174@smallexample
5d67986c 7175@group
d7b8e6c6
EZ
71762: 2 2: 2
71771: [1, 2, 3, 4, 5, 6, 7, 8, 9] 1: [-4, -3, -2, -1, 0, 1, 2, 3, 4]
7178 . .
7179
5d67986c 7180 2 v x 9 @key{RET} 5 V M - or 5 -
d7b8e6c6 7181@end group
5d67986c 7182@end smallexample
d7b8e6c6
EZ
7183
7184@noindent
7185Now we use @kbd{V M ^} to map the exponentiation operator across the
7186vector.
7187
d7b8e6c6 7188@smallexample
5d67986c 7189@group
d7b8e6c6
EZ
71901: [0.0625, 0.125, 0.25, 0.5, 1, 2, 4, 8, 16]
7191 .
7192
7193 V M ^
d7b8e6c6 7194@end group
5d67986c 7195@end smallexample
d7b8e6c6
EZ
7196
7197@node List Answer 2, List Answer 3, List Answer 1, Answers to Exercises
7198@subsection List Tutorial Exercise 2
7199
7200@noindent
7201Given @cite{x} and @cite{y} vectors in quick variables 1 and 2 as before,
7202the first job is to form the matrix that describes the problem.
7203
7204@ifinfo
7205@example
7206 m*x + b*1 = y
7207@end example
7208@end ifinfo
7209@tex
7210\turnoffactive
7211\beforedisplay
7212$$ m \times x + b \times 1 = y $$
7213\afterdisplay
7214@end tex
7215
7216Thus we want a @c{$19\times2$}
7217@asis{19x2} matrix with our @cite{x} vector as one column and
7218ones as the other column. So, first we build the column of ones, then
7219we combine the two columns to form our @cite{A} matrix.
7220
d7b8e6c6 7221@smallexample
5d67986c 7222@group
d7b8e6c6
EZ
72232: [1.34, 1.41, 1.49, ... ] 1: [ [ 1.34, 1 ]
72241: [1, 1, 1, ...] [ 1.41, 1 ]
7225 . [ 1.49, 1 ]
7226 @dots{}
7227
5d67986c 7228 r 1 1 v b 19 @key{RET} M-2 v p v t s 3
d7b8e6c6 7229@end group
5d67986c 7230@end smallexample
d7b8e6c6
EZ
7231
7232@noindent
7233Now we compute @c{$A^T y$}
7234@cite{trn(A) * y} and @c{$A^T A$}
7235@cite{trn(A) * A} and divide.
7236
d7b8e6c6 7237@smallexample
5d67986c 7238@group
d7b8e6c6
EZ
72391: [33.36554, 13.613] 2: [33.36554, 13.613]
7240 . 1: [ [ 98.0003, 41.63 ]
7241 [ 41.63, 19 ] ]
7242 .
7243
7244 v t r 2 * r 3 v t r 3 *
d7b8e6c6 7245@end group
5d67986c 7246@end smallexample
d7b8e6c6
EZ
7247
7248@noindent
7249(Hey, those numbers look familiar!)
7250
d7b8e6c6 7251@smallexample
5d67986c 7252@group
d7b8e6c6
EZ
72531: [0.52141679, -0.425978]
7254 .
7255
7256 /
d7b8e6c6 7257@end group
5d67986c 7258@end smallexample
d7b8e6c6
EZ
7259
7260Since we were solving equations of the form @c{$m \times x + b \times 1 = y$}
7261@cite{m*x + b*1 = y}, these
7262numbers should be @cite{m} and @cite{b}, respectively. Sure enough, they
7263agree exactly with the result computed using @kbd{V M} and @kbd{V R}!
7264
7265The moral of this story: @kbd{V M} and @kbd{V R} will probably solve
7266your problem, but there is often an easier way using the higher-level
7267arithmetic functions!
7268
7269@c [fix-ref Curve Fitting]
7270In fact, there is a built-in @kbd{a F} command that does least-squares
7271fits. @xref{Curve Fitting}.
7272
7273@node List Answer 3, List Answer 4, List Answer 2, Answers to Exercises
7274@subsection List Tutorial Exercise 3
7275
7276@noindent
5d67986c 7277Move to one end of the list and press @kbd{C-@@} (or @kbd{C-@key{SPC}} or
d7b8e6c6
EZ
7278whatever) to set the mark, then move to the other end of the list
7279and type @w{@kbd{M-# g}}.
7280
d7b8e6c6 7281@smallexample
5d67986c 7282@group
d7b8e6c6
EZ
72831: [2.3, 6, 22, 15.1, 7, 15, 14, 7.5, 2.5]
7284 .
d7b8e6c6 7285@end group
5d67986c 7286@end smallexample
d7b8e6c6
EZ
7287
7288To make things interesting, let's assume we don't know at a glance
7289how many numbers are in this list. Then we could type:
7290
d7b8e6c6 7291@smallexample
5d67986c 7292@group
d7b8e6c6
EZ
72932: [2.3, 6, 22, ... ] 2: [2.3, 6, 22, ... ]
72941: [2.3, 6, 22, ... ] 1: 126356422.5
7295 . .
7296
5d67986c 7297 @key{RET} V R *
d7b8e6c6 7298
d7b8e6c6 7299@end group
5d67986c 7300@end smallexample
d7b8e6c6 7301@noindent
d7b8e6c6 7302@smallexample
5d67986c 7303@group
d7b8e6c6
EZ
73042: 126356422.5 2: 126356422.5 1: 7.94652913734
73051: [2.3, 6, 22, ... ] 1: 9 .
7306 . .
7307
5d67986c 7308 @key{TAB} v l I ^
d7b8e6c6 7309@end group
5d67986c 7310@end smallexample
d7b8e6c6
EZ
7311
7312@noindent
7313(The @kbd{I ^} command computes the @var{n}th root of a number.
7314You could also type @kbd{& ^} to take the reciprocal of 9 and
7315then raise the number to that power.)
7316
7317@node List Answer 4, List Answer 5, List Answer 3, Answers to Exercises
7318@subsection List Tutorial Exercise 4
7319
7320@noindent
7321A number @cite{j} is a divisor of @cite{n} if @c{$n \mathbin{\hbox{\code{\%}}} j = 0$}
7322@samp{n % j = 0}. The first
7323step is to get a vector that identifies the divisors.
7324
d7b8e6c6 7325@smallexample
5d67986c 7326@group
d7b8e6c6
EZ
73272: 30 2: [0, 0, 0, 2, ...] 1: [1, 1, 1, 0, ...]
73281: [1, 2, 3, 4, ...] 1: 0 .
7329 . .
7330
5d67986c 7331 30 @key{RET} v x 30 @key{RET} s 1 V M % 0 V M a = s 2
d7b8e6c6 7332@end group
5d67986c 7333@end smallexample
d7b8e6c6
EZ
7334
7335@noindent
7336This vector has 1's marking divisors of 30 and 0's marking non-divisors.
7337
7338The zeroth divisor function is just the total number of divisors.
7339The first divisor function is the sum of the divisors.
7340
d7b8e6c6 7341@smallexample
5d67986c 7342@group
d7b8e6c6
EZ
73431: 8 3: 8 2: 8 2: 8
7344 2: [1, 2, 3, 4, ...] 1: [1, 2, 3, 0, ...] 1: 72
7345 1: [1, 1, 1, 0, ...] . .
7346 .
7347
7348 V R + r 1 r 2 V M * V R +
d7b8e6c6 7349@end group
5d67986c 7350@end smallexample
d7b8e6c6
EZ
7351
7352@noindent
7353Once again, the last two steps just compute a dot product for which
7354a simple @kbd{*} would have worked equally well.
7355
7356@node List Answer 5, List Answer 6, List Answer 4, Answers to Exercises
7357@subsection List Tutorial Exercise 5
7358
7359@noindent
7360The obvious first step is to obtain the list of factors with @kbd{k f}.
7361This list will always be in sorted order, so if there are duplicates
7362they will be right next to each other. A suitable method is to compare
7363the list with a copy of itself shifted over by one.
7364
d7b8e6c6 7365@smallexample
5d67986c 7366@group
d7b8e6c6
EZ
73671: [3, 7, 7, 7, 19] 2: [3, 7, 7, 7, 19] 2: [3, 7, 7, 7, 19, 0]
7368 . 1: [3, 7, 7, 7, 19, 0] 1: [0, 3, 7, 7, 7, 19]
7369 . .
7370
5d67986c 7371 19551 k f @key{RET} 0 | @key{TAB} 0 @key{TAB} |
d7b8e6c6 7372
d7b8e6c6 7373@end group
5d67986c 7374@end smallexample
d7b8e6c6 7375@noindent
d7b8e6c6 7376@smallexample
5d67986c 7377@group
d7b8e6c6
EZ
73781: [0, 0, 1, 1, 0, 0] 1: 2 1: 0
7379 . . .
7380
7381 V M a = V R + 0 a =
d7b8e6c6 7382@end group
5d67986c 7383@end smallexample
d7b8e6c6
EZ
7384
7385@noindent
7386Note that we have to arrange for both vectors to have the same length
7387so that the mapping operation works; no prime factor will ever be
7388zero, so adding zeros on the left and right is safe. From then on
7389the job is pretty straightforward.
7390
7391Incidentally, Calc provides the @c{\dfn{M\"obius} $\mu$}
7392@dfn{Moebius mu} function which is
7393zero if and only if its argument is square-free. It would be a much
7394more convenient way to do the above test in practice.
7395
7396@node List Answer 6, List Answer 7, List Answer 5, Answers to Exercises
7397@subsection List Tutorial Exercise 6
7398
7399@noindent
5d67986c 7400First use @kbd{v x 6 @key{RET}} to get a list of integers, then @kbd{V M v x}
d7b8e6c6
EZ
7401to get a list of lists of integers!
7402
7403@node List Answer 7, List Answer 8, List Answer 6, Answers to Exercises
7404@subsection List Tutorial Exercise 7
7405
7406@noindent
7407Here's one solution. First, compute the triangular list from the previous
7408exercise and type @kbd{1 -} to subtract one from all the elements.
7409
d7b8e6c6 7410@smallexample
5d67986c 7411@group
d7b8e6c6
EZ
74121: [ [0],
7413 [0, 1],
7414 [0, 1, 2],
7415 @dots{}
7416
7417 1 -
d7b8e6c6 7418@end group
5d67986c 7419@end smallexample
d7b8e6c6
EZ
7420
7421The numbers down the lefthand edge of the list we desire are called
7422the ``triangular numbers'' (now you know why!). The @cite{n}th
7423triangular number is the sum of the integers from 1 to @cite{n}, and
7424can be computed directly by the formula @c{$n (n+1) \over 2$}
7425@cite{n * (n+1) / 2}.
7426
d7b8e6c6 7427@smallexample
5d67986c 7428@group
d7b8e6c6
EZ
74292: [ [0], [0, 1], ... ] 2: [ [0], [0, 1], ... ]
74301: [0, 1, 2, 3, 4, 5] 1: [0, 1, 3, 6, 10, 15]
7431 . .
7432
5d67986c 7433 v x 6 @key{RET} 1 - V M ' $ ($+1)/2 @key{RET}
d7b8e6c6 7434@end group
5d67986c 7435@end smallexample
d7b8e6c6
EZ
7436
7437@noindent
7438Adding this list to the above list of lists produces the desired
7439result:
7440
d7b8e6c6 7441@smallexample
5d67986c 7442@group
d7b8e6c6
EZ
74431: [ [0],
7444 [1, 2],
7445 [3, 4, 5],
7446 [6, 7, 8, 9],
7447 [10, 11, 12, 13, 14],
7448 [15, 16, 17, 18, 19, 20] ]
7449 .
7450
7451 V M +
d7b8e6c6 7452@end group
5d67986c 7453@end smallexample
d7b8e6c6
EZ
7454
7455If we did not know the formula for triangular numbers, we could have
7456computed them using a @kbd{V U +} command. We could also have
7457gotten them the hard way by mapping a reduction across the original
7458triangular list.
7459
d7b8e6c6 7460@smallexample
5d67986c 7461@group
d7b8e6c6
EZ
74622: [ [0], [0, 1], ... ] 2: [ [0], [0, 1], ... ]
74631: [ [0], [0, 1], ... ] 1: [0, 1, 3, 6, 10, 15]
7464 . .
7465
5d67986c 7466 @key{RET} V M V R +
d7b8e6c6 7467@end group
5d67986c 7468@end smallexample
d7b8e6c6
EZ
7469
7470@noindent
7471(This means ``map a @kbd{V R +} command across the vector,'' and
7472since each element of the main vector is itself a small vector,
7473@kbd{V R +} computes the sum of its elements.)
7474
7475@node List Answer 8, List Answer 9, List Answer 7, Answers to Exercises
7476@subsection List Tutorial Exercise 8
7477
7478@noindent
7479The first step is to build a list of values of @cite{x}.
7480
d7b8e6c6 7481@smallexample
5d67986c 7482@group
d7b8e6c6
EZ
74831: [1, 2, 3, ..., 21] 1: [0, 1, 2, ..., 20] 1: [0, 0.25, 0.5, ..., 5]
7484 . . .
7485
5d67986c 7486 v x 21 @key{RET} 1 - 4 / s 1
d7b8e6c6 7487@end group
5d67986c 7488@end smallexample
d7b8e6c6
EZ
7489
7490Next, we compute the Bessel function values.
7491
d7b8e6c6 7492@smallexample
5d67986c 7493@group
d7b8e6c6
EZ
74941: [0., 0.124, 0.242, ..., -0.328]
7495 .
7496
5d67986c 7497 V M ' besJ(1,$) @key{RET}
d7b8e6c6 7498@end group
5d67986c 7499@end smallexample
d7b8e6c6
EZ
7500
7501@noindent
5d67986c 7502(Another way to do this would be @kbd{1 @key{TAB} V M f j}.)
d7b8e6c6
EZ
7503
7504A way to isolate the maximum value is to compute the maximum using
7505@kbd{V R X}, then compare all the Bessel values with that maximum.
7506
d7b8e6c6 7507@smallexample
5d67986c 7508@group
d7b8e6c6
EZ
75092: [0., 0.124, 0.242, ... ] 1: [0, 0, 0, ... ] 2: [0, 0, 0, ... ]
75101: 0.5801562 . 1: 1
7511 . .
7512
5d67986c 7513 @key{RET} V R X V M a = @key{RET} V R + @key{DEL}
d7b8e6c6 7514@end group
5d67986c 7515@end smallexample
d7b8e6c6
EZ
7516
7517@noindent
7518It's a good idea to verify, as in the last step above, that only
7519one value is equal to the maximum. (After all, a plot of @c{$\sin x$}
7520@cite{sin(x)}
7521might have many points all equal to the maximum value, 1.)
7522
7523The vector we have now has a single 1 in the position that indicates
7524the maximum value of @cite{x}. Now it is a simple matter to convert
7525this back into the corresponding value itself.
7526
d7b8e6c6 7527@smallexample
5d67986c 7528@group
d7b8e6c6
EZ
75292: [0, 0, 0, ... ] 1: [0, 0., 0., ... ] 1: 1.75
75301: [0, 0.25, 0.5, ... ] . .
7531 .
7532
7533 r 1 V M * V R +
d7b8e6c6 7534@end group
5d67986c 7535@end smallexample
d7b8e6c6
EZ
7536
7537If @kbd{a =} had produced more than one @cite{1} value, this method
7538would have given the sum of all maximum @cite{x} values; not very
7539useful! In this case we could have used @kbd{v m} (@code{calc-mask-vector})
7540instead. This command deletes all elements of a ``data'' vector that
7541correspond to zeros in a ``mask'' vector, leaving us with, in this
7542example, a vector of maximum @cite{x} values.
7543
7544The built-in @kbd{a X} command maximizes a function using more
7545efficient methods. Just for illustration, let's use @kbd{a X}
7546to maximize @samp{besJ(1,x)} over this same interval.
7547
d7b8e6c6 7548@smallexample
5d67986c 7549@group
d7b8e6c6
EZ
75502: besJ(1, x) 1: [1.84115, 0.581865]
75511: [0 .. 5] .
7552 .
7553
5d67986c 7554' besJ(1,x), [0..5] @key{RET} a X x @key{RET}
d7b8e6c6 7555@end group
5d67986c 7556@end smallexample
d7b8e6c6
EZ
7557
7558@noindent
7559The output from @kbd{a X} is a vector containing the value of @cite{x}
7560that maximizes the function, and the function's value at that maximum.
7561As you can see, our simple search got quite close to the right answer.
7562
7563@node List Answer 9, List Answer 10, List Answer 8, Answers to Exercises
7564@subsection List Tutorial Exercise 9
7565
7566@noindent
7567Step one is to convert our integer into vector notation.
7568
d7b8e6c6 7569@smallexample
5d67986c 7570@group
d7b8e6c6
EZ
75711: 25129925999 3: 25129925999
7572 . 2: 10
7573 1: [11, 10, 9, ..., 1, 0]
7574 .
7575
5d67986c 7576 25129925999 @key{RET} 10 @key{RET} 12 @key{RET} v x 12 @key{RET} -
d7b8e6c6 7577
d7b8e6c6 7578@end group
5d67986c 7579@end smallexample
d7b8e6c6 7580@noindent
d7b8e6c6 7581@smallexample
5d67986c 7582@group
d7b8e6c6
EZ
75831: 25129925999 1: [0, 2, 25, 251, 2512, ... ]
75842: [100000000000, ... ] .
7585 .
7586
7587 V M ^ s 1 V M \
d7b8e6c6 7588@end group
5d67986c 7589@end smallexample
d7b8e6c6
EZ
7590
7591@noindent
7592(Recall, the @kbd{\} command computes an integer quotient.)
7593
d7b8e6c6 7594@smallexample
5d67986c 7595@group
d7b8e6c6
EZ
75961: [0, 2, 5, 1, 2, 9, 9, 2, 5, 9, 9, 9]
7597 .
7598
7599 10 V M % s 2
d7b8e6c6 7600@end group
5d67986c 7601@end smallexample
d7b8e6c6
EZ
7602
7603Next we must increment this number. This involves adding one to
7604the last digit, plus handling carries. There is a carry to the
7605left out of a digit if that digit is a nine and all the digits to
7606the right of it are nines.
7607
d7b8e6c6 7608@smallexample
5d67986c 7609@group
d7b8e6c6
EZ
76101: [0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1] 1: [1, 1, 1, 0, 0, 1, ... ]
7611 . .
7612
7613 9 V M a = v v
7614
d7b8e6c6 7615@end group
5d67986c 7616@end smallexample
d7b8e6c6 7617@noindent
d7b8e6c6 7618@smallexample
5d67986c 7619@group
d7b8e6c6
EZ
76201: [1, 1, 1, 0, 0, 0, ... ] 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
7621 . .
7622
7623 V U * v v 1 |
d7b8e6c6 7624@end group
5d67986c 7625@end smallexample
d7b8e6c6
EZ
7626
7627@noindent
7628Accumulating @kbd{*} across a vector of ones and zeros will preserve
7629only the initial run of ones. These are the carries into all digits
7630except the rightmost digit. Concatenating a one on the right takes
7631care of aligning the carries properly, and also adding one to the
7632rightmost digit.
7633
d7b8e6c6 7634@smallexample
5d67986c 7635@group
d7b8e6c6
EZ
76362: [0, 0, 0, 0, ... ] 1: [0, 0, 2, 5, 1, 2, 9, 9, 2, 6, 0, 0, 0]
76371: [0, 0, 2, 5, ... ] .
7638 .
7639
7640 0 r 2 | V M + 10 V M %
d7b8e6c6 7641@end group
5d67986c 7642@end smallexample
d7b8e6c6
EZ
7643
7644@noindent
7645Here we have concatenated 0 to the @emph{left} of the original number;
7646this takes care of shifting the carries by one with respect to the
7647digits that generated them.
7648
7649Finally, we must convert this list back into an integer.
7650
d7b8e6c6 7651@smallexample
5d67986c 7652@group
d7b8e6c6
EZ
76533: [0, 0, 2, 5, ... ] 2: [0, 0, 2, 5, ... ]
76542: 1000000000000 1: [1000000000000, 100000000000, ... ]
76551: [100000000000, ... ] .
7656 .
7657
5d67986c 7658 10 @key{RET} 12 ^ r 1 |
d7b8e6c6 7659
d7b8e6c6 7660@end group
5d67986c 7661@end smallexample
d7b8e6c6 7662@noindent
d7b8e6c6 7663@smallexample
5d67986c 7664@group
d7b8e6c6
EZ
76651: [0, 0, 20000000000, 5000000000, ... ] 1: 25129926000
7666 . .
7667
7668 V M * V R +
d7b8e6c6 7669@end group
5d67986c 7670@end smallexample
d7b8e6c6
EZ
7671
7672@noindent
7673Another way to do this final step would be to reduce the formula
7674@w{@samp{10 $$ + $}} across the vector of digits.
7675
d7b8e6c6 7676@smallexample
5d67986c 7677@group
d7b8e6c6
EZ
76781: [0, 0, 2, 5, ... ] 1: 25129926000
7679 . .
7680
5d67986c 7681 V R ' 10 $$ + $ @key{RET}
d7b8e6c6 7682@end group
5d67986c 7683@end smallexample
d7b8e6c6
EZ
7684
7685@node List Answer 10, List Answer 11, List Answer 9, Answers to Exercises
7686@subsection List Tutorial Exercise 10
7687
7688@noindent
7689For the list @cite{[a, b, c, d]}, the result is @cite{((a = b) = c) = d},
7690which will compare @cite{a} and @cite{b} to produce a 1 or 0, which is
7691then compared with @cite{c} to produce another 1 or 0, which is then
7692compared with @cite{d}. This is not at all what Joe wanted.
7693
7694Here's a more correct method:
7695
d7b8e6c6 7696@smallexample
5d67986c 7697@group
d7b8e6c6
EZ
76981: [7, 7, 7, 8, 7] 2: [7, 7, 7, 8, 7]
7699 . 1: 7
7700 .
7701
5d67986c 7702 ' [7,7,7,8,7] @key{RET} @key{RET} v r 1 @key{RET}
d7b8e6c6 7703
d7b8e6c6 7704@end group
5d67986c 7705@end smallexample
d7b8e6c6 7706@noindent
d7b8e6c6 7707@smallexample
5d67986c 7708@group
d7b8e6c6
EZ
77091: [1, 1, 1, 0, 1] 1: 0
7710 . .
7711
7712 V M a = V R *
d7b8e6c6 7713@end group
5d67986c 7714@end smallexample
d7b8e6c6
EZ
7715
7716@node List Answer 11, List Answer 12, List Answer 10, Answers to Exercises
7717@subsection List Tutorial Exercise 11
7718
7719@noindent
7720The circle of unit radius consists of those points @cite{(x,y)} for which
7721@cite{x^2 + y^2 < 1}. We start by generating a vector of @cite{x^2}
7722and a vector of @cite{y^2}.
7723
7724We can make this go a bit faster by using the @kbd{v .} and @kbd{t .}
7725commands.
7726
d7b8e6c6 7727@smallexample
5d67986c 7728@group
d7b8e6c6
EZ
77292: [2., 2., ..., 2.] 2: [2., 2., ..., 2.]
77301: [2., 2., ..., 2.] 1: [1.16, 1.98, ..., 0.81]
7731 . .
7732
5d67986c 7733 v . t . 2. v b 100 @key{RET} @key{RET} V M k r
d7b8e6c6 7734
d7b8e6c6 7735@end group
5d67986c 7736@end smallexample
d7b8e6c6 7737@noindent
d7b8e6c6 7738@smallexample
5d67986c 7739@group
d7b8e6c6
EZ
77402: [2., 2., ..., 2.] 1: [0.026, 0.96, ..., 0.036]
77411: [0.026, 0.96, ..., 0.036] 2: [0.53, 0.81, ..., 0.094]
7742 . .
7743
5d67986c 7744 1 - 2 V M ^ @key{TAB} V M k r 1 - 2 V M ^
d7b8e6c6 7745@end group
5d67986c 7746@end smallexample
d7b8e6c6
EZ
7747
7748Now we sum the @cite{x^2} and @cite{y^2} values, compare with 1 to
7749get a vector of 1/0 truth values, then sum the truth values.
7750
d7b8e6c6 7751@smallexample
5d67986c 7752@group
d7b8e6c6
EZ
77531: [0.56, 1.78, ..., 0.13] 1: [1, 0, ..., 1] 1: 84
7754 . . .
7755
7756 + 1 V M a < V R +
d7b8e6c6 7757@end group
5d67986c 7758@end smallexample
d7b8e6c6
EZ
7759
7760@noindent
7761The ratio @cite{84/100} should approximate the ratio @c{$\pi/4$}
7762@cite{pi/4}.
7763
d7b8e6c6 7764@smallexample
5d67986c 7765@group
d7b8e6c6
EZ
77661: 0.84 1: 3.36 2: 3.36 1: 1.0695
7767 . . 1: 3.14159 .
7768
7769 100 / 4 * P /
d7b8e6c6 7770@end group
5d67986c 7771@end smallexample
d7b8e6c6
EZ
7772
7773@noindent
7774Our estimate, 3.36, is off by about 7%. We could get a better estimate
7775by taking more points (say, 1000), but it's clear that this method is
7776not very efficient!
7777
7778(Naturally, since this example uses random numbers your own answer
7779will be slightly different from the one shown here!)
7780
7781If you typed @kbd{v .} and @kbd{t .} before, type them again to
7782return to full-sized display of vectors.
7783
7784@node List Answer 12, List Answer 13, List Answer 11, Answers to Exercises
7785@subsection List Tutorial Exercise 12
7786
7787@noindent
7788This problem can be made a lot easier by taking advantage of some
7789symmetries. First of all, after some thought it's clear that the
7790@cite{y} axis can be ignored altogether. Just pick a random @cite{x}
7791component for one end of the match, pick a random direction @c{$\theta$}
7792@cite{theta},
7793and see if @cite{x} and @c{$x + \cos \theta$}
7794@cite{x + cos(theta)} (which is the @cite{x}
7795coordinate of the other endpoint) cross a line. The lines are at
7796integer coordinates, so this happens when the two numbers surround
7797an integer.
7798
7799Since the two endpoints are equivalent, we may as well choose the leftmost
7800of the two endpoints as @cite{x}. Then @cite{theta} is an angle pointing
7801to the right, in the range -90 to 90 degrees. (We could use radians, but
7802it would feel like cheating to refer to @c{$\pi/2$}
7803@cite{pi/2} radians while trying
7804to estimate @c{$\pi$}
7805@cite{pi}!)
7806
7807In fact, since the field of lines is infinite we can choose the
7808coordinates 0 and 1 for the lines on either side of the leftmost
7809endpoint. The rightmost endpoint will be between 0 and 1 if the
7810match does not cross a line, or between 1 and 2 if it does. So:
7811Pick random @cite{x} and @c{$\theta$}
7812@cite{theta}, compute @c{$x + \cos \theta$}
7813@cite{x + cos(theta)},
7814and count how many of the results are greater than one. Simple!
7815
7816We can make this go a bit faster by using the @kbd{v .} and @kbd{t .}
7817commands.
7818
d7b8e6c6 7819@smallexample
5d67986c 7820@group
d7b8e6c6
EZ
78211: [0.52, 0.71, ..., 0.72] 2: [0.52, 0.71, ..., 0.72]
7822 . 1: [78.4, 64.5, ..., -42.9]
7823 .
7824
5d67986c 7825v . t . 1. v b 100 @key{RET} V M k r 180. v b 100 @key{RET} V M k r 90 -
d7b8e6c6 7826@end group
5d67986c 7827@end smallexample
d7b8e6c6
EZ
7828
7829@noindent
7830(The next step may be slow, depending on the speed of your computer.)
7831
d7b8e6c6 7832@smallexample
5d67986c 7833@group
d7b8e6c6
EZ
78342: [0.52, 0.71, ..., 0.72] 1: [0.72, 1.14, ..., 1.45]
78351: [0.20, 0.43, ..., 0.73] .
7836 .
7837
7838 m d V M C +
7839
d7b8e6c6 7840@end group
5d67986c 7841@end smallexample
d7b8e6c6 7842@noindent
d7b8e6c6 7843@smallexample
5d67986c 7844@group
d7b8e6c6
EZ
78451: [0, 1, ..., 1] 1: 0.64 1: 3.125
7846 . . .
7847
5d67986c 7848 1 V M a > V R + 100 / 2 @key{TAB} /
d7b8e6c6 7849@end group
5d67986c 7850@end smallexample
d7b8e6c6
EZ
7851
7852Let's try the third method, too. We'll use random integers up to
7853one million. The @kbd{k r} command with an integer argument picks
7854a random integer.
7855
d7b8e6c6 7856@smallexample
5d67986c 7857@group
d7b8e6c6
EZ
78582: [1000000, 1000000, ..., 1000000] 2: [78489, 527587, ..., 814975]
78591: [1000000, 1000000, ..., 1000000] 1: [324014, 358783, ..., 955450]
7860 . .
7861
5d67986c 7862 1000000 v b 100 @key{RET} @key{RET} V M k r @key{TAB} V M k r
d7b8e6c6 7863
d7b8e6c6 7864@end group
5d67986c 7865@end smallexample
d7b8e6c6 7866@noindent
d7b8e6c6 7867@smallexample
5d67986c 7868@group
d7b8e6c6
EZ
78691: [1, 1, ..., 25] 1: [1, 1, ..., 0] 1: 0.56
7870 . . .
7871
7872 V M k g 1 V M a = V R + 100 /
7873
d7b8e6c6 7874@end group
5d67986c 7875@end smallexample
d7b8e6c6 7876@noindent
d7b8e6c6 7877@smallexample
5d67986c 7878@group
d7b8e6c6
EZ
78791: 10.714 1: 3.273
7880 . .
7881
5d67986c 7882 6 @key{TAB} / Q
d7b8e6c6 7883@end group
5d67986c 7884@end smallexample
d7b8e6c6
EZ
7885
7886For a proof of this property of the GCD function, see section 4.5.2,
7887exercise 10, of Knuth's @emph{Art of Computer Programming}, volume II.
7888
7889If you typed @kbd{v .} and @kbd{t .} before, type them again to
7890return to full-sized display of vectors.
7891
7892@node List Answer 13, List Answer 14, List Answer 12, Answers to Exercises
7893@subsection List Tutorial Exercise 13
7894
7895@noindent
7896First, we put the string on the stack as a vector of ASCII codes.
7897
d7b8e6c6 7898@smallexample
5d67986c 7899@group
d7b8e6c6
EZ
79001: [84, 101, 115, ..., 51]
7901 .
7902
5d67986c 7903 "Testing, 1, 2, 3 @key{RET}
d7b8e6c6 7904@end group
5d67986c 7905@end smallexample
d7b8e6c6
EZ
7906
7907@noindent
7908Note that the @kbd{"} key, like @kbd{$}, initiates algebraic entry so
7909there was no need to type an apostrophe. Also, Calc didn't mind that
7910we omitted the closing @kbd{"}. (The same goes for all closing delimiters
7911like @kbd{)} and @kbd{]} at the end of a formula.
7912
7913We'll show two different approaches here. In the first, we note that
7914if the input vector is @cite{[a, b, c, d]}, then the hash code is
7915@cite{3 (3 (3a + b) + c) + d = 27a + 9b + 3c + d}. In other words,
7916it's a sum of descending powers of three times the ASCII codes.
7917
d7b8e6c6 7918@smallexample
5d67986c 7919@group
d7b8e6c6
EZ
79202: [84, 101, 115, ..., 51] 2: [84, 101, 115, ..., 51]
79211: 16 1: [15, 14, 13, ..., 0]
7922 . .
7923
5d67986c 7924 @key{RET} v l v x 16 @key{RET} -
d7b8e6c6 7925
d7b8e6c6 7926@end group
5d67986c 7927@end smallexample
d7b8e6c6 7928@noindent
d7b8e6c6 7929@smallexample
5d67986c 7930@group
d7b8e6c6
EZ
79312: [84, 101, 115, ..., 51] 1: 1960915098 1: 121
79321: [14348907, ..., 1] . .
7933 .
7934
5d67986c 7935 3 @key{TAB} V M ^ * 511 %
d7b8e6c6 7936@end group
5d67986c 7937@end smallexample
d7b8e6c6
EZ
7938
7939@noindent
7940Once again, @kbd{*} elegantly summarizes most of the computation.
7941But there's an even more elegant approach: Reduce the formula
7942@kbd{3 $$ + $} across the vector. Recall that this represents a
7943function of two arguments that computes its first argument times three
7944plus its second argument.
7945
d7b8e6c6 7946@smallexample
5d67986c 7947@group
d7b8e6c6
EZ
79481: [84, 101, 115, ..., 51] 1: 1960915098
7949 . .
7950
5d67986c 7951 "Testing, 1, 2, 3 @key{RET} V R ' 3$$+$ @key{RET}
d7b8e6c6 7952@end group
5d67986c 7953@end smallexample
d7b8e6c6
EZ
7954
7955@noindent
7956If you did the decimal arithmetic exercise, this will be familiar.
7957Basically, we're turning a base-3 vector of digits into an integer,
7958except that our ``digits'' are much larger than real digits.
7959
7960Instead of typing @kbd{511 %} again to reduce the result, we can be
7961cleverer still and notice that rather than computing a huge integer
7962and taking the modulo at the end, we can take the modulo at each step
7963without affecting the result. While this means there are more
7964arithmetic operations, the numbers we operate on remain small so
7965the operations are faster.
7966
d7b8e6c6 7967@smallexample
5d67986c 7968@group
d7b8e6c6
EZ
79691: [84, 101, 115, ..., 51] 1: 121
7970 . .
7971
5d67986c 7972 "Testing, 1, 2, 3 @key{RET} V R ' (3$$+$)%511 @key{RET}
d7b8e6c6 7973@end group
5d67986c 7974@end smallexample
d7b8e6c6
EZ
7975
7976Why does this work? Think about a two-step computation:
7977@w{@cite{3 (3a + b) + c}}. Taking a result modulo 511 basically means
7978subtracting off enough 511's to put the result in the desired range.
7979So the result when we take the modulo after every step is,
7980
7981@ifinfo
7982@example
79833 (3 a + b - 511 m) + c - 511 n
7984@end example
7985@end ifinfo
7986@tex
7987\turnoffactive
7988\beforedisplay
7989$$ 3 (3 a + b - 511 m) + c - 511 n $$
7990\afterdisplay
7991@end tex
7992
7993@noindent
7994for some suitable integers @cite{m} and @cite{n}. Expanding out by
7995the distributive law yields
7996
7997@ifinfo
7998@example
79999 a + 3 b + c - 511*3 m - 511 n
8000@end example
8001@end ifinfo
8002@tex
8003\turnoffactive
8004\beforedisplay
8005$$ 9 a + 3 b + c - 511\times3 m - 511 n $$
8006\afterdisplay
8007@end tex
8008
8009@noindent
8010The @cite{m} term in the latter formula is redundant because any
8011contribution it makes could just as easily be made by the @cite{n}
8012term. So we can take it out to get an equivalent formula with
8013@cite{n' = 3m + n},
8014
8015@ifinfo
8016@example
80179 a + 3 b + c - 511 n'
8018@end example
8019@end ifinfo
8020@tex
8021\turnoffactive
8022\beforedisplay
8023$$ 9 a + 3 b + c - 511 n' $$
8024\afterdisplay
8025@end tex
8026
8027@noindent
8028which is just the formula for taking the modulo only at the end of
8029the calculation. Therefore the two methods are essentially the same.
8030
8031Later in the tutorial we will encounter @dfn{modulo forms}, which
8032basically automate the idea of reducing every intermediate result
5d67986c 8033modulo some value @var{m}.
d7b8e6c6
EZ
8034
8035@node List Answer 14, Types Answer 1, List Answer 13, Answers to Exercises
8036@subsection List Tutorial Exercise 14
8037
8038We want to use @kbd{H V U} to nest a function which adds a random
8039step to an @cite{(x,y)} coordinate. The function is a bit long, but
8040otherwise the problem is quite straightforward.
8041
d7b8e6c6 8042@smallexample
5d67986c 8043@group
d7b8e6c6
EZ
80442: [0, 0] 1: [ [ 0, 0 ]
80451: 50 [ 0.4288, -0.1695 ]
8046 . [ -0.4787, -0.9027 ]
8047 ...
8048
5d67986c 8049 [0,0] 50 H V U ' <# + [random(2.0)-1, random(2.0)-1]> @key{RET}
d7b8e6c6 8050@end group
5d67986c 8051@end smallexample
d7b8e6c6
EZ
8052
8053Just as the text recommended, we used @samp{< >} nameless function
8054notation to keep the two @code{random} calls from being evaluated
8055before nesting even begins.
8056
8057We now have a vector of @cite{[x, y]} sub-vectors, which by Calc's
8058rules acts like a matrix. We can transpose this matrix and unpack
8059to get a pair of vectors, @cite{x} and @cite{y}, suitable for graphing.
8060
d7b8e6c6 8061@smallexample
5d67986c 8062@group
d7b8e6c6
EZ
80632: [ 0, 0.4288, -0.4787, ... ]
80641: [ 0, -0.1696, -0.9027, ... ]
8065 .
8066
8067 v t v u g f
d7b8e6c6 8068@end group
5d67986c 8069@end smallexample
d7b8e6c6
EZ
8070
8071Incidentally, because the @cite{x} and @cite{y} are completely
8072independent in this case, we could have done two separate commands
8073to create our @cite{x} and @cite{y} vectors of numbers directly.
8074
8075To make a random walk of unit steps, we note that @code{sincos} of
8076a random direction exactly gives us an @cite{[x, y]} step of unit
8077length; in fact, the new nesting function is even briefer, though
8078we might want to lower the precision a bit for it.
8079
d7b8e6c6 8080@smallexample
5d67986c 8081@group
d7b8e6c6
EZ
80822: [0, 0] 1: [ [ 0, 0 ]
80831: 50 [ 0.1318, 0.9912 ]
8084 . [ -0.5965, 0.3061 ]
8085 ...
8086
5d67986c 8087 [0,0] 50 m d p 6 @key{RET} H V U ' <# + sincos(random(360.0))> @key{RET}
d7b8e6c6 8088@end group
5d67986c 8089@end smallexample
d7b8e6c6
EZ
8090
8091Another @kbd{v t v u g f} sequence will graph this new random walk.
8092
8093An interesting twist on these random walk functions would be to use
8094complex numbers instead of 2-vectors to represent points on the plane.
8095In the first example, we'd use something like @samp{random + random*(0,1)},
8096and in the second we could use polar complex numbers with random phase
8097angles. (This exercise was first suggested in this form by Randal
8098Schwartz.)
8099
8100@node Types Answer 1, Types Answer 2, List Answer 14, Answers to Exercises
8101@subsection Types Tutorial Exercise 1
8102
8103@noindent
8104If the number is the square root of @c{$\pi$}
8105@cite{pi} times a rational number,
8106then its square, divided by @c{$\pi$}
8107@cite{pi}, should be a rational number.
8108
d7b8e6c6 8109@smallexample
5d67986c 8110@group
d7b8e6c6
EZ
81111: 1.26508260337 1: 0.509433962268 1: 2486645810:4881193627
8112 . . .
8113
8114 2 ^ P / c F
d7b8e6c6 8115@end group
5d67986c 8116@end smallexample
d7b8e6c6
EZ
8117
8118@noindent
8119Technically speaking this is a rational number, but not one that is
8120likely to have arisen in the original problem. More likely, it just
8121happens to be the fraction which most closely represents some
8122irrational number to within 12 digits.
8123
8124But perhaps our result was not quite exact. Let's reduce the
8125precision slightly and try again:
8126
d7b8e6c6 8127@smallexample
5d67986c 8128@group
d7b8e6c6
EZ
81291: 0.509433962268 1: 27:53
8130 . .
8131
5d67986c 8132 U p 10 @key{RET} c F
d7b8e6c6 8133@end group
5d67986c 8134@end smallexample
d7b8e6c6
EZ
8135
8136@noindent
8137Aha! It's unlikely that an irrational number would equal a fraction
8138this simple to within ten digits, so our original number was probably
8139@c{$\sqrt{27 \pi / 53}$}
8140@cite{sqrt(27 pi / 53)}.
8141
8142Notice that we didn't need to re-round the number when we reduced the
8143precision. Remember, arithmetic operations always round their inputs
8144to the current precision before they begin.
8145
8146@node Types Answer 2, Types Answer 3, Types Answer 1, Answers to Exercises
8147@subsection Types Tutorial Exercise 2
8148
8149@noindent
8150@samp{inf / inf = nan}. Perhaps @samp{1} is the ``obvious'' answer.
8151But if @w{@samp{17 inf = inf}}, then @samp{17 inf / inf = inf / inf = 17}, too.
8152
8153@samp{exp(inf) = inf}. It's tempting to say that the exponential
8154of infinity must be ``bigger'' than ``regular'' infinity, but as
8155far as Calc is concerned all infinities are as just as big.
8156In other words, as @cite{x} goes to infinity, @cite{e^x} also goes
8157to infinity, but the fact the @cite{e^x} grows much faster than
8158@cite{x} is not relevant here.
8159
8160@samp{exp(-inf) = 0}. Here we have a finite answer even though
8161the input is infinite.
8162
8163@samp{sqrt(-inf) = (0, 1) inf}. Remember that @cite{(0, 1)}
8164represents the imaginary number @cite{i}. Here's a derivation:
8165@samp{sqrt(-inf) = @w{sqrt((-1) * inf)} = sqrt(-1) * sqrt(inf)}.
8166The first part is, by definition, @cite{i}; the second is @code{inf}
8167because, once again, all infinities are the same size.
8168
8169@samp{sqrt(uinf) = uinf}. In fact, we do know something about the
8170direction because @code{sqrt} is defined to return a value in the
8171right half of the complex plane. But Calc has no notation for this,
8172so it settles for the conservative answer @code{uinf}.
8173
8174@samp{abs(uinf) = inf}. No matter which direction @cite{x} points,
8175@samp{abs(x)} always points along the positive real axis.
8176
8177@samp{ln(0) = -inf}. Here we have an infinite answer to a finite
8178input. As in the @cite{1 / 0} case, Calc will only use infinities
8179here if you have turned on ``infinite'' mode. Otherwise, it will
8180treat @samp{ln(0)} as an error.
8181
8182@node Types Answer 3, Types Answer 4, Types Answer 2, Answers to Exercises
8183@subsection Types Tutorial Exercise 3
8184
8185@noindent
8186We can make @samp{inf - inf} be any real number we like, say,
8187@cite{a}, just by claiming that we added @cite{a} to the first
8188infinity but not to the second. This is just as true for complex
8189values of @cite{a}, so @code{nan} can stand for a complex number.
8190(And, similarly, @code{uinf} can stand for an infinity that points
8191in any direction in the complex plane, such as @samp{(0, 1) inf}).
8192
8193In fact, we can multiply the first @code{inf} by two. Surely
8194@w{@samp{2 inf - inf = inf}}, but also @samp{2 inf - inf = inf - inf = nan}.
8195So @code{nan} can even stand for infinity. Obviously it's just
8196as easy to make it stand for minus infinity as for plus infinity.
8197
8198The moral of this story is that ``infinity'' is a slippery fish
8199indeed, and Calc tries to handle it by having a very simple model
8200for infinities (only the direction counts, not the ``size''); but
8201Calc is careful to write @code{nan} any time this simple model is
8202unable to tell what the true answer is.
8203
8204@node Types Answer 4, Types Answer 5, Types Answer 3, Answers to Exercises
8205@subsection Types Tutorial Exercise 4
8206
d7b8e6c6 8207@smallexample
5d67986c 8208@group
d7b8e6c6
EZ
82092: 0@@ 47' 26" 1: 0@@ 2' 47.411765"
82101: 17 .
8211 .
8212
5d67986c 8213 0@@ 47' 26" @key{RET} 17 /
d7b8e6c6 8214@end group
5d67986c 8215@end smallexample
d7b8e6c6
EZ
8216
8217@noindent
8218The average song length is two minutes and 47.4 seconds.
8219
d7b8e6c6 8220@smallexample
5d67986c 8221@group
d7b8e6c6
EZ
82222: 0@@ 2' 47.411765" 1: 0@@ 3' 7.411765" 1: 0@@ 53' 6.000005"
82231: 0@@ 0' 20" . .
8224 .
8225
8226 20" + 17 *
d7b8e6c6 8227@end group
5d67986c 8228@end smallexample
d7b8e6c6
EZ
8229
8230@noindent
8231The album would be 53 minutes and 6 seconds long.
8232
8233@node Types Answer 5, Types Answer 6, Types Answer 4, Answers to Exercises
8234@subsection Types Tutorial Exercise 5
8235
8236@noindent
8237Let's suppose it's January 14, 1991. The easiest thing to do is
8238to keep trying 13ths of months until Calc reports a Friday.
8239We can do this by manually entering dates, or by using @kbd{t I}:
8240
d7b8e6c6 8241@smallexample
5d67986c 8242@group
d7b8e6c6
EZ
82431: <Wed Feb 13, 1991> 1: <Wed Mar 13, 1991> 1: <Sat Apr 13, 1991>
8244 . . .
8245
5d67986c 8246 ' <2/13> @key{RET} @key{DEL} ' <3/13> @key{RET} t I
d7b8e6c6 8247@end group
5d67986c 8248@end smallexample
d7b8e6c6
EZ
8249
8250@noindent
8251(Calc assumes the current year if you don't say otherwise.)
8252
8253This is getting tedious---we can keep advancing the date by typing
8254@kbd{t I} over and over again, but let's automate the job by using
8255vector mapping. The @kbd{t I} command actually takes a second
8256``how-many-months'' argument, which defaults to one. This
8257argument is exactly what we want to map over:
8258
d7b8e6c6 8259@smallexample
5d67986c 8260@group
d7b8e6c6
EZ
82612: <Sat Apr 13, 1991> 1: [<Mon May 13, 1991>, <Thu Jun 13, 1991>,
82621: [1, 2, 3, 4, 5, 6] <Sat Jul 13, 1991>, <Tue Aug 13, 1991>,
8263 . <Fri Sep 13, 1991>, <Sun Oct 13, 1991>]
8264 .
8265
5d67986c 8266 v x 6 @key{RET} V M t I
d7b8e6c6 8267@end group
5d67986c 8268@end smallexample
d7b8e6c6
EZ
8269
8270@ifinfo
8271@noindent
8272Et voila, September 13, 1991 is a Friday.
8273@end ifinfo
8274@tex
8275\noindent
8276{\it Et voil{\accent"12 a}}, September 13, 1991 is a Friday.
8277@end tex
8278
d7b8e6c6 8279@smallexample
5d67986c 8280@group
d7b8e6c6
EZ
82811: 242
8282 .
8283
5d67986c 8284' <sep 13> - <jan 14> @key{RET}
d7b8e6c6 8285@end group
5d67986c 8286@end smallexample
d7b8e6c6
EZ
8287
8288@noindent
8289And the answer to our original question: 242 days to go.
8290
8291@node Types Answer 6, Types Answer 7, Types Answer 5, Answers to Exercises
8292@subsection Types Tutorial Exercise 6
8293
8294@noindent
8295The full rule for leap years is that they occur in every year divisible
8296by four, except that they don't occur in years divisible by 100, except
8297that they @emph{do} in years divisible by 400. We could work out the
8298answer by carefully counting the years divisible by four and the
8299exceptions, but there is a much simpler way that works even if we
8300don't know the leap year rule.
8301
8302Let's assume the present year is 1991. Years have 365 days, except
8303that leap years (whenever they occur) have 366 days. So let's count
8304the number of days between now and then, and compare that to the
8305number of years times 365. The number of extra days we find must be
8306equal to the number of leap years there were.
8307
d7b8e6c6 8308@smallexample
5d67986c 8309@group
d7b8e6c6
EZ
83101: <Mon Jan 1, 10001> 2: <Mon Jan 1, 10001> 1: 2925593
8311 . 1: <Tue Jan 1, 1991> .
8312 .
8313
5d67986c 8314 ' <jan 1 10001> @key{RET} ' <jan 1 1991> @key{RET} -
d7b8e6c6 8315
d7b8e6c6 8316@end group
5d67986c 8317@end smallexample
d7b8e6c6 8318@noindent
d7b8e6c6 8319@smallexample
5d67986c 8320@group
d7b8e6c6
EZ
83213: 2925593 2: 2925593 2: 2925593 1: 1943
83222: 10001 1: 8010 1: 2923650 .
83231: 1991 . .
8324 .
8325
5d67986c 8326 10001 @key{RET} 1991 - 365 * -
d7b8e6c6 8327@end group
5d67986c 8328@end smallexample
d7b8e6c6
EZ
8329
8330@c [fix-ref Date Forms]
8331@noindent
8332There will be 1943 leap years before the year 10001. (Assuming,
8333of course, that the algorithm for computing leap years remains
8334unchanged for that long. @xref{Date Forms}, for some interesting
8335background information in that regard.)
8336
8337@node Types Answer 7, Types Answer 8, Types Answer 6, Answers to Exercises
8338@subsection Types Tutorial Exercise 7
8339
8340@noindent
8341The relative errors must be converted to absolute errors so that
8342@samp{+/-} notation may be used.
8343
d7b8e6c6 8344@smallexample
5d67986c 8345@group
d7b8e6c6
EZ
83461: 1. 2: 1.
8347 . 1: 0.2
8348 .
8349
5d67986c 8350 20 @key{RET} .05 * 4 @key{RET} .05 *
d7b8e6c6 8351@end group
5d67986c 8352@end smallexample
d7b8e6c6
EZ
8353
8354Now we simply chug through the formula.
8355
d7b8e6c6 8356@smallexample
5d67986c 8357@group
d7b8e6c6
EZ
83581: 19.7392088022 1: 394.78 +/- 19.739 1: 6316.5 +/- 706.21
8359 . . .
8360
5d67986c 8361 2 P 2 ^ * 20 p 1 * 4 p .2 @key{RET} 2 ^ *
d7b8e6c6 8362@end group
5d67986c 8363@end smallexample
d7b8e6c6
EZ
8364
8365It turns out the @kbd{v u} command will unpack an error form as
8366well as a vector. This saves us some retyping of numbers.
8367
d7b8e6c6 8368@smallexample
5d67986c 8369@group
d7b8e6c6
EZ
83703: 6316.5 +/- 706.21 2: 6316.5 +/- 706.21
83712: 6316.5 1: 0.1118
83721: 706.21 .
8373 .
8374
5d67986c 8375 @key{RET} v u @key{TAB} /
d7b8e6c6 8376@end group
5d67986c 8377@end smallexample
d7b8e6c6
EZ
8378
8379@noindent
8380Thus the volume is 6316 cubic centimeters, within about 11 percent.
8381
8382@node Types Answer 8, Types Answer 9, Types Answer 7, Answers to Exercises
8383@subsection Types Tutorial Exercise 8
8384
8385@noindent
8386The first answer is pretty simple: @samp{1 / (0 .. 10) = (0.1 .. inf)}.
8387Since a number in the interval @samp{(0 .. 10)} can get arbitrarily
8388close to zero, its reciprocal can get arbitrarily large, so the answer
8389is an interval that effectively means, ``any number greater than 0.1''
8390but with no upper bound.
8391
8392The second answer, similarly, is @samp{1 / (-10 .. 0) = (-inf .. -0.1)}.
8393
8394Calc normally treats division by zero as an error, so that the formula
8395@w{@samp{1 / 0}} is left unsimplified. Our third problem,
8396@w{@samp{1 / [0 .. 10]}}, also (potentially) divides by zero because zero
8397is now a member of the interval. So Calc leaves this one unevaluated, too.
8398
8399If you turn on ``infinite'' mode by pressing @kbd{m i}, you will
8400instead get the answer @samp{[0.1 .. inf]}, which includes infinity
8401as a possible value.
8402
8403The fourth calculation, @samp{1 / (-10 .. 10)}, has the same problem.
8404Zero is buried inside the interval, but it's still a possible value.
8405It's not hard to see that the actual result of @samp{1 / (-10 .. 10)}
8406will be either greater than @i{0.1}, or less than @i{-0.1}. Thus
8407the interval goes from minus infinity to plus infinity, with a ``hole''
8408in it from @i{-0.1} to @i{0.1}. Calc doesn't have any way to
8409represent this, so it just reports @samp{[-inf .. inf]} as the answer.
8410It may be disappointing to hear ``the answer lies somewhere between
8411minus infinity and plus infinity, inclusive,'' but that's the best
8412that interval arithmetic can do in this case.
8413
8414@node Types Answer 9, Types Answer 10, Types Answer 8, Answers to Exercises
8415@subsection Types Tutorial Exercise 9
8416
d7b8e6c6 8417@smallexample
5d67986c 8418@group
d7b8e6c6
EZ
84191: [-3 .. 3] 2: [-3 .. 3] 2: [0 .. 9]
8420 . 1: [0 .. 9] 1: [-9 .. 9]
8421 . .
8422
5d67986c 8423 [ 3 n .. 3 ] @key{RET} 2 ^ @key{TAB} @key{RET} *
d7b8e6c6 8424@end group
5d67986c 8425@end smallexample
d7b8e6c6
EZ
8426
8427@noindent
8428In the first case the result says, ``if a number is between @i{-3} and
84293, its square is between 0 and 9.'' The second case says, ``the product
8430of two numbers each between @i{-3} and 3 is between @i{-9} and 9.''
8431
8432An interval form is not a number; it is a symbol that can stand for
8433many different numbers. Two identical-looking interval forms can stand
8434for different numbers.
8435
8436The same issue arises when you try to square an error form.
8437
8438@node Types Answer 10, Types Answer 11, Types Answer 9, Answers to Exercises
8439@subsection Types Tutorial Exercise 10
8440
8441@noindent
8442Testing the first number, we might arbitrarily choose 17 for @cite{x}.
8443
d7b8e6c6 8444@smallexample
5d67986c 8445@group
d7b8e6c6
EZ
84461: 17 mod 811749613 2: 17 mod 811749613 1: 533694123 mod 811749613
8447 . 811749612 .
8448 .
8449
5d67986c 8450 17 M 811749613 @key{RET} 811749612 ^
d7b8e6c6 8451@end group
5d67986c 8452@end smallexample
d7b8e6c6
EZ
8453
8454@noindent
8455Since 533694123 is (considerably) different from 1, the number 811749613
8456must not be prime.
8457
8458It's awkward to type the number in twice as we did above. There are
8459various ways to avoid this, and algebraic entry is one. In fact, using
8460a vector mapping operation we can perform several tests at once. Let's
8461use this method to test the second number.
8462
d7b8e6c6 8463@smallexample
5d67986c 8464@group
d7b8e6c6
EZ
84652: [17, 42, 100000] 1: [1 mod 15485863, 1 mod ... ]
84661: 15485863 .
8467 .
8468
5d67986c 8469 [17 42 100000] 15485863 @key{RET} V M ' ($$ mod $)^($-1) @key{RET}
d7b8e6c6 8470@end group
5d67986c 8471@end smallexample
d7b8e6c6
EZ
8472
8473@noindent
8474The result is three ones (modulo @cite{n}), so it's very probable that
847515485863 is prime. (In fact, this number is the millionth prime.)
8476
8477Note that the functions @samp{($$^($-1)) mod $} or @samp{$$^($-1) % $}
8478would have been hopelessly inefficient, since they would have calculated
8479the power using full integer arithmetic.
8480
8481Calc has a @kbd{k p} command that does primality testing. For small
8482numbers it does an exact test; for large numbers it uses a variant
8483of the Fermat test we used here. You can use @kbd{k p} repeatedly
8484to prove that a large integer is prime with any desired probability.
8485
8486@node Types Answer 11, Types Answer 12, Types Answer 10, Answers to Exercises
8487@subsection Types Tutorial Exercise 11
8488
8489@noindent
8490There are several ways to insert a calculated number into an HMS form.
8491One way to convert a number of seconds to an HMS form is simply to
8492multiply the number by an HMS form representing one second:
8493
d7b8e6c6 8494@smallexample
5d67986c 8495@group
d7b8e6c6
EZ
84961: 31415926.5359 2: 31415926.5359 1: 8726@@ 38' 46.5359"
8497 . 1: 0@@ 0' 1" .
8498 .
8499
8500 P 1e7 * 0@@ 0' 1" *
8501
d7b8e6c6 8502@end group
5d67986c 8503@end smallexample
d7b8e6c6 8504@noindent
d7b8e6c6 8505@smallexample
5d67986c 8506@group
d7b8e6c6
EZ
85072: 8726@@ 38' 46.5359" 1: 6@@ 6' 2.5359" mod 24@@ 0' 0"
85081: 15@@ 27' 16" mod 24@@ 0' 0" .
8509 .
8510
5d67986c 8511 x time @key{RET} +
d7b8e6c6 8512@end group
5d67986c 8513@end smallexample
d7b8e6c6
EZ
8514
8515@noindent
8516It will be just after six in the morning.
8517
8518The algebraic @code{hms} function can also be used to build an
8519HMS form:
8520
d7b8e6c6 8521@smallexample
5d67986c 8522@group
d7b8e6c6
EZ
85231: hms(0, 0, 10000000. pi) 1: 8726@@ 38' 46.5359"
8524 . .
8525
5d67986c 8526 ' hms(0, 0, 1e7 pi) @key{RET} =
d7b8e6c6 8527@end group
5d67986c 8528@end smallexample
d7b8e6c6
EZ
8529
8530@noindent
8531The @kbd{=} key is necessary to evaluate the symbol @samp{pi} to
8532the actual number 3.14159...
8533
8534@node Types Answer 12, Types Answer 13, Types Answer 11, Answers to Exercises
8535@subsection Types Tutorial Exercise 12
8536
8537@noindent
8538As we recall, there are 17 songs of about 2 minutes and 47 seconds
8539each.
8540
d7b8e6c6 8541@smallexample
5d67986c 8542@group
d7b8e6c6
EZ
85432: 0@@ 2' 47" 1: [0@@ 3' 7" .. 0@@ 3' 47"]
85441: [0@@ 0' 20" .. 0@@ 1' 0"] .
8545 .
8546
8547 [ 0@@ 20" .. 0@@ 1' ] +
8548
d7b8e6c6 8549@end group
5d67986c 8550@end smallexample
d7b8e6c6 8551@noindent
d7b8e6c6 8552@smallexample
5d67986c 8553@group
d7b8e6c6
EZ
85541: [0@@ 52' 59." .. 1@@ 4' 19."]
8555 .
8556
8557 17 *
d7b8e6c6 8558@end group
5d67986c 8559@end smallexample
d7b8e6c6
EZ
8560
8561@noindent
8562No matter how long it is, the album will fit nicely on one CD.
8563
8564@node Types Answer 13, Types Answer 14, Types Answer 12, Answers to Exercises
8565@subsection Types Tutorial Exercise 13
8566
8567@noindent
5d67986c 8568Type @kbd{' 1 yr @key{RET} u c s @key{RET}}. The answer is 31557600 seconds.
d7b8e6c6
EZ
8569
8570@node Types Answer 14, Types Answer 15, Types Answer 13, Answers to Exercises
8571@subsection Types Tutorial Exercise 14
8572
8573@noindent
8574How long will it take for a signal to get from one end of the computer
8575to the other?
8576
d7b8e6c6 8577@smallexample
5d67986c 8578@group
d7b8e6c6
EZ
85791: m / c 1: 3.3356 ns
8580 . .
8581
5d67986c 8582 ' 1 m / c @key{RET} u c ns @key{RET}
d7b8e6c6 8583@end group
5d67986c 8584@end smallexample
d7b8e6c6
EZ
8585
8586@noindent
8587(Recall, @samp{c} is a ``unit'' corresponding to the speed of light.)
8588
d7b8e6c6 8589@smallexample
5d67986c 8590@group
d7b8e6c6
EZ
85911: 3.3356 ns 1: 0.81356 ns / ns 1: 0.81356
85922: 4.1 ns . .
8593 .
8594
5d67986c 8595 ' 4.1 ns @key{RET} / u s
d7b8e6c6 8596@end group
5d67986c 8597@end smallexample
d7b8e6c6
EZ
8598
8599@noindent
8600Thus a signal could take up to 81 percent of a clock cycle just to
8601go from one place to another inside the computer, assuming the signal
8602could actually attain the full speed of light. Pretty tight!
8603
8604@node Types Answer 15, Algebra Answer 1, Types Answer 14, Answers to Exercises
8605@subsection Types Tutorial Exercise 15
8606
8607@noindent
8608The speed limit is 55 miles per hour on most highways. We want to
8609find the ratio of Sam's speed to the US speed limit.
8610
d7b8e6c6 8611@smallexample
5d67986c 8612@group
d7b8e6c6
EZ
86131: 55 mph 2: 55 mph 3: 11 hr mph / yd
8614 . 1: 5 yd / hr .
8615 .
8616
5d67986c 8617 ' 55 mph @key{RET} ' 5 yd/hr @key{RET} /
d7b8e6c6 8618@end group
5d67986c 8619@end smallexample
d7b8e6c6
EZ
8620
8621The @kbd{u s} command cancels out these units to get a plain
8622number. Now we take the logarithm base two to find the final
8623answer, assuming that each successive pill doubles his speed.
8624
d7b8e6c6 8625@smallexample
5d67986c 8626@group
d7b8e6c6
EZ
86271: 19360. 2: 19360. 1: 14.24
8628 . 1: 2 .
8629 .
8630
8631 u s 2 B
d7b8e6c6 8632@end group
5d67986c 8633@end smallexample
d7b8e6c6
EZ
8634
8635@noindent
8636Thus Sam can take up to 14 pills without a worry.
8637
8638@node Algebra Answer 1, Algebra Answer 2, Types Answer 15, Answers to Exercises
8639@subsection Algebra Tutorial Exercise 1
8640
8641@noindent
8642@c [fix-ref Declarations]
8643The result @samp{sqrt(x)^2} is simplified back to @cite{x} by the
8644Calculator, but @samp{sqrt(x^2)} is not. (Consider what happens
8645if @w{@cite{x = -4}}.) If @cite{x} is real, this formula could be
8646simplified to @samp{abs(x)}, but for general complex arguments even
8647that is not safe. (@xref{Declarations}, for a way to tell Calc
8648that @cite{x} is known to be real.)
8649
8650@node Algebra Answer 2, Algebra Answer 3, Algebra Answer 1, Answers to Exercises
8651@subsection Algebra Tutorial Exercise 2
8652
8653@noindent
8654Suppose our roots are @cite{[a, b, c]}. We want a polynomial which
8655is zero when @cite{x} is any of these values. The trivial polynomial
8656@cite{x-a} is zero when @cite{x=a}, so the product @cite{(x-a)(x-b)(x-c)}
8657will do the job. We can use @kbd{a c x} to write this in a more
8658familiar form.
8659
d7b8e6c6 8660@smallexample
5d67986c 8661@group
d7b8e6c6
EZ
86621: 34 x - 24 x^3 1: [1.19023, -1.19023, 0]
8663 . .
8664
5d67986c 8665 r 2 a P x @key{RET}
d7b8e6c6 8666
d7b8e6c6 8667@end group
5d67986c 8668@end smallexample
d7b8e6c6 8669@noindent
d7b8e6c6 8670@smallexample
5d67986c 8671@group
d7b8e6c6
EZ
86721: [x - 1.19023, x + 1.19023, x] 1: (x - 1.19023) (x + 1.19023) x
8673 . .
8674
5d67986c 8675 V M ' x-$ @key{RET} V R *
d7b8e6c6 8676
d7b8e6c6 8677@end group
5d67986c 8678@end smallexample
d7b8e6c6 8679@noindent
d7b8e6c6 8680@smallexample
5d67986c 8681@group
d7b8e6c6
EZ
86821: x^3 - 1.41666 x 1: 34 x - 24 x^3
8683 . .
8684
5d67986c 8685 a c x @key{RET} 24 n * a x
d7b8e6c6 8686@end group
5d67986c 8687@end smallexample
d7b8e6c6
EZ
8688
8689@noindent
8690Sure enough, our answer (multiplied by a suitable constant) is the
8691same as the original polynomial.
8692
8693@node Algebra Answer 3, Algebra Answer 4, Algebra Answer 2, Answers to Exercises
8694@subsection Algebra Tutorial Exercise 3
8695
d7b8e6c6 8696@smallexample
5d67986c 8697@group
d7b8e6c6
EZ
86981: x sin(pi x) 1: (sin(pi x) - pi x cos(pi x)) / pi^2
8699 . .
8700
5d67986c 8701 ' x sin(pi x) @key{RET} m r a i x @key{RET}
d7b8e6c6 8702
d7b8e6c6 8703@end group
5d67986c 8704@end smallexample
d7b8e6c6 8705@noindent
d7b8e6c6 8706@smallexample
5d67986c 8707@group
d7b8e6c6
EZ
87081: [y, 1]
87092: (sin(pi x) - pi x cos(pi x)) / pi^2
8710 .
8711
5d67986c 8712 ' [y,1] @key{RET} @key{TAB}
d7b8e6c6 8713
d7b8e6c6 8714@end group
5d67986c 8715@end smallexample
d7b8e6c6 8716@noindent
d7b8e6c6 8717@smallexample
5d67986c 8718@group
d7b8e6c6
EZ
87191: [(sin(pi y) - pi y cos(pi y)) / pi^2, (sin(pi) - pi cos(pi)) / pi^2]
8720 .
8721
5d67986c 8722 V M $ @key{RET}
d7b8e6c6 8723
d7b8e6c6 8724@end group
5d67986c 8725@end smallexample
d7b8e6c6 8726@noindent
d7b8e6c6 8727@smallexample
5d67986c 8728@group
d7b8e6c6
EZ
87291: (sin(pi y) - pi y cos(pi y)) / pi^2 + (pi cos(pi) - sin(pi)) / pi^2
8730 .
8731
8732 V R -
8733
d7b8e6c6 8734@end group
5d67986c 8735@end smallexample
d7b8e6c6 8736@noindent
d7b8e6c6 8737@smallexample
5d67986c 8738@group
d7b8e6c6
EZ
87391: (sin(3.14159 y) - 3.14159 y cos(3.14159 y)) / 9.8696 - 0.3183
8740 .
8741
8742 =
8743
d7b8e6c6 8744@end group
5d67986c 8745@end smallexample
d7b8e6c6 8746@noindent
d7b8e6c6 8747@smallexample
5d67986c 8748@group
d7b8e6c6
EZ
87491: [0., -0.95493, 0.63662, -1.5915, 1.2732]
8750 .
8751
5d67986c 8752 v x 5 @key{RET} @key{TAB} V M $ @key{RET}
d7b8e6c6 8753@end group
5d67986c 8754@end smallexample
d7b8e6c6
EZ
8755
8756@node Algebra Answer 4, Rewrites Answer 1, Algebra Answer 3, Answers to Exercises
8757@subsection Algebra Tutorial Exercise 4
8758
8759@noindent
8760The hard part is that @kbd{V R +} is no longer sufficient to add up all
8761the contributions from the slices, since the slices have varying
8762coefficients. So first we must come up with a vector of these
8763coefficients. Here's one way:
8764
d7b8e6c6 8765@smallexample
5d67986c 8766@group
d7b8e6c6
EZ
87672: -1 2: 3 1: [4, 2, ..., 4]
87681: [1, 2, ..., 9] 1: [-1, 1, ..., -1] .
8769 . .
8770
5d67986c 8771 1 n v x 9 @key{RET} V M ^ 3 @key{TAB} -
d7b8e6c6 8772
d7b8e6c6 8773@end group
5d67986c 8774@end smallexample
d7b8e6c6 8775@noindent
d7b8e6c6 8776@smallexample
5d67986c 8777@group
d7b8e6c6
EZ
87781: [4, 2, ..., 4, 1] 1: [1, 4, 2, ..., 4, 1]
8779 . .
8780
5d67986c 8781 1 | 1 @key{TAB} |
d7b8e6c6 8782@end group
5d67986c 8783@end smallexample
d7b8e6c6
EZ
8784
8785@noindent
8786Now we compute the function values. Note that for this method we need
8787eleven values, including both endpoints of the desired interval.
8788
d7b8e6c6 8789@smallexample
5d67986c 8790@group
d7b8e6c6
EZ
87912: [1, 4, 2, ..., 4, 1]
87921: [1, 1.1, 1.2, ... , 1.8, 1.9, 2.]
8793 .
8794
5d67986c 8795 11 @key{RET} 1 @key{RET} .1 @key{RET} C-u v x
d7b8e6c6 8796
d7b8e6c6 8797@end group
5d67986c 8798@end smallexample
d7b8e6c6 8799@noindent
d7b8e6c6 8800@smallexample
5d67986c 8801@group
d7b8e6c6
EZ
88022: [1, 4, 2, ..., 4, 1]
88031: [0., 0.084941, 0.16993, ... ]
8804 .
8805
5d67986c 8806 ' sin(x) ln(x) @key{RET} m r p 5 @key{RET} V M $ @key{RET}
d7b8e6c6 8807@end group
5d67986c 8808@end smallexample
d7b8e6c6
EZ
8809
8810@noindent
8811Once again this calls for @kbd{V M * V R +}; a simple @kbd{*} does the
8812same thing.
8813
d7b8e6c6 8814@smallexample
5d67986c 8815@group
d7b8e6c6
EZ
88161: 11.22 1: 1.122 1: 0.374
8817 . . .
8818
8819 * .1 * 3 /
d7b8e6c6 8820@end group
5d67986c 8821@end smallexample
d7b8e6c6
EZ
8822
8823@noindent
8824Wow! That's even better than the result from the Taylor series method.
8825
8826@node Rewrites Answer 1, Rewrites Answer 2, Algebra Answer 4, Answers to Exercises
8827@subsection Rewrites Tutorial Exercise 1
8828
8829@noindent
8830We'll use Big mode to make the formulas more readable.
8831
d7b8e6c6 8832@smallexample
5d67986c 8833@group
d7b8e6c6
EZ
8834 ___
8835 2 + V 2
88361: (2 + sqrt(2)) / (1 + sqrt(2)) 1: --------
8837 . ___
8838 1 + V 2
8839
8840 .
8841
5d67986c 8842 ' (2+sqrt(2)) / (1+sqrt(2)) @key{RET} d B
d7b8e6c6 8843@end group
5d67986c 8844@end smallexample
d7b8e6c6
EZ
8845
8846@noindent
8847Multiplying by the conjugate helps because @cite{(a+b) (a-b) = a^2 - b^2}.
8848
d7b8e6c6 8849@smallexample
5d67986c 8850@group
d7b8e6c6
EZ
8851 ___ ___
88521: (2 + V 2 ) (V 2 - 1)
8853 .
8854
5d67986c 8855 a r a/(b+c) := a*(b-c) / (b^2-c^2) @key{RET}
d7b8e6c6 8856
d7b8e6c6 8857@end group
5d67986c 8858@end smallexample
d7b8e6c6 8859@noindent
d7b8e6c6 8860@smallexample
5d67986c 8861@group
d7b8e6c6
EZ
8862 ___ ___
88631: 2 + V 2 - 2 1: V 2
8864 . .
8865
8866 a r a*(b+c) := a*b + a*c a s
d7b8e6c6 8867@end group
5d67986c 8868@end smallexample
d7b8e6c6
EZ
8869
8870@noindent
8871(We could have used @kbd{a x} instead of a rewrite rule for the
8872second step.)
8873
8874The multiply-by-conjugate rule turns out to be useful in many
8875different circumstances, such as when the denominator involves
8876sines and cosines or the imaginary constant @code{i}.
8877
8878@node Rewrites Answer 2, Rewrites Answer 3, Rewrites Answer 1, Answers to Exercises
8879@subsection Rewrites Tutorial Exercise 2
8880
8881@noindent
8882Here is the rule set:
8883
d7b8e6c6 8884@smallexample
5d67986c 8885@group
d7b8e6c6
EZ
8886[ fib(n) := fib(n, 1, 1) :: integer(n) :: n >= 1,
8887 fib(1, x, y) := x,
8888 fib(n, x, y) := fib(n-1, y, x+y) ]
d7b8e6c6 8889@end group
5d67986c 8890@end smallexample
d7b8e6c6
EZ
8891
8892@noindent
8893The first rule turns a one-argument @code{fib} that people like to write
8894into a three-argument @code{fib} that makes computation easier. The
8895second rule converts back from three-argument form once the computation
8896is done. The third rule does the computation itself. It basically
8897says that if @cite{x} and @cite{y} are two consecutive Fibonacci numbers,
8898then @cite{y} and @cite{x+y} are the next (overlapping) pair of Fibonacci
8899numbers.
8900
8901Notice that because the number @cite{n} was ``validated'' by the
8902conditions on the first rule, there is no need to put conditions on
8903the other rules because the rule set would never get that far unless
8904the input were valid. That further speeds computation, since no
8905extra conditions need to be checked at every step.
8906
8907Actually, a user with a nasty sense of humor could enter a bad
8908three-argument @code{fib} call directly, say, @samp{fib(0, 1, 1)},
8909which would get the rules into an infinite loop. One thing that would
8910help keep this from happening by accident would be to use something like
8911@samp{ZzFib} instead of @code{fib} as the name of the three-argument
8912function.
8913
8914@node Rewrites Answer 3, Rewrites Answer 4, Rewrites Answer 2, Answers to Exercises
8915@subsection Rewrites Tutorial Exercise 3
8916
8917@noindent
8918He got an infinite loop. First, Calc did as expected and rewrote
8919@w{@samp{2 + 3 x}} to @samp{f(2, 3, x)}. Then it looked for ways to
8920apply the rule again, and found that @samp{f(2, 3, x)} looks like
8921@samp{a + b x} with @w{@samp{a = 0}} and @samp{b = 1}, so it rewrote to
8922@samp{f(0, 1, f(2, 3, x))}. It then wrapped another @samp{f(0, 1, ...)}
8923around that, and so on, ad infinitum. Joe should have used @kbd{M-1 a r}
8924to make sure the rule applied only once.
8925
8926(Actually, even the first step didn't work as he expected. What Calc
8927really gives for @kbd{M-1 a r} in this situation is @samp{f(3 x, 1, 2)},
8928treating 2 as the ``variable,'' and @samp{3 x} as a constant being added
8929to it. While this may seem odd, it's just as valid a solution as the
8930``obvious'' one. One way to fix this would be to add the condition
8931@samp{:: variable(x)} to the rule, to make sure the thing that matches
8932@samp{x} is indeed a variable, or to change @samp{x} to @samp{quote(x)}
8933on the lefthand side, so that the rule matches the actual variable
8934@samp{x} rather than letting @samp{x} stand for something else.)
8935
8936@node Rewrites Answer 4, Rewrites Answer 5, Rewrites Answer 3, Answers to Exercises
8937@subsection Rewrites Tutorial Exercise 4
8938
8939@noindent
5d67986c
RS
8940@ignore
8941@starindex
8942@end ignore
d7b8e6c6
EZ
8943@tindex seq
8944Here is a suitable set of rules to solve the first part of the problem:
8945
d7b8e6c6 8946@smallexample
5d67986c 8947@group
d7b8e6c6
EZ
8948[ seq(n, c) := seq(n/2, c+1) :: n%2 = 0,
8949 seq(n, c) := seq(3n+1, c+1) :: n%2 = 1 :: n > 1 ]
d7b8e6c6 8950@end group
5d67986c 8951@end smallexample
d7b8e6c6
EZ
8952
8953Given the initial formula @samp{seq(6, 0)}, application of these
8954rules produces the following sequence of formulas:
8955
8956@example
8957seq( 3, 1)
8958seq(10, 2)
8959seq( 5, 3)
8960seq(16, 4)
8961seq( 8, 5)
8962seq( 4, 6)
8963seq( 2, 7)
8964seq( 1, 8)
8965@end example
8966
8967@noindent
8968whereupon neither of the rules match, and rewriting stops.
8969
8970We can pretty this up a bit with a couple more rules:
8971
d7b8e6c6 8972@smallexample
5d67986c 8973@group
d7b8e6c6
EZ
8974[ seq(n) := seq(n, 0),
8975 seq(1, c) := c,
8976 ... ]
d7b8e6c6 8977@end group
5d67986c 8978@end smallexample
d7b8e6c6
EZ
8979
8980@noindent
8981Now, given @samp{seq(6)} as the starting configuration, we get 8
8982as the result.
8983
8984The change to return a vector is quite simple:
8985
d7b8e6c6 8986@smallexample
5d67986c 8987@group
d7b8e6c6
EZ
8988[ seq(n) := seq(n, []) :: integer(n) :: n > 0,
8989 seq(1, v) := v | 1,
8990 seq(n, v) := seq(n/2, v | n) :: n%2 = 0,
8991 seq(n, v) := seq(3n+1, v | n) :: n%2 = 1 ]
d7b8e6c6 8992@end group
5d67986c 8993@end smallexample
d7b8e6c6
EZ
8994
8995@noindent
8996Given @samp{seq(6)}, the result is @samp{[6, 3, 10, 5, 16, 8, 4, 2, 1]}.
8997
8998Notice that the @cite{n > 1} guard is no longer necessary on the last
8999rule since the @cite{n = 1} case is now detected by another rule.
9000But a guard has been added to the initial rule to make sure the
9001initial value is suitable before the computation begins.
9002
9003While still a good idea, this guard is not as vitally important as it
9004was for the @code{fib} function, since calling, say, @samp{seq(x, [])}
9005will not get into an infinite loop. Calc will not be able to prove
9006the symbol @samp{x} is either even or odd, so none of the rules will
9007apply and the rewrites will stop right away.
9008
9009@node Rewrites Answer 5, Rewrites Answer 6, Rewrites Answer 4, Answers to Exercises
9010@subsection Rewrites Tutorial Exercise 5
9011
9012@noindent
5d67986c
RS
9013@ignore
9014@starindex
9015@end ignore
d7b8e6c6 9016@tindex nterms
5d67986c
RS
9017If @cite{x} is the sum @cite{a + b}, then `@t{nterms(}@var{x}@t{)}' must
9018be `@t{nterms(}@var{a}@t{)}' plus `@t{nterms(}@var{b}@t{)}'. If @cite{x}
9019is not a sum, then `@t{nterms(}@var{x}@t{)}' = 1.
d7b8e6c6 9020
d7b8e6c6 9021@smallexample
5d67986c 9022@group
d7b8e6c6
EZ
9023[ nterms(a + b) := nterms(a) + nterms(b),
9024 nterms(x) := 1 ]
d7b8e6c6 9025@end group
5d67986c 9026@end smallexample
d7b8e6c6
EZ
9027
9028@noindent
9029Here we have taken advantage of the fact that earlier rules always
9030match before later rules; @samp{nterms(x)} will only be tried if we
9031already know that @samp{x} is not a sum.
9032
9033@node Rewrites Answer 6, Rewrites Answer 7, Rewrites Answer 5, Answers to Exercises
9034@subsection Rewrites Tutorial Exercise 6
9035
9036Just put the rule @samp{0^0 := 1} into @code{EvalRules}. For example,
9037before making this definition we have:
9038
d7b8e6c6 9039@smallexample
5d67986c 9040@group
d7b8e6c6
EZ
90412: [-2, -1, 0, 1, 2] 1: [1, 1, 0^0, 1, 1]
90421: 0 .
9043 .
9044
5d67986c 9045 v x 5 @key{RET} 3 - 0 V M ^
d7b8e6c6 9046@end group
5d67986c 9047@end smallexample
d7b8e6c6
EZ
9048
9049@noindent
9050But then:
9051
d7b8e6c6 9052@smallexample
5d67986c 9053@group
d7b8e6c6
EZ
90542: [-2, -1, 0, 1, 2] 1: [1, 1, 1, 1, 1]
90551: 0 .
9056 .
9057
5d67986c 9058 U ' 0^0:=1 @key{RET} s t EvalRules @key{RET} V M ^
d7b8e6c6 9059@end group
5d67986c 9060@end smallexample
d7b8e6c6
EZ
9061
9062Perhaps more surprisingly, this rule still works with infinite mode
9063turned on. Calc tries @code{EvalRules} before any built-in rules for
9064a function. This allows you to override the default behavior of any
9065Calc feature: Even though Calc now wants to evaluate @cite{0^0} to
9066@code{nan}, your rule gets there first and evaluates it to 1 instead.
9067
9068Just for kicks, try adding the rule @code{2+3 := 6} to @code{EvalRules}.
9069What happens? (Be sure to remove this rule afterward, or you might get
9070a nasty surprise when you use Calc to balance your checkbook!)
9071
9072@node Rewrites Answer 7, Programming Answer 1, Rewrites Answer 6, Answers to Exercises
9073@subsection Rewrites Tutorial Exercise 7
9074
9075@noindent
9076Here is a rule set that will do the job:
9077
d7b8e6c6 9078@smallexample
5d67986c 9079@group
d7b8e6c6
EZ
9080[ a*(b + c) := a*b + a*c,
9081 opt(a) O(x^n) + opt(b) O(x^m) := O(x^n) :: n <= m
9082 :: constant(a) :: constant(b),
9083 opt(a) O(x^n) + opt(b) x^m := O(x^n) :: n <= m
9084 :: constant(a) :: constant(b),
9085 a O(x^n) := O(x^n) :: constant(a),
9086 x^opt(m) O(x^n) := O(x^(n+m)),
9087 O(x^n) O(x^m) := O(x^(n+m)) ]
d7b8e6c6 9088@end group
5d67986c 9089@end smallexample
d7b8e6c6
EZ
9090
9091If we really want the @kbd{+} and @kbd{*} keys to operate naturally
9092on power series, we should put these rules in @code{EvalRules}. For
9093testing purposes, it is better to put them in a different variable,
9094say, @code{O}, first.
9095
9096The first rule just expands products of sums so that the rest of the
9097rules can assume they have an expanded-out polynomial to work with.
9098Note that this rule does not mention @samp{O} at all, so it will
9099apply to any product-of-sum it encounters---this rule may surprise
9100you if you put it into @code{EvalRules}!
9101
9102In the second rule, the sum of two O's is changed to the smaller O.
9103The optional constant coefficients are there mostly so that
9104@samp{O(x^2) - O(x^3)} and @samp{O(x^3) - O(x^2)} are handled
9105as well as @samp{O(x^2) + O(x^3)}.
9106
9107The third rule absorbs higher powers of @samp{x} into O's.
9108
9109The fourth rule says that a constant times a negligible quantity
9110is still negligible. (This rule will also match @samp{O(x^3) / 4},
9111with @samp{a = 1/4}.)
9112
9113The fifth rule rewrites, for example, @samp{x^2 O(x^3)} to @samp{O(x^5)}.
9114(It is easy to see that if one of these forms is negligible, the other
9115is, too.) Notice the @samp{x^opt(m)} to pick up terms like
9116@w{@samp{x O(x^3)}}. Optional powers will match @samp{x} as @samp{x^1}
9117but not 1 as @samp{x^0}. This turns out to be exactly what we want here.
9118
9119The sixth rule is the corresponding rule for products of two O's.
9120
9121Another way to solve this problem would be to create a new ``data type''
9122that represents truncated power series. We might represent these as
9123function calls @samp{series(@var{coefs}, @var{x})} where @var{coefs} is
9124a vector of coefficients for @cite{x^0}, @cite{x^1}, @cite{x^2}, and so
9125on. Rules would exist for sums and products of such @code{series}
9126objects, and as an optional convenience could also know how to combine a
9127@code{series} object with a normal polynomial. (With this, and with a
9128rule that rewrites @samp{O(x^n)} to the equivalent @code{series} form,
9129you could still enter power series in exactly the same notation as
9130before.) Operations on such objects would probably be more efficient,
9131although the objects would be a bit harder to read.
9132
9133@c [fix-ref Compositions]
9134Some other symbolic math programs provide a power series data type
9135similar to this. Mathematica, for example, has an object that looks
9136like @samp{PowerSeries[@var{x}, @var{x0}, @var{coefs}, @var{nmin},
9137@var{nmax}, @var{den}]}, where @var{x0} is the point about which the
9138power series is taken (we've been assuming this was always zero),
9139and @var{nmin}, @var{nmax}, and @var{den} allow pseudo-power-series
9140with fractional or negative powers. Also, the @code{PowerSeries}
9141objects have a special display format that makes them look like
9142@samp{2 x^2 + O(x^4)} when they are printed out. (@xref{Compositions},
9143for a way to do this in Calc, although for something as involved as
9144this it would probably be better to write the formatting routine
9145in Lisp.)
9146
9147@node Programming Answer 1, Programming Answer 2, Rewrites Answer 7, Answers to Exercises
9148@subsection Programming Tutorial Exercise 1
9149
9150@noindent
9151Just enter the formula @samp{ninteg(sin(t)/t, t, 0, x)}, type
9152@kbd{Z F}, and answer the questions. Since this formula contains two
9153variables, the default argument list will be @samp{(t x)}. We want to
9154change this to @samp{(x)} since @cite{t} is really a dummy variable
9155to be used within @code{ninteg}.
9156
5d67986c
RS
9157The exact keystrokes are @kbd{Z F s Si @key{RET} @key{RET} C-b C-b @key{DEL} @key{DEL} @key{RET} y}.
9158(The @kbd{C-b C-b @key{DEL} @key{DEL}} are what fix the argument list.)
d7b8e6c6
EZ
9159
9160@node Programming Answer 2, Programming Answer 3, Programming Answer 1, Answers to Exercises
9161@subsection Programming Tutorial Exercise 2
9162
9163@noindent
9164One way is to move the number to the top of the stack, operate on
5d67986c 9165it, then move it back: @kbd{C-x ( M-@key{TAB} n M-@key{TAB} M-@key{TAB} C-x )}.
d7b8e6c6
EZ
9166
9167Another way is to negate the top three stack entries, then negate
9168again the top two stack entries: @kbd{C-x ( M-3 n M-2 n C-x )}.
9169
9170Finally, it turns out that a negative prefix argument causes a
9171command like @kbd{n} to operate on the specified stack entry only,
9172which is just what we want: @kbd{C-x ( M-- 3 n C-x )}.
9173
9174Just for kicks, let's also do it algebraically:
5d67986c 9175@w{@kbd{C-x ( ' -$$$, $$, $ @key{RET} C-x )}}.
d7b8e6c6
EZ
9176
9177@node Programming Answer 3, Programming Answer 4, Programming Answer 2, Answers to Exercises
9178@subsection Programming Tutorial Exercise 3
9179
9180@noindent
9181Each of these functions can be computed using the stack, or using
9182algebraic entry, whichever way you prefer:
9183
9184@noindent
9185Computing @c{$\displaystyle{\sin x \over x}$}
9186@cite{sin(x) / x}:
9187
5d67986c 9188Using the stack: @kbd{C-x ( @key{RET} S @key{TAB} / C-x )}.
d7b8e6c6 9189
5d67986c 9190Using algebraic entry: @kbd{C-x ( ' sin($)/$ @key{RET} C-x )}.
d7b8e6c6
EZ
9191
9192@noindent
9193Computing the logarithm:
9194
5d67986c 9195Using the stack: @kbd{C-x ( @key{TAB} B C-x )}
d7b8e6c6 9196
5d67986c 9197Using algebraic entry: @kbd{C-x ( ' log($,$$) @key{RET} C-x )}.
d7b8e6c6
EZ
9198
9199@noindent
9200Computing the vector of integers:
9201
5d67986c 9202Using the stack: @kbd{C-x ( 1 @key{RET} 1 C-u v x C-x )}. (Recall that
d7b8e6c6
EZ
9203@kbd{C-u v x} takes the vector size, starting value, and increment
9204from the stack.)
9205
9206Alternatively: @kbd{C-x ( ~ v x C-x )}. (The @kbd{~} key pops a
9207number from the stack and uses it as the prefix argument for the
9208next command.)
9209
5d67986c 9210Using algebraic entry: @kbd{C-x ( ' index($) @key{RET} C-x )}.
d7b8e6c6
EZ
9211
9212@node Programming Answer 4, Programming Answer 5, Programming Answer 3, Answers to Exercises
9213@subsection Programming Tutorial Exercise 4
9214
9215@noindent
5d67986c 9216Here's one way: @kbd{C-x ( @key{RET} V R + @key{TAB} v l / C-x )}.
d7b8e6c6
EZ
9217
9218@node Programming Answer 5, Programming Answer 6, Programming Answer 4, Answers to Exercises
9219@subsection Programming Tutorial Exercise 5
9220
d7b8e6c6 9221@smallexample
5d67986c 9222@group
d7b8e6c6
EZ
92232: 1 1: 1.61803398502 2: 1.61803398502
92241: 20 . 1: 1.61803398875
9225 . .
9226
5d67986c 9227 1 @key{RET} 20 Z < & 1 + Z > I H P
d7b8e6c6 9228@end group
5d67986c 9229@end smallexample
d7b8e6c6
EZ
9230
9231@noindent
9232This answer is quite accurate.
9233
9234@node Programming Answer 6, Programming Answer 7, Programming Answer 5, Answers to Exercises
9235@subsection Programming Tutorial Exercise 6
9236
9237@noindent
9238Here is the matrix:
9239
9240@example
9241[ [ 0, 1 ] * [a, b] = [b, a + b]
9242 [ 1, 1 ] ]
9243@end example
9244
9245@noindent
9246Thus @samp{[0, 1; 1, 1]^n * [1, 1]} computes Fibonacci numbers @cite{n+1}
9247and @cite{n+2}. Here's one program that does the job:
9248
9249@example
5d67986c 9250C-x ( ' [0, 1; 1, 1] ^ ($-1) * [1, 1] @key{RET} v u @key{DEL} C-x )
d7b8e6c6
EZ
9251@end example
9252
9253@noindent
9254This program is quite efficient because Calc knows how to raise a
9255matrix (or other value) to the power @cite{n} in only @c{$\log_2 n$}
9256@cite{log(n,2)}
9257steps. For example, this program can compute the 1000th Fibonacci
9258number (a 209-digit integer!) in about 10 steps; even though the
9259@kbd{Z < ... Z >} solution had much simpler steps, it would have
9260required so many steps that it would not have been practical.
9261
9262@node Programming Answer 7, Programming Answer 8, Programming Answer 6, Answers to Exercises
9263@subsection Programming Tutorial Exercise 7
9264
9265@noindent
9266The trick here is to compute the harmonic numbers differently, so that
9267the loop counter itself accumulates the sum of reciprocals. We use
9268a separate variable to hold the integer counter.
9269
d7b8e6c6 9270@smallexample
5d67986c 9271@group
d7b8e6c6
EZ
92721: 1 2: 1 1: .
9273 . 1: 4
9274 .
9275
5d67986c 9276 1 t 1 1 @key{RET} 4 Z ( t 2 r 1 1 + s 1 & Z )
d7b8e6c6 9277@end group
5d67986c 9278@end smallexample
d7b8e6c6
EZ
9279
9280@noindent
9281The body of the loop goes as follows: First save the harmonic sum
9282so far in variable 2. Then delete it from the stack; the for loop
9283itself will take care of remembering it for us. Next, recall the
9284count from variable 1, add one to it, and feed its reciprocal to
9285the for loop to use as the step value. The for loop will increase
9286the ``loop counter'' by that amount and keep going until the
9287loop counter exceeds 4.
9288
d7b8e6c6 9289@smallexample
5d67986c 9290@group
d7b8e6c6
EZ
92912: 31 3: 31
92921: 3.99498713092 2: 3.99498713092
9293 . 1: 4.02724519544
9294 .
9295
5d67986c 9296 r 1 r 2 @key{RET} 31 & +
d7b8e6c6 9297@end group
5d67986c 9298@end smallexample
d7b8e6c6
EZ
9299
9300Thus we find that the 30th harmonic number is 3.99, and the 31st
9301harmonic number is 4.02.
9302
9303@node Programming Answer 8, Programming Answer 9, Programming Answer 7, Answers to Exercises
9304@subsection Programming Tutorial Exercise 8
9305
9306@noindent
9307The first step is to compute the derivative @cite{f'(x)} and thus
9308the formula @c{$\displaystyle{x - {f(x) \over f'(x)}}$}
9309@cite{x - f(x)/f'(x)}.
9310
9311(Because this definition is long, it will be repeated in concise form
9312below. You can use @w{@kbd{M-# m}} to load it from there. While you are
9313entering a @kbd{Z ` Z '} body in a macro, Calc simply collects
9314keystrokes without executing them. In the following diagrams we'll
9315pretend Calc actually executed the keystrokes as you typed them,
9316just for purposes of illustration.)
9317
d7b8e6c6 9318@smallexample
5d67986c 9319@group
d7b8e6c6
EZ
93202: sin(cos(x)) - 0.5 3: 4.5
93211: 4.5 2: sin(cos(x)) - 0.5
9322 . 1: -(sin(x) cos(cos(x)))
9323 .
9324
5d67986c 9325' sin(cos(x))-0.5 @key{RET} 4.5 m r C-x ( Z ` @key{TAB} @key{RET} a d x @key{RET}
d7b8e6c6 9326
d7b8e6c6 9327@end group
5d67986c 9328@end smallexample
d7b8e6c6 9329@noindent
d7b8e6c6 9330@smallexample
5d67986c 9331@group
d7b8e6c6
EZ
93322: 4.5
93331: x + (sin(cos(x)) - 0.5) / sin(x) cos(cos(x))
9334 .
9335
5d67986c 9336 / ' x @key{RET} @key{TAB} - t 1
d7b8e6c6 9337@end group
5d67986c 9338@end smallexample
d7b8e6c6
EZ
9339
9340Now, we enter the loop. We'll use a repeat loop with a 20-repetition
9341limit just in case the method fails to converge for some reason.
9342(Normally, the @w{@kbd{Z /}} command will stop the loop before all 20
9343repetitions are done.)
9344
d7b8e6c6 9345@smallexample
5d67986c 9346@group
d7b8e6c6
EZ
93471: 4.5 3: 4.5 2: 4.5
9348 . 2: x + (sin(cos(x)) ... 1: 5.24196456928
9349 1: 4.5 .
9350 .
9351
5d67986c 9352 20 Z < @key{RET} r 1 @key{TAB} s l x @key{RET}
d7b8e6c6 9353@end group
5d67986c 9354@end smallexample
d7b8e6c6
EZ
9355
9356This is the new guess for @cite{x}. Now we compare it with the
9357old one to see if we've converged.
9358
d7b8e6c6 9359@smallexample
5d67986c 9360@group
d7b8e6c6
EZ
93613: 5.24196 2: 5.24196 1: 5.24196 1: 5.26345856348
93622: 5.24196 1: 0 . .
93631: 4.5 .
9364 .
9365
5d67986c 9366 @key{RET} M-@key{TAB} a = Z / Z > Z ' C-x )
d7b8e6c6 9367@end group
5d67986c 9368@end smallexample
d7b8e6c6
EZ
9369
9370The loop converges in just a few steps to this value. To check
9371the result, we can simply substitute it back into the equation.
9372
d7b8e6c6 9373@smallexample
5d67986c 9374@group
d7b8e6c6
EZ
93752: 5.26345856348
93761: 0.499999999997
9377 .
9378
5d67986c 9379 @key{RET} ' sin(cos($)) @key{RET}
d7b8e6c6 9380@end group
5d67986c 9381@end smallexample
d7b8e6c6
EZ
9382
9383Let's test the new definition again:
9384
d7b8e6c6 9385@smallexample
5d67986c 9386@group
d7b8e6c6
EZ
93872: x^2 - 9 1: 3.
93881: 1 .
9389 .
9390
5d67986c 9391 ' x^2-9 @key{RET} 1 X
d7b8e6c6 9392@end group
5d67986c 9393@end smallexample
d7b8e6c6
EZ
9394
9395Once again, here's the full Newton's Method definition:
9396
d7b8e6c6 9397@example
5d67986c
RS
9398@group
9399C-x ( Z ` @key{TAB} @key{RET} a d x @key{RET} / ' x @key{RET} @key{TAB} - t 1
9400 20 Z < @key{RET} r 1 @key{TAB} s l x @key{RET}
9401 @key{RET} M-@key{TAB} a = Z /
d7b8e6c6
EZ
9402 Z >
9403 Z '
9404C-x )
d7b8e6c6 9405@end group
5d67986c 9406@end example
d7b8e6c6
EZ
9407
9408@c [fix-ref Nesting and Fixed Points]
9409It turns out that Calc has a built-in command for applying a formula
9410repeatedly until it converges to a number. @xref{Nesting and Fixed Points},
9411to see how to use it.
9412
9413@c [fix-ref Root Finding]
9414Also, of course, @kbd{a R} is a built-in command that uses Newton's
9415method (among others) to look for numerical solutions to any equation.
9416@xref{Root Finding}.
9417
9418@node Programming Answer 9, Programming Answer 10, Programming Answer 8, Answers to Exercises
9419@subsection Programming Tutorial Exercise 9
9420
9421@noindent
9422The first step is to adjust @cite{z} to be greater than 5. A simple
9423``for'' loop will do the job here. If @cite{z} is less than 5, we
9424reduce the problem using @c{$\psi(z) = \psi(z+1) - 1/z$}
9425@cite{psi(z) = psi(z+1) - 1/z}. We go
9426on to compute @c{$\psi(z+1)$}
9427@cite{psi(z+1)}, and remember to add back a factor of
9428@cite{-1/z} when we're done. This step is repeated until @cite{z > 5}.
9429
9430(Because this definition is long, it will be repeated in concise form
9431below. You can use @w{@kbd{M-# m}} to load it from there. While you are
9432entering a @kbd{Z ` Z '} body in a macro, Calc simply collects
9433keystrokes without executing them. In the following diagrams we'll
9434pretend Calc actually executed the keystrokes as you typed them,
9435just for purposes of illustration.)
9436
d7b8e6c6 9437@smallexample
5d67986c 9438@group
d7b8e6c6
EZ
94391: 1. 1: 1.
9440 . .
9441
5d67986c 9442 1.0 @key{RET} C-x ( Z ` s 1 0 t 2
d7b8e6c6 9443@end group
5d67986c 9444@end smallexample
d7b8e6c6
EZ
9445
9446Here, variable 1 holds @cite{z} and variable 2 holds the adjustment
9447factor. If @cite{z < 5}, we use a loop to increase it.
9448
9449(By the way, we started with @samp{1.0} instead of the integer 1 because
9450otherwise the calculation below will try to do exact fractional arithmetic,
9451and will never converge because fractions compare equal only if they
9452are exactly equal, not just equal to within the current precision.)
9453
d7b8e6c6 9454@smallexample
5d67986c 9455@group
d7b8e6c6
EZ
94563: 1. 2: 1. 1: 6.
94572: 1. 1: 1 .
94581: 5 .
9459 .
9460
5d67986c 9461 @key{RET} 5 a < Z [ 5 Z ( & s + 2 1 s + 1 1 Z ) r 1 Z ]
d7b8e6c6 9462@end group
5d67986c 9463@end smallexample
d7b8e6c6
EZ
9464
9465Now we compute the initial part of the sum: @c{$\ln z - {1 \over 2z}$}
9466@cite{ln(z) - 1/2z}
9467minus the adjustment factor.
9468
d7b8e6c6 9469@smallexample
5d67986c 9470@group
d7b8e6c6
EZ
94712: 1.79175946923 2: 1.7084261359 1: -0.57490719743
94721: 0.0833333333333 1: 2.28333333333 .
9473 . .
9474
9475 L r 1 2 * & - r 2 -
d7b8e6c6 9476@end group
5d67986c 9477@end smallexample
d7b8e6c6
EZ
9478
9479Now we evaluate the series. We'll use another ``for'' loop counting
9480up the value of @cite{2 n}. (Calc does have a summation command,
9481@kbd{a +}, but we'll use loops just to get more practice with them.)
9482
d7b8e6c6 9483@smallexample
5d67986c 9484@group
d7b8e6c6
EZ
94853: -0.5749 3: -0.5749 4: -0.5749 2: -0.5749
94862: 2 2: 1:6 3: 1:6 1: 2.3148e-3
94871: 40 1: 2 2: 2 .
9488 . . 1: 36.
9489 .
9490
5d67986c 9491 2 @key{RET} 40 Z ( @key{RET} k b @key{TAB} @key{RET} r 1 @key{TAB} ^ * /
d7b8e6c6 9492
d7b8e6c6 9493@end group
5d67986c 9494@end smallexample
d7b8e6c6 9495@noindent
d7b8e6c6 9496@smallexample
5d67986c 9497@group
d7b8e6c6
EZ
94983: -0.5749 3: -0.5772 2: -0.5772 1: -0.577215664892
94992: -0.5749 2: -0.5772 1: 0 .
95001: 2.3148e-3 1: -0.5749 .
9501 . .
9502
5d67986c 9503 @key{TAB} @key{RET} M-@key{TAB} - @key{RET} M-@key{TAB} a = Z / 2 Z ) Z ' C-x )
d7b8e6c6 9504@end group
5d67986c 9505@end smallexample
d7b8e6c6
EZ
9506
9507This is the value of @c{$-\gamma$}
9508@cite{- gamma}, with a slight bit of roundoff error.
9509To get a full 12 digits, let's use a higher precision:
9510
d7b8e6c6 9511@smallexample
5d67986c 9512@group
d7b8e6c6
EZ
95132: -0.577215664892 2: -0.577215664892
95141: 1. 1: -0.577215664901532
9515
5d67986c 9516 1. @key{RET} p 16 @key{RET} X
d7b8e6c6 9517@end group
5d67986c 9518@end smallexample
d7b8e6c6
EZ
9519
9520Here's the complete sequence of keystrokes:
9521
d7b8e6c6 9522@example
5d67986c 9523@group
d7b8e6c6 9524C-x ( Z ` s 1 0 t 2
5d67986c 9525 @key{RET} 5 a < Z [ 5 Z ( & s + 2 1 s + 1 1 Z ) r 1 Z ]
d7b8e6c6 9526 L r 1 2 * & - r 2 -
5d67986c
RS
9527 2 @key{RET} 40 Z ( @key{RET} k b @key{TAB} @key{RET} r 1 @key{TAB} ^ * /
9528 @key{TAB} @key{RET} M-@key{TAB} - @key{RET} M-@key{TAB} a = Z /
d7b8e6c6
EZ
9529 2 Z )
9530 Z '
9531C-x )
d7b8e6c6 9532@end group
5d67986c 9533@end example
d7b8e6c6
EZ
9534
9535@node Programming Answer 10, Programming Answer 11, Programming Answer 9, Answers to Exercises
9536@subsection Programming Tutorial Exercise 10
9537
9538@noindent
9539Taking the derivative of a term of the form @cite{x^n} will produce
9540a term like @c{$n x^{n-1}$}
9541@cite{n x^(n-1)}. Taking the derivative of a constant
9542produces zero. From this it is easy to see that the @cite{n}th
9543derivative of a polynomial, evaluated at @cite{x = 0}, will equal the
9544coefficient on the @cite{x^n} term times @cite{n!}.
9545
9546(Because this definition is long, it will be repeated in concise form
9547below. You can use @w{@kbd{M-# m}} to load it from there. While you are
9548entering a @kbd{Z ` Z '} body in a macro, Calc simply collects
9549keystrokes without executing them. In the following diagrams we'll
9550pretend Calc actually executed the keystrokes as you typed them,
9551just for purposes of illustration.)
9552
d7b8e6c6 9553@smallexample
5d67986c 9554@group
d7b8e6c6
EZ
95552: 5 x^4 + (x + 1)^2 3: 5 x^4 + (x + 1)^2
95561: 6 2: 0
9557 . 1: 6
9558 .
9559
5d67986c 9560 ' 5 x^4 + (x+1)^2 @key{RET} 6 C-x ( Z ` [ ] t 1 0 @key{TAB}
d7b8e6c6 9561@end group
5d67986c 9562@end smallexample
d7b8e6c6
EZ
9563
9564@noindent
9565Variable 1 will accumulate the vector of coefficients.
9566
d7b8e6c6 9567@smallexample
5d67986c 9568@group
d7b8e6c6
EZ
95692: 0 3: 0 2: 5 x^4 + ...
95701: 5 x^4 + ... 2: 5 x^4 + ... 1: 1
9571 . 1: 1 .
9572 .
9573
5d67986c 9574 Z ( @key{TAB} @key{RET} 0 s l x @key{RET} M-@key{TAB} ! / s | 1
d7b8e6c6 9575@end group
5d67986c 9576@end smallexample
d7b8e6c6
EZ
9577
9578@noindent
9579Note that @kbd{s | 1} appends the top-of-stack value to the vector
9580in a variable; it is completely analogous to @kbd{s + 1}. We could
5d67986c 9581have written instead, @kbd{r 1 @key{TAB} | t 1}.
d7b8e6c6 9582
d7b8e6c6 9583@smallexample
5d67986c 9584@group
d7b8e6c6
EZ
95851: 20 x^3 + 2 x + 2 1: 0 1: [1, 2, 1, 0, 5, 0, 0]
9586 . . .
9587
5d67986c 9588 a d x @key{RET} 1 Z ) @key{DEL} r 1 Z ' C-x )
d7b8e6c6 9589@end group
5d67986c 9590@end smallexample
d7b8e6c6
EZ
9591
9592To convert back, a simple method is just to map the coefficients
9593against a table of powers of @cite{x}.
9594
d7b8e6c6 9595@smallexample
5d67986c 9596@group
d7b8e6c6
EZ
95972: [1, 2, 1, 0, 5, 0, 0] 2: [1, 2, 1, 0, 5, 0, 0]
95981: 6 1: [0, 1, 2, 3, 4, 5, 6]
9599 . .
9600
5d67986c 9601 6 @key{RET} 1 + 0 @key{RET} 1 C-u v x
d7b8e6c6 9602
d7b8e6c6 9603@end group
5d67986c 9604@end smallexample
d7b8e6c6 9605@noindent
d7b8e6c6 9606@smallexample
5d67986c 9607@group
d7b8e6c6
EZ
96082: [1, 2, 1, 0, 5, 0, 0] 2: 1 + 2 x + x^2 + 5 x^4
96091: [1, x, x^2, x^3, ... ] .
9610 .
9611
5d67986c 9612 ' x @key{RET} @key{TAB} V M ^ *
d7b8e6c6 9613@end group
5d67986c 9614@end smallexample
d7b8e6c6
EZ
9615
9616Once again, here are the whole polynomial to/from vector programs:
9617
d7b8e6c6 9618@example
5d67986c
RS
9619@group
9620C-x ( Z ` [ ] t 1 0 @key{TAB}
9621 Z ( @key{TAB} @key{RET} 0 s l x @key{RET} M-@key{TAB} ! / s | 1
9622 a d x @key{RET}
d7b8e6c6
EZ
9623 1 Z ) r 1
9624 Z '
9625C-x )
9626
5d67986c 9627C-x ( 1 + 0 @key{RET} 1 C-u v x ' x @key{RET} @key{TAB} V M ^ * C-x )
d7b8e6c6 9628@end group
5d67986c 9629@end example
d7b8e6c6
EZ
9630
9631@node Programming Answer 11, Programming Answer 12, Programming Answer 10, Answers to Exercises
9632@subsection Programming Tutorial Exercise 11
9633
9634@noindent
9635First we define a dummy program to go on the @kbd{z s} key. The true
9636@w{@kbd{z s}} key is supposed to take two numbers from the stack and
5d67986c 9637return one number, so @key{DEL} as a dummy definition will make
d7b8e6c6
EZ
9638sure the stack comes out right.
9639
d7b8e6c6 9640@smallexample
5d67986c 9641@group
d7b8e6c6
EZ
96422: 4 1: 4 2: 4
96431: 2 . 1: 2
9644 . .
9645
5d67986c 9646 4 @key{RET} 2 C-x ( @key{DEL} C-x ) Z K s @key{RET} 2
d7b8e6c6 9647@end group
5d67986c 9648@end smallexample
d7b8e6c6
EZ
9649
9650The last step replaces the 2 that was eaten during the creation
9651of the dummy @kbd{z s} command. Now we move on to the real
9652definition. The recurrence needs to be rewritten slightly,
9653to the form @cite{s(n,m) = s(n-1,m-1) - (n-1) s(n-1,m)}.
9654
9655(Because this definition is long, it will be repeated in concise form
9656below. You can use @kbd{M-# m} to load it from there.)
9657
d7b8e6c6 9658@smallexample
5d67986c 9659@group
d7b8e6c6
EZ
96602: 4 4: 4 3: 4 2: 4
96611: 2 3: 2 2: 2 1: 2
9662 . 2: 4 1: 0 .
9663 1: 2 .
9664 .
9665
5d67986c 9666 C-x ( M-2 @key{RET} a = Z [ @key{DEL} @key{DEL} 1 Z :
d7b8e6c6 9667
d7b8e6c6 9668@end group
5d67986c 9669@end smallexample
d7b8e6c6 9670@noindent
d7b8e6c6 9671@smallexample
5d67986c 9672@group
d7b8e6c6
EZ
96734: 4 2: 4 2: 3 4: 3 4: 3 3: 3
96743: 2 1: 2 1: 2 3: 2 3: 2 2: 2
96752: 2 . . 2: 3 2: 3 1: 3
96761: 0 1: 2 1: 1 .
9677 . . .
9678
5d67986c 9679 @key{RET} 0 a = Z [ @key{DEL} @key{DEL} 0 Z : @key{TAB} 1 - @key{TAB} M-2 @key{RET} 1 - z s
d7b8e6c6 9680@end group
5d67986c 9681@end smallexample
d7b8e6c6
EZ
9682
9683@noindent
9684(Note that the value 3 that our dummy @kbd{z s} produces is not correct;
9685it is merely a placeholder that will do just as well for now.)
9686
d7b8e6c6 9687@smallexample
5d67986c 9688@group
d7b8e6c6
EZ
96893: 3 4: 3 3: 3 2: 3 1: -6
96902: 3 3: 3 2: 3 1: 9 .
96911: 2 2: 3 1: 3 .
9692 . 1: 2 .
9693 .
9694
5d67986c 9695 M-@key{TAB} M-@key{TAB} @key{TAB} @key{RET} M-@key{TAB} z s * -
d7b8e6c6 9696
d7b8e6c6 9697@end group
5d67986c 9698@end smallexample
d7b8e6c6 9699@noindent
d7b8e6c6 9700@smallexample
5d67986c 9701@group
d7b8e6c6
EZ
97021: -6 2: 4 1: 11 2: 11
9703 . 1: 2 . 1: 11
9704 . .
9705
5d67986c 9706 Z ] Z ] C-x ) Z K s @key{RET} @key{DEL} 4 @key{RET} 2 z s M-@key{RET} k s
d7b8e6c6 9707@end group
5d67986c 9708@end smallexample
d7b8e6c6
EZ
9709
9710Even though the result that we got during the definition was highly
9711bogus, once the definition is complete the @kbd{z s} command gets
9712the right answers.
9713
9714Here's the full program once again:
9715
d7b8e6c6 9716@example
5d67986c
RS
9717@group
9718C-x ( M-2 @key{RET} a =
9719 Z [ @key{DEL} @key{DEL} 1
9720 Z : @key{RET} 0 a =
9721 Z [ @key{DEL} @key{DEL} 0
9722 Z : @key{TAB} 1 - @key{TAB} M-2 @key{RET} 1 - z s
9723 M-@key{TAB} M-@key{TAB} @key{TAB} @key{RET} M-@key{TAB} z s * -
d7b8e6c6
EZ
9724 Z ]
9725 Z ]
9726C-x )
d7b8e6c6 9727@end group
5d67986c 9728@end example
d7b8e6c6
EZ
9729
9730You can read this definition using @kbd{M-# m} (@code{read-kbd-macro})
9731followed by @kbd{Z K s}, without having to make a dummy definition
9732first, because @code{read-kbd-macro} doesn't need to execute the
9733definition as it reads it in. For this reason, @code{M-# m} is often
9734the easiest way to create recursive programs in Calc.
9735
9736@node Programming Answer 12, , Programming Answer 11, Answers to Exercises
9737@subsection Programming Tutorial Exercise 12
9738
9739@noindent
9740This turns out to be a much easier way to solve the problem. Let's
9741denote Stirling numbers as calls of the function @samp{s}.
9742
9743First, we store the rewrite rules corresponding to the definition of
9744Stirling numbers in a convenient variable:
9745
9746@smallexample
5d67986c 9747s e StirlingRules @key{RET}
d7b8e6c6
EZ
9748[ s(n,n) := 1 :: n >= 0,
9749 s(n,0) := 0 :: n > 0,
9750 s(n,m) := s(n-1,m-1) - (n-1) s(n-1,m) :: n >= m :: m >= 1 ]
9751C-c C-c
9752@end smallexample
9753
9754Now, it's just a matter of applying the rules:
9755
d7b8e6c6 9756@smallexample
5d67986c 9757@group
d7b8e6c6
EZ
97582: 4 1: s(4, 2) 1: 11
97591: 2 . .
9760 .
9761
5d67986c 9762 4 @key{RET} 2 C-x ( ' s($$,$) @key{RET} a r StirlingRules @key{RET} C-x )
d7b8e6c6 9763@end group
5d67986c 9764@end smallexample
d7b8e6c6
EZ
9765
9766As in the case of the @code{fib} rules, it would be useful to put these
9767rules in @code{EvalRules} and to add a @samp{:: remember} condition to
9768the last rule.
9769
9770@c This ends the table-of-contents kludge from above:
9771@tex
9772\global\let\chapternofonts=\oldchapternofonts
9773@end tex
9774
9775@c [reference]
9776
9777@node Introduction, Data Types, Tutorial, Top
9778@chapter Introduction
9779
9780@noindent
9781This chapter is the beginning of the Calc reference manual.
9782It covers basic concepts such as the stack, algebraic and
9783numeric entry, undo, numeric prefix arguments, etc.
9784
9785@c [when-split]
9786@c (Chapter 2, the Tutorial, has been printed in a separate volume.)
9787
9788@menu
9789* Basic Commands::
9790* Help Commands::
9791* Stack Basics::
9792* Numeric Entry::
9793* Algebraic Entry::
9794* Quick Calculator::
9795* Keypad Mode::
9796* Prefix Arguments::
9797* Undo::
9798* Error Messages::
9799* Multiple Calculators::
9800* Troubleshooting Commands::
9801@end menu
9802
9803@node Basic Commands, Help Commands, Introduction, Introduction
9804@section Basic Commands
9805
9806@noindent
9807@pindex calc
9808@pindex calc-mode
9809@cindex Starting the Calculator
9810@cindex Running the Calculator
9811To start the Calculator in its standard interface, type @kbd{M-x calc}.
9812By default this creates a pair of small windows, @samp{*Calculator*}
9813and @samp{*Calc Trail*}. The former displays the contents of the
9814Calculator stack and is manipulated exclusively through Calc commands.
9815It is possible (though not usually necessary) to create several Calc
9816Mode buffers each of which has an independent stack, undo list, and
9817mode settings. There is exactly one Calc Trail buffer; it records a
9818list of the results of all calculations that have been done. The
9819Calc Trail buffer uses a variant of Calc Mode, so Calculator commands
9820still work when the trail buffer's window is selected. It is possible
9821to turn the trail window off, but the @samp{*Calc Trail*} buffer itself
9822still exists and is updated silently. @xref{Trail Commands}.@refill
9823
9824@kindex M-# c
9825@kindex M-# M-#
5d67986c
RS
9826@ignore
9827@mindex @null
9828@end ignore
d7b8e6c6
EZ
9829@kindex M-# #
9830In most installations, the @kbd{M-# c} key sequence is a more
9831convenient way to start the Calculator. Also, @kbd{M-# M-#} and
9832@kbd{M-# #} are synonyms for @kbd{M-# c} unless you last used Calc
9833in its ``keypad'' mode.
9834
9835@kindex x
9836@kindex M-x
9837@pindex calc-execute-extended-command
9838Most Calc commands use one or two keystrokes. Lower- and upper-case
9839letters are distinct. Commands may also be entered in full @kbd{M-x} form;
9840for some commands this is the only form. As a convenience, the @kbd{x}
9841key (@code{calc-execute-extended-command})
9842is like @kbd{M-x} except that it enters the initial string @samp{calc-}
9843for you. For example, the following key sequences are equivalent:
9844@kbd{S}, @kbd{M-x calc-sin @key{RET}}, @kbd{x sin @key{RET}}.@refill
9845
9846@cindex Extensions module
9847@cindex @file{calc-ext} module
9848The Calculator exists in many parts. When you type @kbd{M-# c}, the
9849Emacs ``auto-load'' mechanism will bring in only the first part, which
9850contains the basic arithmetic functions. The other parts will be
9851auto-loaded the first time you use the more advanced commands like trig
9852functions or matrix operations. This is done to improve the response time
9853of the Calculator in the common case when all you need to do is a
9854little arithmetic. If for some reason the Calculator fails to load an
9855extension module automatically, you can force it to load all the
9856extensions by using the @kbd{M-# L} (@code{calc-load-everything})
9857command. @xref{Mode Settings}.@refill
9858
9859If you type @kbd{M-x calc} or @kbd{M-# c} with any numeric prefix argument,
9860the Calculator is loaded if necessary, but it is not actually started.
9861If the argument is positive, the @file{calc-ext} extensions are also
9862loaded if necessary. User-written Lisp code that wishes to make use
9863of Calc's arithmetic routines can use @samp{(calc 0)} or @samp{(calc 1)}
9864to auto-load the Calculator.@refill
9865
9866@kindex M-# b
9867@pindex full-calc
9868If you type @kbd{M-# b}, then next time you use @kbd{M-# c} you
9869will get a Calculator that uses the full height of the Emacs screen.
9870When full-screen mode is on, @kbd{M-# c} runs the @code{full-calc}
9871command instead of @code{calc}. From the Unix shell you can type
9872@samp{emacs -f full-calc} to start a new Emacs specifically for use
9873as a calculator. When Calc is started from the Emacs command line
9874like this, Calc's normal ``quit'' commands actually quit Emacs itself.
9875
9876@kindex M-# o
9877@pindex calc-other-window
9878The @kbd{M-# o} command is like @kbd{M-# c} except that the Calc
9879window is not actually selected. If you are already in the Calc
9880window, @kbd{M-# o} switches you out of it. (The regular Emacs
9881@kbd{C-x o} command would also work for this, but it has a
9882tendency to drop you into the Calc Trail window instead, which
9883@kbd{M-# o} takes care not to do.)
9884
5d67986c
RS
9885@ignore
9886@mindex M-# q
9887@end ignore
d7b8e6c6
EZ
9888For one quick calculation, you can type @kbd{M-# q} (@code{quick-calc})
9889which prompts you for a formula (like @samp{2+3/4}). The result is
9890displayed at the bottom of the Emacs screen without ever creating
9891any special Calculator windows. @xref{Quick Calculator}.
9892
5d67986c
RS
9893@ignore
9894@mindex M-# k
9895@end ignore
d7b8e6c6
EZ
9896Finally, if you are using the X window system you may want to try
9897@kbd{M-# k} (@code{calc-keypad}) which runs Calc with a
9898``calculator keypad'' picture as well as a stack display. Click on
9899the keys with the mouse to operate the calculator. @xref{Keypad Mode}.
9900
9901@kindex q
9902@pindex calc-quit
9903@cindex Quitting the Calculator
9904@cindex Exiting the Calculator
9905The @kbd{q} key (@code{calc-quit}) exits Calc Mode and closes the
9906Calculator's window(s). It does not delete the Calculator buffers.
9907If you type @kbd{M-x calc} again, the Calculator will reappear with the
9908contents of the stack intact. Typing @kbd{M-# c} or @kbd{M-# M-#}
9909again from inside the Calculator buffer is equivalent to executing
9910@code{calc-quit}; you can think of @kbd{M-# M-#} as toggling the
9911Calculator on and off.@refill
9912
9913@kindex M-# x
9914The @kbd{M-# x} command also turns the Calculator off, no matter which
9915user interface (standard, Keypad, or Embedded) is currently active.
9916It also cancels @code{calc-edit} mode if used from there.
9917
5d67986c 9918@kindex d @key{SPC}
d7b8e6c6
EZ
9919@pindex calc-refresh
9920@cindex Refreshing a garbled display
9921@cindex Garbled displays, refreshing
5d67986c 9922The @kbd{d @key{SPC}} key sequence (@code{calc-refresh}) redraws the contents
d7b8e6c6
EZ
9923of the Calculator buffer from memory. Use this if the contents of the
9924buffer have been damaged somehow.
9925
5d67986c
RS
9926@ignore
9927@mindex o
9928@end ignore
d7b8e6c6
EZ
9929The @kbd{o} key (@code{calc-realign}) moves the cursor back to its
9930``home'' position at the bottom of the Calculator buffer.
9931
9932@kindex <
9933@kindex >
9934@pindex calc-scroll-left
9935@pindex calc-scroll-right
9936@cindex Horizontal scrolling
9937@cindex Scrolling
9938@cindex Wide text, scrolling
9939The @kbd{<} and @kbd{>} keys are bound to @code{calc-scroll-left} and
9940@code{calc-scroll-right}. These are just like the normal horizontal
9941scrolling commands except that they scroll one half-screen at a time by
9942default. (Calc formats its output to fit within the bounds of the
9943window whenever it can.)@refill
9944
9945@kindex @{
9946@kindex @}
9947@pindex calc-scroll-down
9948@pindex calc-scroll-up
9949@cindex Vertical scrolling
9950The @kbd{@{} and @kbd{@}} keys are bound to @code{calc-scroll-down}
9951and @code{calc-scroll-up}. They scroll up or down by one-half the
9952height of the Calc window.@refill
9953
9954@kindex M-# 0
9955@pindex calc-reset
9956The @kbd{M-# 0} command (@code{calc-reset}; that's @kbd{M-#} followed
9957by a zero) resets the Calculator to its default state. This clears
9958the stack, resets all the modes, clears the caches (@pxref{Caches}),
9959and so on. (It does @emph{not} erase the values of any variables.)
9960With a numeric prefix argument, @kbd{M-# 0} preserves the contents
9961of the stack but resets everything else.
9962
9963@pindex calc-version
9964The @kbd{M-x calc-version} command displays the current version number
9965of Calc and the name of the person who installed it on your system.
9966(This information is also present in the @samp{*Calc Trail*} buffer,
9967and in the output of the @kbd{h h} command.)
9968
9969@node Help Commands, Stack Basics, Basic Commands, Introduction
9970@section Help Commands
9971
9972@noindent
9973@cindex Help commands
9974@kindex ?
9975@pindex calc-help
9976The @kbd{?} key (@code{calc-help}) displays a series of brief help messages.
9977Some keys (such as @kbd{b} and @kbd{d}) are prefix keys, like Emacs'
9978@key{ESC} and @kbd{C-x} prefixes. You can type
9979@kbd{?} after a prefix to see a list of commands beginning with that
9980prefix. (If the message includes @samp{[MORE]}, press @kbd{?} again
9981to see additional commands for that prefix.)
9982
9983@kindex h h
9984@pindex calc-full-help
9985The @kbd{h h} (@code{calc-full-help}) command displays all the @kbd{?}
9986responses at once. When printed, this makes a nice, compact (three pages)
9987summary of Calc keystrokes.
9988
9989In general, the @kbd{h} key prefix introduces various commands that
9990provide help within Calc. Many of the @kbd{h} key functions are
9991Calc-specific analogues to the @kbd{C-h} functions for Emacs help.
9992
9993@kindex h i
9994@kindex M-# i
9995@kindex i
9996@pindex calc-info
9997The @kbd{h i} (@code{calc-info}) command runs the Emacs Info system
9998to read this manual on-line. This is basically the same as typing
9999@kbd{C-h i} (the regular way to run the Info system), then, if Info
10000is not already in the Calc manual, selecting the beginning of the
10001manual. The @kbd{M-# i} command is another way to read the Calc
10002manual; it is different from @kbd{h i} in that it works any time,
10003not just inside Calc. The plain @kbd{i} key is also equivalent to
10004@kbd{h i}, though this key is obsolete and may be replaced with a
10005different command in a future version of Calc.
10006
10007@kindex h t
10008@kindex M-# t
10009@pindex calc-tutorial
10010The @kbd{h t} (@code{calc-tutorial}) command runs the Info system on
10011the Tutorial section of the Calc manual. It is like @kbd{h i},
10012except that it selects the starting node of the tutorial rather
10013than the beginning of the whole manual. (It actually selects the
10014node ``Interactive Tutorial'' which tells a few things about
10015using the Info system before going on to the actual tutorial.)
10016The @kbd{M-# t} key is equivalent to @kbd{h t} (but it works at
10017all times).
10018
10019@kindex h s
10020@kindex M-# s
10021@pindex calc-info-summary
10022The @kbd{h s} (@code{calc-info-summary}) command runs the Info system
10023on the Summary node of the Calc manual. @xref{Summary}. The @kbd{M-# s}
10024key is equivalent to @kbd{h s}.
10025
10026@kindex h k
10027@pindex calc-describe-key
10028The @kbd{h k} (@code{calc-describe-key}) command looks up a key
10029sequence in the Calc manual. For example, @kbd{h k H a S} looks
10030up the documentation on the @kbd{H a S} (@code{calc-solve-for})
10031command. This works by looking up the textual description of
10032the key(s) in the Key Index of the manual, then jumping to the
10033node indicated by the index.
10034
10035Most Calc commands do not have traditional Emacs documentation
10036strings, since the @kbd{h k} command is both more convenient and
10037more instructive. This means the regular Emacs @kbd{C-h k}
10038(@code{describe-key}) command will not be useful for Calc keystrokes.
10039
10040@kindex h c
10041@pindex calc-describe-key-briefly
10042The @kbd{h c} (@code{calc-describe-key-briefly}) command reads a
10043key sequence and displays a brief one-line description of it at
10044the bottom of the screen. It looks for the key sequence in the
10045Summary node of the Calc manual; if it doesn't find the sequence
10046there, it acts just like its regular Emacs counterpart @kbd{C-h c}
10047(@code{describe-key-briefly}). For example, @kbd{h c H a S}
10048gives the description:
10049
10050@smallexample
10051H a S runs calc-solve-for: a `H a S' v => fsolve(a,v) (?=notes)
10052@end smallexample
10053
10054@noindent
10055which means the command @kbd{H a S} or @kbd{H M-x calc-solve-for}
10056takes a value @cite{a} from the stack, prompts for a value @cite{v},
10057then applies the algebraic function @code{fsolve} to these values.
10058The @samp{?=notes} message means you can now type @kbd{?} to see
10059additional notes from the summary that apply to this command.
10060
10061@kindex h f
10062@pindex calc-describe-function
10063The @kbd{h f} (@code{calc-describe-function}) command looks up an
10064algebraic function or a command name in the Calc manual. The
10065prompt initially contains @samp{calcFunc-}; follow this with an
10066algebraic function name to look up that function in the Function
10067Index. Or, backspace and enter a command name beginning with
10068@samp{calc-} to look it up in the Command Index. This command
10069will also look up operator symbols that can appear in algebraic
10070formulas, like @samp{%} and @samp{=>}.
10071
10072@kindex h v
10073@pindex calc-describe-variable
10074The @kbd{h v} (@code{calc-describe-variable}) command looks up a
10075variable in the Calc manual. The prompt initially contains the
10076@samp{var-} prefix; just add a variable name like @code{pi} or
10077@code{PlotRejects}.
10078
10079@kindex h b
10080@pindex describe-bindings
10081The @kbd{h b} (@code{calc-describe-bindings}) command is just like
10082@kbd{C-h b}, except that only local (Calc-related) key bindings are
10083listed.
10084
10085@kindex h n
10086The @kbd{h n} or @kbd{h C-n} (@code{calc-view-news}) command displays
10087the ``news'' or change history of Calc. This is kept in the file
10088@file{README}, which Calc looks for in the same directory as the Calc
10089source files.
10090
10091@kindex h C-c
10092@kindex h C-d
10093@kindex h C-w
10094The @kbd{h C-c}, @kbd{h C-d}, and @kbd{h C-w} keys display copying,
10095distribution, and warranty information about Calc. These work by
10096pulling up the appropriate parts of the ``Copying'' or ``Reporting
10097Bugs'' sections of the manual.
10098
10099@node Stack Basics, Numeric Entry, Help Commands, Introduction
10100@section Stack Basics
10101
10102@noindent
10103@cindex Stack basics
10104@c [fix-tut RPN Calculations and the Stack]
10105Calc uses RPN notation. If you are not familar with RPN, @pxref{RPN
10106Tutorial}.
10107
10108To add the numbers 1 and 2 in Calc you would type the keys:
10109@kbd{1 @key{RET} 2 +}.
10110(@key{RET} corresponds to the @key{ENTER} key on most calculators.)
10111The first three keystrokes ``push'' the numbers 1 and 2 onto the stack. The
10112@kbd{+} key always ``pops'' the top two numbers from the stack, adds them,
10113and pushes the result (3) back onto the stack. This number is ready for
10114further calculations: @kbd{5 -} pushes 5 onto the stack, then pops the
101153 and 5, subtracts them, and pushes the result (@i{-2}).@refill
10116
10117Note that the ``top'' of the stack actually appears at the @emph{bottom}
10118of the buffer. A line containing a single @samp{.} character signifies
10119the end of the buffer; Calculator commands operate on the number(s)
10120directly above this line. The @kbd{d t} (@code{calc-truncate-stack})
10121command allows you to move the @samp{.} marker up and down in the stack;
10122@pxref{Truncating the Stack}.
10123
10124@kindex d l
10125@pindex calc-line-numbering
10126Stack elements are numbered consecutively, with number 1 being the top of
10127the stack. These line numbers are ordinarily displayed on the lefthand side
10128of the window. The @kbd{d l} (@code{calc-line-numbering}) command controls
10129whether these numbers appear. (Line numbers may be turned off since they
10130slow the Calculator down a bit and also clutter the display.)
10131
10132@kindex o
10133@pindex calc-realign
10134The unshifted letter @kbd{o} (@code{calc-realign}) command repositions
10135the cursor to its top-of-stack ``home'' position. It also undoes any
10136horizontal scrolling in the window. If you give it a numeric prefix
10137argument, it instead moves the cursor to the specified stack element.
10138
10139The @key{RET} (or equivalent @key{SPC}) key is only required to separate
10140two consecutive numbers.
10141(After all, if you typed @kbd{1 2} by themselves the Calculator
5d67986c 10142would enter the number 12.) If you press @key{RET} or @key{SPC} @emph{not}
d7b8e6c6
EZ
10143right after typing a number, the key duplicates the number on the top of
10144the stack. @kbd{@key{RET} *} is thus a handy way to square a number.@refill
10145
10146The @key{DEL} key pops and throws away the top number on the stack.
10147The @key{TAB} key swaps the top two objects on the stack.
10148@xref{Stack and Trail}, for descriptions of these and other stack-related
10149commands.@refill
10150
10151@node Numeric Entry, Algebraic Entry, Stack Basics, Introduction
10152@section Numeric Entry
10153
10154@noindent
10155@kindex 0-9
10156@kindex .
10157@kindex e
10158@cindex Numeric entry
10159@cindex Entering numbers
10160Pressing a digit or other numeric key begins numeric entry using the
10161minibuffer. The number is pushed on the stack when you press the @key{RET}
10162or @key{SPC} keys. If you press any other non-numeric key, the number is
10163pushed onto the stack and the appropriate operation is performed. If
10164you press a numeric key which is not valid, the key is ignored.
10165
10166@cindex Minus signs
10167@cindex Negative numbers, entering
10168@kindex _
10169There are three different concepts corresponding to the word ``minus,''
10170typified by @cite{a-b} (subtraction), @cite{-x}
10171(change-sign), and @cite{-5} (negative number). Calc uses three
10172different keys for these operations, respectively:
10173@kbd{-}, @kbd{n}, and @kbd{_} (the underscore). The @kbd{-} key subtracts
10174the two numbers on the top of the stack. The @kbd{n} key changes the sign
10175of the number on the top of the stack or the number currently being entered.
10176The @kbd{_} key begins entry of a negative number or changes the sign of
10177the number currently being entered. The following sequences all enter the
10178number @i{-5} onto the stack: @kbd{0 @key{RET} 5 -}, @kbd{5 n @key{RET}},
10179@kbd{5 @key{RET} n}, @kbd{_ 5 @key{RET}}, @kbd{5 _ @key{RET}}.@refill
10180
10181Some other keys are active during numeric entry, such as @kbd{#} for
10182non-decimal numbers, @kbd{:} for fractions, and @kbd{@@} for HMS forms.
10183These notations are described later in this manual with the corresponding
10184data types. @xref{Data Types}.
10185
5d67986c 10186During numeric entry, the only editing key available is @key{DEL}.
d7b8e6c6
EZ
10187
10188@node Algebraic Entry, Quick Calculator, Numeric Entry, Introduction
10189@section Algebraic Entry
10190
10191@noindent
10192@kindex '
10193@pindex calc-algebraic-entry
10194@cindex Algebraic notation
10195@cindex Formulas, entering
10196Calculations can also be entered in algebraic form. This is accomplished
10197by typing the apostrophe key, @kbd{'}, followed by the expression in
10198standard format: @kbd{@key{'} 2+3*4 @key{RET}} computes
10199@c{$2+(3\times4) = 14$}
10200@cite{2+(3*4) = 14} and pushes that on the stack. If you wish you can
10201ignore the RPN aspect of Calc altogether and simply enter algebraic
10202expressions in this way. You may want to use @key{DEL} every so often to
10203clear previous results off the stack.@refill
10204
10205You can press the apostrophe key during normal numeric entry to switch
10206the half-entered number into algebraic entry mode. One reason to do this
10207would be to use the full Emacs cursor motion and editing keys, which are
10208available during algebraic entry but not during numeric entry.
10209
10210In the same vein, during either numeric or algebraic entry you can
10211press @kbd{`} (backquote) to switch to @code{calc-edit} mode, where
10212you complete your half-finished entry in a separate buffer.
10213@xref{Editing Stack Entries}.
10214
10215@kindex m a
10216@pindex calc-algebraic-mode
10217@cindex Algebraic mode
10218If you prefer algebraic entry, you can use the command @kbd{m a}
10219(@code{calc-algebraic-mode}) to set Algebraic mode. In this mode,
10220digits and other keys that would normally start numeric entry instead
10221start full algebraic entry; as long as your formula begins with a digit
10222you can omit the apostrophe. Open parentheses and square brackets also
10223begin algebraic entry. You can still do RPN calculations in this mode,
10224but you will have to press @key{RET} to terminate every number:
10225@kbd{2 @key{RET} 3 @key{RET} * 4 @key{RET} +} would accomplish the same
10226thing as @kbd{2*3+4 @key{RET}}.@refill
10227
10228@cindex Incomplete algebraic mode
10229If you give a numeric prefix argument like @kbd{C-u} to the @kbd{m a}
10230command, it enables Incomplete Algebraic mode; this is like regular
10231Algebraic mode except that it applies to the @kbd{(} and @kbd{[} keys
10232only. Numeric keys still begin a numeric entry in this mode.
10233
10234@kindex m t
10235@pindex calc-total-algebraic-mode
10236@cindex Total algebraic mode
10237The @kbd{m t} (@code{calc-total-algebraic-mode}) gives you an even
10238stronger algebraic-entry mode, in which @emph{all} regular letter and
10239punctuation keys begin algebraic entry. Use this if you prefer typing
10240@w{@kbd{sqrt( )}} instead of @kbd{Q}, @w{@kbd{factor( )}} instead of
10241@kbd{a f}, and so on. To type regular Calc commands when you are in
10242``total'' algebraic mode, hold down the @key{META} key. Thus @kbd{M-q}
10243is the command to quit Calc, @kbd{M-p} sets the precision, and
10244@kbd{M-m t} (or @kbd{M-m M-t}, if you prefer) turns total algebraic
10245mode back off again. Meta keys also terminate algebraic entry, so
5d67986c 10246that @kbd{2+3 M-S} is equivalent to @kbd{2+3 @key{RET} M-S}. The symbol
d7b8e6c6
EZ
10247@samp{Alg*} will appear in the mode line whenever you are in this mode.
10248
10249Pressing @kbd{'} (the apostrophe) a second time re-enters the previous
10250algebraic formula. You can then use the normal Emacs editing keys to
10251modify this formula to your liking before pressing @key{RET}.
10252
10253@kindex $
10254@cindex Formulas, referring to stack
10255Within a formula entered from the keyboard, the symbol @kbd{$}
10256represents the number on the top of the stack. If an entered formula
10257contains any @kbd{$} characters, the Calculator replaces the top of
10258stack with that formula rather than simply pushing the formula onto the
10259stack. Thus, @kbd{' 1+2 @key{RET}} pushes 3 on the stack, and @kbd{$*2
10260@key{RET}} replaces it with 6. Note that the @kbd{$} key always
10261initiates algebraic entry; the @kbd{'} is unnecessary if @kbd{$} is the
10262first character in the new formula.@refill
10263
10264Higher stack elements can be accessed from an entered formula with the
10265symbols @kbd{$$}, @kbd{$$$}, and so on. The number of stack elements
10266removed (to be replaced by the entered values) equals the number of dollar
10267signs in the longest such symbol in the formula. For example, @samp{$$+$$$}
10268adds the second and third stack elements, replacing the top three elements
10269with the answer. (All information about the top stack element is thus lost
10270since no single @samp{$} appears in this formula.)@refill
10271
10272A slightly different way to refer to stack elements is with a dollar
10273sign followed by a number: @samp{$1}, @samp{$2}, and so on are much
10274like @samp{$}, @samp{$$}, etc., except that stack entries referred
10275to numerically are not replaced by the algebraic entry. That is, while
10276@samp{$+1} replaces 5 on the stack with 6, @samp{$1+1} leaves the 5
10277on the stack and pushes an additional 6.
10278
10279If a sequence of formulas are entered separated by commas, each formula
10280is pushed onto the stack in turn. For example, @samp{1,2,3} pushes
10281those three numbers onto the stack (leaving the 3 at the top), and
10282@samp{$+1,$-1} replaces a 5 on the stack with 4 followed by 6. Also,
10283@samp{$,$$} exchanges the top two elements of the stack, just like the
10284@key{TAB} key.
10285
5d67986c 10286You can finish an algebraic entry with @kbd{M-=} or @kbd{M-@key{RET}} instead
d7b8e6c6
EZ
10287of @key{RET}. This uses @kbd{=} to evaluate the variables in each
10288formula that goes onto the stack. (Thus @kbd{' pi @key{RET}} pushes
5d67986c 10289the variable @samp{pi}, but @kbd{' pi M-@key{RET}} pushes 3.1415.)
d7b8e6c6 10290
5d67986c 10291If you finish your algebraic entry by pressing @key{LFD} (or @kbd{C-j})
d7b8e6c6
EZ
10292instead of @key{RET}, Calc disables the default simplifications
10293(as if by @kbd{m O}; @pxref{Simplification Modes}) while the entry
10294is being pushed on the stack. Thus @kbd{' 1+2 @key{RET}} pushes 3
10295on the stack, but @kbd{' 1+2 @key{LFD}} pushes the formula @cite{1+2};
10296you might then press @kbd{=} when it is time to evaluate this formula.
10297
10298@node Quick Calculator, Prefix Arguments, Algebraic Entry, Introduction
10299@section ``Quick Calculator'' Mode
10300
10301@noindent
10302@kindex M-# q
10303@pindex quick-calc
10304@cindex Quick Calculator
10305There is another way to invoke the Calculator if all you need to do
10306is make one or two quick calculations. Type @kbd{M-# q} (or
10307@kbd{M-x quick-calc}), then type any formula as an algebraic entry.
10308The Calculator will compute the result and display it in the echo
10309area, without ever actually putting up a Calc window.
10310
10311You can use the @kbd{$} character in a Quick Calculator formula to
10312refer to the previous Quick Calculator result. Older results are
10313not retained; the Quick Calculator has no effect on the full
10314Calculator's stack or trail. If you compute a result and then
10315forget what it was, just run @code{M-# q} again and enter
10316@samp{$} as the formula.
10317
10318If this is the first time you have used the Calculator in this Emacs
10319session, the @kbd{M-# q} command will create the @code{*Calculator*}
10320buffer and perform all the usual initializations; it simply will
10321refrain from putting that buffer up in a new window. The Quick
10322Calculator refers to the @code{*Calculator*} buffer for all mode
10323settings. Thus, for example, to set the precision that the Quick
10324Calculator uses, simply run the full Calculator momentarily and use
10325the regular @kbd{p} command.
10326
10327If you use @code{M-# q} from inside the Calculator buffer, the
10328effect is the same as pressing the apostrophe key (algebraic entry).
10329
10330The result of a Quick calculation is placed in the Emacs ``kill ring''
10331as well as being displayed. A subsequent @kbd{C-y} command will
10332yank the result into the editing buffer. You can also use this
10333to yank the result into the next @kbd{M-# q} input line as a more
10334explicit alternative to @kbd{$} notation, or to yank the result
10335into the Calculator stack after typing @kbd{M-# c}.
10336
10337If you finish your formula by typing @key{LFD} (or @kbd{C-j}) instead
10338of @key{RET}, the result is inserted immediately into the current
10339buffer rather than going into the kill ring.
10340
10341Quick Calculator results are actually evaluated as if by the @kbd{=}
10342key (which replaces variable names by their stored values, if any).
10343If the formula you enter is an assignment to a variable using the
10344@samp{:=} operator, say, @samp{foo := 2 + 3} or @samp{foo := foo + 1},
10345then the result of the evaluation is stored in that Calc variable.
10346@xref{Store and Recall}.
10347
10348If the result is an integer and the current display radix is decimal,
10349the number will also be displayed in hex and octal formats. If the
10350integer is in the range from 1 to 126, it will also be displayed as
10351an ASCII character.
10352
10353For example, the quoted character @samp{"x"} produces the vector
10354result @samp{[120]} (because 120 is the ASCII code of the lower-case
10355`x'; @pxref{Strings}). Since this is a vector, not an integer, it
10356is displayed only according to the current mode settings. But
10357running Quick Calc again and entering @samp{120} will produce the
10358result @samp{120 (16#78, 8#170, x)} which shows the number in its
10359decimal, hexadecimal, octal, and ASCII forms.
10360
10361Please note that the Quick Calculator is not any faster at loading
10362or computing the answer than the full Calculator; the name ``quick''
10363merely refers to the fact that it's much less hassle to use for
10364small calculations.
10365
10366@node Prefix Arguments, Undo, Quick Calculator, Introduction
10367@section Numeric Prefix Arguments
10368
10369@noindent
10370Many Calculator commands use numeric prefix arguments. Some, such as
10371@kbd{d s} (@code{calc-sci-notation}), set a parameter to the value of
10372the prefix argument or use a default if you don't use a prefix.
10373Others (like @kbd{d f} (@code{calc-fix-notation})) require an argument
10374and prompt for a number if you don't give one as a prefix.@refill
10375
10376As a rule, stack-manipulation commands accept a numeric prefix argument
10377which is interpreted as an index into the stack. A positive argument
10378operates on the top @var{n} stack entries; a negative argument operates
10379on the @var{n}th stack entry in isolation; and a zero argument operates
10380on the entire stack.
10381
10382Most commands that perform computations (such as the arithmetic and
10383scientific functions) accept a numeric prefix argument that allows the
10384operation to be applied across many stack elements. For unary operations
10385(that is, functions of one argument like absolute value or complex
10386conjugate), a positive prefix argument applies that function to the top
10387@var{n} stack entries simultaneously, and a negative argument applies it
10388to the @var{n}th stack entry only. For binary operations (functions of
10389two arguments like addition, GCD, and vector concatenation), a positive
10390prefix argument ``reduces'' the function across the top @var{n}
10391stack elements (for example, @kbd{C-u 5 +} sums the top 5 stack entries;
10392@pxref{Reducing and Mapping}), and a negative argument maps the next-to-top
10393@var{n} stack elements with the top stack element as a second argument
10394(for example, @kbd{7 c-u -5 +} adds 7 to the top 5 stack elements).
10395This feature is not available for operations which use the numeric prefix
10396argument for some other purpose.
10397
10398Numeric prefixes are specified the same way as always in Emacs: Press
10399a sequence of @key{META}-digits, or press @key{ESC} followed by digits,
10400or press @kbd{C-u} followed by digits. Some commands treat plain
10401@kbd{C-u} (without any actual digits) specially.@refill
10402
10403@kindex ~
10404@pindex calc-num-prefix
10405You can type @kbd{~} (@code{calc-num-prefix}) to pop an integer from the
10406top of the stack and enter it as the numeric prefix for the next command.
10407For example, @kbd{C-u 16 p} sets the precision to 16 digits; an alternate
10408(silly) way to do this would be @kbd{2 @key{RET} 4 ^ ~ p}, i.e., compute 2
10409to the fourth power and set the precision to that value.@refill
10410
10411Conversely, if you have typed a numeric prefix argument the @kbd{~} key
10412pushes it onto the stack in the form of an integer.
10413
10414@node Undo, Error Messages, Prefix Arguments, Introduction
10415@section Undoing Mistakes
10416
10417@noindent
10418@kindex U
10419@kindex C-_
10420@pindex calc-undo
10421@cindex Mistakes, undoing
10422@cindex Undoing mistakes
10423@cindex Errors, undoing
10424The shift-@kbd{U} key (@code{calc-undo}) undoes the most recent operation.
10425If that operation added or dropped objects from the stack, those objects
10426are removed or restored. If it was a ``store'' operation, you are
10427queried whether or not to restore the variable to its original value.
10428The @kbd{U} key may be pressed any number of times to undo successively
10429farther back in time; with a numeric prefix argument it undoes a
10430specified number of operations. The undo history is cleared only by the
10431@kbd{q} (@code{calc-quit}) command. (Recall that @kbd{M-# c} is
10432synonymous with @code{calc-quit} while inside the Calculator; this
10433also clears the undo history.)
10434
10435Currently the mode-setting commands (like @code{calc-precision}) are not
10436undoable. You can undo past a point where you changed a mode, but you
10437will need to reset the mode yourself.
10438
10439@kindex D
10440@pindex calc-redo
10441@cindex Redoing after an Undo
10442The shift-@kbd{D} key (@code{calc-redo}) redoes an operation that was
10443mistakenly undone. Pressing @kbd{U} with a negative prefix argument is
10444equivalent to executing @code{calc-redo}. You can redo any number of
10445times, up to the number of recent consecutive undo commands. Redo
10446information is cleared whenever you give any command that adds new undo
10447information, i.e., if you undo, then enter a number on the stack or make
10448any other change, then it will be too late to redo.
10449
5d67986c 10450@kindex M-@key{RET}
d7b8e6c6
EZ
10451@pindex calc-last-args
10452@cindex Last-arguments feature
10453@cindex Arguments, restoring
10454The @kbd{M-@key{RET}} key (@code{calc-last-args}) is like undo in that
10455it restores the arguments of the most recent command onto the stack;
10456however, it does not remove the result of that command. Given a numeric
10457prefix argument, this command applies to the @cite{n}th most recent
10458command which removed items from the stack; it pushes those items back
10459onto the stack.
10460
10461The @kbd{K} (@code{calc-keep-args}) command provides a related function
10462to @kbd{M-@key{RET}}. @xref{Stack and Trail}.
10463
10464It is also possible to recall previous results or inputs using the trail.
10465@xref{Trail Commands}.
10466
10467The standard Emacs @kbd{C-_} undo key is recognized as a synonym for @kbd{U}.
10468
10469@node Error Messages, Multiple Calculators, Undo, Introduction
10470@section Error Messages
10471
10472@noindent
10473@kindex w
10474@pindex calc-why
10475@cindex Errors, messages
10476@cindex Why did an error occur?
10477Many situations that would produce an error message in other calculators
10478simply create unsimplified formulas in the Emacs Calculator. For example,
10479@kbd{1 @key{RET} 0 /} pushes the formula @cite{1 / 0}; @w{@kbd{0 L}} pushes
10480the formula @samp{ln(0)}. Floating-point overflow and underflow are also
10481reasons for this to happen.
10482
10483When a function call must be left in symbolic form, Calc usually
10484produces a message explaining why. Messages that are probably
10485surprising or indicative of user errors are displayed automatically.
10486Other messages are simply kept in Calc's memory and are displayed only
10487if you type @kbd{w} (@code{calc-why}). You can also press @kbd{w} if
10488the same computation results in several messages. (The first message
10489will end with @samp{[w=more]} in this case.)
10490
10491@kindex d w
10492@pindex calc-auto-why
10493The @kbd{d w} (@code{calc-auto-why}) command controls when error messages
10494are displayed automatically. (Calc effectively presses @kbd{w} for you
10495after your computation finishes.) By default, this occurs only for
10496``important'' messages. The other possible modes are to report
10497@emph{all} messages automatically, or to report none automatically (so
10498that you must always press @kbd{w} yourself to see the messages).
10499
10500@node Multiple Calculators, Troubleshooting Commands, Error Messages, Introduction
10501@section Multiple Calculators
10502
10503@noindent
10504@pindex another-calc
10505It is possible to have any number of Calc Mode buffers at once.
10506Usually this is done by executing @kbd{M-x another-calc}, which
10507is similar to @kbd{M-# c} except that if a @samp{*Calculator*}
10508buffer already exists, a new, independent one with a name of the
10509form @samp{*Calculator*<@var{n}>} is created. You can also use the
10510command @code{calc-mode} to put any buffer into Calculator mode, but
10511this would ordinarily never be done.
10512
10513The @kbd{q} (@code{calc-quit}) command does not destroy a Calculator buffer;
10514it only closes its window. Use @kbd{M-x kill-buffer} to destroy a
10515Calculator buffer.
10516
10517Each Calculator buffer keeps its own stack, undo list, and mode settings
10518such as precision, angular mode, and display formats. In Emacs terms,
10519variables such as @code{calc-stack} are buffer-local variables. The
10520global default values of these variables are used only when a new
10521Calculator buffer is created. The @code{calc-quit} command saves
10522the stack and mode settings of the buffer being quit as the new defaults.
10523
10524There is only one trail buffer, @samp{*Calc Trail*}, used by all
10525Calculator buffers.
10526
10527@node Troubleshooting Commands, , Multiple Calculators, Introduction
10528@section Troubleshooting Commands
10529
10530@noindent
10531This section describes commands you can use in case a computation
10532incorrectly fails or gives the wrong answer.
10533
10534@xref{Reporting Bugs}, if you find a problem that appears to be due
10535to a bug or deficiency in Calc.
10536
10537@menu
10538* Autoloading Problems::
10539* Recursion Depth::
10540* Caches::
10541* Debugging Calc::
10542@end menu
10543
10544@node Autoloading Problems, Recursion Depth, Troubleshooting Commands, Troubleshooting Commands
10545@subsection Autoloading Problems
10546
10547@noindent
10548The Calc program is split into many component files; components are
10549loaded automatically as you use various commands that require them.
10550Occasionally Calc may lose track of when a certain component is
10551necessary; typically this means you will type a command and it won't
10552work because some function you've never heard of was undefined.
10553
10554@kindex M-# L
10555@pindex calc-load-everything
10556If this happens, the easiest workaround is to type @kbd{M-# L}
10557(@code{calc-load-everything}) to force all the parts of Calc to be
10558loaded right away. This will cause Emacs to take up a lot more
10559memory than it would otherwise, but it's guaranteed to fix the problem.
10560
10561If you seem to run into this problem no matter what you do, or if
10562even the @kbd{M-# L} command crashes, Calc may have been improperly
10563installed. @xref{Installation}, for details of the installation
10564process.
10565
10566@node Recursion Depth, Caches, Autoloading Problems, Troubleshooting Commands
10567@subsection Recursion Depth
10568
10569@noindent
10570@kindex M
10571@kindex I M
10572@pindex calc-more-recursion-depth
10573@pindex calc-less-recursion-depth
10574@cindex Recursion depth
10575@cindex ``Computation got stuck'' message
10576@cindex @code{max-lisp-eval-depth}
10577@cindex @code{max-specpdl-size}
10578Calc uses recursion in many of its calculations. Emacs Lisp keeps a
10579variable @code{max-lisp-eval-depth} which limits the amount of recursion
10580possible in an attempt to recover from program bugs. If a calculation
10581ever halts incorrectly with the message ``Computation got stuck or
10582ran too long,'' use the @kbd{M} command (@code{calc-more-recursion-depth})
10583to increase this limit. (Of course, this will not help if the
10584calculation really did get stuck due to some problem inside Calc.)@refill
10585
10586The limit is always increased (multiplied) by a factor of two. There
10587is also an @kbd{I M} (@code{calc-less-recursion-depth}) command which
10588decreases this limit by a factor of two, down to a minimum value of 200.
10589The default value is 1000.
10590
10591These commands also double or halve @code{max-specpdl-size}, another
10592internal Lisp recursion limit. The minimum value for this limit is 600.
10593
10594@node Caches, Debugging Calc, Recursion Depth, Troubleshooting Commands
10595@subsection Caches
10596
10597@noindent
10598@cindex Caches
10599@cindex Flushing caches
10600Calc saves certain values after they have been computed once. For
10601example, the @kbd{P} (@code{calc-pi}) command initially ``knows'' the
10602constant @c{$\pi$}
10603@cite{pi} to about 20 decimal places; if the current precision
10604is greater than this, it will recompute @c{$\pi$}
10605@cite{pi} using a series
10606approximation. This value will not need to be recomputed ever again
10607unless you raise the precision still further. Many operations such as
10608logarithms and sines make use of similarly cached values such as
10609@c{$\pi \over 4$}
10610@cite{pi/4} and @c{$\ln 2$}
10611@cite{ln(2)}. The visible effect of caching is that
10612high-precision computations may seem to do extra work the first time.
10613Other things cached include powers of two (for the binary arithmetic
10614functions), matrix inverses and determinants, symbolic integrals, and
10615data points computed by the graphing commands.
10616
10617@pindex calc-flush-caches
10618If you suspect a Calculator cache has become corrupt, you can use the
10619@code{calc-flush-caches} command to reset all caches to the empty state.
10620(This should only be necessary in the event of bugs in the Calculator.)
10621The @kbd{M-# 0} (with the zero key) command also resets caches along
10622with all other aspects of the Calculator's state.
10623
10624@node Debugging Calc, , Caches, Troubleshooting Commands
10625@subsection Debugging Calc
10626
10627@noindent
10628A few commands exist to help in the debugging of Calc commands.
10629@xref{Programming}, to see the various ways that you can write
10630your own Calc commands.
10631
10632@kindex Z T
10633@pindex calc-timing
10634The @kbd{Z T} (@code{calc-timing}) command turns on and off a mode
10635in which the timing of slow commands is reported in the Trail.
10636Any Calc command that takes two seconds or longer writes a line
10637to the Trail showing how many seconds it took. This value is
10638accurate only to within one second.
10639
10640All steps of executing a command are included; in particular, time
10641taken to format the result for display in the stack and trail is
10642counted. Some prompts also count time taken waiting for them to
10643be answered, while others do not; this depends on the exact
10644implementation of the command. For best results, if you are timing
10645a sequence that includes prompts or multiple commands, define a
10646keyboard macro to run the whole sequence at once. Calc's @kbd{X}
10647command (@pxref{Keyboard Macros}) will then report the time taken
10648to execute the whole macro.
10649
10650Another advantage of the @kbd{X} command is that while it is
10651executing, the stack and trail are not updated from step to step.
10652So if you expect the output of your test sequence to leave a result
10653that may take a long time to format and you don't wish to count
10654this formatting time, end your sequence with a @key{DEL} keystroke
10655to clear the result from the stack. When you run the sequence with
10656@kbd{X}, Calc will never bother to format the large result.
10657
10658Another thing @kbd{Z T} does is to increase the Emacs variable
10659@code{gc-cons-threshold} to a much higher value (two million; the
10660usual default in Calc is 250,000) for the duration of each command.
10661This generally prevents garbage collection during the timing of
10662the command, though it may cause your Emacs process to grow
10663abnormally large. (Garbage collection time is a major unpredictable
10664factor in the timing of Emacs operations.)
10665
10666Another command that is useful when debugging your own Lisp
10667extensions to Calc is @kbd{M-x calc-pass-errors}, which disables
10668the error handler that changes the ``@code{max-lisp-eval-depth}
10669exceeded'' message to the much more friendly ``Computation got
10670stuck or ran too long.'' This handler interferes with the Emacs
10671Lisp debugger's @code{debug-on-error} mode. Errors are reported
10672in the handler itself rather than at the true location of the
10673error. After you have executed @code{calc-pass-errors}, Lisp
10674errors will be reported correctly but the user-friendly message
10675will be lost.
10676
10677@node Data Types, Stack and Trail, Introduction, Top
10678@chapter Data Types
10679
10680@noindent
10681This chapter discusses the various types of objects that can be placed
10682on the Calculator stack, how they are displayed, and how they are
10683entered. (@xref{Data Type Formats}, for information on how these data
10684types are represented as underlying Lisp objects.)@refill
10685
10686Integers, fractions, and floats are various ways of describing real
10687numbers. HMS forms also for many purposes act as real numbers. These
10688types can be combined to form complex numbers, modulo forms, error forms,
10689or interval forms. (But these last four types cannot be combined
10690arbitrarily:@: error forms may not contain modulo forms, for example.)
10691Finally, all these types of numbers may be combined into vectors,
10692matrices, or algebraic formulas.
10693
10694@menu
10695* Integers:: The most basic data type.
10696* Fractions:: This and above are called @dfn{rationals}.
10697* Floats:: This and above are called @dfn{reals}.
10698* Complex Numbers:: This and above are called @dfn{numbers}.
10699* Infinities::
10700* Vectors and Matrices::
10701* Strings::
10702* HMS Forms::
10703* Date Forms::
10704* Modulo Forms::
10705* Error Forms::
10706* Interval Forms::
10707* Incomplete Objects::
10708* Variables::
10709* Formulas::
10710@end menu
10711
10712@node Integers, Fractions, Data Types, Data Types
10713@section Integers
10714
10715@noindent
10716@cindex Integers
10717The Calculator stores integers to arbitrary precision. Addition,
10718subtraction, and multiplication of integers always yields an exact
10719integer result. (If the result of a division or exponentiation of
10720integers is not an integer, it is expressed in fractional or
10721floating-point form according to the current Fraction Mode.
10722@xref{Fraction Mode}.)
10723
10724A decimal integer is represented as an optional sign followed by a
10725sequence of digits. Grouping (@pxref{Grouping Digits}) can be used to
10726insert a comma at every third digit for display purposes, but you
10727must not type commas during the entry of numbers.@refill
10728
10729@kindex #
10730A non-decimal integer is represented as an optional sign, a radix
10731between 2 and 36, a @samp{#} symbol, and one or more digits. For radix 11
10732and above, the letters A through Z (upper- or lower-case) count as
10733digits and do not terminate numeric entry mode. @xref{Radix Modes}, for how
10734to set the default radix for display of integers. Numbers of any radix
10735may be entered at any time. If you press @kbd{#} at the beginning of a
10736number, the current display radix is used.@refill
10737
10738@node Fractions, Floats, Integers, Data Types
10739@section Fractions
10740
10741@noindent
10742@cindex Fractions
10743A @dfn{fraction} is a ratio of two integers. Fractions are traditionally
10744written ``2/3'' but Calc uses the notation @samp{2:3}. (The @kbd{/} key
10745performs RPN division; the following two sequences push the number
10746@samp{2:3} on the stack: @kbd{2 :@: 3 @key{RET}}, or @kbd{2 @key{RET} 3 /}
10747assuming Fraction Mode has been enabled.)
10748When the Calculator produces a fractional result it always reduces it to
10749simplest form, which may in fact be an integer.@refill
10750
10751Fractions may also be entered in a three-part form, where @samp{2:3:4}
10752represents two-and-three-quarters. @xref{Fraction Formats}, for fraction
10753display formats.@refill
10754
10755Non-decimal fractions are entered and displayed as
10756@samp{@var{radix}#@var{num}:@var{denom}} (or in the analogous three-part
10757form). The numerator and denominator always use the same radix.@refill
10758
10759@node Floats, Complex Numbers, Fractions, Data Types
10760@section Floats
10761
10762@noindent
10763@cindex Floating-point numbers
10764A floating-point number or @dfn{float} is a number stored in scientific
10765notation. The number of significant digits in the fractional part is
10766governed by the current floating precision (@pxref{Precision}). The
10767range of acceptable values is from @c{$10^{-3999999}$}
10768@cite{10^-3999999} (inclusive)
10769to @c{$10^{4000000}$}
10770@cite{10^4000000}
10771(exclusive), plus the corresponding negative
10772values and zero.
10773
10774Calculations that would exceed the allowable range of values (such
10775as @samp{exp(exp(20))}) are left in symbolic form by Calc. The
10776messages ``floating-point overflow'' or ``floating-point underflow''
10777indicate that during the calculation a number would have been produced
10778that was too large or too close to zero, respectively, to be represented
10779by Calc. This does not necessarily mean the final result would have
10780overflowed, just that an overflow occurred while computing the result.
10781(In fact, it could report an underflow even though the final result
10782would have overflowed!)
10783
10784If a rational number and a float are mixed in a calculation, the result
10785will in general be expressed as a float. Commands that require an integer
10786value (such as @kbd{k g} [@code{gcd}]) will also accept integer-valued
10787floats, i.e., floating-point numbers with nothing after the decimal point.
10788
10789Floats are identified by the presence of a decimal point and/or an
10790exponent. In general a float consists of an optional sign, digits
10791including an optional decimal point, and an optional exponent consisting
10792of an @samp{e}, an optional sign, and up to seven exponent digits.
10793For example, @samp{23.5e-2} is 23.5 times ten to the minus-second power,
10794or 0.235.
10795
10796Floating-point numbers are normally displayed in decimal notation with
10797all significant figures shown. Exceedingly large or small numbers are
10798displayed in scientific notation. Various other display options are
10799available. @xref{Float Formats}.
10800
10801@cindex Accuracy of calculations
10802Floating-point numbers are stored in decimal, not binary. The result
10803of each operation is rounded to the nearest value representable in the
10804number of significant digits specified by the current precision,
10805rounding away from zero in the case of a tie. Thus (in the default
10806display mode) what you see is exactly what you get. Some operations such
10807as square roots and transcendental functions are performed with several
10808digits of extra precision and then rounded down, in an effort to make the
10809final result accurate to the full requested precision. However,
10810accuracy is not rigorously guaranteed. If you suspect the validity of a
10811result, try doing the same calculation in a higher precision. The
10812Calculator's arithmetic is not intended to be IEEE-conformant in any
10813way.@refill
10814
10815While floats are always @emph{stored} in decimal, they can be entered
10816and displayed in any radix just like integers and fractions. The
10817notation @samp{@var{radix}#@var{ddd}.@var{ddd}} is a floating-point
10818number whose digits are in the specified radix. Note that the @samp{.}
10819is more aptly referred to as a ``radix point'' than as a decimal
10820point in this case. The number @samp{8#123.4567} is defined as
10821@samp{8#1234567 * 8^-4}. If the radix is 14 or less, you can use
10822@samp{e} notation to write a non-decimal number in scientific notation.
10823The exponent is written in decimal, and is considered to be a power
10824of the radix: @samp{8#1234567e-4}. If the radix is 15 or above, the
10825letter @samp{e} is a digit, so scientific notation must be written
10826out, e.g., @samp{16#123.4567*16^2}. The first two exercises of the
10827Modes Tutorial explore some of the properties of non-decimal floats.
10828
10829@node Complex Numbers, Infinities, Floats, Data Types
10830@section Complex Numbers
10831
10832@noindent
10833@cindex Complex numbers
10834There are two supported formats for complex numbers: rectangular and
10835polar. The default format is rectangular, displayed in the form
10836@samp{(@var{real},@var{imag})} where @var{real} is the real part and
10837@var{imag} is the imaginary part, each of which may be any real number.
10838Rectangular complex numbers can also be displayed in @samp{@var{a}+@var{b}i}
10839notation; @pxref{Complex Formats}.@refill
10840
10841Polar complex numbers are displayed in the form `@t{(}@var{r}@t{;}@c{$\theta$}
10842@var{theta}@t{)}'
10843where @var{r} is the nonnegative magnitude and @c{$\theta$}
10844@var{theta} is the argument
10845or phase angle. The range of @c{$\theta$}
10846@var{theta} depends on the current angular
10847mode (@pxref{Angular Modes}); it is generally between @i{-180} and
10848@i{+180} degrees or the equivalent range in radians.@refill
10849
10850Complex numbers are entered in stages using incomplete objects.
10851@xref{Incomplete Objects}.
10852
10853Operations on rectangular complex numbers yield rectangular complex
10854results, and similarly for polar complex numbers. Where the two types
10855are mixed, or where new complex numbers arise (as for the square root of
10856a negative real), the current @dfn{Polar Mode} is used to determine the
10857type. @xref{Polar Mode}.
10858
10859A complex result in which the imaginary part is zero (or the phase angle
10860is 0 or 180 degrees or @c{$\pi$}
10861@cite{pi} radians) is automatically converted to a real
10862number.
10863
10864@node Infinities, Vectors and Matrices, Complex Numbers, Data Types
10865@section Infinities
10866
10867@noindent
10868@cindex Infinity
10869@cindex @code{inf} variable
10870@cindex @code{uinf} variable
10871@cindex @code{nan} variable
10872@vindex inf
10873@vindex uinf
10874@vindex nan
10875The word @code{inf} represents the mathematical concept of @dfn{infinity}.
10876Calc actually has three slightly different infinity-like values:
10877@code{inf}, @code{uinf}, and @code{nan}. These are just regular
10878variable names (@pxref{Variables}); you should avoid using these
10879names for your own variables because Calc gives them special
10880treatment. Infinities, like all variable names, are normally
10881entered using algebraic entry.
10882
10883Mathematically speaking, it is not rigorously correct to treat
10884``infinity'' as if it were a number, but mathematicians often do
10885so informally. When they say that @samp{1 / inf = 0}, what they
10886really mean is that @cite{1 / x}, as @cite{x} becomes larger and
10887larger, becomes arbitrarily close to zero. So you can imagine
10888that if @cite{x} got ``all the way to infinity,'' then @cite{1 / x}
10889would go all the way to zero. Similarly, when they say that
10890@samp{exp(inf) = inf}, they mean that @c{$e^x$}
10891@cite{exp(x)} grows without
10892bound as @cite{x} grows. The symbol @samp{-inf} likewise stands
10893for an infinitely negative real value; for example, we say that
10894@samp{exp(-inf) = 0}. You can have an infinity pointing in any
10895direction on the complex plane: @samp{sqrt(-inf) = i inf}.
10896
10897The same concept of limits can be used to define @cite{1 / 0}. We
10898really want the value that @cite{1 / x} approaches as @cite{x}
10899approaches zero. But if all we have is @cite{1 / 0}, we can't
10900tell which direction @cite{x} was coming from. If @cite{x} was
10901positive and decreasing toward zero, then we should say that
10902@samp{1 / 0 = inf}. But if @cite{x} was negative and increasing
10903toward zero, the answer is @samp{1 / 0 = -inf}. In fact, @cite{x}
10904could be an imaginary number, giving the answer @samp{i inf} or
10905@samp{-i inf}. Calc uses the special symbol @samp{uinf} to mean
10906@dfn{undirected infinity}, i.e., a value which is infinitely
10907large but with an unknown sign (or direction on the complex plane).
10908
10909Calc actually has three modes that say how infinities are handled.
10910Normally, infinities never arise from calculations that didn't
10911already have them. Thus, @cite{1 / 0} is treated simply as an
10912error and left unevaluated. The @kbd{m i} (@code{calc-infinite-mode})
10913command (@pxref{Infinite Mode}) enables a mode in which
10914@cite{1 / 0} evaluates to @code{uinf} instead. There is also
10915an alternative type of infinite mode which says to treat zeros
10916as if they were positive, so that @samp{1 / 0 = inf}. While this
10917is less mathematically correct, it may be the answer you want in
10918some cases.
10919
10920Since all infinities are ``as large'' as all others, Calc simplifies,
10921e.g., @samp{5 inf} to @samp{inf}. Another example is
10922@samp{5 - inf = -inf}, where the @samp{-inf} is so large that
10923adding a finite number like five to it does not affect it.
10924Note that @samp{a - inf} also results in @samp{-inf}; Calc assumes
10925that variables like @code{a} always stand for finite quantities.
10926Just to show that infinities really are all the same size,
10927note that @samp{sqrt(inf) = inf^2 = exp(inf) = inf} in Calc's
10928notation.
10929
10930It's not so easy to define certain formulas like @samp{0 * inf} and
10931@samp{inf / inf}. Depending on where these zeros and infinities
10932came from, the answer could be literally anything. The latter
10933formula could be the limit of @cite{x / x} (giving a result of one),
10934or @cite{2 x / x} (giving two), or @cite{x^2 / x} (giving @code{inf}),
10935or @cite{x / x^2} (giving zero). Calc uses the symbol @code{nan}
10936to represent such an @dfn{indeterminate} value. (The name ``nan''
10937comes from analogy with the ``NAN'' concept of IEEE standard
10938arithmetic; it stands for ``Not A Number.'' This is somewhat of a
10939misnomer, since @code{nan} @emph{does} stand for some number or
10940infinity, it's just that @emph{which} number it stands for
10941cannot be determined.) In Calc's notation, @samp{0 * inf = nan}
10942and @samp{inf / inf = nan}. A few other common indeterminate
10943expressions are @samp{inf - inf} and @samp{inf ^ 0}. Also,
10944@samp{0 / 0 = nan} if you have turned on ``infinite mode''
10945(as described above).
10946
10947Infinities are especially useful as parts of @dfn{intervals}.
10948@xref{Interval Forms}.
10949
10950@node Vectors and Matrices, Strings, Infinities, Data Types
10951@section Vectors and Matrices
10952
10953@noindent
10954@cindex Vectors
10955@cindex Plain vectors
10956@cindex Matrices
10957The @dfn{vector} data type is flexible and general. A vector is simply a
10958list of zero or more data objects. When these objects are numbers, the
10959whole is a vector in the mathematical sense. When these objects are
10960themselves vectors of equal (nonzero) length, the whole is a @dfn{matrix}.
10961A vector which is not a matrix is referred to here as a @dfn{plain vector}.
10962
10963A vector is displayed as a list of values separated by commas and enclosed
10964in square brackets: @samp{[1, 2, 3]}. Thus the following is a 2 row by
109653 column matrix: @samp{[[1, 2, 3], [4, 5, 6]]}. Vectors, like complex
10966numbers, are entered as incomplete objects. @xref{Incomplete Objects}.
10967During algebraic entry, vectors are entered all at once in the usual
10968brackets-and-commas form. Matrices may be entered algebraically as nested
10969vectors, or using the shortcut notation @w{@samp{[1, 2, 3; 4, 5, 6]}},
10970with rows separated by semicolons. The commas may usually be omitted
10971when entering vectors: @samp{[1 2 3]}. Curly braces may be used in
10972place of brackets: @samp{@{1, 2, 3@}}, but the commas are required in
10973this case.
10974
10975Traditional vector and matrix arithmetic is also supported;
10976@pxref{Basic Arithmetic} and @pxref{Matrix Functions}.
10977Many other operations are applied to vectors element-wise. For example,
10978the complex conjugate of a vector is a vector of the complex conjugates
10979of its elements.@refill
10980
5d67986c
RS
10981@ignore
10982@starindex
10983@end ignore
d7b8e6c6
EZ
10984@tindex vec
10985Algebraic functions for building vectors include @samp{vec(a, b, c)}
10986to build @samp{[a, b, c]}, @samp{cvec(a, n, m)} to build an @c{$n\times m$}
10987@asis{@var{n}x@var{m}}
10988matrix of @samp{a}s, and @samp{index(n)} to build a vector of integers
10989from 1 to @samp{n}.
10990
10991@node Strings, HMS Forms, Vectors and Matrices, Data Types
10992@section Strings
10993
10994@noindent
10995@kindex "
10996@cindex Strings
10997@cindex Character strings
10998Character strings are not a special data type in the Calculator.
10999Rather, a string is represented simply as a vector all of whose
11000elements are integers in the range 0 to 255 (ASCII codes). You can
11001enter a string at any time by pressing the @kbd{"} key. Quotation
11002marks and backslashes are written @samp{\"} and @samp{\\}, respectively,
11003inside strings. Other notations introduced by backslashes are:
11004
d7b8e6c6 11005@example
5d67986c 11006@group
d7b8e6c6
EZ
11007\a 7 \^@@ 0
11008\b 8 \^a-z 1-26
11009\e 27 \^[ 27
11010\f 12 \^\\ 28
11011\n 10 \^] 29
11012\r 13 \^^ 30
11013\t 9 \^_ 31
11014 \^? 127
d7b8e6c6 11015@end group
5d67986c 11016@end example
d7b8e6c6
EZ
11017
11018@noindent
11019Finally, a backslash followed by three octal digits produces any
11020character from its ASCII code.
11021
11022@kindex d "
11023@pindex calc-display-strings
11024Strings are normally displayed in vector-of-integers form. The
11025@w{@kbd{d "}} (@code{calc-display-strings}) command toggles a mode in
11026which any vectors of small integers are displayed as quoted strings
11027instead.
11028
11029The backslash notations shown above are also used for displaying
11030strings. Characters 128 and above are not translated by Calc; unless
11031you have an Emacs modified for 8-bit fonts, these will show up in
11032backslash-octal-digits notation. For characters below 32, and
11033for character 127, Calc uses the backslash-letter combination if
11034there is one, or otherwise uses a @samp{\^} sequence.
11035
11036The only Calc feature that uses strings is @dfn{compositions};
11037@pxref{Compositions}. Strings also provide a convenient
11038way to do conversions between ASCII characters and integers.
11039
5d67986c
RS
11040@ignore
11041@starindex
11042@end ignore
d7b8e6c6
EZ
11043@tindex string
11044There is a @code{string} function which provides a different display
11045format for strings. Basically, @samp{string(@var{s})}, where @var{s}
11046is a vector of integers in the proper range, is displayed as the
11047corresponding string of characters with no surrounding quotation
11048marks or other modifications. Thus @samp{string("ABC")} (or
11049@samp{string([65 66 67])}) will look like @samp{ABC} on the stack.
11050This happens regardless of whether @w{@kbd{d "}} has been used. The
11051only way to turn it off is to use @kbd{d U} (unformatted language
11052mode) which will display @samp{string("ABC")} instead.
11053
11054Control characters are displayed somewhat differently by @code{string}.
11055Characters below 32, and character 127, are shown using @samp{^} notation
11056(same as shown above, but without the backslash). The quote and
11057backslash characters are left alone, as are characters 128 and above.
11058
5d67986c
RS
11059@ignore
11060@starindex
11061@end ignore
d7b8e6c6
EZ
11062@tindex bstring
11063The @code{bstring} function is just like @code{string} except that
11064the resulting string is breakable across multiple lines if it doesn't
11065fit all on one line. Potential break points occur at every space
11066character in the string.
11067
11068@node HMS Forms, Date Forms, Strings, Data Types
11069@section HMS Forms
11070
11071@noindent
11072@cindex Hours-minutes-seconds forms
11073@cindex Degrees-minutes-seconds forms
11074@dfn{HMS} stands for Hours-Minutes-Seconds; when used as an angular
11075argument, the interpretation is Degrees-Minutes-Seconds. All functions
11076that operate on angles accept HMS forms. These are interpreted as
11077degrees regardless of the current angular mode. It is also possible to
11078use HMS as the angular mode so that calculated angles are expressed in
11079degrees, minutes, and seconds.
11080
11081@kindex @@
5d67986c
RS
11082@ignore
11083@mindex @null
11084@end ignore
d7b8e6c6 11085@kindex ' (HMS forms)
5d67986c
RS
11086@ignore
11087@mindex @null
11088@end ignore
d7b8e6c6 11089@kindex " (HMS forms)
5d67986c
RS
11090@ignore
11091@mindex @null
11092@end ignore
d7b8e6c6 11093@kindex h (HMS forms)
5d67986c
RS
11094@ignore
11095@mindex @null
11096@end ignore
d7b8e6c6 11097@kindex o (HMS forms)
5d67986c
RS
11098@ignore
11099@mindex @null
11100@end ignore
d7b8e6c6 11101@kindex m (HMS forms)
5d67986c
RS
11102@ignore
11103@mindex @null
11104@end ignore
d7b8e6c6
EZ
11105@kindex s (HMS forms)
11106The default format for HMS values is
11107@samp{@var{hours}@@ @var{mins}' @var{secs}"}. During entry, the letters
11108@samp{h} (for ``hours'') or
11109@samp{o} (approximating the ``degrees'' symbol) are accepted as well as
11110@samp{@@}, @samp{m} is accepted in place of @samp{'}, and @samp{s} is
11111accepted in place of @samp{"}.
11112The @var{hours} value is an integer (or integer-valued float).
11113The @var{mins} value is an integer or integer-valued float between 0 and 59.
11114The @var{secs} value is a real number between 0 (inclusive) and 60
11115(exclusive). A positive HMS form is interpreted as @var{hours} +
11116@var{mins}/60 + @var{secs}/3600. A negative HMS form is interpreted
11117as @i{- @var{hours}} @i{-} @var{mins}/60 @i{-} @var{secs}/3600.
11118Display format for HMS forms is quite flexible. @xref{HMS Formats}.@refill
11119
11120HMS forms can be added and subtracted. When they are added to numbers,
11121the numbers are interpreted according to the current angular mode. HMS
11122forms can also be multiplied and divided by real numbers. Dividing
11123two HMS forms produces a real-valued ratio of the two angles.
11124
11125@pindex calc-time
11126@cindex Time of day
11127Just for kicks, @kbd{M-x calc-time} pushes the current time of day on
11128the stack as an HMS form.
11129
11130@node Date Forms, Modulo Forms, HMS Forms, Data Types
11131@section Date Forms
11132
11133@noindent
11134@cindex Date forms
11135A @dfn{date form} represents a date and possibly an associated time.
11136Simple date arithmetic is supported: Adding a number to a date
11137produces a new date shifted by that many days; adding an HMS form to
11138a date shifts it by that many hours. Subtracting two date forms
11139computes the number of days between them (represented as a simple
11140number). Many other operations, such as multiplying two date forms,
11141are nonsensical and are not allowed by Calc.
11142
11143Date forms are entered and displayed enclosed in @samp{< >} brackets.
11144The default format is, e.g., @samp{<Wed Jan 9, 1991>} for dates,
11145or @samp{<3:32:20pm Wed Jan 9, 1991>} for dates with times.
11146Input is flexible; date forms can be entered in any of the usual
11147notations for dates and times. @xref{Date Formats}.
11148
11149Date forms are stored internally as numbers, specifically the number
11150of days since midnight on the morning of January 1 of the year 1 AD.
11151If the internal number is an integer, the form represents a date only;
11152if the internal number is a fraction or float, the form represents
11153a date and time. For example, @samp{<6:00am Wed Jan 9, 1991>}
11154is represented by the number 726842.25. The standard precision of
1115512 decimal digits is enough to ensure that a (reasonable) date and
11156time can be stored without roundoff error.
11157
11158If the current precision is greater than 12, date forms will keep
11159additional digits in the seconds position. For example, if the
11160precision is 15, the seconds will keep three digits after the
11161decimal point. Decreasing the precision below 12 may cause the
11162time part of a date form to become inaccurate. This can also happen
11163if astronomically high years are used, though this will not be an
11164issue in everyday (or even everymillenium) use. Note that date
11165forms without times are stored as exact integers, so roundoff is
11166never an issue for them.
11167
11168You can use the @kbd{v p} (@code{calc-pack}) and @kbd{v u}
11169(@code{calc-unpack}) commands to get at the numerical representation
11170of a date form. @xref{Packing and Unpacking}.
11171
11172Date forms can go arbitrarily far into the future or past. Negative
11173year numbers represent years BC. Calc uses a combination of the
11174Gregorian and Julian calendars, following the history of Great
11175Britain and the British colonies. This is the same calendar that
11176is used by the @code{cal} program in most Unix implementations.
11177
11178@cindex Julian calendar
11179@cindex Gregorian calendar
11180Some historical background: The Julian calendar was created by
11181Julius Caesar in the year 46 BC as an attempt to fix the gradual
11182drift caused by the lack of leap years in the calendar used
11183until that time. The Julian calendar introduced an extra day in
11184all years divisible by four. After some initial confusion, the
11185calendar was adopted around the year we call 8 AD. Some centuries
11186later it became apparent that the Julian year of 365.25 days was
11187itself not quite right. In 1582 Pope Gregory XIII introduced the
11188Gregorian calendar, which added the new rule that years divisible
11189by 100, but not by 400, were not to be considered leap years
11190despite being divisible by four. Many countries delayed adoption
11191of the Gregorian calendar because of religious differences;
11192in Britain it was put off until the year 1752, by which time
11193the Julian calendar had fallen eleven days behind the true
11194seasons. So the switch to the Gregorian calendar in early
11195September 1752 introduced a discontinuity: The day after
11196Sep 2, 1752 is Sep 14, 1752. Calc follows this convention.
11197To take another example, Russia waited until 1918 before
11198adopting the new calendar, and thus needed to remove thirteen
11199days (between Feb 1, 1918 and Feb 14, 1918). This means that
11200Calc's reckoning will be inconsistent with Russian history between
112011752 and 1918, and similarly for various other countries.
11202
11203Today's timekeepers introduce an occasional ``leap second'' as
11204well, but Calc does not take these minor effects into account.
11205(If it did, it would have to report a non-integer number of days
11206between, say, @samp{<12:00am Mon Jan 1, 1900>} and
11207@samp{<12:00am Sat Jan 1, 2000>}.)
11208
11209Calc uses the Julian calendar for all dates before the year 1752,
11210including dates BC when the Julian calendar technically had not
11211yet been invented. Thus the claim that day number @i{-10000} is
11212called ``August 16, 28 BC'' should be taken with a grain of salt.
11213
11214Please note that there is no ``year 0''; the day before
11215@samp{<Sat Jan 1, +1>} is @samp{<Fri Dec 31, -1>}. These are
11216days 0 and @i{-1} respectively in Calc's internal numbering scheme.
11217
11218@cindex Julian day counting
11219Another day counting system in common use is, confusingly, also
11220called ``Julian.'' It was invented in 1583 by Joseph Justus
11221Scaliger, who named it in honor of his father Julius Caesar
11222Scaliger. For obscure reasons he chose to start his day
11223numbering on Jan 1, 4713 BC at noon, which in Calc's scheme
11224is @i{-1721423.5} (recall that Calc starts at midnight instead
11225of noon). Thus to convert a Calc date code obtained by
11226unpacking a date form into a Julian day number, simply add
112271721423.5. The Julian code for @samp{6:00am Jan 9, 1991}
11228is 2448265.75. The built-in @kbd{t J} command performs
11229this conversion for you.
11230
11231@cindex Unix time format
11232The Unix operating system measures time as an integer number of
11233seconds since midnight, Jan 1, 1970. To convert a Calc date
11234value into a Unix time stamp, first subtract 719164 (the code
11235for @samp{<Jan 1, 1970>}), then multiply by 86400 (the number of
11236seconds in a day) and press @kbd{R} to round to the nearest
11237integer. If you have a date form, you can simply subtract the
11238day @samp{<Jan 1, 1970>} instead of unpacking and subtracting
11239719164. Likewise, divide by 86400 and add @samp{<Jan 1, 1970>}
11240to convert from Unix time to a Calc date form. (Note that
11241Unix normally maintains the time in the GMT time zone; you may
11242need to subtract five hours to get New York time, or eight hours
11243for California time. The same is usually true of Julian day
11244counts.) The built-in @kbd{t U} command performs these
11245conversions.
11246
11247@node Modulo Forms, Error Forms, Date Forms, Data Types
11248@section Modulo Forms
11249
11250@noindent
11251@cindex Modulo forms
11252A @dfn{modulo form} is a real number which is taken modulo (i.e., within
5d67986c 11253an integer multiple of) some value @var{M}. Arithmetic modulo @var{M}
d7b8e6c6 11254often arises in number theory. Modulo forms are written
5d67986c
RS
11255`@var{a} @t{mod} @var{M}',
11256where @var{a} and @var{M} are real numbers or HMS forms, and
d7b8e6c6
EZ
11257@c{$0 \le a < M$}
11258@cite{0 <= a < @var{M}}.
11259In many applications @cite{a} and @cite{M} will be
11260integers but this is not required.@refill
11261
11262Modulo forms are not to be confused with the modulo operator @samp{%}.
11263The expression @samp{27 % 10} means to compute 27 modulo 10 to produce
11264the result 7. Further computations treat this 7 as just a regular integer.
11265The expression @samp{27 mod 10} produces the result @samp{7 mod 10};
11266further computations with this value are again reduced modulo 10 so that
11267the result always lies in the desired range.
11268
11269When two modulo forms with identical @cite{M}'s are added or multiplied,
11270the Calculator simply adds or multiplies the values, then reduces modulo
11271@cite{M}. If one argument is a modulo form and the other a plain number,
11272the plain number is treated like a compatible modulo form. It is also
11273possible to raise modulo forms to powers; the result is the value raised
11274to the power, then reduced modulo @cite{M}. (When all values involved
11275are integers, this calculation is done much more efficiently than
11276actually computing the power and then reducing.)
11277
11278@cindex Modulo division
5d67986c 11279Two modulo forms `@var{a} @t{mod} @var{M}' and `@var{b} @t{mod} @var{M}'
d7b8e6c6
EZ
11280can be divided if @cite{a}, @cite{b}, and @cite{M} are all
11281integers. The result is the modulo form which, when multiplied by
5d67986c 11282`@var{b} @t{mod} @var{M}', produces `@var{a} @t{mod} @var{M}'. If
d7b8e6c6
EZ
11283there is no solution to this equation (which can happen only when
11284@cite{M} is non-prime), or if any of the arguments are non-integers, the
11285division is left in symbolic form. Other operations, such as square
11286roots, are not yet supported for modulo forms. (Note that, although
5d67986c 11287@w{`@t{(}@var{a} @t{mod} @var{M}@t{)^.5}'} will compute a ``modulo square root''
d7b8e6c6
EZ
11288in the sense of reducing @c{$\sqrt a$}
11289@cite{sqrt(a)} modulo @cite{M}, this is not a
11290useful definition from the number-theoretical point of view.)@refill
11291
5d67986c
RS
11292@ignore
11293@mindex M
11294@end ignore
d7b8e6c6 11295@kindex M (modulo forms)
5d67986c
RS
11296@ignore
11297@mindex mod
11298@end ignore
d7b8e6c6
EZ
11299@tindex mod (operator)
11300To create a modulo form during numeric entry, press the shift-@kbd{M}
11301key to enter the word @samp{mod}. As a special convenience, pressing
11302shift-@kbd{M} a second time automatically enters the value of @cite{M}
11303that was most recently used before. During algebraic entry, either
11304type @samp{mod} by hand or press @kbd{M-m} (that's @kbd{@key{META}-m}).
11305Once again, pressing this a second time enters the current modulo.@refill
11306
11307You can also use @kbd{v p} and @kbd{%} to modify modulo forms.
11308@xref{Building Vectors}. @xref{Basic Arithmetic}.
11309
11310It is possible to mix HMS forms and modulo forms. For example, an
11311HMS form modulo 24 could be used to manipulate clock times; an HMS
11312form modulo 360 would be suitable for angles. Making the modulo @cite{M}
11313also be an HMS form eliminates troubles that would arise if the angular
11314mode were inadvertently set to Radians, in which case
11315@w{@samp{2@@ 0' 0" mod 24}} would be interpreted as two degrees modulo
1131624 radians!
11317
11318Modulo forms cannot have variables or formulas for components. If you
11319enter the formula @samp{(x + 2) mod 5}, Calc propagates the modulus
11320to each of the coefficients: @samp{(1 mod 5) x + (2 mod 5)}.
11321
5d67986c
RS
11322@ignore
11323@starindex
11324@end ignore
d7b8e6c6
EZ
11325@tindex makemod
11326The algebraic function @samp{makemod(a, m)} builds the modulo form
11327@w{@samp{a mod m}}.
11328
11329@node Error Forms, Interval Forms, Modulo Forms, Data Types
11330@section Error Forms
11331
11332@noindent
11333@cindex Error forms
11334@cindex Standard deviations
11335An @dfn{error form} is a number with an associated standard
11336deviation, as in @samp{2.3 +/- 0.12}. The notation
5d67986c 11337`@var{x} @t{+/-} @c{$\sigma$}
d7b8e6c6
EZ
11338@asis{sigma}' stands for an uncertain value which follows a normal or
11339Gaussian distribution of mean @cite{x} and standard deviation or
11340``error'' @c{$\sigma$}
11341@cite{sigma}. Both the mean and the error can be either numbers or
11342formulas. Generally these are real numbers but the mean may also be
11343complex. If the error is negative or complex, it is changed to its
11344absolute value. An error form with zero error is converted to a
11345regular number by the Calculator.@refill
11346
11347All arithmetic and transcendental functions accept error forms as input.
11348Operations on the mean-value part work just like operations on regular
11349numbers. The error part for any function @cite{f(x)} (such as @c{$\sin x$}
11350@cite{sin(x)})
11351is defined by the error of @cite{x} times the derivative of @cite{f}
11352evaluated at the mean value of @cite{x}. For a two-argument function
11353@cite{f(x,y)} (such as addition) the error is the square root of the sum
11354of the squares of the errors due to @cite{x} and @cite{y}.
11355@tex
11356$$ \eqalign{
11357 f(x \hbox{\code{ +/- }} \sigma)
11358 &= f(x) \hbox{\code{ +/- }} \sigma \left| {df(x) \over dx} \right| \cr
11359 f(x \hbox{\code{ +/- }} \sigma_x, y \hbox{\code{ +/- }} \sigma_y)
11360 &= f(x,y) \hbox{\code{ +/- }}
11361 \sqrt{\left(\sigma_x \left| {\partial f(x,y) \over \partial x}
11362 \right| \right)^2
11363 +\left(\sigma_y \left| {\partial f(x,y) \over \partial y}
11364 \right| \right)^2 } \cr
11365} $$
11366@end tex
11367Note that this
11368definition assumes the errors in @cite{x} and @cite{y} are uncorrelated.
11369A side effect of this definition is that @samp{(2 +/- 1) * (2 +/- 1)}
11370is not the same as @samp{(2 +/- 1)^2}; the former represents the product
11371of two independent values which happen to have the same probability
11372distributions, and the latter is the product of one random value with itself.
11373The former will produce an answer with less error, since on the average
11374the two independent errors can be expected to cancel out.@refill
11375
11376Consult a good text on error analysis for a discussion of the proper use
11377of standard deviations. Actual errors often are neither Gaussian-distributed
11378nor uncorrelated, and the above formulas are valid only when errors
11379are small. As an example, the error arising from
5d67986c
RS
11380`@t{sin(}@var{x} @t{+/-} @c{$\sigma$}
11381@var{sigma}@t{)}' is
d7b8e6c6 11382`@c{$\sigma$\nobreak}
5d67986c 11383@var{sigma} @t{abs(cos(}@var{x}@t{))}'. When @cite{x} is close to zero,
d7b8e6c6
EZ
11384@c{$\cos x$}
11385@cite{cos(x)} is
11386close to one so the error in the sine is close to @c{$\sigma$}
11387@cite{sigma}; this makes sense, since @c{$\sin x$}
11388@cite{sin(x)} is approximately @cite{x} near zero, so a given
11389error in @cite{x} will produce about the same error in the sine. Likewise,
11390near 90 degrees @c{$\cos x$}
11391@cite{cos(x)} is nearly zero and so the computed error is
11392small: The sine curve is nearly flat in that region, so an error in @cite{x}
11393has relatively little effect on the value of @c{$\sin x$}
11394@cite{sin(x)}. However, consider
11395@samp{sin(90 +/- 1000)}. The cosine of 90 is zero, so Calc will report
11396zero error! We get an obviously wrong result because we have violated
11397the small-error approximation underlying the error analysis. If the error
11398in @cite{x} had been small, the error in @c{$\sin x$}
11399@cite{sin(x)} would indeed have been negligible.@refill
11400
5d67986c
RS
11401@ignore
11402@mindex p
11403@end ignore
d7b8e6c6
EZ
11404@kindex p (error forms)
11405@tindex +/-
11406To enter an error form during regular numeric entry, use the @kbd{p}
11407(``plus-or-minus'') key to type the @samp{+/-} symbol. (If you try actually
11408typing @samp{+/-} the @kbd{+} key will be interpreted as the Calculator's
11409@kbd{+} command!) Within an algebraic formula, you can press @kbd{M-p} to
11410type the @samp{+/-} symbol, or type it out by hand.
11411
11412Error forms and complex numbers can be mixed; the formulas shown above
11413are used for complex numbers, too; note that if the error part evaluates
11414to a complex number its absolute value (or the square root of the sum of
11415the squares of the absolute values of the two error contributions) is
11416used. Mathematically, this corresponds to a radially symmetric Gaussian
11417distribution of numbers on the complex plane. However, note that Calc
11418considers an error form with real components to represent a real number,
11419not a complex distribution around a real mean.
11420
11421Error forms may also be composed of HMS forms. For best results, both
11422the mean and the error should be HMS forms if either one is.
11423
5d67986c
RS
11424@ignore
11425@starindex
11426@end ignore
d7b8e6c6
EZ
11427@tindex sdev
11428The algebraic function @samp{sdev(a, b)} builds the error form @samp{a +/- b}.
11429
11430@node Interval Forms, Incomplete Objects, Error Forms, Data Types
11431@section Interval Forms
11432
11433@noindent
11434@cindex Interval forms
11435An @dfn{interval} is a subset of consecutive real numbers. For example,
11436the interval @samp{[2 ..@: 4]} represents all the numbers from 2 to 4,
11437inclusive. If you multiply it by the interval @samp{[0.5 ..@: 2]} you
11438obtain @samp{[1 ..@: 8]}. This calculation represents the fact that if
11439you multiply some number in the range @samp{[2 ..@: 4]} by some other
11440number in the range @samp{[0.5 ..@: 2]}, your result will lie in the range
11441from 1 to 8. Interval arithmetic is used to get a worst-case estimate
11442of the possible range of values a computation will produce, given the
11443set of possible values of the input.
11444
11445@ifinfo
11446Calc supports several varieties of intervals, including @dfn{closed}
11447intervals of the type shown above, @dfn{open} intervals such as
11448@samp{(2 ..@: 4)}, which represents the range of numbers from 2 to 4
11449@emph{exclusive}, and @dfn{semi-open} intervals in which one end
11450uses a round parenthesis and the other a square bracket. In mathematical
11451terms,
11452@samp{[2 ..@: 4]} means @cite{2 <= x <= 4}, whereas
11453@samp{[2 ..@: 4)} represents @cite{2 <= x < 4},
11454@samp{(2 ..@: 4]} represents @cite{2 < x <= 4}, and
11455@samp{(2 ..@: 4)} represents @cite{2 < x < 4}.@refill
11456@end ifinfo
11457@tex
11458Calc supports several varieties of intervals, including \dfn{closed}
11459intervals of the type shown above, \dfn{open} intervals such as
11460\samp{(2 ..\: 4)}, which represents the range of numbers from 2 to 4
11461\emph{exclusive}, and \dfn{semi-open} intervals in which one end
11462uses a round parenthesis and the other a square bracket. In mathematical
11463terms,
11464$$ \eqalign{
11465 [2 \hbox{\cite{..}} 4] &\quad\hbox{means}\quad 2 \le x \le 4 \cr
11466 [2 \hbox{\cite{..}} 4) &\quad\hbox{means}\quad 2 \le x < 4 \cr
11467 (2 \hbox{\cite{..}} 4] &\quad\hbox{means}\quad 2 < x \le 4 \cr
11468 (2 \hbox{\cite{..}} 4) &\quad\hbox{means}\quad 2 < x < 4 \cr
11469} $$
11470@end tex
11471
11472The lower and upper limits of an interval must be either real numbers
11473(or HMS or date forms), or symbolic expressions which are assumed to be
11474real-valued, or @samp{-inf} and @samp{inf}. In general the lower limit
11475must be less than the upper limit. A closed interval containing only
11476one value, @samp{[3 ..@: 3]}, is converted to a plain number (3)
11477automatically. An interval containing no values at all (such as
11478@samp{[3 ..@: 2]} or @samp{[2 ..@: 2)}) can be represented but is not
11479guaranteed to behave well when used in arithmetic. Note that the
11480interval @samp{[3 .. inf)} represents all real numbers greater than
11481or equal to 3, and @samp{(-inf .. inf)} represents all real numbers.
11482In fact, @samp{[-inf .. inf]} represents all real numbers including
11483the real infinities.
11484
11485Intervals are entered in the notation shown here, either as algebraic
11486formulas, or using incomplete forms. (@xref{Incomplete Objects}.)
11487In algebraic formulas, multiple periods in a row are collected from
11488left to right, so that @samp{1...1e2} is interpreted as @samp{1.0 ..@: 1e2}
11489rather than @samp{1 ..@: 0.1e2}. Add spaces or zeros if you want to
11490get the other interpretation. If you omit the lower or upper limit,
11491a default of @samp{-inf} or @samp{inf} (respectively) is furnished.
11492
11493``Infinite mode'' also affects operations on intervals
11494(@pxref{Infinities}). Calc will always introduce an open infinity,
11495as in @samp{1 / (0 .. 2] = [0.5 .. inf)}. But closed infinities,
11496@w{@samp{1 / [0 .. 2] = [0.5 .. inf]}}, arise only in infinite mode;
11497otherwise they are left unevaluated. Note that the ``direction'' of
11498a zero is not an issue in this case since the zero is always assumed
11499to be continuous with the rest of the interval. For intervals that
11500contain zero inside them Calc is forced to give the result,
11501@samp{1 / (-2 .. 2) = [-inf .. inf]}.
11502
11503While it may seem that intervals and error forms are similar, they are
11504based on entirely different concepts of inexact quantities. An error
5d67986c
RS
11505form `@var{x} @t{+/-} @c{$\sigma$}
11506@var{sigma}' means a variable is random, and its value could
d7b8e6c6 11507be anything but is ``probably'' within one @c{$\sigma$}
5d67986c
RS
11508@var{sigma} of the mean value @cite{x}.
11509An interval `@t{[}@var{a} @t{..@:} @var{b}@t{]}' means a variable's value
d7b8e6c6
EZ
11510is unknown, but guaranteed to lie in the specified range. Error forms
11511are statistical or ``average case'' approximations; interval arithmetic
11512tends to produce ``worst case'' bounds on an answer.@refill
11513
11514Intervals may not contain complex numbers, but they may contain
11515HMS forms or date forms.
11516
11517@xref{Set Operations}, for commands that interpret interval forms
11518as subsets of the set of real numbers.
11519
5d67986c
RS
11520@ignore
11521@starindex
11522@end ignore
d7b8e6c6
EZ
11523@tindex intv
11524The algebraic function @samp{intv(n, a, b)} builds an interval form
11525from @samp{a} to @samp{b}; @samp{n} is an integer code which must
11526be 0 for @samp{(..)}, 1 for @samp{(..]}, 2 for @samp{[..)}, or
115273 for @samp{[..]}.
11528
11529Please note that in fully rigorous interval arithmetic, care would be
11530taken to make sure that the computation of the lower bound rounds toward
11531minus infinity, while upper bound computations round toward plus
11532infinity. Calc's arithmetic always uses a round-to-nearest mode,
11533which means that roundoff errors could creep into an interval
11534calculation to produce intervals slightly smaller than they ought to
11535be. For example, entering @samp{[1..2]} and pressing @kbd{Q 2 ^}
11536should yield the interval @samp{[1..2]} again, but in fact it yields the
11537(slightly too small) interval @samp{[1..1.9999999]} due to roundoff
11538error.
11539
11540@node Incomplete Objects, Variables, Interval Forms, Data Types
11541@section Incomplete Objects
11542
11543@noindent
5d67986c
RS
11544@ignore
11545@mindex [ ]
11546@end ignore
d7b8e6c6 11547@kindex [
5d67986c
RS
11548@ignore
11549@mindex ( )
11550@end ignore
d7b8e6c6
EZ
11551@kindex (
11552@kindex ,
5d67986c
RS
11553@ignore
11554@mindex @null
11555@end ignore
d7b8e6c6 11556@kindex ]
5d67986c
RS
11557@ignore
11558@mindex @null
11559@end ignore
d7b8e6c6
EZ
11560@kindex )
11561@cindex Incomplete vectors
11562@cindex Incomplete complex numbers
11563@cindex Incomplete interval forms
11564When @kbd{(} or @kbd{[} is typed to begin entering a complex number or
11565vector, respectively, the effect is to push an @dfn{incomplete} complex
11566number or vector onto the stack. The @kbd{,} key adds the value(s) at
11567the top of the stack onto the current incomplete object. The @kbd{)}
11568and @kbd{]} keys ``close'' the incomplete object after adding any values
11569on the top of the stack in front of the incomplete object.
11570
11571As a result, the sequence of keystrokes @kbd{[ 2 , 3 @key{RET} 2 * , 9 ]}
11572pushes the vector @samp{[2, 6, 9]} onto the stack. Likewise, @kbd{( 1 , 2 Q )}
11573pushes the complex number @samp{(1, 1.414)} (approximately).
11574
11575If several values lie on the stack in front of the incomplete object,
11576all are collected and appended to the object. Thus the @kbd{,} key
11577is redundant: @kbd{[ 2 @key{RET} 3 @key{RET} 2 * 9 ]}. Some people
11578prefer the equivalent @key{SPC} key to @key{RET}.@refill
11579
11580As a special case, typing @kbd{,} immediately after @kbd{(}, @kbd{[}, or
11581@kbd{,} adds a zero or duplicates the preceding value in the list being
11582formed. Typing @key{DEL} during incomplete entry removes the last item
11583from the list.
11584
11585@kindex ;
11586The @kbd{;} key is used in the same way as @kbd{,} to create polar complex
11587numbers: @kbd{( 1 ; 2 )}. When entering a vector, @kbd{;} is useful for
11588creating a matrix. In particular, @kbd{[ [ 1 , 2 ; 3 , 4 ; 5 , 6 ] ]} is
11589equivalent to @kbd{[ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] ]}.
11590
11591@kindex ..
11592@pindex calc-dots
11593Incomplete entry is also used to enter intervals. For example,
11594@kbd{[ 2 ..@: 4 )} enters a semi-open interval. Note that when you type
11595the first period, it will be interpreted as a decimal point, but when
11596you type a second period immediately afterward, it is re-interpreted as
11597part of the interval symbol. Typing @kbd{..} corresponds to executing
11598the @code{calc-dots} command.
11599
11600If you find incomplete entry distracting, you may wish to enter vectors
11601and complex numbers as algebraic formulas by pressing the apostrophe key.
11602
11603@node Variables, Formulas, Incomplete Objects, Data Types
11604@section Variables
11605
11606@noindent
11607@cindex Variables, in formulas
11608A @dfn{variable} is somewhere between a storage register on a conventional
11609calculator, and a variable in a programming language. (In fact, a Calc
11610variable is really just an Emacs Lisp variable that contains a Calc number
11611or formula.) A variable's name is normally composed of letters and digits.
11612Calc also allows apostrophes and @code{#} signs in variable names.
11613The Calc variable @code{foo} corresponds to the Emacs Lisp variable
11614@code{var-foo}. Commands like @kbd{s s} (@code{calc-store}) that operate
11615on variables can be made to use any arbitrary Lisp variable simply by
11616backspacing over the @samp{var-} prefix in the minibuffer.@refill
11617
11618In a command that takes a variable name, you can either type the full
11619name of a variable, or type a single digit to use one of the special
11620convenience variables @code{var-q0} through @code{var-q9}. For example,
11621@kbd{3 s s 2} stores the number 3 in variable @code{var-q2}, and
11622@w{@kbd{3 s s foo @key{RET}}} stores that number in variable
11623@code{var-foo}.@refill
11624
11625To push a variable itself (as opposed to the variable's value) on the
11626stack, enter its name as an algebraic expression using the apostrophe
11627(@key{'}) key. Variable names in algebraic formulas implicitly have
11628@samp{var-} prefixed to their names. The @samp{#} character in variable
11629names used in algebraic formulas corresponds to a dash @samp{-} in the
11630Lisp variable name. If the name contains any dashes, the prefix @samp{var-}
11631is @emph{not} automatically added. Thus the two formulas @samp{foo + 1}
11632and @samp{var#foo + 1} both refer to the same variable.
11633
11634@kindex =
11635@pindex calc-evaluate
11636@cindex Evaluation of variables in a formula
11637@cindex Variables, evaluation
11638@cindex Formulas, evaluation
11639The @kbd{=} (@code{calc-evaluate}) key ``evaluates'' a formula by
11640replacing all variables in the formula which have been given values by a
11641@code{calc-store} or @code{calc-let} command by their stored values.
11642Other variables are left alone. Thus a variable that has not been
11643stored acts like an abstract variable in algebra; a variable that has
11644been stored acts more like a register in a traditional calculator.
11645With a positive numeric prefix argument, @kbd{=} evaluates the top
11646@var{n} stack entries; with a negative argument, @kbd{=} evaluates
11647the @var{n}th stack entry.
11648
11649@cindex @code{e} variable
11650@cindex @code{pi} variable
11651@cindex @code{i} variable
11652@cindex @code{phi} variable
11653@cindex @code{gamma} variable
11654@vindex e
11655@vindex pi
11656@vindex i
11657@vindex phi
11658@vindex gamma
11659A few variables are called @dfn{special constants}. Their names are
11660@samp{e}, @samp{pi}, @samp{i}, @samp{phi}, and @samp{gamma}.
11661(@xref{Scientific Functions}.) When they are evaluated with @kbd{=},
11662their values are calculated if necessary according to the current precision
11663or complex polar mode. If you wish to use these symbols for other purposes,
11664simply undefine or redefine them using @code{calc-store}.@refill
11665
11666The variables @samp{inf}, @samp{uinf}, and @samp{nan} stand for
11667infinite or indeterminate values. It's best not to use them as
11668regular variables, since Calc uses special algebraic rules when
11669it manipulates them. Calc displays a warning message if you store
11670a value into any of these special variables.
11671
11672@xref{Store and Recall}, for a discussion of commands dealing with variables.
11673
11674@node Formulas, , Variables, Data Types
11675@section Formulas
11676
11677@noindent
11678@cindex Formulas
11679@cindex Expressions
11680@cindex Operators in formulas
11681@cindex Precedence of operators
11682When you press the apostrophe key you may enter any expression or formula
11683in algebraic form. (Calc uses the terms ``expression'' and ``formula''
11684interchangeably.) An expression is built up of numbers, variable names,
11685and function calls, combined with various arithmetic operators.
11686Parentheses may
11687be used to indicate grouping. Spaces are ignored within formulas, except
11688that spaces are not permitted within variable names or numbers.
11689Arithmetic operators, in order from highest to lowest precedence, and
11690with their equivalent function names, are:
11691
11692@samp{_} [@code{subscr}] (subscripts);
11693
11694postfix @samp{%} [@code{percent}] (as in @samp{25% = 0.25});
11695
11696prefix @samp{+} and @samp{-} [@code{neg}] (as in @samp{-x})
11697and prefix @samp{!} [@code{lnot}] (logical ``not,'' as in @samp{!x});
11698
11699@samp{+/-} [@code{sdev}] (the standard deviation symbol) and
11700@samp{mod} [@code{makemod}] (the symbol for modulo forms);
11701
11702postfix @samp{!} [@code{fact}] (factorial, as in @samp{n!})
11703and postfix @samp{!!} [@code{dfact}] (double factorial);
11704
11705@samp{^} [@code{pow}] (raised-to-the-power-of);
11706
11707@samp{*} [@code{mul}];
11708
11709@samp{/} [@code{div}], @samp{%} [@code{mod}] (modulo), and
11710@samp{\} [@code{idiv}] (integer division);
11711
11712infix @samp{+} [@code{add}] and @samp{-} [@code{sub}] (as in @samp{x-y});
11713
11714@samp{|} [@code{vconcat}] (vector concatenation);
11715
11716relations @samp{=} [@code{eq}], @samp{!=} [@code{neq}], @samp{<} [@code{lt}],
11717@samp{>} [@code{gt}], @samp{<=} [@code{leq}], and @samp{>=} [@code{geq}];
11718
11719@samp{&&} [@code{land}] (logical ``and'');
11720
11721@samp{||} [@code{lor}] (logical ``or'');
11722
11723the C-style ``if'' operator @samp{a?b:c} [@code{if}];
11724
11725@samp{!!!} [@code{pnot}] (rewrite pattern ``not'');
11726
11727@samp{&&&} [@code{pand}] (rewrite pattern ``and'');
11728
11729@samp{|||} [@code{por}] (rewrite pattern ``or'');
11730
11731@samp{:=} [@code{assign}] (for assignments and rewrite rules);
11732
11733@samp{::} [@code{condition}] (rewrite pattern condition);
11734
11735@samp{=>} [@code{evalto}].
11736
11737Note that, unlike in usual computer notation, multiplication binds more
11738strongly than division: @samp{a*b/c*d} is equivalent to @c{$a b \over c d$}
11739@cite{(a*b)/(c*d)}.
11740
11741@cindex Multiplication, implicit
11742@cindex Implicit multiplication
11743The multiplication sign @samp{*} may be omitted in many cases. In particular,
11744if the righthand side is a number, variable name, or parenthesized
11745expression, the @samp{*} may be omitted. Implicit multiplication has the
11746same precedence as the explicit @samp{*} operator. The one exception to
11747the rule is that a variable name followed by a parenthesized expression,
11748as in @samp{f(x)},
11749is interpreted as a function call, not an implicit @samp{*}. In many
11750cases you must use a space if you omit the @samp{*}: @samp{2a} is the
11751same as @samp{2*a}, and @samp{a b} is the same as @samp{a*b}, but @samp{ab}
11752is a variable called @code{ab}, @emph{not} the product of @samp{a} and
11753@samp{b}! Also note that @samp{f (x)} is still a function call.@refill
11754
11755@cindex Implicit comma in vectors
11756The rules are slightly different for vectors written with square brackets.
11757In vectors, the space character is interpreted (like the comma) as a
11758separator of elements of the vector. Thus @w{@samp{[ 2a b+c d ]}} is
11759equivalent to @samp{[2*a, b+c, d]}, whereas @samp{2a b+c d} is equivalent
11760to @samp{2*a*b + c*d}.
11761Note that spaces around the brackets, and around explicit commas, are
11762ignored. To force spaces to be interpreted as multiplication you can
11763enclose a formula in parentheses as in @samp{[(a b) 2(c d)]}, which is
11764interpreted as @samp{[a*b, 2*c*d]}. An implicit comma is also inserted
11765between @samp{][}, as in the matrix @samp{[[1 2][3 4]]}.@refill
11766
11767Vectors that contain commas (not embedded within nested parentheses or
11768brackets) do not treat spaces specially: @samp{[a b, 2 c d]} is a vector
11769of two elements. Also, if it would be an error to treat spaces as
11770separators, but not otherwise, then Calc will ignore spaces:
11771@w{@samp{[a - b]}} is a vector of one element, but @w{@samp{[a -b]}} is
11772a vector of two elements. Finally, vectors entered with curly braces
11773instead of square brackets do not give spaces any special treatment.
11774When Calc displays a vector that does not contain any commas, it will
11775insert parentheses if necessary to make the meaning clear:
11776@w{@samp{[(a b)]}}.
11777
11778The expression @samp{5%-2} is ambiguous; is this five-percent minus two,
11779or five modulo minus-two? Calc always interprets the leftmost symbol as
11780an infix operator preferentially (modulo, in this case), so you would
11781need to write @samp{(5%)-2} to get the former interpretation.
11782
11783@cindex Function call notation
11784A function call is, e.g., @samp{sin(1+x)}. Function names follow the same
11785rules as variable names except that the default prefix @samp{calcFunc-} is
11786used (instead of @samp{var-}) for the internal Lisp form.
11787Most mathematical Calculator commands like
11788@code{calc-sin} have function equivalents like @code{sin}.
11789If no Lisp function is defined for a function called by a formula, the
11790call is left as it is during algebraic manipulation: @samp{f(x+y)} is
11791left alone. Beware that many innocent-looking short names like @code{in}
11792and @code{re} have predefined meanings which could surprise you; however,
11793single letters or single letters followed by digits are always safe to
11794use for your own function names. @xref{Function Index}.@refill
11795
11796In the documentation for particular commands, the notation @kbd{H S}
11797(@code{calc-sinh}) [@code{sinh}] means that the key sequence @kbd{H S}, the
11798command @kbd{M-x calc-sinh}, and the algebraic function @code{sinh(x)} all
11799represent the same operation.@refill
11800
11801Commands that interpret (``parse'') text as algebraic formulas include
11802algebraic entry (@kbd{'}), editing commands like @kbd{`} which parse
11803the contents of the editing buffer when you finish, the @kbd{M-# g}
11804and @w{@kbd{M-# r}} commands, the @kbd{C-y} command, the X window system
11805``paste'' mouse operation, and Embedded Mode. All of these operations
11806use the same rules for parsing formulas; in particular, language modes
11807(@pxref{Language Modes}) affect them all in the same way.
11808
11809When you read a large amount of text into the Calculator (say a vector
11810which represents a big set of rewrite rules; @pxref{Rewrite Rules}),
11811you may wish to include comments in the text. Calc's formula parser
11812ignores the symbol @samp{%%} and anything following it on a line:
11813
11814@example
11815[ a + b, %% the sum of "a" and "b"
11816 c + d,
11817 %% last line is coming up:
11818 e + f ]
11819@end example
11820
11821@noindent
11822This is parsed exactly the same as @samp{[ a + b, c + d, e + f ]}.
11823
11824@xref{Syntax Tables}, for a way to create your own operators and other
11825input notations. @xref{Compositions}, for a way to create new display
11826formats.
11827
11828@xref{Algebra}, for commands for manipulating formulas symbolically.
11829
11830@node Stack and Trail, Mode Settings, Data Types, Top
11831@chapter Stack and Trail Commands
11832
11833@noindent
11834This chapter describes the Calc commands for manipulating objects on the
11835stack and in the trail buffer. (These commands operate on objects of any
11836type, such as numbers, vectors, formulas, and incomplete objects.)
11837
11838@menu
11839* Stack Manipulation::
11840* Editing Stack Entries::
11841* Trail Commands::
11842* Keep Arguments::
11843@end menu
11844
11845@node Stack Manipulation, Editing Stack Entries, Stack and Trail, Stack and Trail
11846@section Stack Manipulation Commands
11847
11848@noindent
5d67986c
RS
11849@kindex @key{RET}
11850@kindex @key{SPC}
d7b8e6c6
EZ
11851@pindex calc-enter
11852@cindex Duplicating stack entries
11853To duplicate the top object on the stack, press @key{RET} or @key{SPC}
11854(two equivalent keys for the @code{calc-enter} command).
11855Given a positive numeric prefix argument, these commands duplicate
11856several elements at the top of the stack.
11857Given a negative argument,
11858these commands duplicate the specified element of the stack.
11859Given an argument of zero, they duplicate the entire stack.
11860For example, with @samp{10 20 30} on the stack,
11861@key{RET} creates @samp{10 20 30 30},
11862@kbd{C-u 2 @key{RET}} creates @samp{10 20 30 20 30},
11863@kbd{C-u - 2 @key{RET}} creates @samp{10 20 30 20}, and
11864@kbd{C-u 0 @key{RET}} creates @samp{10 20 30 10 20 30}.@refill
11865
5d67986c 11866@kindex @key{LFD}
d7b8e6c6
EZ
11867@pindex calc-over
11868The @key{LFD} (@code{calc-over}) command (on a key marked Line-Feed if you
11869have it, else on @kbd{C-j}) is like @code{calc-enter}
11870except that the sign of the numeric prefix argument is interpreted
11871oppositely. Also, with no prefix argument the default argument is 2.
11872Thus with @samp{10 20 30} on the stack, @key{LFD} and @kbd{C-u 2 @key{LFD}}
11873are both equivalent to @kbd{C-u - 2 @key{RET}}, producing
11874@samp{10 20 30 20}.@refill
11875
5d67986c 11876@kindex @key{DEL}
d7b8e6c6
EZ
11877@kindex C-d
11878@pindex calc-pop
11879@cindex Removing stack entries
11880@cindex Deleting stack entries
11881To remove the top element from the stack, press @key{DEL} (@code{calc-pop}).
11882The @kbd{C-d} key is a synonym for @key{DEL}.
11883(If the top element is an incomplete object with at least one element, the
11884last element is removed from it.) Given a positive numeric prefix argument,
11885several elements are removed. Given a negative argument, the specified
11886element of the stack is deleted. Given an argument of zero, the entire
11887stack is emptied.
11888For example, with @samp{10 20 30} on the stack,
11889@key{DEL} leaves @samp{10 20},
11890@kbd{C-u 2 @key{DEL}} leaves @samp{10},
11891@kbd{C-u - 2 @key{DEL}} leaves @samp{10 30}, and
11892@kbd{C-u 0 @key{DEL}} leaves an empty stack.@refill
11893
5d67986c 11894@kindex M-@key{DEL}
d7b8e6c6 11895@pindex calc-pop-above
0d48e8aa 11896The @kbd{M-@key{DEL}} (@code{calc-pop-above}) command is to @key{DEL} what
d7b8e6c6
EZ
11897@key{LFD} is to @key{RET}: It interprets the sign of the numeric
11898prefix argument in the opposite way, and the default argument is 2.
0d48e8aa 11899Thus @kbd{M-@key{DEL}} by itself removes the second-from-top stack element,
5d67986c 11900leaving the first, third, fourth, and so on; @kbd{M-3 M-@key{DEL}} deletes
d7b8e6c6
EZ
11901the third stack element.
11902
5d67986c 11903@kindex @key{TAB}
d7b8e6c6
EZ
11904@pindex calc-roll-down
11905To exchange the top two elements of the stack, press @key{TAB}
11906(@code{calc-roll-down}). Given a positive numeric prefix argument, the
11907specified number of elements at the top of the stack are rotated downward.
11908Given a negative argument, the entire stack is rotated downward the specified
11909number of times. Given an argument of zero, the entire stack is reversed
11910top-for-bottom.
11911For example, with @samp{10 20 30 40 50} on the stack,
11912@key{TAB} creates @samp{10 20 30 50 40},
11913@kbd{C-u 3 @key{TAB}} creates @samp{10 20 50 30 40},
11914@kbd{C-u - 2 @key{TAB}} creates @samp{40 50 10 20 30}, and
11915@kbd{C-u 0 @key{TAB}} creates @samp{50 40 30 20 10}.@refill
11916
5d67986c 11917@kindex M-@key{TAB}
d7b8e6c6 11918@pindex calc-roll-up
5d67986c 11919The command @kbd{M-@key{TAB}} (@code{calc-roll-up}) is analogous to @key{TAB}
d7b8e6c6
EZ
11920except that it rotates upward instead of downward. Also, the default
11921with no prefix argument is to rotate the top 3 elements.
11922For example, with @samp{10 20 30 40 50} on the stack,
5d67986c
RS
11923@kbd{M-@key{TAB}} creates @samp{10 20 40 50 30},
11924@kbd{C-u 4 M-@key{TAB}} creates @samp{10 30 40 50 20},
11925@kbd{C-u - 2 M-@key{TAB}} creates @samp{30 40 50 10 20}, and
11926@kbd{C-u 0 M-@key{TAB}} creates @samp{50 40 30 20 10}.@refill
d7b8e6c6 11927
5d67986c 11928A good way to view the operation of @key{TAB} and @kbd{M-@key{TAB}} is in
d7b8e6c6 11929terms of moving a particular element to a new position in the stack.
5d67986c
RS
11930With a positive argument @var{n}, @key{TAB} moves the top stack
11931element down to level @var{n}, making room for it by pulling all the
11932intervening stack elements toward the top. @kbd{M-@key{TAB}} moves the
11933element at level @var{n} up to the top. (Compare with @key{LFD},
11934which copies instead of moving the element in level @var{n}.)
11935
11936With a negative argument @i{-@var{n}}, @key{TAB} rotates the stack
11937to move the object in level @var{n} to the deepest place in the
11938stack, and the object in level @i{@var{n}+1} to the top. @kbd{M-@key{TAB}}
d7b8e6c6 11939rotates the deepest stack element to be in level @i{n}, also
5d67986c 11940putting the top stack element in level @i{@var{n}+1}.
d7b8e6c6
EZ
11941
11942@xref{Selecting Subformulas}, for a way to apply these commands to
11943any portion of a vector or formula on the stack.
11944
11945@node Editing Stack Entries, Trail Commands, Stack Manipulation, Stack and Trail
11946@section Editing Stack Entries
11947
11948@noindent
11949@kindex `
11950@pindex calc-edit
11951@pindex calc-edit-finish
11952@cindex Editing the stack with Emacs
11953The backquote, @kbd{`} (@code{calc-edit}) command creates a temporary
11954buffer (@samp{*Calc Edit*}) for editing the top-of-stack value using
11955regular Emacs commands. With a numeric prefix argument, it edits the
11956specified number of stack entries at once. (An argument of zero edits
11957the entire stack; a negative argument edits one specific stack entry.)
11958
11959When you are done editing, press @kbd{M-# M-#} to finish and return
11960to Calc. The @key{RET} and @key{LFD} keys also work to finish most
11961sorts of editing, though in some cases Calc leaves @key{RET} with its
11962usual meaning (``insert a newline'') if it's a situation where you
11963might want to insert new lines into the editing buffer. The traditional
11964Emacs ``finish'' key sequence, @kbd{C-c C-c}, also works to finish
11965editing and may be easier to type, depending on your keyboard.
11966
11967When you finish editing, the Calculator parses the lines of text in
11968the @samp{*Calc Edit*} buffer as numbers or formulas, replaces the
11969original stack elements in the original buffer with these new values,
11970then kills the @samp{*Calc Edit*} buffer. The original Calculator buffer
11971continues to exist during editing, but for best results you should be
11972careful not to change it until you have finished the edit. You can
11973also cancel the edit by pressing @kbd{M-# x}.
11974
11975The formula is normally reevaluated as it is put onto the stack.
11976For example, editing @samp{a + 2} to @samp{3 + 2} and pressing
11977@kbd{M-# M-#} will push 5 on the stack. If you use @key{LFD} to
11978finish, Calc will put the result on the stack without evaluating it.
11979
11980If you give a prefix argument to @kbd{M-# M-#} (or @kbd{C-c C-c}),
11981Calc will not kill the @samp{*Calc Edit*} buffer. You can switch
11982back to that buffer and continue editing if you wish. However, you
11983should understand that if you initiated the edit with @kbd{`}, the
11984@kbd{M-# M-#} operation will be programmed to replace the top of the
11985stack with the new edited value, and it will do this even if you have
11986rearranged the stack in the meanwhile. This is not so much of a problem
11987with other editing commands, though, such as @kbd{s e}
11988(@code{calc-edit-variable}; @pxref{Operations on Variables}).
11989
11990If the @code{calc-edit} command involves more than one stack entry,
11991each line of the @samp{*Calc Edit*} buffer is interpreted as a
11992separate formula. Otherwise, the entire buffer is interpreted as
11993one formula, with line breaks ignored. (You can use @kbd{C-o} or
11994@kbd{C-q C-j} to insert a newline in the buffer without pressing @key{RET}.)
11995
11996The @kbd{`} key also works during numeric or algebraic entry. The
11997text entered so far is moved to the @code{*Calc Edit*} buffer for
11998more extensive editing than is convenient in the minibuffer.
11999
12000@node Trail Commands, Keep Arguments, Editing Stack Entries, Stack and Trail
12001@section Trail Commands
12002
12003@noindent
12004@cindex Trail buffer
12005The commands for manipulating the Calc Trail buffer are two-key sequences
12006beginning with the @kbd{t} prefix.
12007
12008@kindex t d
12009@pindex calc-trail-display
12010The @kbd{t d} (@code{calc-trail-display}) command turns display of the
12011trail on and off. Normally the trail display is toggled on if it was off,
12012off if it was on. With a numeric prefix of zero, this command always
12013turns the trail off; with a prefix of one, it always turns the trail on.
12014The other trail-manipulation commands described here automatically turn
12015the trail on. Note that when the trail is off values are still recorded
12016there; they are simply not displayed. To set Emacs to turn the trail
12017off by default, type @kbd{t d} and then save the mode settings with
12018@kbd{m m} (@code{calc-save-modes}).
12019
12020@kindex t i
12021@pindex calc-trail-in
12022@kindex t o
12023@pindex calc-trail-out
12024The @kbd{t i} (@code{calc-trail-in}) and @kbd{t o}
12025(@code{calc-trail-out}) commands switch the cursor into and out of the
12026Calc Trail window. In practice they are rarely used, since the commands
12027shown below are a more convenient way to move around in the
12028trail, and they work ``by remote control'' when the cursor is still
12029in the Calculator window.@refill
12030
12031@cindex Trail pointer
12032There is a @dfn{trail pointer} which selects some entry of the trail at
12033any given time. The trail pointer looks like a @samp{>} symbol right
12034before the selected number. The following commands operate on the
12035trail pointer in various ways.
12036
12037@kindex t y
12038@pindex calc-trail-yank
12039@cindex Retrieving previous results
12040The @kbd{t y} (@code{calc-trail-yank}) command reads the selected value in
12041the trail and pushes it onto the Calculator stack. It allows you to
12042re-use any previously computed value without retyping. With a numeric
12043prefix argument @var{n}, it yanks the value @var{n} lines above the current
12044trail pointer.
12045
12046@kindex t <
12047@pindex calc-trail-scroll-left
12048@kindex t >
12049@pindex calc-trail-scroll-right
12050The @kbd{t <} (@code{calc-trail-scroll-left}) and @kbd{t >}
12051(@code{calc-trail-scroll-right}) commands horizontally scroll the trail
12052window left or right by one half of its width.@refill
12053
12054@kindex t n
12055@pindex calc-trail-next
12056@kindex t p
12057@pindex calc-trail-previous
12058@kindex t f
12059@pindex calc-trail-forward
12060@kindex t b
12061@pindex calc-trail-backward
12062The @kbd{t n} (@code{calc-trail-next}) and @kbd{t p}
12063(@code{calc-trail-previous)} commands move the trail pointer down or up
12064one line. The @kbd{t f} (@code{calc-trail-forward}) and @kbd{t b}
12065(@code{calc-trail-backward}) commands move the trail pointer down or up
12066one screenful at a time. All of these commands accept numeric prefix
12067arguments to move several lines or screenfuls at a time.@refill
12068
12069@kindex t [
12070@pindex calc-trail-first
12071@kindex t ]
12072@pindex calc-trail-last
12073@kindex t h
12074@pindex calc-trail-here
12075The @kbd{t [} (@code{calc-trail-first}) and @kbd{t ]}
12076(@code{calc-trail-last}) commands move the trail pointer to the first or
12077last line of the trail. The @kbd{t h} (@code{calc-trail-here}) command
12078moves the trail pointer to the cursor position; unlike the other trail
12079commands, @kbd{t h} works only when Calc Trail is the selected window.@refill
12080
12081@kindex t s
12082@pindex calc-trail-isearch-forward
12083@kindex t r
12084@pindex calc-trail-isearch-backward
12085@ifinfo
12086The @kbd{t s} (@code{calc-trail-isearch-forward}) and @kbd{t r}
12087(@code{calc-trail-isearch-backward}) commands perform an incremental
12088search forward or backward through the trail. You can press @key{RET}
12089to terminate the search; the trail pointer moves to the current line.
12090If you cancel the search with @kbd{C-g}, the trail pointer stays where
12091it was when the search began.@refill
12092@end ifinfo
12093@tex
12094The @kbd{t s} (@code{calc-trail-isearch-forward}) and @kbd{t r}
12095(@code{calc-trail-isearch-backward}) com\-mands perform an incremental
12096search forward or backward through the trail. You can press @key{RET}
12097to terminate the search; the trail pointer moves to the current line.
12098If you cancel the search with @kbd{C-g}, the trail pointer stays where
12099it was when the search began.
12100@end tex
12101
12102@kindex t m
12103@pindex calc-trail-marker
12104The @kbd{t m} (@code{calc-trail-marker}) command allows you to enter a
12105line of text of your own choosing into the trail. The text is inserted
12106after the line containing the trail pointer; this usually means it is
12107added to the end of the trail. Trail markers are useful mainly as the
12108targets for later incremental searches in the trail.
12109
12110@kindex t k
12111@pindex calc-trail-kill
12112The @kbd{t k} (@code{calc-trail-kill}) command removes the selected line
12113from the trail. The line is saved in the Emacs kill ring suitable for
12114yanking into another buffer, but it is not easy to yank the text back
12115into the trail buffer. With a numeric prefix argument, this command
12116kills the @var{n} lines below or above the selected one.
12117
12118The @kbd{t .} (@code{calc-full-trail-vectors}) command is described
12119elsewhere; @pxref{Vector and Matrix Formats}.
12120
12121@node Keep Arguments, , Trail Commands, Stack and Trail
12122@section Keep Arguments
12123
12124@noindent
12125@kindex K
12126@pindex calc-keep-args
12127The @kbd{K} (@code{calc-keep-args}) command acts like a prefix for
12128the following command. It prevents that command from removing its
12129arguments from the stack. For example, after @kbd{2 @key{RET} 3 +},
12130the stack contains the sole number 5, but after @kbd{2 @key{RET} 3 K +},
12131the stack contains the arguments and the result: @samp{2 3 5}.
12132
12133This works for all commands that take arguments off the stack. As
12134another example, @kbd{K a s} simplifies a formula, pushing the
12135simplified version of the formula onto the stack after the original
12136formula (rather than replacing the original formula).
12137
5d67986c 12138Note that you could get the same effect by typing @kbd{@key{RET} a s},
d7b8e6c6
EZ
12139copying the formula and then simplifying the copy. One difference
12140is that for a very large formula the time taken to format the
5d67986c 12141intermediate copy in @kbd{@key{RET} a s} could be noticeable; @kbd{K a s}
d7b8e6c6
EZ
12142would avoid this extra work.
12143
12144Even stack manipulation commands are affected. @key{TAB} works by
12145popping two values and pushing them back in the opposite order,
12146so @kbd{2 @key{RET} 3 K @key{TAB}} produces @samp{2 3 3 2}.
12147
12148A few Calc commands provide other ways of doing the same thing.
12149For example, @kbd{' sin($)} replaces the number on the stack with
12150its sine using algebraic entry; to push the sine and keep the
12151original argument you could use either @kbd{' sin($1)} or
12152@kbd{K ' sin($)}. @xref{Algebraic Entry}. Also, the @kbd{s s}
12153command is effectively the same as @kbd{K s t}. @xref{Storing Variables}.
12154
12155Keyboard macros may interact surprisingly with the @kbd{K} prefix.
12156If you have defined a keyboard macro to be, say, @samp{Q +} to add
12157one number to the square root of another, then typing @kbd{K X} will
12158execute @kbd{K Q +}, probably not what you expected. The @kbd{K}
12159prefix will apply to just the first command in the macro rather than
12160the whole macro.
12161
12162If you execute a command and then decide you really wanted to keep
12163the argument, you can press @kbd{M-@key{RET}} (@code{calc-last-args}).
12164This command pushes the last arguments that were popped by any command
12165onto the stack. Note that the order of things on the stack will be
12166different than with @kbd{K}: @kbd{2 @key{RET} 3 + M-@key{RET}} leaves
12167@samp{5 2 3} on the stack instead of @samp{2 3 5}. @xref{Undo}.
12168
12169@node Mode Settings, Arithmetic, Stack and Trail, Top
12170@chapter Mode Settings
12171
12172@noindent
12173This chapter describes commands that set modes in the Calculator.
12174They do not affect the contents of the stack, although they may change
12175the @emph{appearance} or @emph{interpretation} of the stack's contents.
12176
12177@menu
12178* General Mode Commands::
12179* Precision::
12180* Inverse and Hyperbolic::
12181* Calculation Modes::
12182* Simplification Modes::
12183* Declarations::
12184* Display Modes::
12185* Language Modes::
12186* Modes Variable::
12187* Calc Mode Line::
12188@end menu
12189
12190@node General Mode Commands, Precision, Mode Settings, Mode Settings
12191@section General Mode Commands
12192
12193@noindent
12194@kindex m m
12195@pindex calc-save-modes
12196@cindex Continuous memory
12197@cindex Saving mode settings
12198@cindex Permanent mode settings
12199@cindex @file{.emacs} file, mode settings
12200You can save all of the current mode settings in your @file{.emacs} file
12201with the @kbd{m m} (@code{calc-save-modes}) command. This will cause
12202Emacs to reestablish these modes each time it starts up. The modes saved
12203in the file include everything controlled by the @kbd{m} and @kbd{d}
12204prefix keys, the current precision and binary word size, whether or not
12205the trail is displayed, the current height of the Calc window, and more.
12206The current interface (used when you type @kbd{M-# M-#}) is also saved.
12207If there were already saved mode settings in the file, they are replaced.
12208Otherwise, the new mode information is appended to the end of the file.
12209
12210@kindex m R
12211@pindex calc-mode-record-mode
12212The @kbd{m R} (@code{calc-mode-record-mode}) command tells Calc to
12213record the new mode settings (as if by pressing @kbd{m m}) every
12214time a mode setting changes. If Embedded Mode is enabled, other
12215options are available; @pxref{Mode Settings in Embedded Mode}.
12216
12217@kindex m F
12218@pindex calc-settings-file-name
12219The @kbd{m F} (@code{calc-settings-file-name}) command allows you to
12220choose a different place than your @file{.emacs} file for @kbd{m m},
12221@kbd{Z P}, and similar commands to save permanent information.
12222You are prompted for a file name. All Calc modes are then reset to
12223their default values, then settings from the file you named are loaded
12224if this file exists, and this file becomes the one that Calc will
12225use in the future for commands like @kbd{m m}. The default settings
12226file name is @file{~/.emacs}. You can see the current file name by
12227giving a blank response to the @kbd{m F} prompt. See also the
12228discussion of the @code{calc-settings-file} variable; @pxref{Installation}.
12229
12230If the file name you give contains the string @samp{.emacs} anywhere
12231inside it, @kbd{m F} will not automatically load the new file. This
12232is because you are presumably switching to your @file{~/.emacs} file,
12233which may contain other things you don't want to reread. You can give
12234a numeric prefix argument of 1 to @kbd{m F} to force it to read the
12235file no matter what its name. Conversely, an argument of @i{-1} tells
12236@kbd{m F} @emph{not} to read the new file. An argument of 2 or @i{-2}
12237tells @kbd{m F} not to reset the modes to their defaults beforehand,
12238which is useful if you intend your new file to have a variant of the
12239modes present in the file you were using before.
12240
12241@kindex m x
12242@pindex calc-always-load-extensions
12243The @kbd{m x} (@code{calc-always-load-extensions}) command enables a mode
12244in which the first use of Calc loads the entire program, including all
12245extensions modules. Otherwise, the extensions modules will not be loaded
12246until the various advanced Calc features are used. Since this mode only
12247has effect when Calc is first loaded, @kbd{m x} is usually followed by
12248@kbd{m m} to make the mode-setting permanent. To load all of Calc just
12249once, rather than always in the future, you can press @kbd{M-# L}.
12250
12251@kindex m S
12252@pindex calc-shift-prefix
12253The @kbd{m S} (@code{calc-shift-prefix}) command enables a mode in which
12254all of Calc's letter prefix keys may be typed shifted as well as unshifted.
12255If you are typing, say, @kbd{a S} (@code{calc-solve-for}) quite often
12256you might find it easier to turn this mode on so that you can type
12257@kbd{A S} instead. When this mode is enabled, the commands that used to
12258be on those single shifted letters (e.g., @kbd{A} (@code{calc-abs})) can
12259now be invoked by pressing the shifted letter twice: @kbd{A A}. Note
12260that the @kbd{v} prefix key always works both shifted and unshifted, and
12261the @kbd{z} and @kbd{Z} prefix keys are always distinct. Also, the @kbd{h}
12262prefix is not affected by this mode. Press @kbd{m S} again to disable
12263shifted-prefix mode.
12264
12265@node Precision, Inverse and Hyperbolic, General Mode Commands, Mode Settings
12266@section Precision
12267
12268@noindent
12269@kindex p
12270@pindex calc-precision
12271@cindex Precision of calculations
12272The @kbd{p} (@code{calc-precision}) command controls the precision to
12273which floating-point calculations are carried. The precision must be
12274at least 3 digits and may be arbitrarily high, within the limits of
12275memory and time. This affects only floats: Integer and rational
12276calculations are always carried out with as many digits as necessary.
12277
12278The @kbd{p} key prompts for the current precision. If you wish you
12279can instead give the precision as a numeric prefix argument.
12280
12281Many internal calculations are carried to one or two digits higher
12282precision than normal. Results are rounded down afterward to the
12283current precision. Unless a special display mode has been selected,
12284floats are always displayed with their full stored precision, i.e.,
12285what you see is what you get. Reducing the current precision does not
12286round values already on the stack, but those values will be rounded
12287down before being used in any calculation. The @kbd{c 0} through
12288@kbd{c 9} commands (@pxref{Conversions}) can be used to round an
12289existing value to a new precision.@refill
12290
12291@cindex Accuracy of calculations
12292It is important to distinguish the concepts of @dfn{precision} and
12293@dfn{accuracy}. In the normal usage of these words, the number
12294123.4567 has a precision of 7 digits but an accuracy of 4 digits.
12295The precision is the total number of digits not counting leading
12296or trailing zeros (regardless of the position of the decimal point).
12297The accuracy is simply the number of digits after the decimal point
12298(again not counting trailing zeros). In Calc you control the precision,
12299not the accuracy of computations. If you were to set the accuracy
12300instead, then calculations like @samp{exp(100)} would generate many
12301more digits than you would typically need, while @samp{exp(-100)} would
12302probably round to zero! In Calc, both these computations give you
12303exactly 12 (or the requested number of) significant digits.
12304
12305The only Calc features that deal with accuracy instead of precision
12306are fixed-point display mode for floats (@kbd{d f}; @pxref{Float Formats}),
12307and the rounding functions like @code{floor} and @code{round}
12308(@pxref{Integer Truncation}). Also, @kbd{c 0} through @kbd{c 9}
12309deal with both precision and accuracy depending on the magnitudes
12310of the numbers involved.
12311
12312If you need to work with a particular fixed accuracy (say, dollars and
12313cents with two digits after the decimal point), one solution is to work
12314with integers and an ``implied'' decimal point. For example, $8.99
5d67986c 12315divided by 6 would be entered @kbd{899 @key{RET} 6 /}, yielding 149.833
d7b8e6c6
EZ
12316(actually $1.49833 with our implied decimal point); pressing @kbd{R}
12317would round this to 150 cents, i.e., $1.50.
12318
12319@xref{Floats}, for still more on floating-point precision and related
12320issues.
12321
12322@node Inverse and Hyperbolic, Calculation Modes, Precision, Mode Settings
12323@section Inverse and Hyperbolic Flags
12324
12325@noindent
12326@kindex I
12327@pindex calc-inverse
12328There is no single-key equivalent to the @code{calc-arcsin} function.
12329Instead, you must first press @kbd{I} (@code{calc-inverse}) to set
12330the @dfn{Inverse Flag}, then press @kbd{S} (@code{calc-sin}).
12331The @kbd{I} key actually toggles the Inverse Flag. When this flag
12332is set, the word @samp{Inv} appears in the mode line.@refill
12333
12334@kindex H
12335@pindex calc-hyperbolic
12336Likewise, the @kbd{H} key (@code{calc-hyperbolic}) sets or clears the
12337Hyperbolic Flag, which transforms @code{calc-sin} into @code{calc-sinh}.
12338If both of these flags are set at once, the effect will be
12339@code{calc-arcsinh}. (The Hyperbolic flag is also used by some
12340non-trigonometric commands; for example @kbd{H L} computes a base-10,
12341instead of base-@i{e}, logarithm.)@refill
12342
12343Command names like @code{calc-arcsin} are provided for completeness, and
12344may be executed with @kbd{x} or @kbd{M-x}. Their effect is simply to
12345toggle the Inverse and/or Hyperbolic flags and then execute the
12346corresponding base command (@code{calc-sin} in this case).
12347
12348The Inverse and Hyperbolic flags apply only to the next Calculator
12349command, after which they are automatically cleared. (They are also
12350cleared if the next keystroke is not a Calc command.) Digits you
12351type after @kbd{I} or @kbd{H} (or @kbd{K}) are treated as prefix
12352arguments for the next command, not as numeric entries. The same
12353is true of @kbd{C-u}, but not of the minus sign (@kbd{K -} means to
12354subtract and keep arguments).
12355
12356The third Calc prefix flag, @kbd{K} (keep-arguments), is discussed
12357elsewhere. @xref{Keep Arguments}.
12358
12359@node Calculation Modes, Simplification Modes, Inverse and Hyperbolic, Mode Settings
12360@section Calculation Modes
12361
12362@noindent
12363The commands in this section are two-key sequences beginning with
12364the @kbd{m} prefix. (That's the letter @kbd{m}, not the @key{META} key.)
12365The @samp{m a} (@code{calc-algebraic-mode}) command is described elsewhere
12366(@pxref{Algebraic Entry}).
12367
12368@menu
12369* Angular Modes::
12370* Polar Mode::
12371* Fraction Mode::
12372* Infinite Mode::
12373* Symbolic Mode::
12374* Matrix Mode::
12375* Automatic Recomputation::
12376* Working Message::
12377@end menu
12378
12379@node Angular Modes, Polar Mode, Calculation Modes, Calculation Modes
12380@subsection Angular Modes
12381
12382@noindent
12383@cindex Angular mode
12384The Calculator supports three notations for angles: radians, degrees,
12385and degrees-minutes-seconds. When a number is presented to a function
12386like @code{sin} that requires an angle, the current angular mode is
12387used to interpret the number as either radians or degrees. If an HMS
12388form is presented to @code{sin}, it is always interpreted as
12389degrees-minutes-seconds.
12390
12391Functions that compute angles produce a number in radians, a number in
12392degrees, or an HMS form depending on the current angular mode. If the
12393result is a complex number and the current mode is HMS, the number is
12394instead expressed in degrees. (Complex-number calculations would
12395normally be done in radians mode, though. Complex numbers are converted
12396to degrees by calculating the complex result in radians and then
12397multiplying by 180 over @c{$\pi$}
12398@cite{pi}.)
12399
12400@kindex m r
12401@pindex calc-radians-mode
12402@kindex m d
12403@pindex calc-degrees-mode
12404@kindex m h
12405@pindex calc-hms-mode
12406The @kbd{m r} (@code{calc-radians-mode}), @kbd{m d} (@code{calc-degrees-mode}),
12407and @kbd{m h} (@code{calc-hms-mode}) commands control the angular mode.
12408The current angular mode is displayed on the Emacs mode line.
12409The default angular mode is degrees.@refill
12410
12411@node Polar Mode, Fraction Mode, Angular Modes, Calculation Modes
12412@subsection Polar Mode
12413
12414@noindent
12415@cindex Polar mode
12416The Calculator normally ``prefers'' rectangular complex numbers in the
12417sense that rectangular form is used when the proper form can not be
12418decided from the input. This might happen by multiplying a rectangular
12419number by a polar one, by taking the square root of a negative real
12420number, or by entering @kbd{( 2 @key{SPC} 3 )}.
12421
12422@kindex m p
12423@pindex calc-polar-mode
12424The @kbd{m p} (@code{calc-polar-mode}) command toggles complex-number
12425preference between rectangular and polar forms. In polar mode, all
12426of the above example situations would produce polar complex numbers.
12427
12428@node Fraction Mode, Infinite Mode, Polar Mode, Calculation Modes
12429@subsection Fraction Mode
12430
12431@noindent
12432@cindex Fraction mode
12433@cindex Division of integers
12434Division of two integers normally yields a floating-point number if the
12435result cannot be expressed as an integer. In some cases you would
12436rather get an exact fractional answer. One way to accomplish this is
12437to multiply fractions instead: @kbd{6 @key{RET} 1:4 *} produces @cite{3:2}
12438even though @kbd{6 @key{RET} 4 /} produces @cite{1.5}.
12439
12440@kindex m f
12441@pindex calc-frac-mode
12442To set the Calculator to produce fractional results for normal integer
12443divisions, use the @kbd{m f} (@code{calc-frac-mode}) command.
12444For example, @cite{8/4} produces @cite{2} in either mode,
12445but @cite{6/4} produces @cite{3:2} in Fraction Mode, @cite{1.5} in
12446Float Mode.@refill
12447
12448At any time you can use @kbd{c f} (@code{calc-float}) to convert a
12449fraction to a float, or @kbd{c F} (@code{calc-fraction}) to convert a
12450float to a fraction. @xref{Conversions}.
12451
12452@node Infinite Mode, Symbolic Mode, Fraction Mode, Calculation Modes
12453@subsection Infinite Mode
12454
12455@noindent
12456@cindex Infinite mode
12457The Calculator normally treats results like @cite{1 / 0} as errors;
12458formulas like this are left in unsimplified form. But Calc can be
12459put into a mode where such calculations instead produce ``infinite''
12460results.
12461
12462@kindex m i
12463@pindex calc-infinite-mode
12464The @kbd{m i} (@code{calc-infinite-mode}) command turns this mode
12465on and off. When the mode is off, infinities do not arise except
12466in calculations that already had infinities as inputs. (One exception
12467is that infinite open intervals like @samp{[0 .. inf)} can be
12468generated; however, intervals closed at infinity (@samp{[0 .. inf]})
12469will not be generated when infinite mode is off.)
12470
12471With infinite mode turned on, @samp{1 / 0} will generate @code{uinf},
12472an undirected infinity. @xref{Infinities}, for a discussion of the
12473difference between @code{inf} and @code{uinf}. Also, @cite{0 / 0}
12474evaluates to @code{nan}, the ``indeterminate'' symbol. Various other
12475functions can also return infinities in this mode; for example,
12476@samp{ln(0) = -inf}, and @samp{gamma(-7) = uinf}. Once again,
12477note that @samp{exp(inf) = inf} regardless of infinite mode because
12478this calculation has infinity as an input.
12479
12480@cindex Positive infinite mode
12481The @kbd{m i} command with a numeric prefix argument of zero,
12482i.e., @kbd{C-u 0 m i}, turns on a ``positive infinite mode'' in
12483which zero is treated as positive instead of being directionless.
12484Thus, @samp{1 / 0 = inf} and @samp{-1 / 0 = -inf} in this mode.
12485Note that zero never actually has a sign in Calc; there are no
12486separate representations for @i{+0} and @i{-0}. Positive
12487infinite mode merely changes the interpretation given to the
12488single symbol, @samp{0}. One consequence of this is that, while
12489you might expect @samp{1 / -0 = -inf}, actually @samp{1 / -0}
12490is equivalent to @samp{1 / 0}, which is equal to positive @code{inf}.
12491
12492@node Symbolic Mode, Matrix Mode, Infinite Mode, Calculation Modes
12493@subsection Symbolic Mode
12494
12495@noindent
12496@cindex Symbolic mode
12497@cindex Inexact results
12498Calculations are normally performed numerically wherever possible.
12499For example, the @code{calc-sqrt} command, or @code{sqrt} function in an
12500algebraic expression, produces a numeric answer if the argument is a
12501number or a symbolic expression if the argument is an expression:
12502@kbd{2 Q} pushes 1.4142 but @kbd{@key{'} x+1 @key{RET} Q} pushes @samp{sqrt(x+1)}.
12503
12504@kindex m s
12505@pindex calc-symbolic-mode
12506In @dfn{symbolic mode}, controlled by the @kbd{m s} (@code{calc-symbolic-mode})
12507command, functions which would produce inexact, irrational results are
12508left in symbolic form. Thus @kbd{16 Q} pushes 4, but @kbd{2 Q} pushes
12509@samp{sqrt(2)}.
12510
12511@kindex N
12512@pindex calc-eval-num
12513The shift-@kbd{N} (@code{calc-eval-num}) command evaluates numerically
12514the expression at the top of the stack, by temporarily disabling
12515@code{calc-symbolic-mode} and executing @kbd{=} (@code{calc-evaluate}).
12516Given a numeric prefix argument, it also
12517sets the floating-point precision to the specified value for the duration
12518of the command.@refill
12519
12520To evaluate a formula numerically without expanding the variables it
12521contains, you can use the key sequence @kbd{m s a v m s} (this uses
12522@code{calc-alg-evaluate}, which resimplifies but doesn't evaluate
12523variables.)
12524
12525@node Matrix Mode, Automatic Recomputation, Symbolic Mode, Calculation Modes
12526@subsection Matrix and Scalar Modes
12527
12528@noindent
12529@cindex Matrix mode
12530@cindex Scalar mode
12531Calc sometimes makes assumptions during algebraic manipulation that
12532are awkward or incorrect when vectors and matrices are involved.
12533Calc has two modes, @dfn{matrix mode} and @dfn{scalar mode}, which
12534modify its behavior around vectors in useful ways.
12535
12536@kindex m v
12537@pindex calc-matrix-mode
12538Press @kbd{m v} (@code{calc-matrix-mode}) once to enter matrix mode.
12539In this mode, all objects are assumed to be matrices unless provably
12540otherwise. One major effect is that Calc will no longer consider
12541multiplication to be commutative. (Recall that in matrix arithmetic,
12542@samp{A*B} is not the same as @samp{B*A}.) This assumption affects
12543rewrite rules and algebraic simplification. Another effect of this
12544mode is that calculations that would normally produce constants like
125450 and 1 (e.g., @cite{a - a} and @cite{a / a}, respectively) will now
12546produce function calls that represent ``generic'' zero or identity
12547matrices: @samp{idn(0)}, @samp{idn(1)}. The @code{idn} function
12548@samp{idn(@var{a},@var{n})} returns @var{a} times an @var{n}x@var{n}
12549identity matrix; if @var{n} is omitted, it doesn't know what
12550dimension to use and so the @code{idn} call remains in symbolic
12551form. However, if this generic identity matrix is later combined
12552with a matrix whose size is known, it will be converted into
12553a true identity matrix of the appropriate size. On the other hand,
12554if it is combined with a scalar (as in @samp{idn(1) + 2}), Calc
12555will assume it really was a scalar after all and produce, e.g., 3.
12556
12557Press @kbd{m v} a second time to get scalar mode. Here, objects are
12558assumed @emph{not} to be vectors or matrices unless provably so.
12559For example, normally adding a variable to a vector, as in
12560@samp{[x, y, z] + a}, will leave the sum in symbolic form because
12561as far as Calc knows, @samp{a} could represent either a number or
12562another 3-vector. In scalar mode, @samp{a} is assumed to be a
12563non-vector, and the addition is evaluated to @samp{[x+a, y+a, z+a]}.
12564
12565Press @kbd{m v} a third time to return to the normal mode of operation.
12566
12567If you press @kbd{m v} with a numeric prefix argument @var{n}, you
12568get a special ``dimensioned matrix mode'' in which matrices of
12569unknown size are assumed to be @var{n}x@var{n} square matrices.
12570Then, the function call @samp{idn(1)} will expand into an actual
12571matrix rather than representing a ``generic'' matrix.
12572
12573@cindex Declaring scalar variables
12574Of course these modes are approximations to the true state of
12575affairs, which is probably that some quantities will be matrices
12576and others will be scalars. One solution is to ``declare''
12577certain variables or functions to be scalar-valued.
12578@xref{Declarations}, to see how to make declarations in Calc.
12579
12580There is nothing stopping you from declaring a variable to be
12581scalar and then storing a matrix in it; however, if you do, the
12582results you get from Calc may not be valid. Suppose you let Calc
12583get the result @samp{[x+a, y+a, z+a]} shown above, and then stored
12584@samp{[1, 2, 3]} in @samp{a}. The result would not be the same as
12585for @samp{[x, y, z] + [1, 2, 3]}, but that's because you have broken
12586your earlier promise to Calc that @samp{a} would be scalar.
12587
12588Another way to mix scalars and matrices is to use selections
12589(@pxref{Selecting Subformulas}). Use matrix mode when operating on
12590your formula normally; then, to apply scalar mode to a certain part
12591of the formula without affecting the rest just select that part,
12592change into scalar mode and press @kbd{=} to resimplify the part
12593under this mode, then change back to matrix mode before deselecting.
12594
12595@node Automatic Recomputation, Working Message, Matrix Mode, Calculation Modes
12596@subsection Automatic Recomputation
12597
12598@noindent
12599The @dfn{evaluates-to} operator, @samp{=>}, has the special
12600property that any @samp{=>} formulas on the stack are recomputed
12601whenever variable values or mode settings that might affect them
12602are changed. @xref{Evaluates-To Operator}.
12603
12604@kindex m C
12605@pindex calc-auto-recompute
12606The @kbd{m C} (@code{calc-auto-recompute}) command turns this
12607automatic recomputation on and off. If you turn it off, Calc will
12608not update @samp{=>} operators on the stack (nor those in the
12609attached Embedded Mode buffer, if there is one). They will not
12610be updated unless you explicitly do so by pressing @kbd{=} or until
12611you press @kbd{m C} to turn recomputation back on. (While automatic
12612recomputation is off, you can think of @kbd{m C m C} as a command
12613to update all @samp{=>} operators while leaving recomputation off.)
12614
12615To update @samp{=>} operators in an Embedded buffer while
12616automatic recomputation is off, use @w{@kbd{M-# u}}.
12617@xref{Embedded Mode}.
12618
12619@node Working Message, , Automatic Recomputation, Calculation Modes
12620@subsection Working Messages
12621
12622@noindent
12623@cindex Performance
12624@cindex Working messages
12625Since the Calculator is written entirely in Emacs Lisp, which is not
12626designed for heavy numerical work, many operations are quite slow.
12627The Calculator normally displays the message @samp{Working...} in the
12628echo area during any command that may be slow. In addition, iterative
12629operations such as square roots and trigonometric functions display the
12630intermediate result at each step. Both of these types of messages can
12631be disabled if you find them distracting.
12632
12633@kindex m w
12634@pindex calc-working
12635Type @kbd{m w} (@code{calc-working}) with a numeric prefix of 0 to
12636disable all ``working'' messages. Use a numeric prefix of 1 to enable
12637only the plain @samp{Working...} message. Use a numeric prefix of 2 to
12638see intermediate results as well. With no numeric prefix this displays
12639the current mode.@refill
12640
12641While it may seem that the ``working'' messages will slow Calc down
12642considerably, experiments have shown that their impact is actually
12643quite small. But if your terminal is slow you may find that it helps
12644to turn the messages off.
12645
12646@node Simplification Modes, Declarations, Calculation Modes, Mode Settings
12647@section Simplification Modes
12648
12649@noindent
12650The current @dfn{simplification mode} controls how numbers and formulas
12651are ``normalized'' when being taken from or pushed onto the stack.
12652Some normalizations are unavoidable, such as rounding floating-point
12653results to the current precision, and reducing fractions to simplest
12654form. Others, such as simplifying a formula like @cite{a+a} (or @cite{2+3}),
12655are done by default but can be turned off when necessary.
12656
12657When you press a key like @kbd{+} when @cite{2} and @cite{3} are on the
12658stack, Calc pops these numbers, normalizes them, creates the formula
12659@cite{2+3}, normalizes it, and pushes the result. Of course the standard
12660rules for normalizing @cite{2+3} will produce the result @cite{5}.
12661
12662Simplification mode commands consist of the lower-case @kbd{m} prefix key
12663followed by a shifted letter.
12664
12665@kindex m O
12666@pindex calc-no-simplify-mode
12667The @kbd{m O} (@code{calc-no-simplify-mode}) command turns off all optional
12668simplifications. These would leave a formula like @cite{2+3} alone. In
12669fact, nothing except simple numbers are ever affected by normalization
12670in this mode.
12671
12672@kindex m N
12673@pindex calc-num-simplify-mode
12674The @kbd{m N} (@code{calc-num-simplify-mode}) command turns off simplification
12675of any formulas except those for which all arguments are constants. For
12676example, @cite{1+2} is simplified to @cite{3}, and @cite{a+(2-2)} is
12677simplified to @cite{a+0} but no further, since one argument of the sum
12678is not a constant. Unfortunately, @cite{(a+2)-2} is @emph{not} simplified
12679because the top-level @samp{-} operator's arguments are not both
12680constant numbers (one of them is the formula @cite{a+2}).
12681A constant is a number or other numeric object (such as a constant
12682error form or modulo form), or a vector all of whose
12683elements are constant.@refill
12684
12685@kindex m D
12686@pindex calc-default-simplify-mode
12687The @kbd{m D} (@code{calc-default-simplify-mode}) command restores the
12688default simplifications for all formulas. This includes many easy and
12689fast algebraic simplifications such as @cite{a+0} to @cite{a}, and
12690@cite{a + 2 a} to @cite{3 a}, as well as evaluating functions like
12691@cite{@t{deriv}(x^2, x)} to @cite{2 x}.
12692
12693@kindex m B
12694@pindex calc-bin-simplify-mode
12695The @kbd{m B} (@code{calc-bin-simplify-mode}) mode applies the default
12696simplifications to a result and then, if the result is an integer,
12697uses the @kbd{b c} (@code{calc-clip}) command to clip the integer according
12698to the current binary word size. @xref{Binary Functions}. Real numbers
12699are rounded to the nearest integer and then clipped; other kinds of
12700results (after the default simplifications) are left alone.
12701
12702@kindex m A
12703@pindex calc-alg-simplify-mode
12704The @kbd{m A} (@code{calc-alg-simplify-mode}) mode does algebraic
12705simplification; it applies all the default simplifications, and also
12706the more powerful (and slower) simplifications made by @kbd{a s}
12707(@code{calc-simplify}). @xref{Algebraic Simplifications}.
12708
12709@kindex m E
12710@pindex calc-ext-simplify-mode
12711The @kbd{m E} (@code{calc-ext-simplify-mode}) mode does ``extended''
12712algebraic simplification, as by the @kbd{a e} (@code{calc-simplify-extended})
12713command. @xref{Unsafe Simplifications}.
12714
12715@kindex m U
12716@pindex calc-units-simplify-mode
12717The @kbd{m U} (@code{calc-units-simplify-mode}) mode does units
12718simplification; it applies the command @kbd{u s}
12719(@code{calc-simplify-units}), which in turn
12720is a superset of @kbd{a s}. In this mode, variable names which
12721are identifiable as unit names (like @samp{mm} for ``millimeters'')
12722are simplified with their unit definitions in mind.@refill
12723
12724A common technique is to set the simplification mode down to the lowest
12725amount of simplification you will allow to be applied automatically, then
12726use manual commands like @kbd{a s} and @kbd{c c} (@code{calc-clean}) to
12727perform higher types of simplifications on demand. @xref{Algebraic
12728Definitions}, for another sample use of no-simplification mode.@refill
12729
12730@node Declarations, Display Modes, Simplification Modes, Mode Settings
12731@section Declarations
12732
12733@noindent
12734A @dfn{declaration} is a statement you make that promises you will
12735use a certain variable or function in a restricted way. This may
12736give Calc the freedom to do things that it couldn't do if it had to
12737take the fully general situation into account.
12738
12739@menu
12740* Declaration Basics::
12741* Kinds of Declarations::
12742* Functions for Declarations::
12743@end menu
12744
12745@node Declaration Basics, Kinds of Declarations, Declarations, Declarations
12746@subsection Declaration Basics
12747
12748@noindent
12749@kindex s d
12750@pindex calc-declare-variable
12751The @kbd{s d} (@code{calc-declare-variable}) command is the easiest
12752way to make a declaration for a variable. This command prompts for
12753the variable name, then prompts for the declaration. The default
12754at the declaration prompt is the previous declaration, if any.
12755You can edit this declaration, or press @kbd{C-k} to erase it and
12756type a new declaration. (Or, erase it and press @key{RET} to clear
12757the declaration, effectively ``undeclaring'' the variable.)
12758
12759A declaration is in general a vector of @dfn{type symbols} and
12760@dfn{range} values. If there is only one type symbol or range value,
12761you can write it directly rather than enclosing it in a vector.
5d67986c
RS
12762For example, @kbd{s d foo @key{RET} real @key{RET}} declares @code{foo} to
12763be a real number, and @kbd{s d bar @key{RET} [int, const, [1..6]] @key{RET}}
d7b8e6c6
EZ
12764declares @code{bar} to be a constant integer between 1 and 6.
12765(Actually, you can omit the outermost brackets and Calc will
5d67986c 12766provide them for you: @kbd{s d bar @key{RET} int, const, [1..6] @key{RET}}.)
d7b8e6c6
EZ
12767
12768@cindex @code{Decls} variable
12769@vindex Decls
12770Declarations in Calc are kept in a special variable called @code{Decls}.
12771This variable encodes the set of all outstanding declarations in
12772the form of a matrix. Each row has two elements: A variable or
12773vector of variables declared by that row, and the declaration
12774specifier as described above. You can use the @kbd{s D} command to
12775edit this variable if you wish to see all the declarations at once.
12776@xref{Operations on Variables}, for a description of this command
12777and the @kbd{s p} command that allows you to save your declarations
12778permanently if you wish.
12779
12780Items being declared can also be function calls. The arguments in
12781the call are ignored; the effect is to say that this function returns
12782values of the declared type for any valid arguments. The @kbd{s d}
12783command declares only variables, so if you wish to make a function
12784declaration you will have to edit the @code{Decls} matrix yourself.
12785
12786For example, the declaration matrix
12787
d7b8e6c6 12788@smallexample
5d67986c 12789@group
d7b8e6c6
EZ
12790[ [ foo, real ]
12791 [ [j, k, n], int ]
12792 [ f(1,2,3), [0 .. inf) ] ]
d7b8e6c6 12793@end group
5d67986c 12794@end smallexample
d7b8e6c6
EZ
12795
12796@noindent
12797declares that @code{foo} represents a real number, @code{j}, @code{k}
12798and @code{n} represent integers, and the function @code{f} always
12799returns a real number in the interval shown.
12800
12801@vindex All
12802If there is a declaration for the variable @code{All}, then that
12803declaration applies to all variables that are not otherwise declared.
12804It does not apply to function names. For example, using the row
12805@samp{[All, real]} says that all your variables are real unless they
12806are explicitly declared without @code{real} in some other row.
12807The @kbd{s d} command declares @code{All} if you give a blank
12808response to the variable-name prompt.
12809
12810@node Kinds of Declarations, Functions for Declarations, Declaration Basics, Declarations
12811@subsection Kinds of Declarations
12812
12813@noindent
12814The type-specifier part of a declaration (that is, the second prompt
12815in the @kbd{s d} command) can be a type symbol, an interval, or a
12816vector consisting of zero or more type symbols followed by zero or
12817more intervals or numbers that represent the set of possible values
12818for the variable.
12819
d7b8e6c6 12820@smallexample
5d67986c 12821@group
d7b8e6c6
EZ
12822[ [ a, [1, 2, 3, 4, 5] ]
12823 [ b, [1 .. 5] ]
12824 [ c, [int, 1 .. 5] ] ]
d7b8e6c6 12825@end group
5d67986c 12826@end smallexample
d7b8e6c6
EZ
12827
12828Here @code{a} is declared to contain one of the five integers shown;
12829@code{b} is any number in the interval from 1 to 5 (any real number
12830since we haven't specified), and @code{c} is any integer in that
12831interval. Thus the declarations for @code{a} and @code{c} are
12832nearly equivalent (see below).
12833
12834The type-specifier can be the empty vector @samp{[]} to say that
12835nothing is known about a given variable's value. This is the same
12836as not declaring the variable at all except that it overrides any
12837@code{All} declaration which would otherwise apply.
12838
12839The initial value of @code{Decls} is the empty vector @samp{[]}.
12840If @code{Decls} has no stored value or if the value stored in it
12841is not valid, it is ignored and there are no declarations as far
12842as Calc is concerned. (The @kbd{s d} command will replace such a
12843malformed value with a fresh empty matrix, @samp{[]}, before recording
12844the new declaration.) Unrecognized type symbols are ignored.
12845
12846The following type symbols describe what sorts of numbers will be
12847stored in a variable:
12848
12849@table @code
12850@item int
12851Integers.
12852@item numint
12853Numerical integers. (Integers or integer-valued floats.)
12854@item frac
12855Fractions. (Rational numbers which are not integers.)
12856@item rat
12857Rational numbers. (Either integers or fractions.)
12858@item float
12859Floating-point numbers.
12860@item real
12861Real numbers. (Integers, fractions, or floats. Actually,
12862intervals and error forms with real components also count as
12863reals here.)
12864@item pos
12865Positive real numbers. (Strictly greater than zero.)
12866@item nonneg
12867Nonnegative real numbers. (Greater than or equal to zero.)
12868@item number
12869Numbers. (Real or complex.)
12870@end table
12871
12872Calc uses this information to determine when certain simplifications
12873of formulas are safe. For example, @samp{(x^y)^z} cannot be
12874simplified to @samp{x^(y z)} in general; for example,
12875@samp{((-3)^2)^1:2} is 3, but @samp{(-3)^(2*1:2) = (-3)^1} is @i{-3}.
12876However, this simplification @emph{is} safe if @code{z} is known
12877to be an integer, or if @code{x} is known to be a nonnegative
12878real number. If you have given declarations that allow Calc to
12879deduce either of these facts, Calc will perform this simplification
12880of the formula.
12881
12882Calc can apply a certain amount of logic when using declarations.
12883For example, @samp{(x^y)^(2n+1)} will be simplified if @code{n}
12884has been declared @code{int}; Calc knows that an integer times an
12885integer, plus an integer, must always be an integer. (In fact,
12886Calc would simplify @samp{(-x)^(2n+1)} to @samp{-(x^(2n+1))} since
12887it is able to determine that @samp{2n+1} must be an odd integer.)
12888
12889Similarly, @samp{(abs(x)^y)^z} will be simplified to @samp{abs(x)^(y z)}
12890because Calc knows that the @code{abs} function always returns a
12891nonnegative real. If you had a @code{myabs} function that also had
12892this property, you could get Calc to recognize it by adding the row
12893@samp{[myabs(), nonneg]} to the @code{Decls} matrix.
12894
12895One instance of this simplification is @samp{sqrt(x^2)} (since the
12896@code{sqrt} function is effectively a one-half power). Normally
12897Calc leaves this formula alone. After the command
5d67986c
RS
12898@kbd{s d x @key{RET} real @key{RET}}, however, it can simplify the formula to
12899@samp{abs(x)}. And after @kbd{s d x @key{RET} nonneg @key{RET}}, Calc can
d7b8e6c6
EZ
12900simplify this formula all the way to @samp{x}.
12901
12902If there are any intervals or real numbers in the type specifier,
12903they comprise the set of possible values that the variable or
12904function being declared can have. In particular, the type symbol
12905@code{real} is effectively the same as the range @samp{[-inf .. inf]}
12906(note that infinity is included in the range of possible values);
12907@code{pos} is the same as @samp{(0 .. inf]}, and @code{nonneg} is
12908the same as @samp{[0 .. inf]}. Saying @samp{[real, [-5 .. 5]]} is
12909redundant because the fact that the variable is real can be
12910deduced just from the interval, but @samp{[int, [-5 .. 5]]} and
12911@samp{[rat, [-5 .. 5]]} are useful combinations.
12912
12913Note that the vector of intervals or numbers is in the same format
12914used by Calc's set-manipulation commands. @xref{Set Operations}.
12915
12916The type specifier @samp{[1, 2, 3]} is equivalent to
12917@samp{[numint, 1, 2, 3]}, @emph{not} to @samp{[int, 1, 2, 3]}.
12918In other words, the range of possible values means only that
12919the variable's value must be numerically equal to a number in
12920that range, but not that it must be equal in type as well.
12921Calc's set operations act the same way; @samp{in(2, [1., 2., 3.])}
12922and @samp{in(1.5, [1:2, 3:2, 5:2])} both report ``true.''
12923
12924If you use a conflicting combination of type specifiers, the
12925results are unpredictable. An example is @samp{[pos, [0 .. 5]]},
12926where the interval does not lie in the range described by the
12927type symbol.
12928
12929``Real'' declarations mostly affect simplifications involving powers
12930like the one described above. Another case where they are used
12931is in the @kbd{a P} command which returns a list of all roots of a
12932polynomial; if the variable has been declared real, only the real
12933roots (if any) will be included in the list.
12934
12935``Integer'' declarations are used for simplifications which are valid
12936only when certain values are integers (such as @samp{(x^y)^z}
12937shown above).
12938
12939Another command that makes use of declarations is @kbd{a s}, when
12940simplifying equations and inequalities. It will cancel @code{x}
12941from both sides of @samp{a x = b x} only if it is sure @code{x}
12942is non-zero, say, because it has a @code{pos} declaration.
12943To declare specifically that @code{x} is real and non-zero,
12944use @samp{[[-inf .. 0), (0 .. inf]]}. (There is no way in the
12945current notation to say that @code{x} is nonzero but not necessarily
12946real.) The @kbd{a e} command does ``unsafe'' simplifications,
12947including cancelling @samp{x} from the equation when @samp{x} is
12948not known to be nonzero.
12949
12950Another set of type symbols distinguish between scalars and vectors.
12951
12952@table @code
12953@item scalar
12954The value is not a vector.
12955@item vector
12956The value is a vector.
12957@item matrix
12958The value is a matrix (a rectangular vector of vectors).
12959@end table
12960
12961These type symbols can be combined with the other type symbols
12962described above; @samp{[int, matrix]} describes an object which
12963is a matrix of integers.
12964
12965Scalar/vector declarations are used to determine whether certain
12966algebraic operations are safe. For example, @samp{[a, b, c] + x}
12967is normally not simplified to @samp{[a + x, b + x, c + x]}, but
12968it will be if @code{x} has been declared @code{scalar}. On the
12969other hand, multiplication is usually assumed to be commutative,
12970but the terms in @samp{x y} will never be exchanged if both @code{x}
12971and @code{y} are known to be vectors or matrices. (Calc currently
12972never distinguishes between @code{vector} and @code{matrix}
12973declarations.)
12974
12975@xref{Matrix Mode}, for a discussion of ``matrix mode'' and
12976``scalar mode,'' which are similar to declaring @samp{[All, matrix]}
12977or @samp{[All, scalar]} but much more convenient.
12978
12979One more type symbol that is recognized is used with the @kbd{H a d}
12980command for taking total derivatives of a formula. @xref{Calculus}.
12981
12982@table @code
12983@item const
12984The value is a constant with respect to other variables.
12985@end table
12986
12987Calc does not check the declarations for a variable when you store
12988a value in it. However, storing @i{-3.5} in a variable that has
12989been declared @code{pos}, @code{int}, or @code{matrix} may have
12990unexpected effects; Calc may evaluate @samp{sqrt(x^2)} to @cite{3.5}
12991if it substitutes the value first, or to @cite{-3.5} if @code{x}
12992was declared @code{pos} and the formula @samp{sqrt(x^2)} is
12993simplified to @samp{x} before the value is substituted. Before
12994using a variable for a new purpose, it is best to use @kbd{s d}
12995or @kbd{s D} to check to make sure you don't still have an old
12996declaration for the variable that will conflict with its new meaning.
12997
12998@node Functions for Declarations, , Kinds of Declarations, Declarations
12999@subsection Functions for Declarations
13000
13001@noindent
13002Calc has a set of functions for accessing the current declarations
13003in a convenient manner. These functions return 1 if the argument
13004can be shown to have the specified property, or 0 if the argument
13005can be shown @emph{not} to have that property; otherwise they are
13006left unevaluated. These functions are suitable for use with rewrite
13007rules (@pxref{Conditional Rewrite Rules}) or programming constructs
13008(@pxref{Conditionals in Macros}). They can be entered only using
13009algebraic notation. @xref{Logical Operations}, for functions
13010that perform other tests not related to declarations.
13011
13012For example, @samp{dint(17)} returns 1 because 17 is an integer, as
13013do @samp{dint(n)} and @samp{dint(2 n - 3)} if @code{n} has been declared
13014@code{int}, but @samp{dint(2.5)} and @samp{dint(n + 0.5)} return 0.
13015Calc consults knowledge of its own built-in functions as well as your
13016own declarations: @samp{dint(floor(x))} returns 1.
13017
5d67986c
RS
13018@ignore
13019@starindex
13020@end ignore
d7b8e6c6 13021@tindex dint
5d67986c
RS
13022@ignore
13023@starindex
13024@end ignore
d7b8e6c6 13025@tindex dnumint
5d67986c
RS
13026@ignore
13027@starindex
13028@end ignore
d7b8e6c6
EZ
13029@tindex dnatnum
13030The @code{dint} function checks if its argument is an integer.
13031The @code{dnatnum} function checks if its argument is a natural
13032number, i.e., a nonnegative integer. The @code{dnumint} function
13033checks if its argument is numerically an integer, i.e., either an
13034integer or an integer-valued float. Note that these and the other
13035data type functions also accept vectors or matrices composed of
13036suitable elements, and that real infinities @samp{inf} and @samp{-inf}
13037are considered to be integers for the purposes of these functions.
13038
5d67986c
RS
13039@ignore
13040@starindex
13041@end ignore
d7b8e6c6
EZ
13042@tindex drat
13043The @code{drat} function checks if its argument is rational, i.e.,
13044an integer or fraction. Infinities count as rational, but intervals
13045and error forms do not.
13046
5d67986c
RS
13047@ignore
13048@starindex
13049@end ignore
d7b8e6c6
EZ
13050@tindex dreal
13051The @code{dreal} function checks if its argument is real. This
13052includes integers, fractions, floats, real error forms, and intervals.
13053
5d67986c
RS
13054@ignore
13055@starindex
13056@end ignore
d7b8e6c6
EZ
13057@tindex dimag
13058The @code{dimag} function checks if its argument is imaginary,
13059i.e., is mathematically equal to a real number times @cite{i}.
13060
5d67986c
RS
13061@ignore
13062@starindex
13063@end ignore
d7b8e6c6 13064@tindex dpos
5d67986c
RS
13065@ignore
13066@starindex
13067@end ignore
d7b8e6c6 13068@tindex dneg
5d67986c
RS
13069@ignore
13070@starindex
13071@end ignore
d7b8e6c6
EZ
13072@tindex dnonneg
13073The @code{dpos} function checks for positive (but nonzero) reals.
13074The @code{dneg} function checks for negative reals. The @code{dnonneg}
13075function checks for nonnegative reals, i.e., reals greater than or
13076equal to zero. Note that the @kbd{a s} command can simplify an
13077expression like @cite{x > 0} to 1 or 0 using @code{dpos}, and that
13078@kbd{a s} is effectively applied to all conditions in rewrite rules,
13079so the actual functions @code{dpos}, @code{dneg}, and @code{dnonneg}
13080are rarely necessary.
13081
5d67986c
RS
13082@ignore
13083@starindex
13084@end ignore
d7b8e6c6
EZ
13085@tindex dnonzero
13086The @code{dnonzero} function checks that its argument is nonzero.
13087This includes all nonzero real or complex numbers, all intervals that
13088do not include zero, all nonzero modulo forms, vectors all of whose
13089elements are nonzero, and variables or formulas whose values can be
13090deduced to be nonzero. It does not include error forms, since they
13091represent values which could be anything including zero. (This is
13092also the set of objects considered ``true'' in conditional contexts.)
13093
5d67986c
RS
13094@ignore
13095@starindex
13096@end ignore
d7b8e6c6 13097@tindex deven
5d67986c
RS
13098@ignore
13099@starindex
13100@end ignore
d7b8e6c6
EZ
13101@tindex dodd
13102The @code{deven} function returns 1 if its argument is known to be
13103an even integer (or integer-valued float); it returns 0 if its argument
13104is known not to be even (because it is known to be odd or a non-integer).
13105The @kbd{a s} command uses this to simplify a test of the form
13106@samp{x % 2 = 0}. There is also an analogous @code{dodd} function.
13107
5d67986c
RS
13108@ignore
13109@starindex
13110@end ignore
d7b8e6c6
EZ
13111@tindex drange
13112The @code{drange} function returns a set (an interval or a vector
13113of intervals and/or numbers; @pxref{Set Operations}) that describes
13114the set of possible values of its argument. If the argument is
13115a variable or a function with a declaration, the range is copied
13116from the declaration. Otherwise, the possible signs of the
13117expression are determined using a method similar to @code{dpos},
13118etc., and a suitable set like @samp{[0 .. inf]} is returned. If
13119the expression is not provably real, the @code{drange} function
13120remains unevaluated.
13121
5d67986c
RS
13122@ignore
13123@starindex
13124@end ignore
d7b8e6c6
EZ
13125@tindex dscalar
13126The @code{dscalar} function returns 1 if its argument is provably
13127scalar, or 0 if its argument is provably non-scalar. It is left
13128unevaluated if this cannot be determined. (If matrix mode or scalar
13129mode are in effect, this function returns 1 or 0, respectively,
13130if it has no other information.) When Calc interprets a condition
13131(say, in a rewrite rule) it considers an unevaluated formula to be
13132``false.'' Thus, @samp{dscalar(a)} is ``true'' only if @code{a} is
13133provably scalar, and @samp{!dscalar(a)} is ``true'' only if @code{a}
13134is provably non-scalar; both are ``false'' if there is insufficient
13135information to tell.
13136
13137@node Display Modes, Language Modes, Declarations, Mode Settings
13138@section Display Modes
13139
13140@noindent
13141The commands in this section are two-key sequences beginning with the
13142@kbd{d} prefix. The @kbd{d l} (@code{calc-line-numbering}) and @kbd{d b}
13143(@code{calc-line-breaking}) commands are described elsewhere;
13144@pxref{Stack Basics} and @pxref{Normal Language Modes}, respectively.
13145Display formats for vectors and matrices are also covered elsewhere;
13146@pxref{Vector and Matrix Formats}.@refill
13147
13148One thing all display modes have in common is their treatment of the
13149@kbd{H} prefix. This prefix causes any mode command that would normally
13150refresh the stack to leave the stack display alone. The word ``Dirty''
13151will appear in the mode line when Calc thinks the stack display may not
13152reflect the latest mode settings.
13153
5d67986c 13154@kindex d @key{RET}
d7b8e6c6 13155@pindex calc-refresh-top
5d67986c 13156The @kbd{d @key{RET}} (@code{calc-refresh-top}) command reformats the
d7b8e6c6
EZ
13157top stack entry according to all the current modes. Positive prefix
13158arguments reformat the top @var{n} entries; negative prefix arguments
13159reformat the specified entry, and a prefix of zero is equivalent to
5d67986c
RS
13160@kbd{d @key{SPC}} (@code{calc-refresh}), which reformats the entire stack.
13161For example, @kbd{H d s M-2 d @key{RET}} changes to scientific notation
d7b8e6c6
EZ
13162but reformats only the top two stack entries in the new mode.
13163
13164The @kbd{I} prefix has another effect on the display modes. The mode
13165is set only temporarily; the top stack entry is reformatted according
13166to that mode, then the original mode setting is restored. In other
5d67986c 13167words, @kbd{I d s} is equivalent to @kbd{H d s d @key{RET} H d (@var{old mode})}.
d7b8e6c6
EZ
13168
13169@menu
13170* Radix Modes::
13171* Grouping Digits::
13172* Float Formats::
13173* Complex Formats::
13174* Fraction Formats::
13175* HMS Formats::
13176* Date Formats::
13177* Truncating the Stack::
13178* Justification::
13179* Labels::
13180@end menu
13181
13182@node Radix Modes, Grouping Digits, Display Modes, Display Modes
13183@subsection Radix Modes
13184
13185@noindent
13186@cindex Radix display
13187@cindex Non-decimal numbers
13188@cindex Decimal and non-decimal numbers
13189Calc normally displays numbers in decimal (@dfn{base-10} or @dfn{radix-10})
13190notation. Calc can actually display in any radix from two (binary) to 36.
13191When the radix is above 10, the letters @code{A} to @code{Z} are used as
13192digits. When entering such a number, letter keys are interpreted as
13193potential digits rather than terminating numeric entry mode.
13194
13195@kindex d 2
13196@kindex d 8
13197@kindex d 6
13198@kindex d 0
13199@cindex Hexadecimal integers
13200@cindex Octal integers
13201The key sequences @kbd{d 2}, @kbd{d 8}, @kbd{d 6}, and @kbd{d 0} select
13202binary, octal, hexadecimal, and decimal as the current display radix,
13203respectively. Numbers can always be entered in any radix, though the
13204current radix is used as a default if you press @kbd{#} without any initial
13205digits. A number entered without a @kbd{#} is @emph{always} interpreted
13206as decimal.@refill
13207
13208@kindex d r
13209@pindex calc-radix
13210To set the radix generally, use @kbd{d r} (@code{calc-radix}) and enter
13211an integer from 2 to 36. You can specify the radix as a numeric prefix
13212argument; otherwise you will be prompted for it.
13213
13214@kindex d z
13215@pindex calc-leading-zeros
13216@cindex Leading zeros
13217Integers normally are displayed with however many digits are necessary to
13218represent the integer and no more. The @kbd{d z} (@code{calc-leading-zeros})
13219command causes integers to be padded out with leading zeros according to the
13220current binary word size. (@xref{Binary Functions}, for a discussion of
13221word size.) If the absolute value of the word size is @cite{w}, all integers
13222are displayed with at least enough digits to represent @c{$2^w-1$}
13223@cite{(2^w)-1} in the
13224current radix. (Larger integers will still be displayed in their entirety.)
13225
13226@node Grouping Digits, Float Formats, Radix Modes, Display Modes
13227@subsection Grouping Digits
13228
13229@noindent
13230@kindex d g
13231@pindex calc-group-digits
13232@cindex Grouping digits
13233@cindex Digit grouping
13234Long numbers can be hard to read if they have too many digits. For
13235example, the factorial of 30 is 33 digits long! Press @kbd{d g}
13236(@code{calc-group-digits}) to enable @dfn{grouping} mode, in which digits
13237are displayed in clumps of 3 or 4 (depending on the current radix)
13238separated by commas.
13239
13240The @kbd{d g} command toggles grouping on and off.
13241With a numerix prefix of 0, this command displays the current state of
13242the grouping flag; with an argument of minus one it disables grouping;
13243with a positive argument @cite{N} it enables grouping on every @cite{N}
13244digits. For floating-point numbers, grouping normally occurs only
13245before the decimal point. A negative prefix argument @cite{-N} enables
13246grouping every @cite{N} digits both before and after the decimal point.@refill
13247
13248@kindex d ,
13249@pindex calc-group-char
13250The @kbd{d ,} (@code{calc-group-char}) command allows you to choose any
13251character as the grouping separator. The default is the comma character.
13252If you find it difficult to read vectors of large integers grouped with
13253commas, you may wish to use spaces or some other character instead.
13254This command takes the next character you type, whatever it is, and
13255uses it as the digit separator. As a special case, @kbd{d , \} selects
13256@samp{\,} (@TeX{}'s thin-space symbol) as the digit separator.
13257
13258Please note that grouped numbers will not generally be parsed correctly
13259if re-read in textual form, say by the use of @kbd{M-# y} and @kbd{M-# g}.
13260(@xref{Kill and Yank}, for details on these commands.) One exception is
13261the @samp{\,} separator, which doesn't interfere with parsing because it
13262is ignored by @TeX{} language mode.
13263
13264@node Float Formats, Complex Formats, Grouping Digits, Display Modes
13265@subsection Float Formats
13266
13267@noindent
13268Floating-point quantities are normally displayed in standard decimal
13269form, with scientific notation used if the exponent is especially high
13270or low. All significant digits are normally displayed. The commands
13271in this section allow you to choose among several alternative display
13272formats for floats.
13273
13274@kindex d n
13275@pindex calc-normal-notation
13276The @kbd{d n} (@code{calc-normal-notation}) command selects the normal
13277display format. All significant figures in a number are displayed.
13278With a positive numeric prefix, numbers are rounded if necessary to
13279that number of significant digits. With a negative numerix prefix,
13280the specified number of significant digits less than the current
13281precision is used. (Thus @kbd{C-u -2 d n} displays 10 digits if the
13282current precision is 12.)
13283
13284@kindex d f
13285@pindex calc-fix-notation
13286The @kbd{d f} (@code{calc-fix-notation}) command selects fixed-point
13287notation. The numeric argument is the number of digits after the
13288decimal point, zero or more. This format will relax into scientific
13289notation if a nonzero number would otherwise have been rounded all the
13290way to zero. Specifying a negative number of digits is the same as
13291for a positive number, except that small nonzero numbers will be rounded
13292to zero rather than switching to scientific notation.
13293
13294@kindex d s
13295@pindex calc-sci-notation
13296@cindex Scientific notation, display of
13297The @kbd{d s} (@code{calc-sci-notation}) command selects scientific
13298notation. A positive argument sets the number of significant figures
13299displayed, of which one will be before and the rest after the decimal
13300point. A negative argument works the same as for @kbd{d n} format.
13301The default is to display all significant digits.
13302
13303@kindex d e
13304@pindex calc-eng-notation
13305@cindex Engineering notation, display of
13306The @kbd{d e} (@code{calc-eng-notation}) command selects engineering
13307notation. This is similar to scientific notation except that the
13308exponent is rounded down to a multiple of three, with from one to three
13309digits before the decimal point. An optional numeric prefix sets the
13310number of significant digits to display, as for @kbd{d s}.
13311
13312It is important to distinguish between the current @emph{precision} and
13313the current @emph{display format}. After the commands @kbd{C-u 10 p}
13314and @kbd{C-u 6 d n} the Calculator computes all results to ten
13315significant figures but displays only six. (In fact, intermediate
13316calculations are often carried to one or two more significant figures,
13317but values placed on the stack will be rounded down to ten figures.)
13318Numbers are never actually rounded to the display precision for storage,
13319except by commands like @kbd{C-k} and @kbd{M-# y} which operate on the
13320actual displayed text in the Calculator buffer.
13321
13322@kindex d .
13323@pindex calc-point-char
13324The @kbd{d .} (@code{calc-point-char}) command selects the character used
13325as a decimal point. Normally this is a period; users in some countries
13326may wish to change this to a comma. Note that this is only a display
13327style; on entry, periods must always be used to denote floating-point
13328numbers, and commas to separate elements in a list.
13329
13330@node Complex Formats, Fraction Formats, Float Formats, Display Modes
13331@subsection Complex Formats
13332
13333@noindent
13334@kindex d c
13335@pindex calc-complex-notation
13336There are three supported notations for complex numbers in rectangular
13337form. The default is as a pair of real numbers enclosed in parentheses
13338and separated by a comma: @samp{(a,b)}. The @kbd{d c}
13339(@code{calc-complex-notation}) command selects this style.@refill
13340
13341@kindex d i
13342@pindex calc-i-notation
13343@kindex d j
13344@pindex calc-j-notation
13345The other notations are @kbd{d i} (@code{calc-i-notation}), in which
13346numbers are displayed in @samp{a+bi} form, and @kbd{d j}
13347(@code{calc-j-notation}) which displays the form @samp{a+bj} preferred
13348in some disciplines.@refill
13349
13350@cindex @code{i} variable
13351@vindex i
13352Complex numbers are normally entered in @samp{(a,b)} format.
13353If you enter @samp{2+3i} as an algebraic formula, it will be stored as
13354the formula @samp{2 + 3 * i}. However, if you use @kbd{=} to evaluate
13355this formula and you have not changed the variable @samp{i}, the @samp{i}
13356will be interpreted as @samp{(0,1)} and the formula will be simplified
13357to @samp{(2,3)}. Other commands (like @code{calc-sin}) will @emph{not}
13358interpret the formula @samp{2 + 3 * i} as a complex number.
13359@xref{Variables}, under ``special constants.''@refill
13360
13361@node Fraction Formats, HMS Formats, Complex Formats, Display Modes
13362@subsection Fraction Formats
13363
13364@noindent
13365@kindex d o
13366@pindex calc-over-notation
13367Display of fractional numbers is controlled by the @kbd{d o}
13368(@code{calc-over-notation}) command. By default, a number like
13369eight thirds is displayed in the form @samp{8:3}. The @kbd{d o} command
13370prompts for a one- or two-character format. If you give one character,
13371that character is used as the fraction separator. Common separators are
13372@samp{:} and @samp{/}. (During input of numbers, the @kbd{:} key must be
13373used regardless of the display format; in particular, the @kbd{/} is used
13374for RPN-style division, @emph{not} for entering fractions.)
13375
13376If you give two characters, fractions use ``integer-plus-fractional-part''
13377notation. For example, the format @samp{+/} would display eight thirds
13378as @samp{2+2/3}. If two colons are present in a number being entered,
13379the number is interpreted in this form (so that the entries @kbd{2:2:3}
13380and @kbd{8:3} are equivalent).
13381
13382It is also possible to follow the one- or two-character format with
13383a number. For example: @samp{:10} or @samp{+/3}. In this case,
13384Calc adjusts all fractions that are displayed to have the specified
13385denominator, if possible. Otherwise it adjusts the denominator to
13386be a multiple of the specified value. For example, in @samp{:6} mode
13387the fraction @cite{1:6} will be unaffected, but @cite{2:3} will be
13388displayed as @cite{4:6}, @cite{1:2} will be displayed as @cite{3:6},
13389and @cite{1:8} will be displayed as @cite{3:24}. Integers are also
13390affected by this mode: 3 is displayed as @cite{18:6}. Note that the
13391format @samp{:1} writes fractions the same as @samp{:}, but it writes
13392integers as @cite{n:1}.
13393
13394The fraction format does not affect the way fractions or integers are
13395stored, only the way they appear on the screen. The fraction format
13396never affects floats.
13397
13398@node HMS Formats, Date Formats, Fraction Formats, Display Modes
13399@subsection HMS Formats
13400
13401@noindent
13402@kindex d h
13403@pindex calc-hms-notation
13404The @kbd{d h} (@code{calc-hms-notation}) command controls the display of
13405HMS (hours-minutes-seconds) forms. It prompts for a string which
13406consists basically of an ``hours'' marker, optional punctuation, a
13407``minutes'' marker, more optional punctuation, and a ``seconds'' marker.
13408Punctuation is zero or more spaces, commas, or semicolons. The hours
13409marker is one or more non-punctuation characters. The minutes and
13410seconds markers must be single non-punctuation characters.
13411
13412The default HMS format is @samp{@@ ' "}, producing HMS values of the form
13413@samp{23@@ 30' 15.75"}. The format @samp{deg, ms} would display this same
13414value as @samp{23deg, 30m15.75s}. During numeric entry, the @kbd{h} or @kbd{o}
13415keys are recognized as synonyms for @kbd{@@} regardless of display format.
13416The @kbd{m} and @kbd{s} keys are recognized as synonyms for @kbd{'} and
13417@kbd{"}, respectively, but only if an @kbd{@@} (or @kbd{h} or @kbd{o}) has
13418already been typed; otherwise, they have their usual meanings
13419(@kbd{m-} prefix and @kbd{s-} prefix). Thus, @kbd{5 "}, @kbd{0 @@ 5 "}, and
13420@kbd{0 h 5 s} are some of the ways to enter the quantity ``five seconds.''
13421The @kbd{'} key is recognized as ``minutes'' only if @kbd{@@} (or @kbd{h} or
13422@kbd{o}) has already been pressed; otherwise it means to switch to algebraic
13423entry.
13424
13425@node Date Formats, Truncating the Stack, HMS Formats, Display Modes
13426@subsection Date Formats
13427
13428@noindent
13429@kindex d d
13430@pindex calc-date-notation
13431The @kbd{d d} (@code{calc-date-notation}) command controls the display
13432of date forms (@pxref{Date Forms}). It prompts for a string which
13433contains letters that represent the various parts of a date and time.
13434To show which parts should be omitted when the form represents a pure
13435date with no time, parts of the string can be enclosed in @samp{< >}
13436marks. If you don't include @samp{< >} markers in the format, Calc
13437guesses at which parts, if any, should be omitted when formatting
13438pure dates.
13439
13440The default format is: @samp{<H:mm:SSpp >Www Mmm D, YYYY}.
13441An example string in this format is @samp{3:32pm Wed Jan 9, 1991}.
13442If you enter a blank format string, this default format is
13443reestablished.
13444
13445Calc uses @samp{< >} notation for nameless functions as well as for
13446dates. @xref{Specifying Operators}. To avoid confusion with nameless
13447functions, your date formats should avoid using the @samp{#} character.
13448
13449@menu
13450* Date Formatting Codes::
13451* Free-Form Dates::
13452* Standard Date Formats::
13453@end menu
13454
13455@node Date Formatting Codes, Free-Form Dates, Date Formats, Date Formats
13456@subsubsection Date Formatting Codes
13457
13458@noindent
13459When displaying a date, the current date format is used. All
13460characters except for letters and @samp{<} and @samp{>} are
13461copied literally when dates are formatted. The portion between
13462@samp{< >} markers is omitted for pure dates, or included for
13463date/time forms. Letters are interpreted according to the table
13464below.
13465
13466When dates are read in during algebraic entry, Calc first tries to
13467match the input string to the current format either with or without
13468the time part. The punctuation characters (including spaces) must
13469match exactly; letter fields must correspond to suitable text in
13470the input. If this doesn't work, Calc checks if the input is a
13471simple number; if so, the number is interpreted as a number of days
13472since Jan 1, 1 AD. Otherwise, Calc tries a much more relaxed and
13473flexible algorithm which is described in the next section.
13474
13475Weekday names are ignored during reading.
13476
13477Two-digit year numbers are interpreted as lying in the range
13478from 1941 to 2039. Years outside that range are always
13479entered and displayed in full. Year numbers with a leading
13480@samp{+} sign are always interpreted exactly, allowing the
13481entry and display of the years 1 through 99 AD.
13482
13483Here is a complete list of the formatting codes for dates:
13484
13485@table @asis
13486@item Y
13487Year: ``91'' for 1991, ``7'' for 2007, ``+23'' for 23 AD.
13488@item YY
13489Year: ``91'' for 1991, ``07'' for 2007, ``+23'' for 23 AD.
13490@item BY
13491Year: ``91'' for 1991, `` 7'' for 2007, ``+23'' for 23 AD.
13492@item YYY
13493Year: ``1991'' for 1991, ``23'' for 23 AD.
13494@item YYYY
13495Year: ``1991'' for 1991, ``+23'' for 23 AD.
13496@item aa
13497Year: ``ad'' or blank.
13498@item AA
13499Year: ``AD'' or blank.
13500@item aaa
13501Year: ``ad '' or blank. (Note trailing space.)
13502@item AAA
13503Year: ``AD '' or blank.
13504@item aaaa
13505Year: ``a.d.'' or blank.
13506@item AAAA
13507Year: ``A.D.'' or blank.
13508@item bb
13509Year: ``bc'' or blank.
13510@item BB
13511Year: ``BC'' or blank.
13512@item bbb
13513Year: `` bc'' or blank. (Note leading space.)
13514@item BBB
13515Year: `` BC'' or blank.
13516@item bbbb
13517Year: ``b.c.'' or blank.
13518@item BBBB
13519Year: ``B.C.'' or blank.
13520@item M
13521Month: ``8'' for August.
13522@item MM
13523Month: ``08'' for August.
13524@item BM
13525Month: `` 8'' for August.
13526@item MMM
13527Month: ``AUG'' for August.
13528@item Mmm
13529Month: ``Aug'' for August.
13530@item mmm
13531Month: ``aug'' for August.
13532@item MMMM
13533Month: ``AUGUST'' for August.
13534@item Mmmm
13535Month: ``August'' for August.
13536@item D
13537Day: ``7'' for 7th day of month.
13538@item DD
13539Day: ``07'' for 7th day of month.
13540@item BD
13541Day: `` 7'' for 7th day of month.
13542@item W
13543Weekday: ``0'' for Sunday, ``6'' for Saturday.
13544@item WWW
13545Weekday: ``SUN'' for Sunday.
13546@item Www
13547Weekday: ``Sun'' for Sunday.
13548@item www
13549Weekday: ``sun'' for Sunday.
13550@item WWWW
13551Weekday: ``SUNDAY'' for Sunday.
13552@item Wwww
13553Weekday: ``Sunday'' for Sunday.
13554@item d
13555Day of year: ``34'' for Feb. 3.
13556@item ddd
13557Day of year: ``034'' for Feb. 3.
13558@item bdd
13559Day of year: `` 34'' for Feb. 3.
13560@item h
13561Hour: ``5'' for 5 AM; ``17'' for 5 PM.
13562@item hh
13563Hour: ``05'' for 5 AM; ``17'' for 5 PM.
13564@item bh
13565Hour: `` 5'' for 5 AM; ``17'' for 5 PM.
13566@item H
13567Hour: ``5'' for 5 AM and 5 PM.
13568@item HH
13569Hour: ``05'' for 5 AM and 5 PM.
13570@item BH
13571Hour: `` 5'' for 5 AM and 5 PM.
13572@item p
13573AM/PM: ``a'' or ``p''.
13574@item P
13575AM/PM: ``A'' or ``P''.
13576@item pp
13577AM/PM: ``am'' or ``pm''.
13578@item PP
13579AM/PM: ``AM'' or ``PM''.
13580@item pppp
13581AM/PM: ``a.m.'' or ``p.m.''.
13582@item PPPP
13583AM/PM: ``A.M.'' or ``P.M.''.
13584@item m
13585Minutes: ``7'' for 7.
13586@item mm
13587Minutes: ``07'' for 7.
13588@item bm
13589Minutes: `` 7'' for 7.
13590@item s
13591Seconds: ``7'' for 7; ``7.23'' for 7.23.
13592@item ss
13593Seconds: ``07'' for 7; ``07.23'' for 7.23.
13594@item bs
13595Seconds: `` 7'' for 7; `` 7.23'' for 7.23.
13596@item SS
13597Optional seconds: ``07'' for 7; blank for 0.
13598@item BS
13599Optional seconds: `` 7'' for 7; blank for 0.
13600@item N
13601Numeric date/time: ``726842.25'' for 6:00am Wed Jan 9, 1991.
13602@item n
13603Numeric date: ``726842'' for any time on Wed Jan 9, 1991.
13604@item J
13605Julian date/time: ``2448265.75'' for 6:00am Wed Jan 9, 1991.
13606@item j
13607Julian date: ``2448266'' for any time on Wed Jan 9, 1991.
13608@item U
13609Unix time: ``663400800'' for 6:00am Wed Jan 9, 1991.
13610@item X
13611Brackets suppression. An ``X'' at the front of the format
13612causes the surrounding @w{@samp{< >}} delimiters to be omitted
13613when formatting dates. Note that the brackets are still
13614required for algebraic entry.
13615@end table
13616
13617If ``SS'' or ``BS'' (optional seconds) is preceded by a colon, the
13618colon is also omitted if the seconds part is zero.
13619
13620If ``bb,'' ``bbb'' or ``bbbb'' or their upper-case equivalents
13621appear in the format, then negative year numbers are displayed
13622without a minus sign. Note that ``aa'' and ``bb'' are mutually
13623exclusive. Some typical usages would be @samp{YYYY AABB};
13624@samp{AAAYYYYBBB}; @samp{YYYYBBB}.
13625
13626The formats ``YY,'' ``YYYY,'' ``MM,'' ``DD,'' ``ddd,'' ``hh,'' ``HH,''
13627``mm,'' ``ss,'' and ``SS'' actually match any number of digits during
13628reading unless several of these codes are strung together with no
13629punctuation in between, in which case the input must have exactly as
13630many digits as there are letters in the format.
13631
13632The ``j,'' ``J,'' and ``U'' formats do not make any time zone
13633adjustment. They effectively use @samp{julian(x,0)} and
13634@samp{unixtime(x,0)} to make the conversion; @pxref{Date Arithmetic}.
13635
13636@node Free-Form Dates, Standard Date Formats, Date Formatting Codes, Date Formats
13637@subsubsection Free-Form Dates
13638
13639@noindent
13640When reading a date form during algebraic entry, Calc falls back
13641on the algorithm described here if the input does not exactly
13642match the current date format. This algorithm generally
13643``does the right thing'' and you don't have to worry about it,
13644but it is described here in full detail for the curious.
13645
13646Calc does not distinguish between upper- and lower-case letters
13647while interpreting dates.
13648
13649First, the time portion, if present, is located somewhere in the
13650text and then removed. The remaining text is then interpreted as
13651the date.
13652
13653A time is of the form @samp{hh:mm:ss}, possibly with the seconds
13654part omitted and possibly with an AM/PM indicator added to indicate
1365512-hour time. If the AM/PM is present, the minutes may also be
13656omitted. The AM/PM part may be any of the words @samp{am},
13657@samp{pm}, @samp{noon}, or @samp{midnight}; each of these may be
13658abbreviated to one letter, and the alternate forms @samp{a.m.},
13659@samp{p.m.}, and @samp{mid} are also understood. Obviously
13660@samp{noon} and @samp{midnight} are allowed only on 12:00:00.
13661The words @samp{noon}, @samp{mid}, and @samp{midnight} are also
13662recognized with no number attached.
13663
13664If there is no AM/PM indicator, the time is interpreted in 24-hour
13665format.
13666
13667To read the date portion, all words and numbers are isolated
13668from the string; other characters are ignored. All words must
13669be either month names or day-of-week names (the latter of which
13670are ignored). Names can be written in full or as three-letter
13671abbreviations.
13672
13673Large numbers, or numbers with @samp{+} or @samp{-} signs,
13674are interpreted as years. If one of the other numbers is
13675greater than 12, then that must be the day and the remaining
13676number in the input is therefore the month. Otherwise, Calc
13677assumes the month, day and year are in the same order that they
13678appear in the current date format. If the year is omitted, the
13679current year is taken from the system clock.
13680
13681If there are too many or too few numbers, or any unrecognizable
13682words, then the input is rejected.
13683
13684If there are any large numbers (of five digits or more) other than
13685the year, they are ignored on the assumption that they are something
13686like Julian dates that were included along with the traditional
13687date components when the date was formatted.
13688
13689One of the words @samp{ad}, @samp{a.d.}, @samp{bc}, or @samp{b.c.}
13690may optionally be used; the latter two are equivalent to a
13691minus sign on the year value.
13692
13693If you always enter a four-digit year, and use a name instead
13694of a number for the month, there is no danger of ambiguity.
13695
13696@node Standard Date Formats, , Free-Form Dates, Date Formats
13697@subsubsection Standard Date Formats
13698
13699@noindent
13700There are actually ten standard date formats, numbered 0 through 9.
13701Entering a blank line at the @kbd{d d} command's prompt gives
13702you format number 1, Calc's usual format. You can enter any digit
13703to select the other formats.
13704
13705To create your own standard date formats, give a numeric prefix
13706argument from 0 to 9 to the @w{@kbd{d d}} command. The format you
13707enter will be recorded as the new standard format of that
13708number, as well as becoming the new current date format.
13709You can save your formats permanently with the @w{@kbd{m m}}
13710command (@pxref{Mode Settings}).
13711
13712@table @asis
13713@item 0
13714@samp{N} (Numerical format)
13715@item 1
13716@samp{<H:mm:SSpp >Www Mmm D, YYYY} (American format)
13717@item 2
13718@samp{D Mmm YYYY<, h:mm:SS>} (European format)
13719@item 3
13720@samp{Www Mmm BD< hh:mm:ss> YYYY} (Unix written date format)
13721@item 4
13722@samp{M/D/Y< H:mm:SSpp>} (American slashed format)
13723@item 5
13724@samp{D.M.Y< h:mm:SS>} (European dotted format)
13725@item 6
13726@samp{M-D-Y< H:mm:SSpp>} (American dashed format)
13727@item 7
13728@samp{D-M-Y< h:mm:SS>} (European dashed format)
13729@item 8
13730@samp{j<, h:mm:ss>} (Julian day plus time)
13731@item 9
13732@samp{YYddd< hh:mm:ss>} (Year-day format)
13733@end table
13734
13735@node Truncating the Stack, Justification, Date Formats, Display Modes
13736@subsection Truncating the Stack
13737
13738@noindent
13739@kindex d t
13740@pindex calc-truncate-stack
13741@cindex Truncating the stack
13742@cindex Narrowing the stack
13743The @kbd{d t} (@code{calc-truncate-stack}) command moves the @samp{.}@:
13744line that marks the top-of-stack up or down in the Calculator buffer.
13745The number right above that line is considered to the be at the top of
13746the stack. Any numbers below that line are ``hidden'' from all stack
13747operations. This is similar to the Emacs ``narrowing'' feature, except
13748that the values below the @samp{.} are @emph{visible}, just temporarily
13749frozen. This feature allows you to keep several independent calculations
13750running at once in different parts of the stack, or to apply a certain
13751command to an element buried deep in the stack.@refill
13752
13753Pressing @kbd{d t} by itself moves the @samp{.} to the line the cursor
13754is on. Thus, this line and all those below it become hidden. To un-hide
13755these lines, move down to the end of the buffer and press @w{@kbd{d t}}.
13756With a positive numeric prefix argument @cite{n}, @kbd{d t} hides the
13757bottom @cite{n} values in the buffer. With a negative argument, it hides
13758all but the top @cite{n} values. With an argument of zero, it hides zero
13759values, i.e., moves the @samp{.} all the way down to the bottom.@refill
13760
13761@kindex d [
13762@pindex calc-truncate-up
13763@kindex d ]
13764@pindex calc-truncate-down
13765The @kbd{d [} (@code{calc-truncate-up}) and @kbd{d ]}
13766(@code{calc-truncate-down}) commands move the @samp{.} up or down one
13767line at a time (or several lines with a prefix argument).@refill
13768
13769@node Justification, Labels, Truncating the Stack, Display Modes
13770@subsection Justification
13771
13772@noindent
13773@kindex d <
13774@pindex calc-left-justify
13775@kindex d =
13776@pindex calc-center-justify
13777@kindex d >
13778@pindex calc-right-justify
13779Values on the stack are normally left-justified in the window. You can
13780control this arrangement by typing @kbd{d <} (@code{calc-left-justify}),
13781@kbd{d >} (@code{calc-right-justify}), or @kbd{d =}
13782(@code{calc-center-justify}). For example, in right-justification mode,
13783stack entries are displayed flush-right against the right edge of the
13784window.@refill
13785
13786If you change the width of the Calculator window you may have to type
5d67986c 13787@kbd{d @key{SPC}} (@code{calc-refresh}) to re-align right-justified or centered
d7b8e6c6
EZ
13788text.
13789
13790Right-justification is especially useful together with fixed-point
13791notation (see @code{d f}; @code{calc-fix-notation}). With these modes
13792together, the decimal points on numbers will always line up.
13793
13794With a numeric prefix argument, the justification commands give you
13795a little extra control over the display. The argument specifies the
13796horizontal ``origin'' of a display line. It is also possible to
13797specify a maximum line width using the @kbd{d b} command (@pxref{Normal
13798Language Modes}). For reference, the precise rules for formatting and
13799breaking lines are given below. Notice that the interaction between
13800origin and line width is slightly different in each justification
13801mode.
13802
13803In left-justified mode, the line is indented by a number of spaces
13804given by the origin (default zero). If the result is longer than the
13805maximum line width, if given, or too wide to fit in the Calc window
13806otherwise, then it is broken into lines which will fit; each broken
13807line is indented to the origin.
13808
13809In right-justified mode, lines are shifted right so that the rightmost
13810character is just before the origin, or just before the current
13811window width if no origin was specified. If the line is too long
13812for this, then it is broken; the current line width is used, if
13813specified, or else the origin is used as a width if that is
13814specified, or else the line is broken to fit in the window.
13815
13816In centering mode, the origin is the column number of the center of
13817each stack entry. If a line width is specified, lines will not be
13818allowed to go past that width; Calc will either indent less or
13819break the lines if necessary. If no origin is specified, half the
13820line width or Calc window width is used.
13821
13822Note that, in each case, if line numbering is enabled the display
13823is indented an additional four spaces to make room for the line
13824number. The width of the line number is taken into account when
13825positioning according to the current Calc window width, but not
13826when positioning by explicit origins and widths. In the latter
13827case, the display is formatted as specified, and then uniformly
13828shifted over four spaces to fit the line numbers.
13829
13830@node Labels, , Justification, Display Modes
13831@subsection Labels
13832
13833@noindent
13834@kindex d @{
13835@pindex calc-left-label
13836The @kbd{d @{} (@code{calc-left-label}) command prompts for a string,
13837then displays that string to the left of every stack entry. If the
13838entries are left-justified (@pxref{Justification}), then they will
13839appear immediately after the label (unless you specified an origin
13840greater than the length of the label). If the entries are centered
13841or right-justified, the label appears on the far left and does not
13842affect the horizontal position of the stack entry.
13843
13844Give a blank string (with @kbd{d @{ @key{RET}}) to turn the label off.
13845
13846@kindex d @}
13847@pindex calc-right-label
13848The @kbd{d @}} (@code{calc-right-label}) command similarly adds a
13849label on the righthand side. It does not affect positioning of
13850the stack entries unless they are right-justified. Also, if both
13851a line width and an origin are given in right-justified mode, the
13852stack entry is justified to the origin and the righthand label is
13853justified to the line width.
13854
13855One application of labels would be to add equation numbers to
13856formulas you are manipulating in Calc and then copying into a
13857document (possibly using Embedded Mode). The equations would
13858typically be centered, and the equation numbers would be on the
13859left or right as you prefer.
13860
13861@node Language Modes, Modes Variable, Display Modes, Mode Settings
13862@section Language Modes
13863
13864@noindent
13865The commands in this section change Calc to use a different notation for
13866entry and display of formulas, corresponding to the conventions of some
13867other common language such as Pascal or @TeX{}. Objects displayed on the
13868stack or yanked from the Calculator to an editing buffer will be formatted
13869in the current language; objects entered in algebraic entry or yanked from
13870another buffer will be interpreted according to the current language.
13871
13872The current language has no effect on things written to or read from the
13873trail buffer, nor does it affect numeric entry. Only algebraic entry is
13874affected. You can make even algebraic entry ignore the current language
13875and use the standard notation by giving a numeric prefix, e.g., @kbd{C-u '}.
13876
13877For example, suppose the formula @samp{2*a[1] + atan(a[2])} occurs in a C
13878program; elsewhere in the program you need the derivatives of this formula
13879with respect to @samp{a[1]} and @samp{a[2]}. First, type @kbd{d C}
13880to switch to C notation. Now use @code{C-u M-# g} to grab the formula
13881into the Calculator, @kbd{a d a[1] @key{RET}} to differentiate with respect
13882to the first variable, and @kbd{M-# y} to yank the formula for the derivative
13883back into your C program. Press @kbd{U} to undo the differentiation and
13884repeat with @kbd{a d a[2] @key{RET}} for the other derivative.
13885
13886Without being switched into C mode first, Calc would have misinterpreted
13887the brackets in @samp{a[1]} and @samp{a[2]}, would not have known that
13888@code{atan} was equivalent to Calc's built-in @code{arctan} function,
13889and would have written the formula back with notations (like implicit
13890multiplication) which would not have been legal for a C program.
13891
13892As another example, suppose you are maintaining a C program and a @TeX{}
13893document, each of which needs a copy of the same formula. You can grab the
13894formula from the program in C mode, switch to @TeX{} mode, and yank the
13895formula into the document in @TeX{} math-mode format.
13896
13897Language modes are selected by typing the letter @kbd{d} followed by a
13898shifted letter key.
13899
13900@menu
13901* Normal Language Modes::
13902* C FORTRAN Pascal::
13903* TeX Language Mode::
13904* Eqn Language Mode::
13905* Mathematica Language Mode::
13906* Maple Language Mode::
13907* Compositions::
13908* Syntax Tables::
13909@end menu
13910
13911@node Normal Language Modes, C FORTRAN Pascal, Language Modes, Language Modes
13912@subsection Normal Language Modes
13913
13914@noindent
13915@kindex d N
13916@pindex calc-normal-language
13917The @kbd{d N} (@code{calc-normal-language}) command selects the usual
13918notation for Calc formulas, as described in the rest of this manual.
13919Matrices are displayed in a multi-line tabular format, but all other
13920objects are written in linear form, as they would be typed from the
13921keyboard.
13922
13923@kindex d O
13924@pindex calc-flat-language
13925@cindex Matrix display
13926The @kbd{d O} (@code{calc-flat-language}) command selects a language
13927identical with the normal one, except that matrices are written in
13928one-line form along with everything else. In some applications this
13929form may be more suitable for yanking data into other buffers.
13930
13931@kindex d b
13932@pindex calc-line-breaking
13933@cindex Line breaking
13934@cindex Breaking up long lines
13935Even in one-line mode, long formulas or vectors will still be split
13936across multiple lines if they exceed the width of the Calculator window.
13937The @kbd{d b} (@code{calc-line-breaking}) command turns this line-breaking
13938feature on and off. (It works independently of the current language.)
13939If you give a numeric prefix argument of five or greater to the @kbd{d b}
13940command, that argument will specify the line width used when breaking
13941long lines.
13942
13943@kindex d B
13944@pindex calc-big-language
13945The @kbd{d B} (@code{calc-big-language}) command selects a language
13946which uses textual approximations to various mathematical notations,
13947such as powers, quotients, and square roots:
13948
13949@example
13950 ____________
13951 | a + 1 2
13952 | ----- + c
13953\| b
13954@end example
13955
13956@noindent
13957in place of @samp{sqrt((a+1)/b + c^2)}.
13958
13959Subscripts like @samp{a_i} are displayed as actual subscripts in ``big''
13960mode. Double subscripts, @samp{a_i_j} (@samp{subscr(subscr(a, i), j)})
13961are displayed as @samp{a} with subscripts separated by commas:
13962@samp{i, j}. They must still be entered in the usual underscore
13963notation.
13964
13965One slight ambiguity of Big notation is that
13966
13967@example
13968 3
13969- -
13970 4
13971@end example
13972
13973@noindent
13974can represent either the negative rational number @cite{-3:4}, or the
13975actual expression @samp{-(3/4)}; but the latter formula would normally
13976never be displayed because it would immediately be evaluated to
13977@cite{-3:4} or @cite{-0.75}, so this ambiguity is not a problem in
13978typical use.
13979
13980Non-decimal numbers are displayed with subscripts. Thus there is no
13981way to tell the difference between @samp{16#C2} and @samp{C2_16},
13982though generally you will know which interpretation is correct.
13983Logarithms @samp{log(x,b)} and @samp{log10(x)} also use subscripts
13984in Big mode.
13985
13986In Big mode, stack entries often take up several lines. To aid
13987readability, stack entries are separated by a blank line in this mode.
13988You may find it useful to expand the Calc window's height using
13989@kbd{C-x ^} (@code{enlarge-window}) or to make the Calc window the only
13990one on the screen with @kbd{C-x 1} (@code{delete-other-windows}).
13991
13992Long lines are currently not rearranged to fit the window width in
13993Big mode, so you may need to use the @kbd{<} and @kbd{>} keys
13994to scroll across a wide formula. For really big formulas, you may
13995even need to use @kbd{@{} and @kbd{@}} to scroll up and down.
13996
13997@kindex d U
13998@pindex calc-unformatted-language
13999The @kbd{d U} (@code{calc-unformatted-language}) command altogether disables
14000the use of operator notation in formulas. In this mode, the formula
14001shown above would be displayed:
14002
14003@example
14004sqrt(add(div(add(a, 1), b), pow(c, 2)))
14005@end example
14006
14007These four modes differ only in display format, not in the format
14008expected for algebraic entry. The standard Calc operators work in
14009all four modes, and unformatted notation works in any language mode
14010(except that Mathematica mode expects square brackets instead of
14011parentheses).
14012
14013@node C FORTRAN Pascal, TeX Language Mode, Normal Language Modes, Language Modes
14014@subsection C, FORTRAN, and Pascal Modes
14015
14016@noindent
14017@kindex d C
14018@pindex calc-c-language
14019@cindex C language
14020The @kbd{d C} (@code{calc-c-language}) command selects the conventions
14021of the C language for display and entry of formulas. This differs from
14022the normal language mode in a variety of (mostly minor) ways. In
14023particular, C language operators and operator precedences are used in
14024place of Calc's usual ones. For example, @samp{a^b} means @samp{xor(a,b)}
14025in C mode; a value raised to a power is written as a function call,
14026@samp{pow(a,b)}.
14027
14028In C mode, vectors and matrices use curly braces instead of brackets.
14029Octal and hexadecimal values are written with leading @samp{0} or @samp{0x}
14030rather than using the @samp{#} symbol. Array subscripting is
14031translated into @code{subscr} calls, so that @samp{a[i]} in C
14032mode is the same as @samp{a_i} in normal mode. Assignments
14033turn into the @code{assign} function, which Calc normally displays
14034using the @samp{:=} symbol.
14035
14036The variables @code{var-pi} and @code{var-e} would be displayed @samp{pi}
14037and @samp{e} in normal mode, but in C mode they are displayed as
14038@samp{M_PI} and @samp{M_E}, corresponding to the names of constants
14039typically provided in the @file{<math.h>} header. Functions whose
14040names are different in C are translated automatically for entry and
14041display purposes. For example, entering @samp{asin(x)} will push the
14042formula @samp{arcsin(x)} onto the stack; this formula will be displayed
14043as @samp{asin(x)} as long as C mode is in effect.
14044
14045@kindex d P
14046@pindex calc-pascal-language
14047@cindex Pascal language
14048The @kbd{d P} (@code{calc-pascal-language}) command selects Pascal
14049conventions. Like C mode, Pascal mode interprets array brackets and uses
14050a different table of operators. Hexadecimal numbers are entered and
14051displayed with a preceding dollar sign. (Thus the regular meaning of
14052@kbd{$2} during algebraic entry does not work in Pascal mode, though
14053@kbd{$} (and @kbd{$$}, etc.) not followed by digits works the same as
14054always.) No special provisions are made for other non-decimal numbers,
14055vectors, and so on, since there is no universally accepted standard way
14056of handling these in Pascal.
14057
14058@kindex d F
14059@pindex calc-fortran-language
14060@cindex FORTRAN language
14061The @kbd{d F} (@code{calc-fortran-language}) command selects FORTRAN
14062conventions. Various function names are transformed into FORTRAN
14063equivalents. Vectors are written as @samp{/1, 2, 3/}, and may be
14064entered this way or using square brackets. Since FORTRAN uses round
14065parentheses for both function calls and array subscripts, Calc displays
14066both in the same way; @samp{a(i)} is interpreted as a function call
14067upon reading, and subscripts must be entered as @samp{subscr(a, i)}.
14068Also, if the variable @code{a} has been declared to have type
14069@code{vector} or @code{matrix} then @samp{a(i)} will be parsed as a
14070subscript. (@xref{Declarations}.) Usually it doesn't matter, though;
14071if you enter the subscript expression @samp{a(i)} and Calc interprets
14072it as a function call, you'll never know the difference unless you
14073switch to another language mode or replace @code{a} with an actual
14074vector (or unless @code{a} happens to be the name of a built-in
14075function!).
14076
14077Underscores are allowed in variable and function names in all of these
14078language modes. The underscore here is equivalent to the @samp{#} in
14079normal mode, or to hyphens in the underlying Emacs Lisp variable names.
14080
14081FORTRAN and Pascal modes normally do not adjust the case of letters in
14082formulas. Most built-in Calc names use lower-case letters. If you use a
14083positive numeric prefix argument with @kbd{d P} or @kbd{d F}, these
14084modes will use upper-case letters exclusively for display, and will
14085convert to lower-case on input. With a negative prefix, these modes
14086convert to lower-case for display and input.
14087
14088@node TeX Language Mode, Eqn Language Mode, C FORTRAN Pascal, Language Modes
14089@subsection @TeX{} Language Mode
14090
14091@noindent
14092@kindex d T
14093@pindex calc-tex-language
14094@cindex TeX language
14095The @kbd{d T} (@code{calc-tex-language}) command selects the conventions
14096of ``math mode'' in the @TeX{} typesetting language, by Donald Knuth.
14097Formulas are entered
14098and displayed in @TeX{} notation, as in @samp{\sin\left( a \over b \right)}.
14099Math formulas are usually enclosed by @samp{$ $} signs in @TeX{}; these
14100should be omitted when interfacing with Calc. To Calc, the @samp{$} sign
14101has the same meaning it always does in algebraic formulas (a reference to
14102an existing entry on the stack).@refill
14103
14104Complex numbers are displayed as in @samp{3 + 4i}. Fractions and
14105quotients are written using @code{\over};
14106binomial coefficients are written with @code{\choose}.
14107Interval forms are written with @code{\ldots}, and
14108error forms are written with @code{\pm}.
14109Absolute values are written as in @samp{|x + 1|}, and the floor and
14110ceiling functions are written with @code{\lfloor}, @code{\rfloor}, etc.
14111The words @code{\left} and @code{\right} are ignored when reading
14112formulas in @TeX{} mode. Both @code{inf} and @code{uinf} are written
14113as @code{\infty}; when read, @code{\infty} always translates to
14114@code{inf}.@refill
14115
14116Function calls are written the usual way, with the function name followed
14117by the arguments in parentheses. However, functions for which @TeX{} has
14118special names (like @code{\sin}) will use curly braces instead of
14119parentheses for very simple arguments. During input, curly braces and
14120parentheses work equally well for grouping, but when the document is
14121formatted the curly braces will be invisible. Thus the printed result is
14122@c{$\sin{2 x}$}
14123@cite{sin 2x} but @c{$\sin(2 + x)$}
14124@cite{sin(2 + x)}.
14125
14126Function and variable names not treated specially by @TeX{} are simply
14127written out as-is, which will cause them to come out in italic letters
14128in the printed document. If you invoke @kbd{d T} with a positive numeric
14129prefix argument, names of more than one character will instead be written
14130@samp{\hbox@{@var{name}@}}. The @samp{\hbox@{ @}} notation is ignored
14131during reading. If you use a negative prefix argument, such function
14132names are written @samp{\@var{name}}, and function names that begin
14133with @code{\} during reading have the @code{\} removed. (Note that
14134in this mode, long variable names are still written with @code{\hbox}.
14135However, you can always make an actual variable name like @code{\bar}
14136in any @TeX{} mode.)
14137
14138During reading, text of the form @samp{\matrix@{ ...@: @}} is replaced
14139by @samp{[ ...@: ]}. The same also applies to @code{\pmatrix} and
14140@code{\bmatrix}. The symbol @samp{&} is interpreted as a comma,
14141and the symbols @samp{\cr} and @samp{\\} are interpreted as semicolons.
14142During output, matrices are displayed in @samp{\matrix@{ a & b \\ c & d@}}
14143format; you may need to edit this afterwards to change @code{\matrix}
14144to @code{\pmatrix} or @code{\\} to @code{\cr}.
14145
14146Accents like @code{\tilde} and @code{\bar} translate into function
14147calls internally (@samp{tilde(x)}, @samp{bar(x)}). The @code{\underline}
14148sequence is treated as an accent. The @code{\vec} accent corresponds
14149to the function name @code{Vec}, because @code{vec} is the name of
14150a built-in Calc function. The following table shows the accents
14151in Calc, @TeX{}, and @dfn{eqn} (described in the next section):
14152
14153@iftex
14154@begingroup
14155@let@calcindexershow=@calcindexernoshow @c Suppress marginal notes
14156@let@calcindexersh=@calcindexernoshow
14157@end iftex
5d67986c
RS
14158@ignore
14159@starindex
14160@end ignore
d7b8e6c6 14161@tindex acute
5d67986c
RS
14162@ignore
14163@starindex
14164@end ignore
d7b8e6c6 14165@tindex bar
5d67986c
RS
14166@ignore
14167@starindex
14168@end ignore
d7b8e6c6 14169@tindex breve
5d67986c
RS
14170@ignore
14171@starindex
14172@end ignore
d7b8e6c6 14173@tindex check
5d67986c
RS
14174@ignore
14175@starindex
14176@end ignore
d7b8e6c6 14177@tindex dot
5d67986c
RS
14178@ignore
14179@starindex
14180@end ignore
d7b8e6c6 14181@tindex dotdot
5d67986c
RS
14182@ignore
14183@starindex
14184@end ignore
d7b8e6c6 14185@tindex dyad
5d67986c
RS
14186@ignore
14187@starindex
14188@end ignore
d7b8e6c6 14189@tindex grave
5d67986c
RS
14190@ignore
14191@starindex
14192@end ignore
d7b8e6c6 14193@tindex hat
5d67986c
RS
14194@ignore
14195@starindex
14196@end ignore
d7b8e6c6 14197@tindex Prime
5d67986c
RS
14198@ignore
14199@starindex
14200@end ignore
d7b8e6c6 14201@tindex tilde
5d67986c
RS
14202@ignore
14203@starindex
14204@end ignore
d7b8e6c6 14205@tindex under
5d67986c
RS
14206@ignore
14207@starindex
14208@end ignore
d7b8e6c6
EZ
14209@tindex Vec
14210@iftex
14211@endgroup
14212@end iftex
14213@example
14214Calc TeX eqn
14215---- --- ---
14216acute \acute
14217bar \bar bar
14218breve \breve
14219check \check
14220dot \dot dot
14221dotdot \ddot dotdot
14222dyad dyad
14223grave \grave
14224hat \hat hat
14225Prime prime
14226tilde \tilde tilde
14227under \underline under
14228Vec \vec vec
14229@end example
14230
14231The @samp{=>} (evaluates-to) operator appears as a @code{\to} symbol:
14232@samp{@{@var{a} \to @var{b}@}}. @TeX{} defines @code{\to} as an
14233alias for @code{\rightarrow}. However, if the @samp{=>} is the
14234top-level expression being formatted, a slightly different notation
14235is used: @samp{\evalto @var{a} \to @var{b}}. The @code{\evalto}
14236word is ignored by Calc's input routines, and is undefined in @TeX{}.
14237You will typically want to include one of the following definitions
14238at the top of a @TeX{} file that uses @code{\evalto}:
14239
14240@example
14241\def\evalto@{@}
14242\def\evalto#1\to@{@}
14243@end example
14244
14245The first definition formats evaluates-to operators in the usual
14246way. The second causes only the @var{b} part to appear in the
14247printed document; the @var{a} part and the arrow are hidden.
14248Another definition you may wish to use is @samp{\let\to=\Rightarrow}
14249which causes @code{\to} to appear more like Calc's @samp{=>} symbol.
14250@xref{Evaluates-To Operator}, for a discussion of @code{evalto}.
14251
14252The complete set of @TeX{} control sequences that are ignored during
14253reading is:
14254
14255@example
14256\hbox \mbox \text \left \right
14257\, \> \: \; \! \quad \qquad \hfil \hfill
14258\displaystyle \textstyle \dsize \tsize
14259\scriptstyle \scriptscriptstyle \ssize \ssize
14260\rm \bf \it \sl \roman \bold \italic \slanted
14261\cal \mit \Cal \Bbb \frak \goth
14262\evalto
14263@end example
14264
14265Note that, because these symbols are ignored, reading a @TeX{} formula
14266into Calc and writing it back out may lose spacing and font information.
14267
14268Also, the ``discretionary multiplication sign'' @samp{\*} is read
14269the same as @samp{*}.
14270
14271@ifinfo
14272The @TeX{} version of this manual includes some printed examples at the
14273end of this section.
14274@end ifinfo
14275@iftex
14276Here are some examples of how various Calc formulas are formatted in @TeX{}:
14277
d7b8e6c6 14278@example
5d67986c 14279@group
d7b8e6c6
EZ
14280sin(a^2 / b_i)
14281\sin\left( {a^2 \over b_i} \right)
5d67986c 14282@end group
d7b8e6c6
EZ
14283@end example
14284@tex
14285\let\rm\goodrm
14286$$ \sin\left( a^2 \over b_i \right) $$
14287@end tex
14288@sp 1
d7b8e6c6 14289
d7b8e6c6 14290@example
5d67986c 14291@group
d7b8e6c6
EZ
14292[(3, 4), 3:4, 3 +/- 4, [3 .. inf)]
14293[3 + 4i, @{3 \over 4@}, 3 \pm 4, [3 \ldots \infty)]
5d67986c 14294@end group
d7b8e6c6
EZ
14295@end example
14296@tex
14297\turnoffactive
14298$$ [3 + 4i, {3 \over 4}, 3 \pm 4, [ 3 \ldots \infty)] $$
14299@end tex
14300@sp 1
d7b8e6c6 14301
d7b8e6c6 14302@example
5d67986c 14303@group
d7b8e6c6
EZ
14304[abs(a), abs(a / b), floor(a), ceil(a / b)]
14305[|a|, \left| a \over b \right|,
14306 \lfloor a \rfloor, \left\lceil a \over b \right\rceil]
5d67986c 14307@end group
d7b8e6c6
EZ
14308@end example
14309@tex
14310$$ [|a|, \left| a \over b \right|,
14311 \lfloor a \rfloor, \left\lceil a \over b \right\rceil] $$
14312@end tex
14313@sp 1
d7b8e6c6 14314
d7b8e6c6 14315@example
5d67986c 14316@group
d7b8e6c6
EZ
14317[sin(a), sin(2 a), sin(2 + a), sin(a / b)]
14318[\sin@{a@}, \sin@{2 a@}, \sin(2 + a),
14319 \sin\left( @{a \over b@} \right)]
5d67986c 14320@end group
d7b8e6c6
EZ
14321@end example
14322@tex
14323\turnoffactive\let\rm\goodrm
14324$$ [\sin{a}, \sin{2 a}, \sin(2 + a), \sin\left( {a \over b} \right)] $$
14325@end tex
14326@sp 2
d7b8e6c6 14327
d7b8e6c6
EZ
14328First with plain @kbd{d T}, then with @kbd{C-u d T}, then finally with
14329@kbd{C-u - d T} (using the example definition
14330@samp{\def\foo#1@{\tilde F(#1)@}}:
14331
14332@example
5d67986c 14333@group
d7b8e6c6
EZ
14334[f(a), foo(bar), sin(pi)]
14335[f(a), foo(bar), \sin{\pi}]
14336[f(a), \hbox@{foo@}(\hbox@{bar@}), \sin@{\pi@}]
14337[f(a), \foo@{\hbox@{bar@}@}, \sin@{\pi@}]
5d67986c 14338@end group
d7b8e6c6
EZ
14339@end example
14340@tex
14341\let\rm\goodrm
14342$$ [f(a), foo(bar), \sin{\pi}] $$
14343$$ [f(a), \hbox{foo}(\hbox{bar}), \sin{\pi}] $$
14344$$ [f(a), \tilde F(\hbox{bar}), \sin{\pi}] $$
14345@end tex
14346@sp 2
d7b8e6c6 14347
d7b8e6c6
EZ
14348First with @samp{\def\evalto@{@}}, then with @samp{\def\evalto#1\to@{@}}:
14349
14350@example
5d67986c 14351@group
d7b8e6c6
EZ
143522 + 3 => 5
14353\evalto 2 + 3 \to 5
5d67986c 14354@end group
d7b8e6c6
EZ
14355@end example
14356@tex
14357\turnoffactive
14358$$ 2 + 3 \to 5 $$
14359$$ 5 $$
14360@end tex
14361@sp 2
d7b8e6c6 14362
d7b8e6c6
EZ
14363First with standard @code{\to}, then with @samp{\let\to\Rightarrow}:
14364
14365@example
5d67986c 14366@group
d7b8e6c6
EZ
14367[2 + 3 => 5, a / 2 => (b + c) / 2]
14368[@{2 + 3 \to 5@}, @{@{a \over 2@} \to @{b + c \over 2@}@}]
5d67986c 14369@end group
d7b8e6c6
EZ
14370@end example
14371@tex
14372\turnoffactive
14373$$ [{2 + 3 \to 5}, {{a \over 2} \to {b + c \over 2}}] $$
14374{\let\to\Rightarrow
14375$$ [{2 + 3 \to 5}, {{a \over 2} \to {b + c \over 2}}] $$}
14376@end tex
14377@sp 2
d7b8e6c6 14378
d7b8e6c6
EZ
14379Matrices normally, then changing @code{\matrix} to @code{\pmatrix}:
14380
14381@example
5d67986c 14382@group
d7b8e6c6
EZ
14383[ [ a / b, 0 ], [ 0, 2^(x + 1) ] ]
14384\matrix@{ @{a \over b@} & 0 \\ 0 & 2^@{(x + 1)@} @}
14385\pmatrix@{ @{a \over b@} & 0 \\ 0 & 2^@{(x + 1)@} @}
5d67986c 14386@end group
d7b8e6c6
EZ
14387@end example
14388@tex
14389\turnoffactive
14390$$ \matrix{ {a \over b} & 0 \cr 0 & 2^{(x + 1)} } $$
14391$$ \pmatrix{ {a \over b} & 0 \cr 0 & 2^{(x + 1)} } $$
14392@end tex
14393@sp 2
d7b8e6c6
EZ
14394@end iftex
14395
14396@node Eqn Language Mode, Mathematica Language Mode, TeX Language Mode, Language Modes
14397@subsection Eqn Language Mode
14398
14399@noindent
14400@kindex d E
14401@pindex calc-eqn-language
14402@dfn{Eqn} is another popular formatter for math formulas. It is
14403designed for use with the TROFF text formatter, and comes standard
14404with many versions of Unix. The @kbd{d E} (@code{calc-eqn-language})
14405command selects @dfn{eqn} notation.
14406
14407The @dfn{eqn} language's main idiosyncrasy is that whitespace plays
14408a significant part in the parsing of the language. For example,
14409@samp{sqrt x+1 + y} treats @samp{x+1} as the argument of the
14410@code{sqrt} operator. @dfn{Eqn} also understands more conventional
14411grouping using curly braces: @samp{sqrt@{x+1@} + y}. Braces are
14412required only when the argument contains spaces.
14413
14414In Calc's @dfn{eqn} mode, however, curly braces are required to
14415delimit arguments of operators like @code{sqrt}. The first of the
14416above examples would treat only the @samp{x} as the argument of
14417@code{sqrt}, and in fact @samp{sin x+1} would be interpreted as
14418@samp{sin * x + 1}, because @code{sin} is not a special operator
14419in the @dfn{eqn} language. If you always surround the argument
14420with curly braces, Calc will never misunderstand.
14421
14422Calc also understands parentheses as grouping characters. Another
14423peculiarity of @dfn{eqn}'s syntax makes it advisable to separate
14424words with spaces from any surrounding characters that aren't curly
14425braces, so Calc writes @samp{sin ( x + y )} in @dfn{eqn} mode.
14426(The spaces around @code{sin} are important to make @dfn{eqn}
14427recognize that @code{sin} should be typeset in a roman font, and
14428the spaces around @code{x} and @code{y} are a good idea just in
14429case the @dfn{eqn} document has defined special meanings for these
14430names, too.)
14431
14432Powers and subscripts are written with the @code{sub} and @code{sup}
14433operators, respectively. Note that the caret symbol @samp{^} is
14434treated the same as a space in @dfn{eqn} mode, as is the @samp{~}
14435symbol (these are used to introduce spaces of various widths into
14436the typeset output of @dfn{eqn}).
14437
14438As in @TeX{} mode, Calc's formatter omits parentheses around the
14439arguments of functions like @code{ln} and @code{sin} if they are
14440``simple-looking''; in this case Calc surrounds the argument with
14441braces, separated by a @samp{~} from the function name: @samp{sin~@{x@}}.
14442
14443Font change codes (like @samp{roman @var{x}}) and positioning codes
14444(like @samp{~} and @samp{down @var{n} @var{x}}) are ignored by the
14445@dfn{eqn} reader. Also ignored are the words @code{left}, @code{right},
14446@code{mark}, and @code{lineup}. Quotation marks in @dfn{eqn} mode input
14447are treated the same as curly braces: @samp{sqrt "1+x"} is equivalent to
14448@samp{sqrt @{1+x@}}; this is only an approximation to the true meaning
14449of quotes in @dfn{eqn}, but it is good enough for most uses.
14450
14451Accent codes (@samp{@var{x} dot}) are handled by treating them as
14452function calls (@samp{dot(@var{x})}) internally. @xref{TeX Language
b275eac7 14453Mode}, for a table of these accent functions. The @code{prime} accent
d7b8e6c6
EZ
14454is treated specially if it occurs on a variable or function name:
14455@samp{f prime prime @w{( x prime )}} is stored internally as
14456@samp{f'@w{'}(x')}. For example, taking the derivative of @samp{f(2 x)}
14457with @kbd{a d x} will produce @samp{2 f'(2 x)}, which @dfn{eqn} mode
14458will display as @samp{2 f prime ( 2 x )}.
14459
14460Assignments are written with the @samp{<-} (left-arrow) symbol,
14461and @code{evalto} operators are written with @samp{->} or
14462@samp{evalto ... ->} (@pxref{TeX Language Mode}, for a discussion
14463of this). The regular Calc symbols @samp{:=} and @samp{=>} are also
14464recognized for these operators during reading.
14465
14466Vectors in @dfn{eqn} mode use regular Calc square brackets, but
14467matrices are formatted as @samp{matrix @{ ccol @{ a above b @} ... @}}.
14468The words @code{lcol} and @code{rcol} are recognized as synonyms
14469for @code{ccol} during input, and are generated instead of @code{ccol}
14470if the matrix justification mode so specifies.
14471
14472@node Mathematica Language Mode, Maple Language Mode, Eqn Language Mode, Language Modes
14473@subsection Mathematica Language Mode
14474
14475@noindent
14476@kindex d M
14477@pindex calc-mathematica-language
14478@cindex Mathematica language
14479The @kbd{d M} (@code{calc-mathematica-language}) command selects the
14480conventions of Mathematica, a powerful and popular mathematical tool
14481from Wolfram Research, Inc. Notable differences in Mathematica mode
14482are that the names of built-in functions are capitalized, and function
14483calls use square brackets instead of parentheses. Thus the Calc
14484formula @samp{sin(2 x)} is entered and displayed @w{@samp{Sin[2 x]}} in
14485Mathematica mode.
14486
14487Vectors and matrices use curly braces in Mathematica. Complex numbers
14488are written @samp{3 + 4 I}. The standard special constants in Calc are
14489written @code{Pi}, @code{E}, @code{I}, @code{GoldenRatio}, @code{EulerGamma},
14490@code{Infinity}, @code{ComplexInfinity}, and @code{Indeterminate} in
14491Mathematica mode.
14492Non-decimal numbers are written, e.g., @samp{16^^7fff}. Floating-point
14493numbers in scientific notation are written @samp{1.23*10.^3}.
14494Subscripts use double square brackets: @samp{a[[i]]}.@refill
14495
14496@node Maple Language Mode, Compositions, Mathematica Language Mode, Language Modes
14497@subsection Maple Language Mode
14498
14499@noindent
14500@kindex d W
14501@pindex calc-maple-language
14502@cindex Maple language
14503The @kbd{d W} (@code{calc-maple-language}) command selects the
14504conventions of Maple, another mathematical tool from the University
14505of Waterloo.
14506
14507Maple's language is much like C. Underscores are allowed in symbol
14508names; square brackets are used for subscripts; explicit @samp{*}s for
14509multiplications are required. Use either @samp{^} or @samp{**} to
14510denote powers.
14511
14512Maple uses square brackets for lists and curly braces for sets. Calc
14513interprets both notations as vectors, and displays vectors with square
14514brackets. This means Maple sets will be converted to lists when they
14515pass through Calc. As a special case, matrices are written as calls
14516to the function @code{matrix}, given a list of lists as the argument,
14517and can be read in this form or with all-capitals @code{MATRIX}.
14518
14519The Maple interval notation @samp{2 .. 3} has no surrounding brackets;
14520Calc reads @samp{2 .. 3} as the closed interval @samp{[2 .. 3]}, and
14521writes any kind of interval as @samp{2 .. 3}. This means you cannot
14522see the difference between an open and a closed interval while in
14523Maple display mode.
14524
14525Maple writes complex numbers as @samp{3 + 4*I}. Its special constants
14526are @code{Pi}, @code{E}, @code{I}, and @code{infinity} (all three of
14527@code{inf}, @code{uinf}, and @code{nan} display as @code{infinity}).
14528Floating-point numbers are written @samp{1.23*10.^3}.
14529
14530Among things not currently handled by Calc's Maple mode are the
14531various quote symbols, procedures and functional operators, and
14532inert (@samp{&}) operators.
14533
14534@node Compositions, Syntax Tables, Maple Language Mode, Language Modes
14535@subsection Compositions
14536
14537@noindent
14538@cindex Compositions
14539There are several @dfn{composition functions} which allow you to get
14540displays in a variety of formats similar to those in Big language
14541mode. Most of these functions do not evaluate to anything; they are
14542placeholders which are left in symbolic form by Calc's evaluator but
14543are recognized by Calc's display formatting routines.
14544
14545Two of these, @code{string} and @code{bstring}, are described elsewhere.
14546@xref{Strings}. For example, @samp{string("ABC")} is displayed as
14547@samp{ABC}. When viewed on the stack it will be indistinguishable from
14548the variable @code{ABC}, but internally it will be stored as
14549@samp{string([65, 66, 67])} and can still be manipulated this way; for
14550example, the selection and vector commands @kbd{j 1 v v j u} would
14551select the vector portion of this object and reverse the elements, then
14552deselect to reveal a string whose characters had been reversed.
14553
14554The composition functions do the same thing in all language modes
14555(although their components will of course be formatted in the current
14556language mode). The one exception is Unformatted mode (@kbd{d U}),
14557which does not give the composition functions any special treatment.
14558The functions are discussed here because of their relationship to
14559the language modes.
14560
14561@menu
14562* Composition Basics::
14563* Horizontal Compositions::
14564* Vertical Compositions::
14565* Other Compositions::
14566* Information about Compositions::
14567* User-Defined Compositions::
14568@end menu
14569
14570@node Composition Basics, Horizontal Compositions, Compositions, Compositions
14571@subsubsection Composition Basics
14572
14573@noindent
14574Compositions are generally formed by stacking formulas together
14575horizontally or vertically in various ways. Those formulas are
14576themselves compositions. @TeX{} users will find this analogous
14577to @TeX{}'s ``boxes.'' Each multi-line composition has a
14578@dfn{baseline}; horizontal compositions use the baselines to
14579decide how formulas should be positioned relative to one another.
14580For example, in the Big mode formula
14581
d7b8e6c6 14582@example
5d67986c 14583@group
d7b8e6c6
EZ
14584 2
14585 a + b
1458617 + ------
14587 c
d7b8e6c6 14588@end group
5d67986c 14589@end example
d7b8e6c6
EZ
14590
14591@noindent
14592the second term of the sum is four lines tall and has line three as
14593its baseline. Thus when the term is combined with 17, line three
14594is placed on the same level as the baseline of 17.
14595
14596@tex
14597\bigskip
14598@end tex
14599
14600Another important composition concept is @dfn{precedence}. This is
14601an integer that represents the binding strength of various operators.
14602For example, @samp{*} has higher precedence (195) than @samp{+} (180),
14603which means that @samp{(a * b) + c} will be formatted without the
14604parentheses, but @samp{a * (b + c)} will keep the parentheses.
14605
14606The operator table used by normal and Big language modes has the
14607following precedences:
14608
14609@example
14610_ 1200 @r{(subscripts)}
14611% 1100 @r{(as in n}%@r{)}
14612- 1000 @r{(as in }-@r{n)}
14613! 1000 @r{(as in }!@r{n)}
14614mod 400
14615+/- 300
14616!! 210 @r{(as in n}!!@r{)}
14617! 210 @r{(as in n}!@r{)}
14618^ 200
14619* 195 @r{(or implicit multiplication)}
14620/ % \ 190
14621+ - 180 @r{(as in a}+@r{b)}
14622| 170
14623< = 160 @r{(and other relations)}
14624&& 110
14625|| 100
14626? : 90
14627!!! 85
14628&&& 80
14629||| 75
14630:= 50
14631:: 45
14632=> 40
14633@end example
14634
14635The general rule is that if an operator with precedence @cite{n}
14636occurs as an argument to an operator with precedence @cite{m}, then
14637the argument is enclosed in parentheses if @cite{n < m}. Top-level
14638expressions and expressions which are function arguments, vector
14639components, etc., are formatted with precedence zero (so that they
14640normally never get additional parentheses).
14641
14642For binary left-associative operators like @samp{+}, the righthand
14643argument is actually formatted with one-higher precedence than shown
14644in the table. This makes sure @samp{(a + b) + c} omits the parentheses,
14645but the unnatural form @samp{a + (b + c)} keeps its parentheses.
14646Right-associative operators like @samp{^} format the lefthand argument
14647with one-higher precedence.
14648
5d67986c
RS
14649@ignore
14650@starindex
14651@end ignore
d7b8e6c6
EZ
14652@tindex cprec
14653The @code{cprec} function formats an expression with an arbitrary
14654precedence. For example, @samp{cprec(abc, 185)} will combine into
14655sums and products as follows: @samp{7 + abc}, @samp{7 (abc)} (because
14656this @code{cprec} form has higher precedence than addition, but lower
14657precedence than multiplication).
14658
14659@tex
14660\bigskip
14661@end tex
14662
14663A final composition issue is @dfn{line breaking}. Calc uses two
14664different strategies for ``flat'' and ``non-flat'' compositions.
14665A non-flat composition is anything that appears on multiple lines
14666(not counting line breaking). Examples would be matrices and Big
14667mode powers and quotients. Non-flat compositions are displayed
14668exactly as specified. If they come out wider than the current
14669window, you must use horizontal scrolling (@kbd{<} and @kbd{>}) to
14670view them.
14671
14672Flat compositions, on the other hand, will be broken across several
14673lines if they are too wide to fit the window. Certain points in a
14674composition are noted internally as @dfn{break points}. Calc's
14675general strategy is to fill each line as much as possible, then to
14676move down to the next line starting at the first break point that
14677didn't fit. However, the line breaker understands the hierarchical
14678structure of formulas. It will not break an ``inner'' formula if
14679it can use an earlier break point from an ``outer'' formula instead.
14680For example, a vector of sums might be formatted as:
14681
d7b8e6c6 14682@example
5d67986c 14683@group
d7b8e6c6
EZ
14684[ a + b + c, d + e + f,
14685 g + h + i, j + k + l, m ]
d7b8e6c6 14686@end group
5d67986c 14687@end example
d7b8e6c6
EZ
14688
14689@noindent
14690If the @samp{m} can fit, then so, it seems, could the @samp{g}.
14691But Calc prefers to break at the comma since the comma is part
14692of a ``more outer'' formula. Calc would break at a plus sign
14693only if it had to, say, if the very first sum in the vector had
14694itself been too large to fit.
14695
14696Of the composition functions described below, only @code{choriz}
14697generates break points. The @code{bstring} function (@pxref{Strings})
14698also generates breakable items: A break point is added after every
14699space (or group of spaces) except for spaces at the very beginning or
14700end of the string.
14701
14702Composition functions themselves count as levels in the formula
14703hierarchy, so a @code{choriz} that is a component of a larger
14704@code{choriz} will be less likely to be broken. As a special case,
14705if a @code{bstring} occurs as a component of a @code{choriz} or
14706@code{choriz}-like object (such as a vector or a list of arguments
14707in a function call), then the break points in that @code{bstring}
14708will be on the same level as the break points of the surrounding
14709object.
14710
14711@node Horizontal Compositions, Vertical Compositions, Composition Basics, Compositions
14712@subsubsection Horizontal Compositions
14713
14714@noindent
5d67986c
RS
14715@ignore
14716@starindex
14717@end ignore
d7b8e6c6
EZ
14718@tindex choriz
14719The @code{choriz} function takes a vector of objects and composes
14720them horizontally. For example, @samp{choriz([17, a b/c, d])} formats
14721as @w{@samp{17a b / cd}} in normal language mode, or as
14722
d7b8e6c6 14723@example
5d67986c 14724@group
d7b8e6c6
EZ
14725 a b
1472617---d
14727 c
d7b8e6c6 14728@end group
5d67986c 14729@end example
d7b8e6c6
EZ
14730
14731@noindent
14732in Big language mode. This is actually one case of the general
14733function @samp{choriz(@var{vec}, @var{sep}, @var{prec})}, where
14734either or both of @var{sep} and @var{prec} may be omitted.
14735@var{Prec} gives the @dfn{precedence} to use when formatting
14736each of the components of @var{vec}. The default precedence is
14737the precedence from the surrounding environment.
14738
14739@var{Sep} is a string (i.e., a vector of character codes as might
14740be entered with @code{" "} notation) which should separate components
14741of the composition. Also, if @var{sep} is given, the line breaker
14742will allow lines to be broken after each occurrence of @var{sep}.
14743If @var{sep} is omitted, the composition will not be breakable
14744(unless any of its component compositions are breakable).
14745
14746For example, @samp{2 choriz([a, b c, d = e], " + ", 180)} is
14747formatted as @samp{2 a + b c + (d = e)}. To get the @code{choriz}
14748to have precedence 180 ``outwards'' as well as ``inwards,''
14749enclose it in a @code{cprec} form: @samp{2 cprec(choriz(...), 180)}
14750formats as @samp{2 (a + b c + (d = e))}.
14751
14752The baseline of a horizontal composition is the same as the
14753baselines of the component compositions, which are all aligned.
14754
14755@node Vertical Compositions, Other Compositions, Horizontal Compositions, Compositions
14756@subsubsection Vertical Compositions
14757
14758@noindent
5d67986c
RS
14759@ignore
14760@starindex
14761@end ignore
d7b8e6c6
EZ
14762@tindex cvert
14763The @code{cvert} function makes a vertical composition. Each
14764component of the vector is centered in a column. The baseline of
14765the result is by default the top line of the resulting composition.
14766For example, @samp{f(cvert([a, bb, ccc]), cvert([a^2 + 1, b^2]))}
14767formats in Big mode as
14768
d7b8e6c6 14769@example
5d67986c 14770@group
d7b8e6c6
EZ
14771f( a , 2 )
14772 bb a + 1
14773 ccc 2
14774 b
d7b8e6c6 14775@end group
5d67986c 14776@end example
d7b8e6c6 14777
5d67986c
RS
14778@ignore
14779@starindex
14780@end ignore
d7b8e6c6
EZ
14781@tindex cbase
14782There are several special composition functions that work only as
14783components of a vertical composition. The @code{cbase} function
14784controls the baseline of the vertical composition; the baseline
14785will be the same as the baseline of whatever component is enclosed
14786in @code{cbase}. Thus @samp{f(cvert([a, cbase(bb), ccc]),
14787cvert([a^2 + 1, cbase(b^2)]))} displays as
14788
d7b8e6c6 14789@example
5d67986c 14790@group
d7b8e6c6
EZ
14791 2
14792 a + 1
14793 a 2
14794f(bb , b )
14795 ccc
d7b8e6c6 14796@end group
5d67986c 14797@end example
d7b8e6c6 14798
5d67986c
RS
14799@ignore
14800@starindex
14801@end ignore
d7b8e6c6 14802@tindex ctbase
5d67986c
RS
14803@ignore
14804@starindex
14805@end ignore
d7b8e6c6
EZ
14806@tindex cbbase
14807There are also @code{ctbase} and @code{cbbase} functions which
14808make the baseline of the vertical composition equal to the top
14809or bottom line (rather than the baseline) of that component.
14810Thus @samp{cvert([cbase(a / b)]) + cvert([ctbase(a / b)]) +
14811cvert([cbbase(a / b)])} gives
14812
d7b8e6c6 14813@example
5d67986c 14814@group
d7b8e6c6
EZ
14815 a
14816a -
14817- + a + b
14818b -
14819 b
d7b8e6c6 14820@end group
5d67986c 14821@end example
d7b8e6c6
EZ
14822
14823There should be only one @code{cbase}, @code{ctbase}, or @code{cbbase}
14824function in a given vertical composition. These functions can also
14825be written with no arguments: @samp{ctbase()} is a zero-height object
14826which means the baseline is the top line of the following item, and
14827@samp{cbbase()} means the baseline is the bottom line of the preceding
14828item.
14829
5d67986c
RS
14830@ignore
14831@starindex
14832@end ignore
d7b8e6c6
EZ
14833@tindex crule
14834The @code{crule} function builds a ``rule,'' or horizontal line,
14835across a vertical composition. By itself @samp{crule()} uses @samp{-}
14836characters to build the rule. You can specify any other character,
14837e.g., @samp{crule("=")}. The argument must be a character code or
14838vector of exactly one character code. It is repeated to match the
14839width of the widest item in the stack. For example, a quotient
14840with a thick line is @samp{cvert([a + 1, cbase(crule("=")), b^2])}:
14841
d7b8e6c6 14842@example
5d67986c 14843@group
d7b8e6c6
EZ
14844a + 1
14845=====
14846 2
14847 b
d7b8e6c6 14848@end group
5d67986c 14849@end example
d7b8e6c6 14850
5d67986c
RS
14851@ignore
14852@starindex
14853@end ignore
d7b8e6c6 14854@tindex clvert
5d67986c
RS
14855@ignore
14856@starindex
14857@end ignore
d7b8e6c6
EZ
14858@tindex crvert
14859Finally, the functions @code{clvert} and @code{crvert} act exactly
14860like @code{cvert} except that the items are left- or right-justified
14861in the stack. Thus @samp{clvert([a, bb, ccc]) + crvert([a, bb, ccc])}
14862gives:
14863
d7b8e6c6 14864@example
5d67986c 14865@group
d7b8e6c6
EZ
14866a + a
14867bb bb
14868ccc ccc
d7b8e6c6 14869@end group
5d67986c 14870@end example
d7b8e6c6
EZ
14871
14872Like @code{choriz}, the vertical compositions accept a second argument
14873which gives the precedence to use when formatting the components.
14874Vertical compositions do not support separator strings.
14875
14876@node Other Compositions, Information about Compositions, Vertical Compositions, Compositions
14877@subsubsection Other Compositions
14878
14879@noindent
5d67986c
RS
14880@ignore
14881@starindex
14882@end ignore
d7b8e6c6
EZ
14883@tindex csup
14884The @code{csup} function builds a superscripted expression. For
14885example, @samp{csup(a, b)} looks the same as @samp{a^b} does in Big
14886language mode. This is essentially a horizontal composition of
14887@samp{a} and @samp{b}, where @samp{b} is shifted up so that its
14888bottom line is one above the baseline.
14889
5d67986c
RS
14890@ignore
14891@starindex
14892@end ignore
d7b8e6c6
EZ
14893@tindex csub
14894Likewise, the @code{csub} function builds a subscripted expression.
14895This shifts @samp{b} down so that its top line is one below the
14896bottom line of @samp{a} (note that this is not quite analogous to
14897@code{csup}). Other arrangements can be obtained by using
14898@code{choriz} and @code{cvert} directly.
14899
5d67986c
RS
14900@ignore
14901@starindex
14902@end ignore
d7b8e6c6
EZ
14903@tindex cflat
14904The @code{cflat} function formats its argument in ``flat'' mode,
14905as obtained by @samp{d O}, if the current language mode is normal
14906or Big. It has no effect in other language modes. For example,
14907@samp{a^(b/c)} is formatted by Big mode like @samp{csup(a, cflat(b/c))}
14908to improve its readability.
14909
5d67986c
RS
14910@ignore
14911@starindex
14912@end ignore
d7b8e6c6
EZ
14913@tindex cspace
14914The @code{cspace} function creates horizontal space. For example,
14915@samp{cspace(4)} is effectively the same as @samp{string(" ")}.
14916A second string (i.e., vector of characters) argument is repeated
14917instead of the space character. For example, @samp{cspace(4, "ab")}
14918looks like @samp{abababab}. If the second argument is not a string,
14919it is formatted in the normal way and then several copies of that
14920are composed together: @samp{cspace(4, a^2)} yields
14921
d7b8e6c6 14922@example
5d67986c 14923@group
d7b8e6c6
EZ
14924 2 2 2 2
14925a a a a
d7b8e6c6 14926@end group
5d67986c 14927@end example
d7b8e6c6
EZ
14928
14929@noindent
14930If the number argument is zero, this is a zero-width object.
14931
5d67986c
RS
14932@ignore
14933@starindex
14934@end ignore
d7b8e6c6
EZ
14935@tindex cvspace
14936The @code{cvspace} function creates vertical space, or a vertical
14937stack of copies of a certain string or formatted object. The
14938baseline is the center line of the resulting stack. A numerical
14939argument of zero will produce an object which contributes zero
14940height if used in a vertical composition.
14941
5d67986c
RS
14942@ignore
14943@starindex
14944@end ignore
d7b8e6c6 14945@tindex ctspace
5d67986c
RS
14946@ignore
14947@starindex
14948@end ignore
d7b8e6c6
EZ
14949@tindex cbspace
14950There are also @code{ctspace} and @code{cbspace} functions which
14951create vertical space with the baseline the same as the baseline
14952of the top or bottom copy, respectively, of the second argument.
14953Thus @samp{cvspace(2, a/b) + ctspace(2, a/b) + cbspace(2, a/b)}
14954displays as:
14955
d7b8e6c6 14956@example
5d67986c 14957@group
d7b8e6c6
EZ
14958 a
14959 -
14960a b
14961- a a
14962b + - + -
14963a b b
14964- a
14965b -
14966 b
d7b8e6c6 14967@end group
5d67986c 14968@end example
d7b8e6c6
EZ
14969
14970@node Information about Compositions, User-Defined Compositions, Other Compositions, Compositions
14971@subsubsection Information about Compositions
14972
14973@noindent
14974The functions in this section are actual functions; they compose their
14975arguments according to the current language and other display modes,
14976then return a certain measurement of the composition as an integer.
14977
5d67986c
RS
14978@ignore
14979@starindex
14980@end ignore
d7b8e6c6
EZ
14981@tindex cwidth
14982The @code{cwidth} function measures the width, in characters, of a
14983composition. For example, @samp{cwidth(a + b)} is 5, and
14984@samp{cwidth(a / b)} is 5 in normal mode, 1 in Big mode, and 11 in
14985@TeX{} mode (for @samp{@{a \over b@}}). The argument may involve
14986the composition functions described in this section.
14987
5d67986c
RS
14988@ignore
14989@starindex
14990@end ignore
d7b8e6c6
EZ
14991@tindex cheight
14992The @code{cheight} function measures the height of a composition.
14993This is the total number of lines in the argument's printed form.
14994
5d67986c
RS
14995@ignore
14996@starindex
14997@end ignore
d7b8e6c6 14998@tindex cascent
5d67986c
RS
14999@ignore
15000@starindex
15001@end ignore
d7b8e6c6
EZ
15002@tindex cdescent
15003The functions @code{cascent} and @code{cdescent} measure the amount
15004of the height that is above (and including) the baseline, or below
15005the baseline, respectively. Thus @samp{cascent(@var{x}) + cdescent(@var{x})}
15006always equals @samp{cheight(@var{x})}. For a one-line formula like
15007@samp{a + b}, @code{cascent} returns 1 and @code{cdescent} returns 0.
15008For @samp{a / b} in Big mode, @code{cascent} returns 2 and @code{cdescent}
15009returns 1. The only formula for which @code{cascent} will return zero
15010is @samp{cvspace(0)} or equivalents.
15011
15012@node User-Defined Compositions, , Information about Compositions, Compositions
15013@subsubsection User-Defined Compositions
15014
15015@noindent
15016@kindex Z C
15017@pindex calc-user-define-composition
15018The @kbd{Z C} (@code{calc-user-define-composition}) command lets you
15019define the display format for any algebraic function. You provide a
15020formula containing a certain number of argument variables on the stack.
15021Any time Calc formats a call to the specified function in the current
15022language mode and with that number of arguments, Calc effectively
15023replaces the function call with that formula with the arguments
15024replaced.
15025
15026Calc builds the default argument list by sorting all the variable names
15027that appear in the formula into alphabetical order. You can edit this
15028argument list before pressing @key{RET} if you wish. Any variables in
15029the formula that do not appear in the argument list will be displayed
15030literally; any arguments that do not appear in the formula will not
15031affect the display at all.
15032
15033You can define formats for built-in functions, for functions you have
15034defined with @kbd{Z F} (@pxref{Algebraic Definitions}), or for functions
15035which have no definitions but are being used as purely syntactic objects.
15036You can define different formats for each language mode, and for each
15037number of arguments, using a succession of @kbd{Z C} commands. When
15038Calc formats a function call, it first searches for a format defined
15039for the current language mode (and number of arguments); if there is
15040none, it uses the format defined for the Normal language mode. If
15041neither format exists, Calc uses its built-in standard format for that
15042function (usually just @samp{@var{func}(@var{args})}).
15043
15044If you execute @kbd{Z C} with the number 0 on the stack instead of a
15045formula, any defined formats for the function in the current language
15046mode will be removed. The function will revert to its standard format.
15047
15048For example, the default format for the binomial coefficient function
15049@samp{choose(n, m)} in the Big language mode is
15050
d7b8e6c6 15051@example
5d67986c 15052@group
d7b8e6c6
EZ
15053 n
15054( )
15055 m
d7b8e6c6 15056@end group
5d67986c 15057@end example
d7b8e6c6
EZ
15058
15059@noindent
15060You might prefer the notation,
15061
d7b8e6c6 15062@example
5d67986c 15063@group
d7b8e6c6
EZ
15064 C
15065n m
d7b8e6c6 15066@end group
5d67986c 15067@end example
d7b8e6c6
EZ
15068
15069@noindent
15070To define this notation, first make sure you are in Big mode,
15071then put the formula
15072
15073@smallexample
15074choriz([cvert([cvspace(1), n]), C, cvert([cvspace(1), m])])
15075@end smallexample
15076
15077@noindent
15078on the stack and type @kbd{Z C}. Answer the first prompt with
15079@code{choose}. The second prompt will be the default argument list
15080of @samp{(C m n)}. Edit this list to be @samp{(n m)} and press
15081@key{RET}. Now, try it out: For example, turn simplification
15082off with @kbd{m O} and enter @samp{choose(a,b) + choose(7,3)}
15083as an algebraic entry.
15084
d7b8e6c6 15085@example
5d67986c 15086@group
d7b8e6c6
EZ
15087 C + C
15088a b 7 3
d7b8e6c6 15089@end group
5d67986c 15090@end example
d7b8e6c6
EZ
15091
15092As another example, let's define the usual notation for Stirling
15093numbers of the first kind, @samp{stir1(n, m)}. This is just like
15094the regular format for binomial coefficients but with square brackets
15095instead of parentheses.
15096
15097@smallexample
15098choriz([string("["), cvert([n, cbase(cvspace(1)), m]), string("]")])
15099@end smallexample
15100
15101Now type @kbd{Z C stir1 @key{RET}}, edit the argument list to
15102@samp{(n m)}, and type @key{RET}.
15103
15104The formula provided to @kbd{Z C} usually will involve composition
15105functions, but it doesn't have to. Putting the formula @samp{a + b + c}
15106onto the stack and typing @kbd{Z C foo @key{RET} @key{RET}} would define
15107the function @samp{foo(x,y,z)} to display like @samp{x + y + z}.
15108This ``sum'' will act exactly like a real sum for all formatting
15109purposes (it will be parenthesized the same, and so on). However
15110it will be computationally unrelated to a sum. For example, the
15111formula @samp{2 * foo(1, 2, 3)} will display as @samp{2 (1 + 2 + 3)}.
15112Operator precedences have caused the ``sum'' to be written in
15113parentheses, but the arguments have not actually been summed.
15114(Generally a display format like this would be undesirable, since
15115it can easily be confused with a real sum.)
15116
15117The special function @code{eval} can be used inside a @kbd{Z C}
15118composition formula to cause all or part of the formula to be
15119evaluated at display time. For example, if the formula is
15120@samp{a + eval(b + c)}, then @samp{foo(1, 2, 3)} will be displayed
15121as @samp{1 + 5}. Evaluation will use the default simplifications,
15122regardless of the current simplification mode. There are also
15123@code{evalsimp} and @code{evalextsimp} which simplify as if by
15124@kbd{a s} and @kbd{a e} (respectively). Note that these ``functions''
15125operate only in the context of composition formulas (and also in
15126rewrite rules, where they serve a similar purpose; @pxref{Rewrite
15127Rules}). On the stack, a call to @code{eval} will be left in
15128symbolic form.
15129
15130It is not a good idea to use @code{eval} except as a last resort.
15131It can cause the display of formulas to be extremely slow. For
15132example, while @samp{eval(a + b)} might seem quite fast and simple,
15133there are several situations where it could be slow. For example,
15134@samp{a} and/or @samp{b} could be polar complex numbers, in which
15135case doing the sum requires trigonometry. Or, @samp{a} could be
15136the factorial @samp{fact(100)} which is unevaluated because you
15137have typed @kbd{m O}; @code{eval} will evaluate it anyway to
15138produce a large, unwieldy integer.
15139
15140You can save your display formats permanently using the @kbd{Z P}
15141command (@pxref{Creating User Keys}).
15142
15143@node Syntax Tables, , Compositions, Language Modes
15144@subsection Syntax Tables
15145
15146@noindent
15147@cindex Syntax tables
15148@cindex Parsing formulas, customized
15149Syntax tables do for input what compositions do for output: They
15150allow you to teach custom notations to Calc's formula parser.
15151Calc keeps a separate syntax table for each language mode.
15152
15153(Note that the Calc ``syntax tables'' discussed here are completely
15154unrelated to the syntax tables described in the Emacs manual.)
15155
15156@kindex Z S
15157@pindex calc-edit-user-syntax
15158The @kbd{Z S} (@code{calc-edit-user-syntax}) command edits the
15159syntax table for the current language mode. If you want your
15160syntax to work in any language, define it in the normal language
15161mode. Type @kbd{M-# M-#} to finish editing the syntax table, or
15162@kbd{M-# x} to cancel the edit. The @kbd{m m} command saves all
15163the syntax tables along with the other mode settings;
15164@pxref{General Mode Commands}.
15165
15166@menu
15167* Syntax Table Basics::
15168* Precedence in Syntax Tables::
15169* Advanced Syntax Patterns::
15170* Conditional Syntax Rules::
15171@end menu
15172
15173@node Syntax Table Basics, Precedence in Syntax Tables, Syntax Tables, Syntax Tables
15174@subsubsection Syntax Table Basics
15175
15176@noindent
15177@dfn{Parsing} is the process of converting a raw string of characters,
15178such as you would type in during algebraic entry, into a Calc formula.
15179Calc's parser works in two stages. First, the input is broken down
15180into @dfn{tokens}, such as words, numbers, and punctuation symbols
15181like @samp{+}, @samp{:=}, and @samp{+/-}. Space between tokens is
15182ignored (except when it serves to separate adjacent words). Next,
15183the parser matches this string of tokens against various built-in
15184syntactic patterns, such as ``an expression followed by @samp{+}
15185followed by another expression'' or ``a name followed by @samp{(},
15186zero or more expressions separated by commas, and @samp{)}.''
15187
15188A @dfn{syntax table} is a list of user-defined @dfn{syntax rules},
15189which allow you to specify new patterns to define your own
15190favorite input notations. Calc's parser always checks the syntax
15191table for the current language mode, then the table for the normal
15192language mode, before it uses its built-in rules to parse an
15193algebraic formula you have entered. Each syntax rule should go on
15194its own line; it consists of a @dfn{pattern}, a @samp{:=} symbol,
15195and a Calc formula with an optional @dfn{condition}. (Syntax rules
15196resemble algebraic rewrite rules, but the notation for patterns is
15197completely different.)
15198
15199A syntax pattern is a list of tokens, separated by spaces.
15200Except for a few special symbols, tokens in syntax patterns are
15201matched literally, from left to right. For example, the rule,
15202
15203@example
15204foo ( ) := 2+3
15205@end example
15206
15207@noindent
15208would cause Calc to parse the formula @samp{4+foo()*5} as if it
15209were @samp{4+(2+3)*5}. Notice that the parentheses were written
15210as two separate tokens in the rule. As a result, the rule works
15211for both @samp{foo()} and @w{@samp{foo ( )}}. If we had written
15212the rule as @samp{foo () := 2+3}, then Calc would treat @samp{()}
15213as a single, indivisible token, so that @w{@samp{foo( )}} would
15214not be recognized by the rule. (It would be parsed as a regular
15215zero-argument function call instead.) In fact, this rule would
15216also make trouble for the rest of Calc's parser: An unrelated
15217formula like @samp{bar()} would now be tokenized into @samp{bar ()}
15218instead of @samp{bar ( )}, so that the standard parser for function
15219calls would no longer recognize it!
15220
15221While it is possible to make a token with a mixture of letters
15222and punctuation symbols, this is not recommended. It is better to
15223break it into several tokens, as we did with @samp{foo()} above.
15224
15225The symbol @samp{#} in a syntax pattern matches any Calc expression.
15226On the righthand side, the things that matched the @samp{#}s can
15227be referred to as @samp{#1}, @samp{#2}, and so on (where @samp{#1}
15228matches the leftmost @samp{#} in the pattern). For example, these
15229rules match a user-defined function, prefix operator, infix operator,
15230and postfix operator, respectively:
15231
15232@example
15233foo ( # ) := myfunc(#1)
15234foo # := myprefix(#1)
15235# foo # := myinfix(#1,#2)
15236# foo := mypostfix(#1)
15237@end example
15238
15239Thus @samp{foo(3)} will parse as @samp{myfunc(3)}, and @samp{2+3 foo}
15240will parse as @samp{mypostfix(2+3)}.
15241
15242It is important to write the first two rules in the order shown,
15243because Calc tries rules in order from first to last. If the
15244pattern @samp{foo #} came first, it would match anything that could
15245match the @samp{foo ( # )} rule, since an expression in parentheses
15246is itself a valid expression. Thus the @w{@samp{foo ( # )}} rule would
15247never get to match anything. Likewise, the last two rules must be
15248written in the order shown or else @samp{3 foo 4} will be parsed as
15249@samp{mypostfix(3) * 4}. (Of course, the best way to avoid these
15250ambiguities is not to use the same symbol in more than one way at
15251the same time! In case you're not convinced, try the following
15252exercise: How will the above rules parse the input @samp{foo(3,4)},
15253if at all? Work it out for yourself, then try it in Calc and see.)
15254
15255Calc is quite flexible about what sorts of patterns are allowed.
15256The only rule is that every pattern must begin with a literal
15257token (like @samp{foo} in the first two patterns above), or with
15258a @samp{#} followed by a literal token (as in the last two
15259patterns). After that, any mixture is allowed, although putting
15260two @samp{#}s in a row will not be very useful since two
15261expressions with nothing between them will be parsed as one
15262expression that uses implicit multiplication.
15263
15264As a more practical example, Maple uses the notation
15265@samp{sum(a(i), i=1..10)} for sums, which Calc's Maple mode doesn't
15266recognize at present. To handle this syntax, we simply add the
15267rule,
15268
15269@example
15270sum ( # , # = # .. # ) := sum(#1,#2,#3,#4)
15271@end example
15272
15273@noindent
15274to the Maple mode syntax table. As another example, C mode can't
15275read assignment operators like @samp{++} and @samp{*=}. We can
15276define these operators quite easily:
15277
15278@example
15279# *= # := muleq(#1,#2)
15280# ++ := postinc(#1)
15281++ # := preinc(#1)
15282@end example
15283
15284@noindent
15285To complete the job, we would use corresponding composition functions
15286and @kbd{Z C} to cause these functions to display in their respective
15287Maple and C notations. (Note that the C example ignores issues of
15288operator precedence, which are discussed in the next section.)
15289
15290You can enclose any token in quotes to prevent its usual
15291interpretation in syntax patterns:
15292
15293@example
15294# ":=" # := becomes(#1,#2)
15295@end example
15296
15297Quotes also allow you to include spaces in a token, although once
15298again it is generally better to use two tokens than one token with
15299an embedded space. To include an actual quotation mark in a quoted
15300token, precede it with a backslash. (This also works to include
15301backslashes in tokens.)
15302
15303@example
15304# "bad token" # "/\"\\" # := silly(#1,#2,#3)
15305@end example
15306
15307@noindent
15308This will parse @samp{3 bad token 4 /"\ 5} to @samp{silly(3,4,5)}.
15309
15310The token @kbd{#} has a predefined meaning in Calc's formula parser;
15311it is not legal to use @samp{"#"} in a syntax rule. However, longer
15312tokens that include the @samp{#} character are allowed. Also, while
15313@samp{"$"} and @samp{"\""} are allowed as tokens, their presence in
15314the syntax table will prevent those characters from working in their
15315usual ways (referring to stack entries and quoting strings,
15316respectively).
15317
15318Finally, the notation @samp{%%} anywhere in a syntax table causes
15319the rest of the line to be ignored as a comment.
15320
15321@node Precedence in Syntax Tables, Advanced Syntax Patterns, Syntax Table Basics, Syntax Tables
15322@subsubsection Precedence
15323
15324@noindent
15325Different operators are generally assigned different @dfn{precedences}.
15326By default, an operator defined by a rule like
15327
15328@example
15329# foo # := foo(#1,#2)
15330@end example
15331
15332@noindent
15333will have an extremely low precedence, so that @samp{2*3+4 foo 5 == 6}
15334will be parsed as @samp{(2*3+4) foo (5 == 6)}. To change the
15335precedence of an operator, use the notation @samp{#/@var{p}} in
15336place of @samp{#}, where @var{p} is an integer precedence level.
15337For example, 185 lies between the precedences for @samp{+} and
15338@samp{*}, so if we change this rule to
15339
15340@example
15341#/185 foo #/186 := foo(#1,#2)
15342@end example
15343
15344@noindent
15345then @samp{2+3 foo 4*5} will be parsed as @samp{2+(3 foo (4*5))}.
15346Also, because we've given the righthand expression slightly higher
15347precedence, our new operator will be left-associative:
15348@samp{1 foo 2 foo 3} will be parsed as @samp{(1 foo 2) foo 3}.
15349By raising the precedence of the lefthand expression instead, we
15350can create a right-associative operator.
15351
15352@xref{Composition Basics}, for a table of precedences of the
15353standard Calc operators. For the precedences of operators in other
15354language modes, look in the Calc source file @file{calc-lang.el}.
15355
15356@node Advanced Syntax Patterns, Conditional Syntax Rules, Precedence in Syntax Tables, Syntax Tables
15357@subsubsection Advanced Syntax Patterns
15358
15359@noindent
15360To match a function with a variable number of arguments, you could
15361write
15362
15363@example
15364foo ( # ) := myfunc(#1)
15365foo ( # , # ) := myfunc(#1,#2)
15366foo ( # , # , # ) := myfunc(#1,#2,#3)
15367@end example
15368
15369@noindent
15370but this isn't very elegant. To match variable numbers of items,
15371Calc uses some notations inspired regular expressions and the
15372``extended BNF'' style used by some language designers.
15373
15374@example
15375foo ( @{ # @}*, ) := apply(myfunc,#1)
15376@end example
15377
15378The token @samp{@{} introduces a repeated or optional portion.
15379One of the three tokens @samp{@}*}, @samp{@}+}, or @samp{@}?}
15380ends the portion. These will match zero or more, one or more,
15381or zero or one copies of the enclosed pattern, respectively.
15382In addition, @samp{@}*} and @samp{@}+} can be followed by a
15383separator token (with no space in between, as shown above).
15384Thus @samp{@{ # @}*,} matches nothing, or one expression, or
15385several expressions separated by commas.
15386
15387A complete @samp{@{ ... @}} item matches as a vector of the
15388items that matched inside it. For example, the above rule will
15389match @samp{foo(1,2,3)} to get @samp{apply(myfunc,[1,2,3])}.
15390The Calc @code{apply} function takes a function name and a vector
15391of arguments and builds a call to the function with those
15392arguments, so the net result is the formula @samp{myfunc(1,2,3)}.
15393
15394If the body of a @samp{@{ ... @}} contains several @samp{#}s
15395(or nested @samp{@{ ... @}} constructs), then the items will be
15396strung together into the resulting vector. If the body
15397does not contain anything but literal tokens, the result will
15398always be an empty vector.
15399
15400@example
15401foo ( @{ # , # @}+, ) := bar(#1)
15402foo ( @{ @{ # @}*, @}*; ) := matrix(#1)
15403@end example
15404
15405@noindent
5d67986c
RS
15406will parse @samp{foo(1, 2, 3, 4)} as @samp{bar([1, 2, 3, 4])}, and
15407@samp{foo(1, 2; 3, 4)} as @samp{matrix([[1, 2], [3, 4]])}. Also, after
d7b8e6c6 15408some thought it's easy to see how this pair of rules will parse
5d67986c 15409@samp{foo(1, 2, 3)} as @samp{matrix([[1, 2, 3]])}, since the first
d7b8e6c6
EZ
15410rule will only match an even number of arguments. The rule
15411
15412@example
15413foo ( # @{ , # , # @}? ) := bar(#1,#2)
15414@end example
15415
15416@noindent
15417will parse @samp{foo(2,3,4)} as @samp{bar(2,[3,4])}, and
15418@samp{foo(2)} as @samp{bar(2,[])}.
15419
15420The notation @samp{@{ ... @}?.} (note the trailing period) works
15421just the same as regular @samp{@{ ... @}?}, except that it does not
15422count as an argument; the following two rules are equivalent:
15423
15424@example
15425foo ( # , @{ also @}? # ) := bar(#1,#3)
15426foo ( # , @{ also @}?. # ) := bar(#1,#2)
15427@end example
15428
15429@noindent
15430Note that in the first case the optional text counts as @samp{#2},
15431which will always be an empty vector, but in the second case no
15432empty vector is produced.
15433
15434Another variant is @samp{@{ ... @}?$}, which means the body is
15435optional only at the end of the input formula. All built-in syntax
15436rules in Calc use this for closing delimiters, so that during
5d67986c 15437algebraic entry you can type @kbd{[sqrt(2), sqrt(3 @key{RET}}, omitting
d7b8e6c6
EZ
15438the closing parenthesis and bracket. Calc does this automatically
15439for trailing @samp{)}, @samp{]}, and @samp{>} tokens in syntax
15440rules, but you can use @samp{@{ ... @}?$} explicitly to get
15441this effect with any token (such as @samp{"@}"} or @samp{end}).
15442Like @samp{@{ ... @}?.}, this notation does not count as an
15443argument. Conversely, you can use quotes, as in @samp{")"}, to
15444prevent a closing-delimiter token from being automatically treated
15445as optional.
15446
15447Calc's parser does not have full backtracking, which means some
15448patterns will not work as you might expect:
15449
15450@example
15451foo ( @{ # , @}? # , # ) := bar(#1,#2,#3)
15452@end example
15453
15454@noindent
15455Here we are trying to make the first argument optional, so that
15456@samp{foo(2,3)} parses as @samp{bar([],2,3)}. Unfortunately, Calc
15457first tries to match @samp{2,} against the optional part of the
15458pattern, finds a match, and so goes ahead to match the rest of the
15459pattern. Later on it will fail to match the second comma, but it
15460doesn't know how to go back and try the other alternative at that
15461point. One way to get around this would be to use two rules:
15462
15463@example
15464foo ( # , # , # ) := bar([#1],#2,#3)
15465foo ( # , # ) := bar([],#1,#2)
15466@end example
15467
15468More precisely, when Calc wants to match an optional or repeated
15469part of a pattern, it scans forward attempting to match that part.
15470If it reaches the end of the optional part without failing, it
15471``finalizes'' its choice and proceeds. If it fails, though, it
15472backs up and tries the other alternative. Thus Calc has ``partial''
15473backtracking. A fully backtracking parser would go on to make sure
15474the rest of the pattern matched before finalizing the choice.
15475
15476@node Conditional Syntax Rules, , Advanced Syntax Patterns, Syntax Tables
15477@subsubsection Conditional Syntax Rules
15478
15479@noindent
15480It is possible to attach a @dfn{condition} to a syntax rule. For
15481example, the rules
15482
15483@example
15484foo ( # ) := ifoo(#1) :: integer(#1)
15485foo ( # ) := gfoo(#1)
15486@end example
15487
15488@noindent
15489will parse @samp{foo(3)} as @samp{ifoo(3)}, but will parse
15490@samp{foo(3.5)} and @samp{foo(x)} as calls to @code{gfoo}. Any
15491number of conditions may be attached; all must be true for the
15492rule to succeed. A condition is ``true'' if it evaluates to a
15493nonzero number. @xref{Logical Operations}, for a list of Calc
15494functions like @code{integer} that perform logical tests.
15495
15496The exact sequence of events is as follows: When Calc tries a
15497rule, it first matches the pattern as usual. It then substitutes
15498@samp{#1}, @samp{#2}, etc., in the conditions, if any. Next, the
15499conditions are simplified and evaluated in order from left to right,
15500as if by the @w{@kbd{a s}} algebra command (@pxref{Simplifying Formulas}).
15501Each result is true if it is a nonzero number, or an expression
15502that can be proven to be nonzero (@pxref{Declarations}). If the
15503results of all conditions are true, the expression (such as
15504@samp{ifoo(#1)}) has its @samp{#}s substituted, and that is the
15505result of the parse. If the result of any condition is false, Calc
15506goes on to try the next rule in the syntax table.
15507
15508Syntax rules also support @code{let} conditions, which operate in
15509exactly the same way as they do in algebraic rewrite rules.
15510@xref{Other Features of Rewrite Rules}, for details. A @code{let}
15511condition is always true, but as a side effect it defines a
15512variable which can be used in later conditions, and also in the
15513expression after the @samp{:=} sign:
15514
15515@example
15516foo ( # ) := hifoo(x) :: let(x := #1 + 0.5) :: dnumint(x)
15517@end example
15518
15519@noindent
15520The @code{dnumint} function tests if a value is numerically an
15521integer, i.e., either a true integer or an integer-valued float.
15522This rule will parse @code{foo} with a half-integer argument,
15523like @samp{foo(3.5)}, to a call like @samp{hifoo(4.)}.
15524
15525The lefthand side of a syntax rule @code{let} must be a simple
15526variable, not the arbitrary pattern that is allowed in rewrite
15527rules.
15528
15529The @code{matches} function is also treated specially in syntax
15530rule conditions (again, in the same way as in rewrite rules).
15531@xref{Matching Commands}. If the matching pattern contains
15532meta-variables, then those meta-variables may be used in later
15533conditions and in the result expression. The arguments to
15534@code{matches} are not evaluated in this situation.
15535
15536@example
15537sum ( # , # ) := sum(#1,a,b,c) :: matches(#2, a=[b..c])
15538@end example
15539
15540@noindent
15541This is another way to implement the Maple mode @code{sum} notation.
15542In this approach, we allow @samp{#2} to equal the whole expression
15543@samp{i=1..10}. Then, we use @code{matches} to break it apart into
15544its components. If the expression turns out not to match the pattern,
15545the syntax rule will fail. Note that @kbd{Z S} always uses Calc's
15546normal language mode for editing expressions in syntax rules, so we
15547must use regular Calc notation for the interval @samp{[b..c]} that
15548will correspond to the Maple mode interval @samp{1..10}.
15549
15550@node Modes Variable, Calc Mode Line, Language Modes, Mode Settings
15551@section The @code{Modes} Variable
15552
15553@noindent
15554@kindex m g
15555@pindex calc-get-modes
15556The @kbd{m g} (@code{calc-get-modes}) command pushes onto the stack
15557a vector of numbers that describes the various mode settings that
15558are in effect. With a numeric prefix argument, it pushes only the
15559@var{n}th mode, i.e., the @var{n}th element of this vector. Keyboard
15560macros can use the @kbd{m g} command to modify their behavior based
15561on the current mode settings.
15562
15563@cindex @code{Modes} variable
15564@vindex Modes
15565The modes vector is also available in the special variable
5d67986c 15566@code{Modes}. In other words, @kbd{m g} is like @kbd{s r Modes @key{RET}}.
d7b8e6c6
EZ
15567It will not work to store into this variable; in fact, if you do,
15568@code{Modes} will cease to track the current modes. (The @kbd{m g}
15569command will continue to work, however.)
15570
15571In general, each number in this vector is suitable as a numeric
15572prefix argument to the associated mode-setting command. (Recall
15573that the @kbd{~} key takes a number from the stack and gives it as
15574a numeric prefix to the next command.)
15575
15576The elements of the modes vector are as follows:
15577
15578@enumerate
15579@item
15580Current precision. Default is 12; associated command is @kbd{p}.
15581
15582@item
15583Binary word size. Default is 32; associated command is @kbd{b w}.
15584
15585@item
15586Stack size (not counting the value about to be pushed by @kbd{m g}).
15587This is zero if @kbd{m g} is executed with an empty stack.
15588
15589@item
15590Number radix. Default is 10; command is @kbd{d r}.
15591
15592@item
15593Floating-point format. This is the number of digits, plus the
15594constant 0 for normal notation, 10000 for scientific notation,
1559520000 for engineering notation, or 30000 for fixed-point notation.
15596These codes are acceptable as prefix arguments to the @kbd{d n}
15597command, but note that this may lose information: For example,
15598@kbd{d s} and @kbd{C-u 12 d s} have similar (but not quite
15599identical) effects if the current precision is 12, but they both
15600produce a code of 10012, which will be treated by @kbd{d n} as
15601@kbd{C-u 12 d s}. If the precision then changes, the float format
15602will still be frozen at 12 significant figures.
15603
15604@item
15605Angular mode. Default is 1 (degrees). Other values are 2 (radians)
15606and 3 (HMS). The @kbd{m d} command accepts these prefixes.
15607
15608@item
15609Symbolic mode. Value is 0 or 1; default is 0. Command is @kbd{m s}.
15610
15611@item
15612Fraction mode. Value is 0 or 1; default is 0. Command is @kbd{m f}.
15613
15614@item
15615Polar mode. Value is 0 (rectangular) or 1 (polar); default is 0.
15616Command is @kbd{m p}.
15617
15618@item
15619Matrix/scalar mode. Default value is @i{-1}. Value is 0 for scalar
5d67986c
RS
15620mode, @i{-2} for matrix mode, or @var{N} for @c{$N\times N$}
15621@var{N}x@var{N} matrix mode. Command is @kbd{m v}.
d7b8e6c6
EZ
15622
15623@item
15624Simplification mode. Default is 1. Value is @i{-1} for off (@kbd{m O}),
156250 for @kbd{m N}, 2 for @kbd{m B}, 3 for @kbd{m A}, 4 for @kbd{m E},
15626or 5 for @w{@kbd{m U}}. The @kbd{m D} command accepts these prefixes.
15627
15628@item
15629Infinite mode. Default is @i{-1} (off). Value is 1 if the mode is on,
15630or 0 if the mode is on with positive zeros. Command is @kbd{m i}.
15631@end enumerate
15632
5d67986c 15633For example, the sequence @kbd{M-1 m g @key{RET} 2 + ~ p} increases the
d7b8e6c6
EZ
15634precision by two, leaving a copy of the old precision on the stack.
15635Later, @kbd{~ p} will restore the original precision using that
15636stack value. (This sequence might be especially useful inside a
15637keyboard macro.)
15638
5d67986c 15639As another example, @kbd{M-3 m g 1 - ~ @key{DEL}} deletes all but the
d7b8e6c6
EZ
15640oldest (bottommost) stack entry.
15641
15642Yet another example: The HP-48 ``round'' command rounds a number
15643to the current displayed precision. You could roughly emulate this
15644in Calc with the sequence @kbd{M-5 m g 10000 % ~ c c}. (This
15645would not work for fixed-point mode, but it wouldn't be hard to
15646do a full emulation with the help of the @kbd{Z [} and @kbd{Z ]}
15647programming commands. @xref{Conditionals in Macros}.)
15648
15649@node Calc Mode Line, , Modes Variable, Mode Settings
15650@section The Calc Mode Line
15651
15652@noindent
15653@cindex Mode line indicators
15654This section is a summary of all symbols that can appear on the
15655Calc mode line, the highlighted bar that appears under the Calc
15656stack window (or under an editing window in Embedded Mode).
15657
15658The basic mode line format is:
15659
15660@example
15661--%%-Calc: 12 Deg @var{other modes} (Calculator)
15662@end example
15663
15664The @samp{%%} is the Emacs symbol for ``read-only''; it shows that
15665regular Emacs commands are not allowed to edit the stack buffer
15666as if it were text.
15667
15668The word @samp{Calc:} changes to @samp{CalcEmbed:} if Embedded Mode
15669is enabled. The words after this describe the various Calc modes
15670that are in effect.
15671
15672The first mode is always the current precision, an integer.
15673The second mode is always the angular mode, either @code{Deg},
15674@code{Rad}, or @code{Hms}.
15675
15676Here is a complete list of the remaining symbols that can appear
15677on the mode line:
15678
15679@table @code
15680@item Alg
15681Algebraic mode (@kbd{m a}; @pxref{Algebraic Entry}).
15682
15683@item Alg[(
15684Incomplete algebraic mode (@kbd{C-u m a}).
15685
15686@item Alg*
15687Total algebraic mode (@kbd{m t}).
15688
15689@item Symb
15690Symbolic mode (@kbd{m s}; @pxref{Symbolic Mode}).
15691
15692@item Matrix
15693Matrix mode (@kbd{m v}; @pxref{Matrix Mode}).
15694
15695@item Matrix@var{n}
15696Dimensioned matrix mode (@kbd{C-u @var{n} m v}).
15697
15698@item Scalar
15699Scalar mode (@kbd{m v}; @pxref{Matrix Mode}).
15700
15701@item Polar
15702Polar complex mode (@kbd{m p}; @pxref{Polar Mode}).
15703
15704@item Frac
15705Fraction mode (@kbd{m f}; @pxref{Fraction Mode}).
15706
15707@item Inf
15708Infinite mode (@kbd{m i}; @pxref{Infinite Mode}).
15709
15710@item +Inf
15711Positive infinite mode (@kbd{C-u 0 m i}).
15712
15713@item NoSimp
15714Default simplifications off (@kbd{m O}; @pxref{Simplification Modes}).
15715
15716@item NumSimp
15717Default simplifications for numeric arguments only (@kbd{m N}).
15718
15719@item BinSimp@var{w}
15720Binary-integer simplification mode; word size @var{w} (@kbd{m B}, @kbd{b w}).
15721
15722@item AlgSimp
15723Algebraic simplification mode (@kbd{m A}).
15724
15725@item ExtSimp
15726Extended algebraic simplification mode (@kbd{m E}).
15727
15728@item UnitSimp
15729Units simplification mode (@kbd{m U}).
15730
15731@item Bin
15732Current radix is 2 (@kbd{d 2}; @pxref{Radix Modes}).
15733
15734@item Oct
15735Current radix is 8 (@kbd{d 8}).
15736
15737@item Hex
15738Current radix is 16 (@kbd{d 6}).
15739
15740@item Radix@var{n}
15741Current radix is @var{n} (@kbd{d r}).
15742
15743@item Zero
15744Leading zeros (@kbd{d z}; @pxref{Radix Modes}).
15745
15746@item Big
15747Big language mode (@kbd{d B}; @pxref{Normal Language Modes}).
15748
15749@item Flat
15750One-line normal language mode (@kbd{d O}).
15751
15752@item Unform
15753Unformatted language mode (@kbd{d U}).
15754
15755@item C
15756C language mode (@kbd{d C}; @pxref{C FORTRAN Pascal}).
15757
15758@item Pascal
15759Pascal language mode (@kbd{d P}).
15760
15761@item Fortran
15762FORTRAN language mode (@kbd{d F}).
15763
15764@item TeX
15765@TeX{} language mode (@kbd{d T}; @pxref{TeX Language Mode}).
15766
15767@item Eqn
15768@dfn{Eqn} language mode (@kbd{d E}; @pxref{Eqn Language Mode}).
15769
15770@item Math
15771Mathematica language mode (@kbd{d M}; @pxref{Mathematica Language Mode}).
15772
15773@item Maple
15774Maple language mode (@kbd{d W}; @pxref{Maple Language Mode}).
15775
15776@item Norm@var{n}
15777Normal float mode with @var{n} digits (@kbd{d n}; @pxref{Float Formats}).
15778
15779@item Fix@var{n}
15780Fixed point mode with @var{n} digits after the point (@kbd{d f}).
15781
15782@item Sci
15783Scientific notation mode (@kbd{d s}).
15784
15785@item Sci@var{n}
15786Scientific notation with @var{n} digits (@kbd{d s}).
15787
15788@item Eng
15789Engineering notation mode (@kbd{d e}).
15790
15791@item Eng@var{n}
15792Engineering notation with @var{n} digits (@kbd{d e}).
15793
15794@item Left@var{n}
15795Left-justified display indented by @var{n} (@kbd{d <}; @pxref{Justification}).
15796
15797@item Right
15798Right-justified display (@kbd{d >}).
15799
15800@item Right@var{n}
15801Right-justified display with width @var{n} (@kbd{d >}).
15802
15803@item Center
15804Centered display (@kbd{d =}).
15805
15806@item Center@var{n}
15807Centered display with center column @var{n} (@kbd{d =}).
15808
15809@item Wid@var{n}
15810Line breaking with width @var{n} (@kbd{d b}; @pxref{Normal Language Modes}).
15811
15812@item Wide
15813No line breaking (@kbd{d b}).
15814
15815@item Break
15816Selections show deep structure (@kbd{j b}; @pxref{Making Selections}).
15817
15818@item Save
15819Record modes in @file{~/.emacs} (@kbd{m R}; @pxref{General Mode Commands}).
15820
15821@item Local
15822Record modes in Embedded buffer (@kbd{m R}).
15823
15824@item LocEdit
15825Record modes as editing-only in Embedded buffer (@kbd{m R}).
15826
15827@item LocPerm
15828Record modes as permanent-only in Embedded buffer (@kbd{m R}).
15829
15830@item Global
15831Record modes as global in Embedded buffer (@kbd{m R}).
15832
15833@item Manual
15834Automatic recomputation turned off (@kbd{m C}; @pxref{Automatic
15835Recomputation}).
15836
15837@item Graph
15838GNUPLOT process is alive in background (@pxref{Graphics}).
15839
15840@item Sel
15841Top-of-stack has a selection (Embedded only; @pxref{Making Selections}).
15842
15843@item Dirty
15844The stack display may not be up-to-date (@pxref{Display Modes}).
15845
15846@item Inv
15847``Inverse'' prefix was pressed (@kbd{I}; @pxref{Inverse and Hyperbolic}).
15848
15849@item Hyp
15850``Hyperbolic'' prefix was pressed (@kbd{H}).
15851
15852@item Keep
15853``Keep-arguments'' prefix was pressed (@kbd{K}).
15854
15855@item Narrow
15856Stack is truncated (@kbd{d t}; @pxref{Truncating the Stack}).
15857@end table
15858
15859In addition, the symbols @code{Active} and @code{~Active} can appear
15860as minor modes on an Embedded buffer's mode line. @xref{Embedded Mode}.
15861
15862@node Arithmetic, Scientific Functions, Mode Settings, Top
15863@chapter Arithmetic Functions
15864
15865@noindent
15866This chapter describes the Calc commands for doing simple calculations
15867on numbers, such as addition, absolute value, and square roots. These
15868commands work by removing the top one or two values from the stack,
15869performing the desired operation, and pushing the result back onto the
15870stack. If the operation cannot be performed, the result pushed is a
15871formula instead of a number, such as @samp{2/0} (because division by zero
15872is illegal) or @samp{sqrt(x)} (because the argument @samp{x} is a formula).
15873
15874Most of the commands described here can be invoked by a single keystroke.
15875Some of the more obscure ones are two-letter sequences beginning with
15876the @kbd{f} (``functions'') prefix key.
15877
15878@xref{Prefix Arguments}, for a discussion of the effect of numeric
15879prefix arguments on commands in this chapter which do not otherwise
15880interpret a prefix argument.
15881
15882@menu
15883* Basic Arithmetic::
15884* Integer Truncation::
15885* Complex Number Functions::
15886* Conversions::
15887* Date Arithmetic::
15888* Financial Functions::
15889* Binary Functions::
15890@end menu
15891
15892@node Basic Arithmetic, Integer Truncation, Arithmetic, Arithmetic
15893@section Basic Arithmetic
15894
15895@noindent
15896@kindex +
15897@pindex calc-plus
5d67986c
RS
15898@ignore
15899@mindex @null
15900@end ignore
d7b8e6c6
EZ
15901@tindex +
15902The @kbd{+} (@code{calc-plus}) command adds two numbers. The numbers may
15903be any of the standard Calc data types. The resulting sum is pushed back
15904onto the stack.
15905
15906If both arguments of @kbd{+} are vectors or matrices (of matching dimensions),
15907the result is a vector or matrix sum. If one argument is a vector and the
15908other a scalar (i.e., a non-vector), the scalar is added to each of the
15909elements of the vector to form a new vector. If the scalar is not a
15910number, the operation is left in symbolic form: Suppose you added @samp{x}
15911to the vector @samp{[1,2]}. You may want the result @samp{[1+x,2+x]}, or
15912you may plan to substitute a 2-vector for @samp{x} in the future. Since
15913the Calculator can't tell which interpretation you want, it makes the
15914safest assumption. @xref{Reducing and Mapping}, for a way to add @samp{x}
15915to every element of a vector.
15916
15917If either argument of @kbd{+} is a complex number, the result will in general
15918be complex. If one argument is in rectangular form and the other polar,
15919the current Polar Mode determines the form of the result. If Symbolic
15920Mode is enabled, the sum may be left as a formula if the necessary
15921conversions for polar addition are non-trivial.
15922
15923If both arguments of @kbd{+} are HMS forms, the forms are added according to
15924the usual conventions of hours-minutes-seconds notation. If one argument
15925is an HMS form and the other is a number, that number is converted from
15926degrees or radians (depending on the current Angular Mode) to HMS format
15927and then the two HMS forms are added.
15928
15929If one argument of @kbd{+} is a date form, the other can be either a
15930real number, which advances the date by a certain number of days, or
15931an HMS form, which advances the date by a certain amount of time.
15932Subtracting two date forms yields the number of days between them.
15933Adding two date forms is meaningless, but Calc interprets it as the
15934subtraction of one date form and the negative of the other. (The
15935negative of a date form can be understood by remembering that dates
15936are stored as the number of days before or after Jan 1, 1 AD.)
15937
15938If both arguments of @kbd{+} are error forms, the result is an error form
15939with an appropriately computed standard deviation. If one argument is an
15940error form and the other is a number, the number is taken to have zero error.
15941Error forms may have symbolic formulas as their mean and/or error parts;
15942adding these will produce a symbolic error form result. However, adding an
15943error form to a plain symbolic formula (as in @samp{(a +/- b) + c}) will not
15944work, for the same reasons just mentioned for vectors. Instead you must
15945write @samp{(a +/- b) + (c +/- 0)}.
15946
15947If both arguments of @kbd{+} are modulo forms with equal values of @cite{M},
15948or if one argument is a modulo form and the other a plain number, the
15949result is a modulo form which represents the sum, modulo @cite{M}, of
15950the two values.
15951
15952If both arguments of @kbd{+} are intervals, the result is an interval
15953which describes all possible sums of the possible input values. If
15954one argument is a plain number, it is treated as the interval
15955@w{@samp{[x ..@: x]}}.
15956
15957If one argument of @kbd{+} is an infinity and the other is not, the
15958result is that same infinity. If both arguments are infinite and in
15959the same direction, the result is the same infinity, but if they are
15960infinite in different directions the result is @code{nan}.
15961
15962@kindex -
15963@pindex calc-minus
5d67986c
RS
15964@ignore
15965@mindex @null
15966@end ignore
d7b8e6c6
EZ
15967@tindex -
15968The @kbd{-} (@code{calc-minus}) command subtracts two values. The top
15969number on the stack is subtracted from the one behind it, so that the
15970computation @kbd{5 @key{RET} 2 -} produces 3, not @i{-3}. All options
15971available for @kbd{+} are available for @kbd{-} as well.
15972
15973@kindex *
15974@pindex calc-times
5d67986c
RS
15975@ignore
15976@mindex @null
15977@end ignore
d7b8e6c6
EZ
15978@tindex *
15979The @kbd{*} (@code{calc-times}) command multiplies two numbers. If one
15980argument is a vector and the other a scalar, the scalar is multiplied by
15981the elements of the vector to produce a new vector. If both arguments
15982are vectors, the interpretation depends on the dimensions of the
15983vectors: If both arguments are matrices, a matrix multiplication is
15984done. If one argument is a matrix and the other a plain vector, the
15985vector is interpreted as a row vector or column vector, whichever is
15986dimensionally correct. If both arguments are plain vectors, the result
15987is a single scalar number which is the dot product of the two vectors.
15988
15989If one argument of @kbd{*} is an HMS form and the other a number, the
15990HMS form is multiplied by that amount. It is an error to multiply two
15991HMS forms together, or to attempt any multiplication involving date
15992forms. Error forms, modulo forms, and intervals can be multiplied;
15993see the comments for addition of those forms. When two error forms
15994or intervals are multiplied they are considered to be statistically
15995independent; thus, @samp{[-2 ..@: 3] * [-2 ..@: 3]} is @samp{[-6 ..@: 9]},
15996whereas @w{@samp{[-2 ..@: 3] ^ 2}} is @samp{[0 ..@: 9]}.
15997
15998@kindex /
15999@pindex calc-divide
5d67986c
RS
16000@ignore
16001@mindex @null
16002@end ignore
d7b8e6c6
EZ
16003@tindex /
16004The @kbd{/} (@code{calc-divide}) command divides two numbers. When
16005dividing a scalar @cite{B} by a square matrix @cite{A}, the computation
16006performed is @cite{B} times the inverse of @cite{A}. This also occurs
16007if @cite{B} is itself a vector or matrix, in which case the effect is
16008to solve the set of linear equations represented by @cite{B}. If @cite{B}
16009is a matrix with the same number of rows as @cite{A}, or a plain vector
16010(which is interpreted here as a column vector), then the equation
16011@cite{A X = B} is solved for the vector or matrix @cite{X}. Otherwise,
16012if @cite{B} is a non-square matrix with the same number of @emph{columns}
16013as @cite{A}, the equation @cite{X A = B} is solved. If you wish a vector
16014@cite{B} to be interpreted as a row vector to be solved as @cite{X A = B},
16015make it into a one-row matrix with @kbd{C-u 1 v p} first. To force a
16016left-handed solution with a square matrix @cite{B}, transpose @cite{A} and
16017@cite{B} before dividing, then transpose the result.
16018
16019HMS forms can be divided by real numbers or by other HMS forms. Error
16020forms can be divided in any combination of ways. Modulo forms where both
16021values and the modulo are integers can be divided to get an integer modulo
16022form result. Intervals can be divided; dividing by an interval that
16023encompasses zero or has zero as a limit will result in an infinite
16024interval.
16025
16026@kindex ^
16027@pindex calc-power
5d67986c
RS
16028@ignore
16029@mindex @null
16030@end ignore
d7b8e6c6
EZ
16031@tindex ^
16032The @kbd{^} (@code{calc-power}) command raises a number to a power. If
16033the power is an integer, an exact result is computed using repeated
16034multiplications. For non-integer powers, Calc uses Newton's method or
16035logarithms and exponentials. Square matrices can be raised to integer
16036powers. If either argument is an error (or interval or modulo) form,
16037the result is also an error (or interval or modulo) form.
16038
16039@kindex I ^
16040@tindex nroot
16041If you press the @kbd{I} (inverse) key first, the @kbd{I ^} command
5d67986c
RS
16042computes an Nth root: @kbd{125 @key{RET} 3 I ^} computes the number 5.
16043(This is entirely equivalent to @kbd{125 @key{RET} 1:3 ^}.)
d7b8e6c6
EZ
16044
16045@kindex \
16046@pindex calc-idiv
16047@tindex idiv
5d67986c
RS
16048@ignore
16049@mindex @null
16050@end ignore
d7b8e6c6
EZ
16051@tindex \
16052The @kbd{\} (@code{calc-idiv}) command divides two numbers on the stack
16053to produce an integer result. It is equivalent to dividing with
16054@key{/}, then rounding down with @kbd{F} (@code{calc-floor}), only a bit
16055more convenient and efficient. Also, since it is an all-integer
16056operation when the arguments are integers, it avoids problems that
16057@kbd{/ F} would have with floating-point roundoff.
16058
16059@kindex %
16060@pindex calc-mod
5d67986c
RS
16061@ignore
16062@mindex @null
16063@end ignore
d7b8e6c6
EZ
16064@tindex %
16065The @kbd{%} (@code{calc-mod}) command performs a ``modulo'' (or ``remainder'')
16066operation. Mathematically, @samp{a%b = a - (a\b)*b}, and is defined
16067for all real numbers @cite{a} and @cite{b} (except @cite{b=0}). For
16068positive @cite{b}, the result will always be between 0 (inclusive) and
16069@cite{b} (exclusive). Modulo does not work for HMS forms and error forms.
16070If @cite{a} is a modulo form, its modulo is changed to @cite{b}, which
16071must be positive real number.
16072
16073@kindex :
16074@pindex calc-fdiv
16075@tindex fdiv
16076The @kbd{:} (@code{calc-fdiv}) command [@code{fdiv} function in a formula]
16077divides the two integers on the top of the stack to produce a fractional
16078result. This is a convenient shorthand for enabling Fraction Mode (with
16079@kbd{m f}) temporarily and using @samp{/}. Note that during numeric entry
16080the @kbd{:} key is interpreted as a fraction separator, so to divide 8 by 6
16081you would have to type @kbd{8 @key{RET} 6 @key{RET} :}. (Of course, in
16082this case, it would be much easier simply to enter the fraction directly
16083as @kbd{8:6 @key{RET}}!)
16084
16085@kindex n
16086@pindex calc-change-sign
16087The @kbd{n} (@code{calc-change-sign}) command negates the number on the top
16088of the stack. It works on numbers, vectors and matrices, HMS forms, date
16089forms, error forms, intervals, and modulo forms.
16090
16091@kindex A
16092@pindex calc-abs
16093@tindex abs
16094The @kbd{A} (@code{calc-abs}) [@code{abs}] command computes the absolute
16095value of a number. The result of @code{abs} is always a nonnegative
16096real number: With a complex argument, it computes the complex magnitude.
16097With a vector or matrix argument, it computes the Frobenius norm, i.e.,
16098the square root of the sum of the squares of the absolute values of the
16099elements. The absolute value of an error form is defined by replacing
16100the mean part with its absolute value and leaving the error part the same.
16101The absolute value of a modulo form is undefined. The absolute value of
16102an interval is defined in the obvious way.
16103
16104@kindex f A
16105@pindex calc-abssqr
16106@tindex abssqr
16107The @kbd{f A} (@code{calc-abssqr}) [@code{abssqr}] command computes the
16108absolute value squared of a number, vector or matrix, or error form.
16109
16110@kindex f s
16111@pindex calc-sign
16112@tindex sign
16113The @kbd{f s} (@code{calc-sign}) [@code{sign}] command returns 1 if its
16114argument is positive, @i{-1} if its argument is negative, or 0 if its
16115argument is zero. In algebraic form, you can also write @samp{sign(a,x)}
16116which evaluates to @samp{x * sign(a)}, i.e., either @samp{x}, @samp{-x}, or
16117zero depending on the sign of @samp{a}.
16118
16119@kindex &
16120@pindex calc-inv
16121@tindex inv
16122@cindex Reciprocal
16123The @kbd{&} (@code{calc-inv}) [@code{inv}] command computes the
16124reciprocal of a number, i.e., @cite{1 / x}. Operating on a square
16125matrix, it computes the inverse of that matrix.
16126
16127@kindex Q
16128@pindex calc-sqrt
16129@tindex sqrt
16130The @kbd{Q} (@code{calc-sqrt}) [@code{sqrt}] command computes the square
16131root of a number. For a negative real argument, the result will be a
16132complex number whose form is determined by the current Polar Mode.
16133
16134@kindex f h
16135@pindex calc-hypot
16136@tindex hypot
16137The @kbd{f h} (@code{calc-hypot}) [@code{hypot}] command computes the square
16138root of the sum of the squares of two numbers. That is, @samp{hypot(a,b)}
16139is the length of the hypotenuse of a right triangle with sides @cite{a}
16140and @cite{b}. If the arguments are complex numbers, their squared
16141magnitudes are used.
16142
16143@kindex f Q
16144@pindex calc-isqrt
16145@tindex isqrt
16146The @kbd{f Q} (@code{calc-isqrt}) [@code{isqrt}] command computes the
16147integer square root of an integer. This is the true square root of the
16148number, rounded down to an integer. For example, @samp{isqrt(10)}
16149produces 3. Note that, like @kbd{\} [@code{idiv}], this uses exact
16150integer arithmetic throughout to avoid roundoff problems. If the input
16151is a floating-point number or other non-integer value, this is exactly
16152the same as @samp{floor(sqrt(x))}.
16153
16154@kindex f n
16155@kindex f x
16156@pindex calc-min
16157@tindex min
16158@pindex calc-max
16159@tindex max
16160The @kbd{f n} (@code{calc-min}) [@code{min}] and @kbd{f x} (@code{calc-max})
16161[@code{max}] commands take the minimum or maximum of two real numbers,
16162respectively. These commands also work on HMS forms, date forms,
16163intervals, and infinities. (In algebraic expressions, these functions
16164take any number of arguments and return the maximum or minimum among
16165all the arguments.)@refill
16166
16167@kindex f M
16168@kindex f X
16169@pindex calc-mant-part
16170@tindex mant
16171@pindex calc-xpon-part
16172@tindex xpon
16173The @kbd{f M} (@code{calc-mant-part}) [@code{mant}] function extracts
16174the ``mantissa'' part @cite{m} of its floating-point argument; @kbd{f X}
16175(@code{calc-xpon-part}) [@code{xpon}] extracts the ``exponent'' part
16176@cite{e}. The original number is equal to @c{$m \times 10^e$}
16177@cite{m * 10^e},
16178where @cite{m} is in the interval @samp{[1.0 ..@: 10.0)} except that
16179@cite{m=e=0} if the original number is zero. For integers
16180and fractions, @code{mant} returns the number unchanged and @code{xpon}
16181returns zero. The @kbd{v u} (@code{calc-unpack}) command can also be
16182used to ``unpack'' a floating-point number; this produces an integer
16183mantissa and exponent, with the constraint that the mantissa is not
16184a multiple of ten (again except for the @cite{m=e=0} case).@refill
16185
16186@kindex f S
16187@pindex calc-scale-float
16188@tindex scf
16189The @kbd{f S} (@code{calc-scale-float}) [@code{scf}] function scales a number
16190by a given power of ten. Thus, @samp{scf(mant(x), xpon(x)) = x} for any
16191real @samp{x}. The second argument must be an integer, but the first
16192may actually be any numeric value. For example, @samp{scf(5,-2) = 0.05}
16193or @samp{1:20} depending on the current Fraction Mode.@refill
16194
16195@kindex f [
16196@kindex f ]
16197@pindex calc-decrement
16198@pindex calc-increment
16199@tindex decr
16200@tindex incr
16201The @kbd{f [} (@code{calc-decrement}) [@code{decr}] and @kbd{f ]}
16202(@code{calc-increment}) [@code{incr}] functions decrease or increase
16203a number by one unit. For integers, the effect is obvious. For
16204floating-point numbers, the change is by one unit in the last place.
16205For example, incrementing @samp{12.3456} when the current precision
16206is 6 digits yields @samp{12.3457}. If the current precision had been
162078 digits, the result would have been @samp{12.345601}. Incrementing
16208@samp{0.0} produces @c{$10^{-p}$}
16209@cite{10^-p}, where @cite{p} is the current
16210precision. These operations are defined only on integers and floats.
16211With numeric prefix arguments, they change the number by @cite{n} units.
16212
16213Note that incrementing followed by decrementing, or vice-versa, will
16214almost but not quite always cancel out. Suppose the precision is
162156 digits and the number @samp{9.99999} is on the stack. Incrementing
16216will produce @samp{10.0000}; decrementing will produce @samp{9.9999}.
16217One digit has been dropped. This is an unavoidable consequence of the
16218way floating-point numbers work.
16219
16220Incrementing a date/time form adjusts it by a certain number of seconds.
16221Incrementing a pure date form adjusts it by a certain number of days.
16222
16223@node Integer Truncation, Complex Number Functions, Basic Arithmetic, Arithmetic
16224@section Integer Truncation
16225
16226@noindent
16227There are four commands for truncating a real number to an integer,
16228differing mainly in their treatment of negative numbers. All of these
16229commands have the property that if the argument is an integer, the result
16230is the same integer. An integer-valued floating-point argument is converted
16231to integer form.
16232
16233If you press @kbd{H} (@code{calc-hyperbolic}) first, the result will be
16234expressed as an integer-valued floating-point number.
16235
16236@cindex Integer part of a number
16237@kindex F
16238@pindex calc-floor
16239@tindex floor
16240@tindex ffloor
5d67986c
RS
16241@ignore
16242@mindex @null
16243@end ignore
d7b8e6c6
EZ
16244@kindex H F
16245The @kbd{F} (@code{calc-floor}) [@code{floor} or @code{ffloor}] command
16246truncates a real number to the next lower integer, i.e., toward minus
16247infinity. Thus @kbd{3.6 F} produces 3, but @kbd{_3.6 F} produces
16248@i{-4}.@refill
16249
16250@kindex I F
16251@pindex calc-ceiling
16252@tindex ceil
16253@tindex fceil
5d67986c
RS
16254@ignore
16255@mindex @null
16256@end ignore
d7b8e6c6
EZ
16257@kindex H I F
16258The @kbd{I F} (@code{calc-ceiling}) [@code{ceil} or @code{fceil}]
16259command truncates toward positive infinity. Thus @kbd{3.6 I F} produces
162604, and @kbd{_3.6 I F} produces @i{-3}.@refill
16261
16262@kindex R
16263@pindex calc-round
16264@tindex round
16265@tindex fround
5d67986c
RS
16266@ignore
16267@mindex @null
16268@end ignore
d7b8e6c6
EZ
16269@kindex H R
16270The @kbd{R} (@code{calc-round}) [@code{round} or @code{fround}] command
16271rounds to the nearest integer. When the fractional part is .5 exactly,
16272this command rounds away from zero. (All other rounding in the
16273Calculator uses this convention as well.) Thus @kbd{3.5 R} produces 4
16274but @kbd{3.4 R} produces 3; @kbd{_3.5 R} produces @i{-4}.@refill
16275
16276@kindex I R
16277@pindex calc-trunc
16278@tindex trunc
16279@tindex ftrunc
5d67986c
RS
16280@ignore
16281@mindex @null
16282@end ignore
d7b8e6c6
EZ
16283@kindex H I R
16284The @kbd{I R} (@code{calc-trunc}) [@code{trunc} or @code{ftrunc}]
16285command truncates toward zero. In other words, it ``chops off''
16286everything after the decimal point. Thus @kbd{3.6 I R} produces 3 and
16287@kbd{_3.6 I R} produces @i{-3}.@refill
16288
16289These functions may not be applied meaningfully to error forms, but they
16290do work for intervals. As a convenience, applying @code{floor} to a
16291modulo form floors the value part of the form. Applied to a vector,
16292these functions operate on all elements of the vector one by one.
16293Applied to a date form, they operate on the internal numerical
16294representation of dates, converting a date/time form into a pure date.
16295
5d67986c
RS
16296@ignore
16297@starindex
16298@end ignore
d7b8e6c6 16299@tindex rounde
5d67986c
RS
16300@ignore
16301@starindex
16302@end ignore
d7b8e6c6 16303@tindex roundu
5d67986c
RS
16304@ignore
16305@starindex
16306@end ignore
d7b8e6c6 16307@tindex frounde
5d67986c
RS
16308@ignore
16309@starindex
16310@end ignore
d7b8e6c6
EZ
16311@tindex froundu
16312There are two more rounding functions which can only be entered in
16313algebraic notation. The @code{roundu} function is like @code{round}
16314except that it rounds up, toward plus infinity, when the fractional
16315part is .5. This distinction matters only for negative arguments.
16316Also, @code{rounde} rounds to an even number in the case of a tie,
16317rounding up or down as necessary. For example, @samp{rounde(3.5)} and
16318@samp{rounde(4.5)} both return 4, but @samp{rounde(5.5)} returns 6.
16319The advantage of round-to-even is that the net error due to rounding
16320after a long calculation tends to cancel out to zero. An important
16321subtle point here is that the number being fed to @code{rounde} will
16322already have been rounded to the current precision before @code{rounde}
16323begins. For example, @samp{rounde(2.500001)} with a current precision
16324of 6 will incorrectly, or at least surprisingly, yield 2 because the
16325argument will first have been rounded down to @cite{2.5} (which
16326@code{rounde} sees as an exact tie between 2 and 3).
16327
16328Each of these functions, when written in algebraic formulas, allows
16329a second argument which specifies the number of digits after the
16330decimal point to keep. For example, @samp{round(123.4567, 2)} will
16331produce the answer 123.46, and @samp{round(123.4567, -1)} will
16332produce 120 (i.e., the cutoff is one digit to the @emph{left} of
16333the decimal point). A second argument of zero is equivalent to
16334no second argument at all.
16335
16336@cindex Fractional part of a number
16337To compute the fractional part of a number (i.e., the amount which, when
5d67986c 16338added to `@t{floor(}@var{n}@t{)}', will produce @var{n}) just take @var{n}
d7b8e6c6
EZ
16339modulo 1 using the @code{%} command.@refill
16340
16341Note also the @kbd{\} (integer quotient), @kbd{f I} (integer logarithm),
16342and @kbd{f Q} (integer square root) commands, which are analogous to
16343@kbd{/}, @kbd{B}, and @kbd{Q}, respectively, except that they take integer
16344arguments and return the result rounded down to an integer.
16345
16346@node Complex Number Functions, Conversions, Integer Truncation, Arithmetic
16347@section Complex Number Functions
16348
16349@noindent
16350@kindex J
16351@pindex calc-conj
16352@tindex conj
16353The @kbd{J} (@code{calc-conj}) [@code{conj}] command computes the
16354complex conjugate of a number. For complex number @cite{a+bi}, the
16355complex conjugate is @cite{a-bi}. If the argument is a real number,
16356this command leaves it the same. If the argument is a vector or matrix,
16357this command replaces each element by its complex conjugate.
16358
16359@kindex G
16360@pindex calc-argument
16361@tindex arg
16362The @kbd{G} (@code{calc-argument}) [@code{arg}] command computes the
16363``argument'' or polar angle of a complex number. For a number in polar
16364notation, this is simply the second component of the pair
5d67986c
RS
16365`@t{(}@var{r}@t{;}@c{$\theta$}
16366@var{theta}@t{)}'.
d7b8e6c6
EZ
16367The result is expressed according to the current angular mode and will
16368be in the range @i{-180} degrees (exclusive) to @i{+180} degrees
16369(inclusive), or the equivalent range in radians.@refill
16370
16371@pindex calc-imaginary
16372The @code{calc-imaginary} command multiplies the number on the
16373top of the stack by the imaginary number @cite{i = (0,1)}. This
16374command is not normally bound to a key in Calc, but it is available
16375on the @key{IMAG} button in Keypad Mode.
16376
16377@kindex f r
16378@pindex calc-re
16379@tindex re
16380The @kbd{f r} (@code{calc-re}) [@code{re}] command replaces a complex number
16381by its real part. This command has no effect on real numbers. (As an
16382added convenience, @code{re} applied to a modulo form extracts
16383the value part.)@refill
16384
16385@kindex f i
16386@pindex calc-im
16387@tindex im
16388The @kbd{f i} (@code{calc-im}) [@code{im}] command replaces a complex number
16389by its imaginary part; real numbers are converted to zero. With a vector
16390or matrix argument, these functions operate element-wise.@refill
16391
5d67986c
RS
16392@ignore
16393@mindex v p
16394@end ignore
d7b8e6c6
EZ
16395@kindex v p (complex)
16396@pindex calc-pack
16397The @kbd{v p} (@code{calc-pack}) command can pack the top two numbers on
16398the the stack into a composite object such as a complex number. With
16399a prefix argument of @i{-1}, it produces a rectangular complex number;
16400with an argument of @i{-2}, it produces a polar complex number.
16401(Also, @pxref{Building Vectors}.)
16402
5d67986c
RS
16403@ignore
16404@mindex v u
16405@end ignore
d7b8e6c6
EZ
16406@kindex v u (complex)
16407@pindex calc-unpack
16408The @kbd{v u} (@code{calc-unpack}) command takes the complex number
16409(or other composite object) on the top of the stack and unpacks it
16410into its separate components.
16411
16412@node Conversions, Date Arithmetic, Complex Number Functions, Arithmetic
16413@section Conversions
16414
16415@noindent
16416The commands described in this section convert numbers from one form
16417to another; they are two-key sequences beginning with the letter @kbd{c}.
16418
16419@kindex c f
16420@pindex calc-float
16421@tindex pfloat
16422The @kbd{c f} (@code{calc-float}) [@code{pfloat}] command converts the
16423number on the top of the stack to floating-point form. For example,
16424@cite{23} is converted to @cite{23.0}, @cite{3:2} is converted to
16425@cite{1.5}, and @cite{2.3} is left the same. If the value is a composite
16426object such as a complex number or vector, each of the components is
16427converted to floating-point. If the value is a formula, all numbers
16428in the formula are converted to floating-point. Note that depending
16429on the current floating-point precision, conversion to floating-point
16430format may lose information.@refill
16431
16432As a special exception, integers which appear as powers or subscripts
16433are not floated by @kbd{c f}. If you really want to float a power,
16434you can use a @kbd{j s} command to select the power followed by @kbd{c f}.
16435Because @kbd{c f} cannot examine the formula outside of the selection,
16436it does not notice that the thing being floated is a power.
16437@xref{Selecting Subformulas}.
16438
16439The normal @kbd{c f} command is ``pervasive'' in the sense that it
16440applies to all numbers throughout the formula. The @code{pfloat}
16441algebraic function never stays around in a formula; @samp{pfloat(a + 1)}
16442changes to @samp{a + 1.0} as soon as it is evaluated.
16443
16444@kindex H c f
16445@tindex float
16446With the Hyperbolic flag, @kbd{H c f} [@code{float}] operates
16447only on the number or vector of numbers at the top level of its
16448argument. Thus, @samp{float(1)} is 1.0, but @samp{float(a + 1)}
16449is left unevaluated because its argument is not a number.
16450
16451You should use @kbd{H c f} if you wish to guarantee that the final
16452value, once all the variables have been assigned, is a float; you
16453would use @kbd{c f} if you wish to do the conversion on the numbers
16454that appear right now.
16455
16456@kindex c F
16457@pindex calc-fraction
16458@tindex pfrac
16459The @kbd{c F} (@code{calc-fraction}) [@code{pfrac}] command converts a
16460floating-point number into a fractional approximation. By default, it
16461produces a fraction whose decimal representation is the same as the
16462input number, to within the current precision. You can also give a
16463numeric prefix argument to specify a tolerance, either directly, or,
16464if the prefix argument is zero, by using the number on top of the stack
16465as the tolerance. If the tolerance is a positive integer, the fraction
16466is correct to within that many significant figures. If the tolerance is
16467a non-positive integer, it specifies how many digits fewer than the current
16468precision to use. If the tolerance is a floating-point number, the
16469fraction is correct to within that absolute amount.
16470
16471@kindex H c F
16472@tindex frac
16473The @code{pfrac} function is pervasive, like @code{pfloat}.
16474There is also a non-pervasive version, @kbd{H c F} [@code{frac}],
16475which is analogous to @kbd{H c f} discussed above.
16476
16477@kindex c d
16478@pindex calc-to-degrees
16479@tindex deg
16480The @kbd{c d} (@code{calc-to-degrees}) [@code{deg}] command converts a
16481number into degrees form. The value on the top of the stack may be an
16482HMS form (interpreted as degrees-minutes-seconds), or a real number which
16483will be interpreted in radians regardless of the current angular mode.@refill
16484
16485@kindex c r
16486@pindex calc-to-radians
16487@tindex rad
16488The @kbd{c r} (@code{calc-to-radians}) [@code{rad}] command converts an
16489HMS form or angle in degrees into an angle in radians.
16490
16491@kindex c h
16492@pindex calc-to-hms
16493@tindex hms
16494The @kbd{c h} (@code{calc-to-hms}) [@code{hms}] command converts a real
16495number, interpreted according to the current angular mode, to an HMS
16496form describing the same angle. In algebraic notation, the @code{hms}
16497function also accepts three arguments: @samp{hms(@var{h}, @var{m}, @var{s})}.
16498(The three-argument version is independent of the current angular mode.)
16499
16500@pindex calc-from-hms
16501The @code{calc-from-hms} command converts the HMS form on the top of the
16502stack into a real number according to the current angular mode.
16503
16504@kindex c p
16505@kindex I c p
16506@pindex calc-polar
16507@tindex polar
16508@tindex rect
16509The @kbd{c p} (@code{calc-polar}) command converts the complex number on
16510the top of the stack from polar to rectangular form, or from rectangular
16511to polar form, whichever is appropriate. Real numbers are left the same.
16512This command is equivalent to the @code{rect} or @code{polar}
16513functions in algebraic formulas, depending on the direction of
16514conversion. (It uses @code{polar}, except that if the argument is
16515already a polar complex number, it uses @code{rect} instead. The
16516@kbd{I c p} command always uses @code{rect}.)@refill
16517
16518@kindex c c
16519@pindex calc-clean
16520@tindex pclean
16521The @kbd{c c} (@code{calc-clean}) [@code{pclean}] command ``cleans'' the
16522number on the top of the stack. Floating point numbers are re-rounded
16523according to the current precision. Polar numbers whose angular
16524components have strayed from the @i{-180} to @i{+180} degree range
16525are normalized. (Note that results will be undesirable if the current
16526angular mode is different from the one under which the number was
16527produced!) Integers and fractions are generally unaffected by this
16528operation. Vectors and formulas are cleaned by cleaning each component
16529number (i.e., pervasively).@refill
16530
16531If the simplification mode is set below the default level, it is raised
16532to the default level for the purposes of this command. Thus, @kbd{c c}
16533applies the default simplifications even if their automatic application
16534is disabled. @xref{Simplification Modes}.
16535
16536@cindex Roundoff errors, correcting
16537A numeric prefix argument to @kbd{c c} sets the floating-point precision
16538to that value for the duration of the command. A positive prefix (of at
16539least 3) sets the precision to the specified value; a negative or zero
16540prefix decreases the precision by the specified amount.
16541
16542@kindex c 0-9
16543@pindex calc-clean-num
16544The keystroke sequences @kbd{c 0} through @kbd{c 9} are equivalent
16545to @kbd{c c} with the corresponding negative prefix argument. If roundoff
16546errors have changed 2.0 into 1.999999, typing @kbd{c 1} to clip off one
16547decimal place often conveniently does the trick.
16548
16549The @kbd{c c} command with a numeric prefix argument, and the @kbd{c 0}
16550through @kbd{c 9} commands, also ``clip'' very small floating-point
16551numbers to zero. If the exponent is less than or equal to the negative
16552of the specified precision, the number is changed to 0.0. For example,
16553if the current precision is 12, then @kbd{c 2} changes the vector
16554@samp{[1e-8, 1e-9, 1e-10, 1e-11]} to @samp{[1e-8, 1e-9, 0, 0]}.
16555Numbers this small generally arise from roundoff noise.
16556
16557If the numbers you are using really are legitimately this small,
16558you should avoid using the @kbd{c 0} through @kbd{c 9} commands.
16559(The plain @kbd{c c} command rounds to the current precision but
16560does not clip small numbers.)
16561
16562One more property of @kbd{c 0} through @kbd{c 9}, and of @kbd{c c} with
16563a prefix argument, is that integer-valued floats are converted to
16564plain integers, so that @kbd{c 1} on @samp{[1., 1.5, 2., 2.5, 3.]}
16565produces @samp{[1, 1.5, 2, 2.5, 3]}. This is not done for huge
16566numbers (@samp{1e100} is technically an integer-valued float, but
16567you wouldn't want it automatically converted to a 100-digit integer).
16568
16569@kindex H c 0-9
16570@kindex H c c
16571@tindex clean
16572With the Hyperbolic flag, @kbd{H c c} and @kbd{H c 0} through @kbd{H c 9}
16573operate non-pervasively [@code{clean}].
16574
16575@node Date Arithmetic, Financial Functions, Conversions, Arithmetic
16576@section Date Arithmetic
16577
16578@noindent
16579@cindex Date arithmetic, additional functions
16580The commands described in this section perform various conversions
16581and calculations involving date forms (@pxref{Date Forms}). They
16582use the @kbd{t} (for time/date) prefix key followed by shifted
16583letters.
16584
16585The simplest date arithmetic is done using the regular @kbd{+} and @kbd{-}
16586commands. In particular, adding a number to a date form advances the
16587date form by a certain number of days; adding an HMS form to a date
16588form advances the date by a certain amount of time; and subtracting two
16589date forms produces a difference measured in days. The commands
16590described here provide additional, more specialized operations on dates.
16591
16592Many of these commands accept a numeric prefix argument; if you give
16593plain @kbd{C-u} as the prefix, these commands will instead take the
16594additional argument from the top of the stack.
16595
16596@menu
16597* Date Conversions::
16598* Date Functions::
16599* Time Zones::
16600* Business Days::
16601@end menu
16602
16603@node Date Conversions, Date Functions, Date Arithmetic, Date Arithmetic
16604@subsection Date Conversions
16605
16606@noindent
16607@kindex t D
16608@pindex calc-date
16609@tindex date
16610The @kbd{t D} (@code{calc-date}) [@code{date}] command converts a
16611date form into a number, measured in days since Jan 1, 1 AD. The
16612result will be an integer if @var{date} is a pure date form, or a
16613fraction or float if @var{date} is a date/time form. Or, if its
16614argument is a number, it converts this number into a date form.
16615
16616With a numeric prefix argument, @kbd{t D} takes that many objects
16617(up to six) from the top of the stack and interprets them in one
16618of the following ways:
16619
16620The @samp{date(@var{year}, @var{month}, @var{day})} function
16621builds a pure date form out of the specified year, month, and
16622day, which must all be integers. @var{Year} is a year number,
16623such as 1991 (@emph{not} the same as 91!). @var{Month} must be
16624an integer in the range 1 to 12; @var{day} must be in the range
166251 to 31. If the specified month has fewer than 31 days and
16626@var{day} is too large, the equivalent day in the following
16627month will be used.
16628
16629The @samp{date(@var{month}, @var{day})} function builds a
16630pure date form using the current year, as determined by the
16631real-time clock.
16632
16633The @samp{date(@var{year}, @var{month}, @var{day}, @var{hms})}
16634function builds a date/time form using an @var{hms} form.
16635
16636The @samp{date(@var{year}, @var{month}, @var{day}, @var{hour},
16637@var{minute}, @var{second})} function builds a date/time form.
16638@var{hour} should be an integer in the range 0 to 23;
16639@var{minute} should be an integer in the range 0 to 59;
16640@var{second} should be any real number in the range @samp{[0 .. 60)}.
16641The last two arguments default to zero if omitted.
16642
16643@kindex t J
16644@pindex calc-julian
16645@tindex julian
16646@cindex Julian day counts, conversions
16647The @kbd{t J} (@code{calc-julian}) [@code{julian}] command converts
16648a date form into a Julian day count, which is the number of days
16649since noon on Jan 1, 4713 BC. A pure date is converted to an integer
16650Julian count representing noon of that day. A date/time form is
16651converted to an exact floating-point Julian count, adjusted to
16652interpret the date form in the current time zone but the Julian
16653day count in Greenwich Mean Time. A numeric prefix argument allows
16654you to specify the time zone; @pxref{Time Zones}. Use a prefix of
16655zero to suppress the time zone adjustment. Note that pure date forms
16656are never time-zone adjusted.
16657
16658This command can also do the opposite conversion, from a Julian day
16659count (either an integer day, or a floating-point day and time in
16660the GMT zone), into a pure date form or a date/time form in the
16661current or specified time zone.
16662
16663@kindex t U
16664@pindex calc-unix-time
16665@tindex unixtime
16666@cindex Unix time format, conversions
16667The @kbd{t U} (@code{calc-unix-time}) [@code{unixtime}] command
16668converts a date form into a Unix time value, which is the number of
16669seconds since midnight on Jan 1, 1970, or vice-versa. The numeric result
16670will be an integer if the current precision is 12 or less; for higher
5d67986c 16671precisions, the result may be a float with (@var{precision}@minus{}12)
d7b8e6c6
EZ
16672digits after the decimal. Just as for @kbd{t J}, the numeric time
16673is interpreted in the GMT time zone and the date form is interpreted
16674in the current or specified zone. Some systems use Unix-like
16675numbering but with the local time zone; give a prefix of zero to
16676suppress the adjustment if so.
16677
16678@kindex t C
16679@pindex calc-convert-time-zones
16680@tindex tzconv
16681@cindex Time Zones, converting between
16682The @kbd{t C} (@code{calc-convert-time-zones}) [@code{tzconv}]
16683command converts a date form from one time zone to another. You
16684are prompted for each time zone name in turn; you can answer with
16685any suitable Calc time zone expression (@pxref{Time Zones}).
16686If you answer either prompt with a blank line, the local time
16687zone is used for that prompt. You can also answer the first
16688prompt with @kbd{$} to take the two time zone names from the
16689stack (and the date to be converted from the third stack level).
16690
16691@node Date Functions, Business Days, Date Conversions, Date Arithmetic
16692@subsection Date Functions
16693
16694@noindent
16695@kindex t N
16696@pindex calc-now
16697@tindex now
16698The @kbd{t N} (@code{calc-now}) [@code{now}] command pushes the
16699current date and time on the stack as a date form. The time is
16700reported in terms of the specified time zone; with no numeric prefix
16701argument, @kbd{t N} reports for the current time zone.
16702
16703@kindex t P
16704@pindex calc-date-part
16705The @kbd{t P} (@code{calc-date-part}) command extracts one part
16706of a date form. The prefix argument specifies the part; with no
16707argument, this command prompts for a part code from 1 to 9.
16708The various part codes are described in the following paragraphs.
16709
16710@tindex year
16711The @kbd{M-1 t P} [@code{year}] function extracts the year number
16712from a date form as an integer, e.g., 1991. This and the
16713following functions will also accept a real number for an
16714argument, which is interpreted as a standard Calc day number.
16715Note that this function will never return zero, since the year
167161 BC immediately precedes the year 1 AD.
16717
16718@tindex month
16719The @kbd{M-2 t P} [@code{month}] function extracts the month number
16720from a date form as an integer in the range 1 to 12.
16721
16722@tindex day
16723The @kbd{M-3 t P} [@code{day}] function extracts the day number
16724from a date form as an integer in the range 1 to 31.
16725
16726@tindex hour
16727The @kbd{M-4 t P} [@code{hour}] function extracts the hour from
16728a date form as an integer in the range 0 (midnight) to 23. Note
16729that 24-hour time is always used. This returns zero for a pure
16730date form. This function (and the following two) also accept
16731HMS forms as input.
16732
16733@tindex minute
16734The @kbd{M-5 t P} [@code{minute}] function extracts the minute
16735from a date form as an integer in the range 0 to 59.
16736
16737@tindex second
16738The @kbd{M-6 t P} [@code{second}] function extracts the second
16739from a date form. If the current precision is 12 or less,
16740the result is an integer in the range 0 to 59. For higher
16741precisions, the result may instead be a floating-point number.
16742
16743@tindex weekday
16744The @kbd{M-7 t P} [@code{weekday}] function extracts the weekday
16745number from a date form as an integer in the range 0 (Sunday)
16746to 6 (Saturday).
16747
16748@tindex yearday
16749The @kbd{M-8 t P} [@code{yearday}] function extracts the day-of-year
16750number from a date form as an integer in the range 1 (January 1)
16751to 366 (December 31 of a leap year).
16752
16753@tindex time
16754The @kbd{M-9 t P} [@code{time}] function extracts the time portion
16755of a date form as an HMS form. This returns @samp{0@@ 0' 0"}
16756for a pure date form.
16757
16758@kindex t M
16759@pindex calc-new-month
16760@tindex newmonth
16761The @kbd{t M} (@code{calc-new-month}) [@code{newmonth}] command
16762computes a new date form that represents the first day of the month
16763specified by the input date. The result is always a pure date
16764form; only the year and month numbers of the input are retained.
16765With a numeric prefix argument @var{n} in the range from 1 to 31,
16766@kbd{t M} computes the @var{n}th day of the month. (If @var{n}
16767is greater than the actual number of days in the month, or if
16768@var{n} is zero, the last day of the month is used.)
16769
16770@kindex t Y
16771@pindex calc-new-year
16772@tindex newyear
16773The @kbd{t Y} (@code{calc-new-year}) [@code{newyear}] command
16774computes a new pure date form that represents the first day of
16775the year specified by the input. The month, day, and time
16776of the input date form are lost. With a numeric prefix argument
16777@var{n} in the range from 1 to 366, @kbd{t Y} computes the
16778@var{n}th day of the year (366 is treated as 365 in non-leap
16779years). A prefix argument of 0 computes the last day of the
16780year (December 31). A negative prefix argument from @i{-1} to
16781@i{-12} computes the first day of the @var{n}th month of the year.
16782
16783@kindex t W
16784@pindex calc-new-week
16785@tindex newweek
16786The @kbd{t W} (@code{calc-new-week}) [@code{newweek}] command
16787computes a new pure date form that represents the Sunday on or before
16788the input date. With a numeric prefix argument, it can be made to
16789use any day of the week as the starting day; the argument must be in
16790the range from 0 (Sunday) to 6 (Saturday). This function always
16791subtracts between 0 and 6 days from the input date.
16792
16793Here's an example use of @code{newweek}: Find the date of the next
16794Wednesday after a given date. Using @kbd{M-3 t W} or @samp{newweek(d, 3)}
16795will give you the @emph{preceding} Wednesday, so @samp{newweek(d+7, 3)}
16796will give you the following Wednesday. A further look at the definition
16797of @code{newweek} shows that if the input date is itself a Wednesday,
16798this formula will return the Wednesday one week in the future. An
16799exercise for the reader is to modify this formula to yield the same day
16800if the input is already a Wednesday. Another interesting exercise is
16801to preserve the time-of-day portion of the input (@code{newweek} resets
16802the time to midnight; hint:@: how can @code{newweek} be defined in terms
16803of the @code{weekday} function?).
16804
5d67986c
RS
16805@ignore
16806@starindex
16807@end ignore
d7b8e6c6
EZ
16808@tindex pwday
16809The @samp{pwday(@var{date})} function (not on any key) computes the
16810day-of-month number of the Sunday on or before @var{date}. With
16811two arguments, @samp{pwday(@var{date}, @var{day})} computes the day
16812number of the Sunday on or before day number @var{day} of the month
16813specified by @var{date}. The @var{day} must be in the range from
168147 to 31; if the day number is greater than the actual number of days
16815in the month, the true number of days is used instead. Thus
16816@samp{pwday(@var{date}, 7)} finds the first Sunday of the month, and
16817@samp{pwday(@var{date}, 31)} finds the last Sunday of the month.
16818With a third @var{weekday} argument, @code{pwday} can be made to look
16819for any day of the week instead of Sunday.
16820
16821@kindex t I
16822@pindex calc-inc-month
16823@tindex incmonth
16824The @kbd{t I} (@code{calc-inc-month}) [@code{incmonth}] command
16825increases a date form by one month, or by an arbitrary number of
16826months specified by a numeric prefix argument. The time portion,
16827if any, of the date form stays the same. The day also stays the
16828same, except that if the new month has fewer days the day
16829number may be reduced to lie in the valid range. For example,
16830@samp{incmonth(<Jan 31, 1991>)} produces @samp{<Feb 28, 1991>}.
16831Because of this, @kbd{t I t I} and @kbd{M-2 t I} do not always give
16832the same results (@samp{<Mar 28, 1991>} versus @samp{<Mar 31, 1991>}
16833in this case).
16834
5d67986c
RS
16835@ignore
16836@starindex
16837@end ignore
d7b8e6c6
EZ
16838@tindex incyear
16839The @samp{incyear(@var{date}, @var{step})} function increases
16840a date form by the specified number of years, which may be
16841any positive or negative integer. Note that @samp{incyear(d, n)}
16842is equivalent to @w{@samp{incmonth(d, 12*n)}}, but these do not have
16843simple equivalents in terms of day arithmetic because
16844months and years have varying lengths. If the @var{step}
16845argument is omitted, 1 year is assumed. There is no keyboard
16846command for this function; use @kbd{C-u 12 t I} instead.
16847
16848There is no @code{newday} function at all because @kbd{F} [@code{floor}]
16849serves this purpose. Similarly, instead of @code{incday} and
16850@code{incweek} simply use @cite{d + n} or @cite{d + 7 n}.
16851
16852@xref{Basic Arithmetic}, for the @kbd{f ]} [@code{incr}] command
16853which can adjust a date/time form by a certain number of seconds.
16854
16855@node Business Days, Time Zones, Date Functions, Date Arithmetic
16856@subsection Business Days
16857
16858@noindent
16859Often time is measured in ``business days'' or ``working days,''
16860where weekends and holidays are skipped. Calc's normal date
16861arithmetic functions use calendar days, so that subtracting two
16862consecutive Mondays will yield a difference of 7 days. By contrast,
16863subtracting two consecutive Mondays would yield 5 business days
16864(assuming two-day weekends and the absence of holidays).
16865
16866@kindex t +
16867@kindex t -
16868@tindex badd
16869@tindex bsub
16870@pindex calc-business-days-plus
16871@pindex calc-business-days-minus
16872The @kbd{t +} (@code{calc-business-days-plus}) [@code{badd}]
16873and @kbd{t -} (@code{calc-business-days-minus}) [@code{bsub}]
16874commands perform arithmetic using business days. For @kbd{t +},
16875one argument must be a date form and the other must be a real
16876number (positive or negative). If the number is not an integer,
16877then a certain amount of time is added as well as a number of
16878days; for example, adding 0.5 business days to a time in Friday
16879evening will produce a time in Monday morning. It is also
16880possible to add an HMS form; adding @samp{12@@ 0' 0"} also adds
16881half a business day. For @kbd{t -}, the arguments are either a
16882date form and a number or HMS form, or two date forms, in which
16883case the result is the number of business days between the two
16884dates.
16885
16886@cindex @code{Holidays} variable
16887@vindex Holidays
16888By default, Calc considers any day that is not a Saturday or
16889Sunday to be a business day. You can define any number of
16890additional holidays by editing the variable @code{Holidays}.
16891(There is an @w{@kbd{s H}} convenience command for editing this
16892variable.) Initially, @code{Holidays} contains the vector
16893@samp{[sat, sun]}. Entries in the @code{Holidays} vector may
16894be any of the following kinds of objects:
16895
16896@itemize @bullet
16897@item
16898Date forms (pure dates, not date/time forms). These specify
16899particular days which are to be treated as holidays.
16900
16901@item
16902Intervals of date forms. These specify a range of days, all of
16903which are holidays (e.g., Christmas week). @xref{Interval Forms}.
16904
16905@item
16906Nested vectors of date forms. Each date form in the vector is
16907considered to be a holiday.
16908
16909@item
16910Any Calc formula which evaluates to one of the above three things.
16911If the formula involves the variable @cite{y}, it stands for a
16912yearly repeating holiday; @cite{y} will take on various year
16913numbers like 1992. For example, @samp{date(y, 12, 25)} specifies
16914Christmas day, and @samp{newweek(date(y, 11, 7), 4) + 21} specifies
16915Thanksgiving (which is held on the fourth Thursday of November).
16916If the formula involves the variable @cite{m}, that variable
16917takes on month numbers from 1 to 12: @samp{date(y, m, 15)} is
16918a holiday that takes place on the 15th of every month.
16919
16920@item
16921A weekday name, such as @code{sat} or @code{sun}. This is really
16922a variable whose name is a three-letter, lower-case day name.
16923
16924@item
16925An interval of year numbers (integers). This specifies the span of
16926years over which this holiday list is to be considered valid. Any
16927business-day arithmetic that goes outside this range will result
16928in an error message. Use this if you are including an explicit
16929list of holidays, rather than a formula to generate them, and you
16930want to make sure you don't accidentally go beyond the last point
16931where the holidays you entered are complete. If there is no
16932limiting interval in the @code{Holidays} vector, the default
16933@samp{[1 .. 2737]} is used. (This is the absolute range of years
16934for which Calc's business-day algorithms will operate.)
16935
16936@item
16937An interval of HMS forms. This specifies the span of hours that
16938are to be considered one business day. For example, if this
16939range is @samp{[9@@ 0' 0" .. 17@@ 0' 0"]} (i.e., 9am to 5pm), then
16940the business day is only eight hours long, so that @kbd{1.5 t +}
16941on @samp{<4:00pm Fri Dec 13, 1991>} will add one business day and
16942four business hours to produce @samp{<12:00pm Tue Dec 17, 1991>}.
16943Likewise, @kbd{t -} will now express differences in time as
16944fractions of an eight-hour day. Times before 9am will be treated
16945as 9am by business date arithmetic, and times at or after 5pm will
16946be treated as 4:59:59pm. If there is no HMS interval in @code{Holidays},
16947the full 24-hour day @samp{[0@ 0' 0" .. 24@ 0' 0"]} is assumed.
16948(Regardless of the type of bounds you specify, the interval is
16949treated as inclusive on the low end and exclusive on the high end,
16950so that the work day goes from 9am up to, but not including, 5pm.)
16951@end itemize
16952
16953If the @code{Holidays} vector is empty, then @kbd{t +} and
16954@kbd{t -} will act just like @kbd{+} and @kbd{-} because there will
16955then be no difference between business days and calendar days.
16956
16957Calc expands the intervals and formulas you give into a complete
16958list of holidays for internal use. This is done mainly to make
16959sure it can detect multiple holidays. (For example,
16960@samp{<Jan 1, 1989>} is both New Year's Day and a Sunday, but
16961Calc's algorithms take care to count it only once when figuring
16962the number of holidays between two dates.)
16963
16964Since the complete list of holidays for all the years from 1 to
169652737 would be huge, Calc actually computes only the part of the
16966list between the smallest and largest years that have been involved
16967in business-day calculations so far. Normally, you won't have to
16968worry about this. Keep in mind, however, that if you do one
16969calculation for 1992, and another for 1792, even if both involve
16970only a small range of years, Calc will still work out all the
16971holidays that fall in that 200-year span.
16972
16973If you add a (positive) number of days to a date form that falls on a
16974weekend or holiday, the date form is treated as if it were the most
16975recent business day. (Thus adding one business day to a Friday,
16976Saturday, or Sunday will all yield the following Monday.) If you
16977subtract a number of days from a weekend or holiday, the date is
16978effectively on the following business day. (So subtracting one business
16979day from Saturday, Sunday, or Monday yields the preceding Friday.) The
16980difference between two dates one or both of which fall on holidays
16981equals the number of actual business days between them. These
16982conventions are consistent in the sense that, if you add @var{n}
16983business days to any date, the difference between the result and the
16984original date will come out to @var{n} business days. (It can't be
16985completely consistent though; a subtraction followed by an addition
16986might come out a bit differently, since @kbd{t +} is incapable of
16987producing a date that falls on a weekend or holiday.)
16988
5d67986c
RS
16989@ignore
16990@starindex
16991@end ignore
d7b8e6c6
EZ
16992@tindex holiday
16993There is a @code{holiday} function, not on any keys, that takes
16994any date form and returns 1 if that date falls on a weekend or
16995holiday, as defined in @code{Holidays}, or 0 if the date is a
16996business day.
16997
16998@node Time Zones, , Business Days, Date Arithmetic
16999@subsection Time Zones
17000
17001@noindent
17002@cindex Time zones
17003@cindex Daylight savings time
17004Time zones and daylight savings time are a complicated business.
17005The conversions to and from Julian and Unix-style dates automatically
17006compute the correct time zone and daylight savings adjustment to use,
17007provided they can figure out this information. This section describes
17008Calc's time zone adjustment algorithm in detail, in case you want to
17009do conversions in different time zones or in case Calc's algorithms
17010can't determine the right correction to use.
17011
17012Adjustments for time zones and daylight savings time are done by
17013@kbd{t U}, @kbd{t J}, @kbd{t N}, and @kbd{t C}, but not by any other
17014commands. In particular, @samp{<may 1 1991> - <apr 1 1991>} evaluates
17015to exactly 30 days even though there is a daylight-savings
17016transition in between. This is also true for Julian pure dates:
17017@samp{julian(<may 1 1991>) - julian(<apr 1 1991>)}. But Julian
17018and Unix date/times will adjust for daylight savings time:
17019@samp{julian(<12am may 1 1991>) - julian(<12am apr 1 1991>)}
17020evaluates to @samp{29.95834} (that's 29 days and 23 hours)
17021because one hour was lost when daylight savings commenced on
17022April 7, 1991.
17023
17024In brief, the idiom @samp{julian(@var{date1}) - julian(@var{date2})}
17025computes the actual number of 24-hour periods between two dates, whereas
17026@samp{@var{date1} - @var{date2}} computes the number of calendar
17027days between two dates without taking daylight savings into account.
17028
17029@pindex calc-time-zone
5d67986c
RS
17030@ignore
17031@starindex
17032@end ignore
d7b8e6c6
EZ
17033@tindex tzone
17034The @code{calc-time-zone} [@code{tzone}] command converts the time
17035zone specified by its numeric prefix argument into a number of
17036seconds difference from Greenwich mean time (GMT). If the argument
17037is a number, the result is simply that value multiplied by 3600.
17038Typical arguments for North America are 5 (Eastern) or 8 (Pacific). If
17039Daylight Savings time is in effect, one hour should be subtracted from
17040the normal difference.
17041
17042If you give a prefix of plain @kbd{C-u}, @code{calc-time-zone} (like other
17043date arithmetic commands that include a time zone argument) takes the
17044zone argument from the top of the stack. (In the case of @kbd{t J}
17045and @kbd{t U}, the normal argument is then taken from the second-to-top
17046stack position.) This allows you to give a non-integer time zone
17047adjustment. The time-zone argument can also be an HMS form, or
17048it can be a variable which is a time zone name in upper- or lower-case.
17049For example @samp{tzone(PST) = tzone(8)} and @samp{tzone(pdt) = tzone(7)}
17050(for Pacific standard and daylight savings times, respectively).
17051
17052North American and European time zone names are defined as follows;
17053note that for each time zone there is one name for standard time,
17054another for daylight savings time, and a third for ``generalized'' time
17055in which the daylight savings adjustment is computed from context.
17056
d7b8e6c6 17057@smallexample
5d67986c 17058@group
d7b8e6c6
EZ
17059YST PST MST CST EST AST NST GMT WET MET MEZ
17060 9 8 7 6 5 4 3.5 0 -1 -2 -2
17061
17062YDT PDT MDT CDT EDT ADT NDT BST WETDST METDST MESZ
17063 8 7 6 5 4 3 2.5 -1 -2 -3 -3
17064
17065YGT PGT MGT CGT EGT AGT NGT BGT WEGT MEGT MEGZ
170669/8 8/7 7/6 6/5 5/4 4/3 3.5/2.5 0/-1 -1/-2 -2/-3 -2/-3
d7b8e6c6 17067@end group
5d67986c 17068@end smallexample
d7b8e6c6
EZ
17069
17070@vindex math-tzone-names
17071To define time zone names that do not appear in the above table,
17072you must modify the Lisp variable @code{math-tzone-names}. This
17073is a list of lists describing the different time zone names; its
17074structure is best explained by an example. The three entries for
17075Pacific Time look like this:
17076
d7b8e6c6 17077@smallexample
5d67986c 17078@group
d7b8e6c6
EZ
17079( ( "PST" 8 0 ) ; Name as an upper-case string, then standard
17080 ( "PDT" 8 -1 ) ; adjustment, then daylight savings adjustment.
17081 ( "PGT" 8 "PST" "PDT" ) ) ; Generalized time zone.
d7b8e6c6 17082@end group
5d67986c 17083@end smallexample
d7b8e6c6
EZ
17084
17085@cindex @code{TimeZone} variable
17086@vindex TimeZone
17087With no arguments, @code{calc-time-zone} or @samp{tzone()} obtains an
17088argument from the Calc variable @code{TimeZone} if a value has been
17089stored for that variable. If not, Calc runs the Unix @samp{date}
17090command and looks for one of the above time zone names in the output;
17091if this does not succeed, @samp{tzone()} leaves itself unevaluated.
17092The time zone name in the @samp{date} output may be followed by a signed
17093adjustment, e.g., @samp{GMT+5} or @samp{GMT+0500} which specifies a
17094number of hours and minutes to be added to the base time zone.
17095Calc stores the time zone it finds into @code{TimeZone} to speed
17096later calls to @samp{tzone()}.
17097
17098The special time zone name @code{local} is equivalent to no argument,
17099i.e., it uses the local time zone as obtained from the @code{date}
17100command.
17101
17102If the time zone name found is one of the standard or daylight
17103savings zone names from the above table, and Calc's internal
17104daylight savings algorithm says that time and zone are consistent
17105(e.g., @code{PDT} accompanies a date that Calc's algorithm would also
17106consider to be daylight savings, or @code{PST} accompanies a date
17107that Calc would consider to be standard time), then Calc substitutes
17108the corresponding generalized time zone (like @code{PGT}).
17109
17110If your system does not have a suitable @samp{date} command, you
17111may wish to put a @samp{(setq var-TimeZone ...)} in your Emacs
17112initialization file to set the time zone. The easiest way to do
17113this is to edit the @code{TimeZone} variable using Calc's @kbd{s T}
17114command, then use the @kbd{s p} (@code{calc-permanent-variable})
17115command to save the value of @code{TimeZone} permanently.
17116
17117The @kbd{t J} and @code{t U} commands with no numeric prefix
17118arguments do the same thing as @samp{tzone()}. If the current
17119time zone is a generalized time zone, e.g., @code{EGT}, Calc
17120examines the date being converted to tell whether to use standard
17121or daylight savings time. But if the current time zone is explicit,
17122e.g., @code{EST} or @code{EDT}, then that adjustment is used exactly
17123and Calc's daylight savings algorithm is not consulted.
17124
17125Some places don't follow the usual rules for daylight savings time.
17126The state of Arizona, for example, does not observe daylight savings
17127time. If you run Calc during the winter season in Arizona, the
17128Unix @code{date} command will report @code{MST} time zone, which
17129Calc will change to @code{MGT}. If you then convert a time that
17130lies in the summer months, Calc will apply an incorrect daylight
17131savings time adjustment. To avoid this, set your @code{TimeZone}
17132variable explicitly to @code{MST} to force the use of standard,
17133non-daylight-savings time.
17134
17135@vindex math-daylight-savings-hook
17136@findex math-std-daylight-savings
17137By default Calc always considers daylight savings time to begin at
171382 a.m.@: on the first Sunday of April, and to end at 2 a.m.@: on the
17139last Sunday of October. This is the rule that has been in effect
17140in North America since 1987. If you are in a country that uses
17141different rules for computing daylight savings time, you have two
17142choices: Write your own daylight savings hook, or control time
17143zones explicitly by setting the @code{TimeZone} variable and/or
17144always giving a time-zone argument for the conversion functions.
17145
17146The Lisp variable @code{math-daylight-savings-hook} holds the
17147name of a function that is used to compute the daylight savings
17148adjustment for a given date. The default is
17149@code{math-std-daylight-savings}, which computes an adjustment
17150(either 0 or @i{-1}) using the North American rules given above.
17151
17152The daylight savings hook function is called with four arguments:
17153The date, as a floating-point number in standard Calc format;
17154a six-element list of the date decomposed into year, month, day,
17155hour, minute, and second, respectively; a string which contains
17156the generalized time zone name in upper-case, e.g., @code{"WEGT"};
17157and a special adjustment to be applied to the hour value when
17158converting into a generalized time zone (see below).
17159
17160@findex math-prev-weekday-in-month
17161The Lisp function @code{math-prev-weekday-in-month} is useful for
17162daylight savings computations. This is an internal version of
17163the user-level @code{pwday} function described in the previous
17164section. It takes four arguments: The floating-point date value,
17165the corresponding six-element date list, the day-of-month number,
17166and the weekday number (0-6).
17167
17168The default daylight savings hook ignores the time zone name, but a
17169more sophisticated hook could use different algorithms for different
17170time zones. It would also be possible to use different algorithms
17171depending on the year number, but the default hook always uses the
17172algorithm for 1987 and later. Here is a listing of the default
17173daylight savings hook:
17174
17175@smallexample
17176(defun math-std-daylight-savings (date dt zone bump)
17177 (cond ((< (nth 1 dt) 4) 0)
17178 ((= (nth 1 dt) 4)
17179 (let ((sunday (math-prev-weekday-in-month date dt 7 0)))
17180 (cond ((< (nth 2 dt) sunday) 0)
17181 ((= (nth 2 dt) sunday)
17182 (if (>= (nth 3 dt) (+ 3 bump)) -1 0))
17183 (t -1))))
17184 ((< (nth 1 dt) 10) -1)
17185 ((= (nth 1 dt) 10)
17186 (let ((sunday (math-prev-weekday-in-month date dt 31 0)))
17187 (cond ((< (nth 2 dt) sunday) -1)
17188 ((= (nth 2 dt) sunday)
17189 (if (>= (nth 3 dt) (+ 2 bump)) 0 -1))
17190 (t 0))))
17191 (t 0))
17192)
17193@end smallexample
17194
17195@noindent
17196The @code{bump} parameter is equal to zero when Calc is converting
17197from a date form in a generalized time zone into a GMT date value.
17198It is @i{-1} when Calc is converting in the other direction. The
17199adjustments shown above ensure that the conversion behaves correctly
17200and reasonably around the 2 a.m.@: transition in each direction.
17201
17202There is a ``missing'' hour between 2 a.m.@: and 3 a.m.@: at the
17203beginning of daylight savings time; converting a date/time form that
17204falls in this hour results in a time value for the following hour,
17205from 3 a.m.@: to 4 a.m. At the end of daylight savings time, the
17206hour from 1 a.m.@: to 2 a.m.@: repeats itself; converting a date/time
17207form that falls in in this hour results in a time value for the first
17208manifestion of that time (@emph{not} the one that occurs one hour later).
17209
17210If @code{math-daylight-savings-hook} is @code{nil}, then the
17211daylight savings adjustment is always taken to be zero.
17212
17213In algebraic formulas, @samp{tzone(@var{zone}, @var{date})}
17214computes the time zone adjustment for a given zone name at a
17215given date. The @var{date} is ignored unless @var{zone} is a
17216generalized time zone. If @var{date} is a date form, the
17217daylight savings computation is applied to it as it appears.
17218If @var{date} is a numeric date value, it is adjusted for the
17219daylight-savings version of @var{zone} before being given to
17220the daylight savings hook. This odd-sounding rule ensures
17221that the daylight-savings computation is always done in
17222local time, not in the GMT time that a numeric @var{date}
17223is typically represented in.
17224
5d67986c
RS
17225@ignore
17226@starindex
17227@end ignore
d7b8e6c6
EZ
17228@tindex dsadj
17229The @samp{dsadj(@var{date}, @var{zone})} function computes the
17230daylight savings adjustment that is appropriate for @var{date} in
17231time zone @var{zone}. If @var{zone} is explicitly in or not in
17232daylight savings time (e.g., @code{PDT} or @code{PST}) the
17233@var{date} is ignored. If @var{zone} is a generalized time zone,
17234the algorithms described above are used. If @var{zone} is omitted,
17235the computation is done for the current time zone.
17236
17237@xref{Reporting Bugs}, for the address of Calc's author, if you
17238should wish to contribute your improved versions of
17239@code{math-tzone-names} and @code{math-daylight-savings-hook}
17240to the Calc distribution.
17241
17242@node Financial Functions, Binary Functions, Date Arithmetic, Arithmetic
17243@section Financial Functions
17244
17245@noindent
17246Calc's financial or business functions use the @kbd{b} prefix
17247key followed by a shifted letter. (The @kbd{b} prefix followed by
17248a lower-case letter is used for operations on binary numbers.)
17249
17250Note that the rate and the number of intervals given to these
17251functions must be on the same time scale, e.g., both months or
17252both years. Mixing an annual interest rate with a time expressed
17253in months will give you very wrong answers!
17254
17255It is wise to compute these functions to a higher precision than
17256you really need, just to make sure your answer is correct to the
17257last penny; also, you may wish to check the definitions at the end
17258of this section to make sure the functions have the meaning you expect.
17259
17260@menu
17261* Percentages::
17262* Future Value::
17263* Present Value::
17264* Related Financial Functions::
17265* Depreciation Functions::
17266* Definitions of Financial Functions::
17267@end menu
17268
17269@node Percentages, Future Value, Financial Functions, Financial Functions
17270@subsection Percentages
17271
17272@kindex M-%
17273@pindex calc-percent
17274@tindex %
17275@tindex percent
17276The @kbd{M-%} (@code{calc-percent}) command takes a percentage value,
17277say 5.4, and converts it to an equivalent actual number. For example,
17278@kbd{5.4 M-%} enters 0.054 on the stack. (That's the @key{META} or
17279@key{ESC} key combined with @kbd{%}.)
17280
17281Actually, @kbd{M-%} creates a formula of the form @samp{5.4%}.
17282You can enter @samp{5.4%} yourself during algebraic entry. The
17283@samp{%} operator simply means, ``the preceding value divided by
17284100.'' The @samp{%} operator has very high precedence, so that
17285@samp{1+8%} is interpreted as @samp{1+(8%)}, not as @samp{(1+8)%}.
17286(The @samp{%} operator is just a postfix notation for the
17287@code{percent} function, just like @samp{20!} is the notation for
17288@samp{fact(20)}, or twenty-factorial.)
17289
17290The formula @samp{5.4%} would normally evaluate immediately to
172910.054, but the @kbd{M-%} command suppresses evaluation as it puts
17292the formula onto the stack. However, the next Calc command that
17293uses the formula @samp{5.4%} will evaluate it as its first step.
17294The net effect is that you get to look at @samp{5.4%} on the stack,
17295but Calc commands see it as @samp{0.054}, which is what they expect.
17296
17297In particular, @samp{5.4%} and @samp{0.054} are suitable values
17298for the @var{rate} arguments of the various financial functions,
17299but the number @samp{5.4} is probably @emph{not} suitable---it
17300represents a rate of 540 percent!
17301
17302The key sequence @kbd{M-% *} effectively means ``percent-of.''
5d67986c 17303For example, @kbd{68 @key{RET} 25 M-% *} computes 17, which is 25% of
d7b8e6c6
EZ
1730468 (and also 68% of 25, which comes out to the same thing).
17305
17306@kindex c %
17307@pindex calc-convert-percent
17308The @kbd{c %} (@code{calc-convert-percent}) command converts the
17309value on the top of the stack from numeric to percentage form.
17310For example, if 0.08 is on the stack, @kbd{c %} converts it to
17311@samp{8%}. The quantity is the same, it's just represented
17312differently. (Contrast this with @kbd{M-%}, which would convert
17313this number to @samp{0.08%}.) The @kbd{=} key is a convenient way
17314to convert a formula like @samp{8%} back to numeric form, 0.08.
17315
17316To compute what percentage one quantity is of another quantity,
5d67986c 17317use @kbd{/ c %}. For example, @w{@kbd{17 @key{RET} 68 / c %}} displays
d7b8e6c6
EZ
17318@samp{25%}.
17319
17320@kindex b %
17321@pindex calc-percent-change
17322@tindex relch
17323The @kbd{b %} (@code{calc-percent-change}) [@code{relch}] command
17324calculates the percentage change from one number to another.
5d67986c 17325For example, @kbd{40 @key{RET} 50 b %} produces the answer @samp{25%},
d7b8e6c6 17326since 50 is 25% larger than 40. A negative result represents a
5d67986c 17327decrease: @kbd{50 @key{RET} 40 b %} produces @samp{-20%}, since 40 is
d7b8e6c6
EZ
1732820% smaller than 50. (The answers are different in magnitude
17329because, in the first case, we're increasing by 25% of 40, but
17330in the second case, we're decreasing by 20% of 50.) The effect
5d67986c 17331of @kbd{40 @key{RET} 50 b %} is to compute @cite{(50-40)/40}, converting
d7b8e6c6
EZ
17332the answer to percentage form as if by @kbd{c %}.
17333
17334@node Future Value, Present Value, Percentages, Financial Functions
17335@subsection Future Value
17336
17337@noindent
17338@kindex b F
17339@pindex calc-fin-fv
17340@tindex fv
17341The @kbd{b F} (@code{calc-fin-fv}) [@code{fv}] command computes
17342the future value of an investment. It takes three arguments
17343from the stack: @samp{fv(@var{rate}, @var{n}, @var{payment})}.
17344If you give payments of @var{payment} every year for @var{n}
17345years, and the money you have paid earns interest at @var{rate} per
17346year, then this function tells you what your investment would be
17347worth at the end of the period. (The actual interval doesn't
17348have to be years, as long as @var{n} and @var{rate} are expressed
17349in terms of the same intervals.) This function assumes payments
17350occur at the @emph{end} of each interval.
17351
17352@kindex I b F
17353@tindex fvb
17354The @kbd{I b F} [@code{fvb}] command does the same computation,
17355but assuming your payments are at the beginning of each interval.
17356Suppose you plan to deposit $1000 per year in a savings account
17357earning 5.4% interest, starting right now. How much will be
17358in the account after five years? @code{fvb(5.4%, 5, 1000) = 5870.73}.
17359Thus you will have earned $870 worth of interest over the years.
17360Using the stack, this calculation would have been
5d67986c 17361@kbd{5.4 M-% 5 @key{RET} 1000 I b F}. Note that the rate is expressed
d7b8e6c6
EZ
17362as a number between 0 and 1, @emph{not} as a percentage.
17363
17364@kindex H b F
17365@tindex fvl
17366The @kbd{H b F} [@code{fvl}] command computes the future value
17367of an initial lump sum investment. Suppose you could deposit
17368those five thousand dollars in the bank right now; how much would
17369they be worth in five years? @code{fvl(5.4%, 5, 5000) = 6503.89}.
17370
17371The algebraic functions @code{fv} and @code{fvb} accept an optional
17372fourth argument, which is used as an initial lump sum in the sense
17373of @code{fvl}. In other words, @code{fv(@var{rate}, @var{n},
17374@var{payment}, @var{initial}) = fv(@var{rate}, @var{n}, @var{payment})
17375+ fvl(@var{rate}, @var{n}, @var{initial})}.@refill
17376
17377To illustrate the relationships between these functions, we could
17378do the @code{fvb} calculation ``by hand'' using @code{fvl}. The
17379final balance will be the sum of the contributions of our five
17380deposits at various times. The first deposit earns interest for
17381five years: @code{fvl(5.4%, 5, 1000) = 1300.78}. The second
17382deposit only earns interest for four years: @code{fvl(5.4%, 4, 1000) =
173831234.13}. And so on down to the last deposit, which earns one
17384year's interest: @code{fvl(5.4%, 1, 1000) = 1054.00}. The sum of
17385these five values is, sure enough, $5870.73, just as was computed
17386by @code{fvb} directly.
17387
17388What does @code{fv(5.4%, 5, 1000) = 5569.96} mean? The payments
17389are now at the ends of the periods. The end of one year is the same
17390as the beginning of the next, so what this really means is that we've
17391lost the payment at year zero (which contributed $1300.78), but we're
17392now counting the payment at year five (which, since it didn't have
17393a chance to earn interest, counts as $1000). Indeed, @cite{5569.96 =
173945870.73 - 1300.78 + 1000} (give or take a bit of roundoff error).
17395
17396@node Present Value, Related Financial Functions, Future Value, Financial Functions
17397@subsection Present Value
17398
17399@noindent
17400@kindex b P
17401@pindex calc-fin-pv
17402@tindex pv
17403The @kbd{b P} (@code{calc-fin-pv}) [@code{pv}] command computes
17404the present value of an investment. Like @code{fv}, it takes
17405three arguments: @code{pv(@var{rate}, @var{n}, @var{payment})}.
17406It computes the present value of a series of regular payments.
17407Suppose you have the chance to make an investment that will
17408pay $2000 per year over the next four years; as you receive
17409these payments you can put them in the bank at 9% interest.
17410You want to know whether it is better to make the investment, or
17411to keep the money in the bank where it earns 9% interest right
17412from the start. The calculation @code{pv(9%, 4, 2000)} gives the
17413result 6479.44. If your initial investment must be less than this,
17414say, $6000, then the investment is worthwhile. But if you had to
17415put up $7000, then it would be better just to leave it in the bank.
17416
17417Here is the interpretation of the result of @code{pv}: You are
17418trying to compare the return from the investment you are
17419considering, which is @code{fv(9%, 4, 2000) = 9146.26}, with
17420the return from leaving the money in the bank, which is
17421@code{fvl(9%, 4, @var{x})} where @var{x} is the amount of money
17422you would have to put up in advance. The @code{pv} function
17423finds the break-even point, @cite{x = 6479.44}, at which
17424@code{fvl(9%, 4, 6479.44)} is also equal to 9146.26. This is
17425the largest amount you should be willing to invest.
17426
17427@kindex I b P
17428@tindex pvb
17429The @kbd{I b P} [@code{pvb}] command solves the same problem,
17430but with payments occurring at the beginning of each interval.
17431It has the same relationship to @code{fvb} as @code{pv} has
17432to @code{fv}. For example @code{pvb(9%, 4, 2000) = 7062.59},
17433a larger number than @code{pv} produced because we get to start
17434earning interest on the return from our investment sooner.
17435
17436@kindex H b P
17437@tindex pvl
17438The @kbd{H b P} [@code{pvl}] command computes the present value of
17439an investment that will pay off in one lump sum at the end of the
17440period. For example, if we get our $8000 all at the end of the
17441four years, @code{pvl(9%, 4, 8000) = 5667.40}. This is much
17442less than @code{pv} reported, because we don't earn any interest
17443on the return from this investment. Note that @code{pvl} and
17444@code{fvl} are simple inverses: @code{fvl(9%, 4, 5667.40) = 8000}.
17445
17446You can give an optional fourth lump-sum argument to @code{pv}
17447and @code{pvb}; this is handled in exactly the same way as the
17448fourth argument for @code{fv} and @code{fvb}.
17449
17450@kindex b N
17451@pindex calc-fin-npv
17452@tindex npv
17453The @kbd{b N} (@code{calc-fin-npv}) [@code{npv}] command computes
17454the net present value of a series of irregular investments.
17455The first argument is the interest rate. The second argument is
17456a vector which represents the expected return from the investment
17457at the end of each interval. For example, if the rate represents
17458a yearly interest rate, then the vector elements are the return
17459from the first year, second year, and so on.
17460
17461Thus, @code{npv(9%, [2000,2000,2000,2000]) = pv(9%, 4, 2000) = 6479.44}.
17462Obviously this function is more interesting when the payments are
17463not all the same!
17464
17465The @code{npv} function can actually have two or more arguments.
17466Multiple arguments are interpreted in the same way as for the
17467vector statistical functions like @code{vsum}.
17468@xref{Single-Variable Statistics}. Basically, if there are several
17469payment arguments, each either a vector or a plain number, all these
17470values are collected left-to-right into the complete list of payments.
17471A numeric prefix argument on the @kbd{b N} command says how many
17472payment values or vectors to take from the stack.@refill
17473
17474@kindex I b N
17475@tindex npvb
17476The @kbd{I b N} [@code{npvb}] command computes the net present
17477value where payments occur at the beginning of each interval
17478rather than at the end.
17479
17480@node Related Financial Functions, Depreciation Functions, Present Value, Financial Functions
17481@subsection Related Financial Functions
17482
17483@noindent
17484The functions in this section are basically inverses of the
17485present value functions with respect to the various arguments.
17486
17487@kindex b M
17488@pindex calc-fin-pmt
17489@tindex pmt
17490The @kbd{b M} (@code{calc-fin-pmt}) [@code{pmt}] command computes
17491the amount of periodic payment necessary to amortize a loan.
17492Thus @code{pmt(@var{rate}, @var{n}, @var{amount})} equals the
17493value of @var{payment} such that @code{pv(@var{rate}, @var{n},
17494@var{payment}) = @var{amount}}.@refill
17495
17496@kindex I b M
17497@tindex pmtb
17498The @kbd{I b M} [@code{pmtb}] command does the same computation
17499but using @code{pvb} instead of @code{pv}. Like @code{pv} and
17500@code{pvb}, these functions can also take a fourth argument which
17501represents an initial lump-sum investment.
17502
17503@kindex H b M
17504The @kbd{H b M} key just invokes the @code{fvl} function, which is
17505the inverse of @code{pvl}. There is no explicit @code{pmtl} function.
17506
17507@kindex b #
17508@pindex calc-fin-nper
17509@tindex nper
17510The @kbd{b #} (@code{calc-fin-nper}) [@code{nper}] command computes
17511the number of regular payments necessary to amortize a loan.
17512Thus @code{nper(@var{rate}, @var{payment}, @var{amount})} equals
17513the value of @var{n} such that @code{pv(@var{rate}, @var{n},
17514@var{payment}) = @var{amount}}. If @var{payment} is too small
17515ever to amortize a loan for @var{amount} at interest rate @var{rate},
17516the @code{nper} function is left in symbolic form.@refill
17517
17518@kindex I b #
17519@tindex nperb
17520The @kbd{I b #} [@code{nperb}] command does the same computation
17521but using @code{pvb} instead of @code{pv}. You can give a fourth
17522lump-sum argument to these functions, but the computation will be
17523rather slow in the four-argument case.@refill
17524
17525@kindex H b #
17526@tindex nperl
17527The @kbd{H b #} [@code{nperl}] command does the same computation
17528using @code{pvl}. By exchanging @var{payment} and @var{amount} you
17529can also get the solution for @code{fvl}. For example,
17530@code{nperl(8%, 2000, 1000) = 9.006}, so if you place $1000 in a
17531bank account earning 8%, it will take nine years to grow to $2000.@refill
17532
17533@kindex b T
17534@pindex calc-fin-rate
17535@tindex rate
17536The @kbd{b T} (@code{calc-fin-rate}) [@code{rate}] command computes
17537the rate of return on an investment. This is also an inverse of @code{pv}:
17538@code{rate(@var{n}, @var{payment}, @var{amount})} computes the value of
17539@var{rate} such that @code{pv(@var{rate}, @var{n}, @var{payment}) =
17540@var{amount}}. The result is expressed as a formula like @samp{6.3%}.@refill
17541
17542@kindex I b T
17543@kindex H b T
17544@tindex rateb
17545@tindex ratel
17546The @kbd{I b T} [@code{rateb}] and @kbd{H b T} [@code{ratel}]
17547commands solve the analogous equations with @code{pvb} or @code{pvl}
17548in place of @code{pv}. Also, @code{rate} and @code{rateb} can
17549accept an optional fourth argument just like @code{pv} and @code{pvb}.
17550To redo the above example from a different perspective,
17551@code{ratel(9, 2000, 1000) = 8.00597%}, which says you will need an
17552interest rate of 8% in order to double your account in nine years.@refill
17553
17554@kindex b I
17555@pindex calc-fin-irr
17556@tindex irr
17557The @kbd{b I} (@code{calc-fin-irr}) [@code{irr}] command is the
17558analogous function to @code{rate} but for net present value.
17559Its argument is a vector of payments. Thus @code{irr(@var{payments})}
17560computes the @var{rate} such that @code{npv(@var{rate}, @var{payments}) = 0};
17561this rate is known as the @dfn{internal rate of return}.
17562
17563@kindex I b I
17564@tindex irrb
17565The @kbd{I b I} [@code{irrb}] command computes the internal rate of
17566return assuming payments occur at the beginning of each period.
17567
17568@node Depreciation Functions, Definitions of Financial Functions, Related Financial Functions, Financial Functions
17569@subsection Depreciation Functions
17570
17571@noindent
17572The functions in this section calculate @dfn{depreciation}, which is
17573the amount of value that a possession loses over time. These functions
17574are characterized by three parameters: @var{cost}, the original cost
17575of the asset; @var{salvage}, the value the asset will have at the end
17576of its expected ``useful life''; and @var{life}, the number of years
17577(or other periods) of the expected useful life.
17578
17579There are several methods for calculating depreciation that differ in
17580the way they spread the depreciation over the lifetime of the asset.
17581
17582@kindex b S
17583@pindex calc-fin-sln
17584@tindex sln
17585The @kbd{b S} (@code{calc-fin-sln}) [@code{sln}] command computes the
17586``straight-line'' depreciation. In this method, the asset depreciates
17587by the same amount every year (or period). For example,
17588@samp{sln(12000, 2000, 5)} returns 2000. The asset costs $12000
17589initially and will be worth $2000 after five years; it loses $2000
17590per year.
17591
17592@kindex b Y
17593@pindex calc-fin-syd
17594@tindex syd
17595The @kbd{b Y} (@code{calc-fin-syd}) [@code{syd}] command computes the
17596accelerated ``sum-of-years'-digits'' depreciation. Here the depreciation
17597is higher during the early years of the asset's life. Since the
17598depreciation is different each year, @kbd{b Y} takes a fourth @var{period}
17599parameter which specifies which year is requested, from 1 to @var{life}.
17600If @var{period} is outside this range, the @code{syd} function will
17601return zero.
17602
17603@kindex b D
17604@pindex calc-fin-ddb
17605@tindex ddb
17606The @kbd{b D} (@code{calc-fin-ddb}) [@code{ddb}] command computes an
17607accelerated depreciation using the double-declining balance method.
17608It also takes a fourth @var{period} parameter.
17609
17610For symmetry, the @code{sln} function will accept a @var{period}
17611parameter as well, although it will ignore its value except that the
17612return value will as usual be zero if @var{period} is out of range.
17613
17614For example, pushing the vector @cite{[1,2,3,4,5]} (perhaps with @kbd{v x 5})
17615and then mapping @kbd{V M ' [sln(12000,2000,5,$), syd(12000,2000,5,$),
5d67986c 17616ddb(12000,2000,5,$)] @key{RET}} produces a matrix that allows us to compare
d7b8e6c6
EZ
17617the three depreciation methods:
17618
d7b8e6c6 17619@example
5d67986c 17620@group
d7b8e6c6
EZ
17621[ [ 2000, 3333, 4800 ]
17622 [ 2000, 2667, 2880 ]
17623 [ 2000, 2000, 1728 ]
17624 [ 2000, 1333, 592 ]
17625 [ 2000, 667, 0 ] ]
d7b8e6c6 17626@end group
5d67986c 17627@end example
d7b8e6c6
EZ
17628
17629@noindent
17630(Values have been rounded to nearest integers in this figure.)
17631We see that @code{sln} depreciates by the same amount each year,
17632@kbd{syd} depreciates more at the beginning and less at the end,
17633and @kbd{ddb} weights the depreciation even more toward the beginning.
17634
17635Summing columns with @kbd{V R : +} yields @cite{[10000, 10000, 10000]};
17636the total depreciation in any method is (by definition) the
17637difference between the cost and the salvage value.
17638
17639@node Definitions of Financial Functions, , Depreciation Functions, Financial Functions
17640@subsection Definitions
17641
17642@noindent
17643For your reference, here are the actual formulas used to compute
17644Calc's financial functions.
17645
17646Calc will not evaluate a financial function unless the @var{rate} or
17647@var{n} argument is known. However, @var{payment} or @var{amount} can
17648be a variable. Calc expands these functions according to the
17649formulas below for symbolic arguments only when you use the @kbd{a "}
17650(@code{calc-expand-formula}) command, or when taking derivatives or
17651integrals or solving equations involving the functions.
17652
17653@ifinfo
17654These formulas are shown using the conventions of ``Big'' display
17655mode (@kbd{d B}); for example, the formula for @code{fv} written
17656linearly is @samp{pmt * ((1 + rate)^n) - 1) / rate}.
17657
17658@example
17659 n
17660 (1 + rate) - 1
17661fv(rate, n, pmt) = pmt * ---------------
17662 rate
17663
17664 n
17665 ((1 + rate) - 1) (1 + rate)
17666fvb(rate, n, pmt) = pmt * ----------------------------
17667 rate
17668
17669 n
17670fvl(rate, n, pmt) = pmt * (1 + rate)
17671
17672 -n
17673 1 - (1 + rate)
17674pv(rate, n, pmt) = pmt * ----------------
17675 rate
17676
17677 -n
17678 (1 - (1 + rate) ) (1 + rate)
17679pvb(rate, n, pmt) = pmt * -----------------------------
17680 rate
17681
17682 -n
17683pvl(rate, n, pmt) = pmt * (1 + rate)
17684
17685 -1 -2 -3
17686npv(rate, [a, b, c]) = a*(1 + rate) + b*(1 + rate) + c*(1 + rate)
17687
17688 -1 -2
17689npvb(rate, [a, b, c]) = a + b*(1 + rate) + c*(1 + rate)
17690
17691 -n
17692 (amt - x * (1 + rate) ) * rate
17693pmt(rate, n, amt, x) = -------------------------------
17694 -n
17695 1 - (1 + rate)
17696
17697 -n
17698 (amt - x * (1 + rate) ) * rate
17699pmtb(rate, n, amt, x) = -------------------------------
17700 -n
17701 (1 - (1 + rate) ) (1 + rate)
17702
17703 amt * rate
17704nper(rate, pmt, amt) = - log(1 - ------------, 1 + rate)
17705 pmt
17706
17707 amt * rate
17708nperb(rate, pmt, amt) = - log(1 - ---------------, 1 + rate)
17709 pmt * (1 + rate)
17710
17711 amt
17712nperl(rate, pmt, amt) = - log(---, 1 + rate)
17713 pmt
17714
17715 1/n
17716 pmt
17717ratel(n, pmt, amt) = ------ - 1
17718 1/n
17719 amt
17720
17721 cost - salv
17722sln(cost, salv, life) = -----------
17723 life
17724
17725 (cost - salv) * (life - per + 1)
17726syd(cost, salv, life, per) = --------------------------------
17727 life * (life + 1) / 2
17728
17729 book * 2
17730ddb(cost, salv, life, per) = --------, book = cost - depreciation so far
17731 life
17732@end example
17733@end ifinfo
17734@tex
17735\turnoffactive
17736$$ \code{fv}(r, n, p) = p { (1 + r)^n - 1 \over r } $$
17737$$ \code{fvb}(r, n, p) = p { ((1 + r)^n - 1) (1 + r) \over r } $$
17738$$ \code{fvl}(r, n, p) = p (1 + r)^n $$
17739$$ \code{pv}(r, n, p) = p { 1 - (1 + r)^{-n} \over r } $$
17740$$ \code{pvb}(r, n, p) = p { (1 - (1 + r)^{-n}) (1 + r) \over r } $$
17741$$ \code{pvl}(r, n, p) = p (1 + r)^{-n} $$
17742$$ \code{npv}(r, [a,b,c]) = a (1 + r)^{-1} + b (1 + r)^{-2} + c (1 + r)^{-3} $$
17743$$ \code{npvb}(r, [a,b,c]) = a + b (1 + r)^{-1} + c (1 + r)^{-2} $$
17744$$ \code{pmt}(r, n, a, x) = { (a - x (1 + r)^{-n}) r \over 1 - (1 + r)^{-n} }$$
17745$$ \code{pmtb}(r, n, a, x) = { (a - x (1 + r)^{-n}) r \over
17746 (1 - (1 + r)^{-n}) (1 + r) } $$
17747$$ \code{nper}(r, p, a) = -\code{log}(1 - { a r \over p }, 1 + r) $$
17748$$ \code{nperb}(r, p, a) = -\code{log}(1 - { a r \over p (1 + r) }, 1 + r) $$
17749$$ \code{nperl}(r, p, a) = -\code{log}({a \over p}, 1 + r) $$
17750$$ \code{ratel}(n, p, a) = { p^{1/n} \over a^{1/n} } - 1 $$
17751$$ \code{sln}(c, s, l) = { c - s \over l } $$
17752$$ \code{syd}(c, s, l, p) = { (c - s) (l - p + 1) \over l (l+1) / 2 } $$
17753$$ \code{ddb}(c, s, l, p) = { 2 (c - \hbox{depreciation so far}) \over l } $$
17754@end tex
17755
17756@noindent
17757In @code{pmt} and @code{pmtb}, @cite{x=0} if omitted.
17758
17759These functions accept any numeric objects, including error forms,
17760intervals, and even (though not very usefully) complex numbers. The
17761above formulas specify exactly the behavior of these functions with
17762all sorts of inputs.
17763
17764Note that if the first argument to the @code{log} in @code{nper} is
17765negative, @code{nper} leaves itself in symbolic form rather than
17766returning a (financially meaningless) complex number.
17767
17768@samp{rate(num, pmt, amt)} solves the equation
17769@samp{pv(rate, num, pmt) = amt} for @samp{rate} using @kbd{H a R}
17770(@code{calc-find-root}), with the interval @samp{[.01% .. 100%]}
17771for an initial guess. The @code{rateb} function is the same except
17772that it uses @code{pvb}. Note that @code{ratel} can be solved
17773directly; its formula is shown in the above list.
17774
17775Similarly, @samp{irr(pmts)} solves the equation @samp{npv(rate, pmts) = 0}
17776for @samp{rate}.
17777
17778If you give a fourth argument to @code{nper} or @code{nperb}, Calc
17779will also use @kbd{H a R} to solve the equation using an initial
17780guess interval of @samp{[0 .. 100]}.
17781
17782A fourth argument to @code{fv} simply sums the two components
17783calculated from the above formulas for @code{fv} and @code{fvl}.
17784The same is true of @code{fvb}, @code{pv}, and @code{pvb}.
17785
17786The @kbd{ddb} function is computed iteratively; the ``book'' value
17787starts out equal to @var{cost}, and decreases according to the above
17788formula for the specified number of periods. If the book value
17789would decrease below @var{salvage}, it only decreases to @var{salvage}
17790and the depreciation is zero for all subsequent periods. The @code{ddb}
17791function returns the amount the book value decreased in the specified
17792period.
17793
17794The Calc financial function names were borrowed mostly from Microsoft
17795Excel and Borland's Quattro. The @code{ratel} function corresponds to
17796@samp{@@CGR} in Borland's Reflex. The @code{nper} and @code{nperl}
17797functions correspond to @samp{@@TERM} and @samp{@@CTERM} in Quattro,
17798respectively. Beware that the Calc functions may take their arguments
17799in a different order than the corresponding functions in your favorite
17800spreadsheet.
17801
17802@node Binary Functions, , Financial Functions, Arithmetic
17803@section Binary Number Functions
17804
17805@noindent
17806The commands in this chapter all use two-letter sequences beginning with
17807the @kbd{b} prefix.
17808
17809@cindex Binary numbers
17810The ``binary'' operations actually work regardless of the currently
17811displayed radix, although their results make the most sense in a radix
17812like 2, 8, or 16 (as obtained by the @kbd{d 2}, @kbd{d 8}, or @w{@kbd{d 6}}
17813commands, respectively). You may also wish to enable display of leading
17814zeros with @kbd{d z}. @xref{Radix Modes}.
17815
17816@cindex Word size for binary operations
17817The Calculator maintains a current @dfn{word size} @cite{w}, an
17818arbitrary positive or negative integer. For a positive word size, all
17819of the binary operations described here operate modulo @cite{2^w}. In
17820particular, negative arguments are converted to positive integers modulo
17821@cite{2^w} by all binary functions.@refill
17822
17823If the word size is negative, binary operations produce 2's complement
17824integers from @c{$-2^{-w-1}$}
17825@cite{-(2^(-w-1))} to @c{$2^{-w-1}-1$}
17826@cite{2^(-w-1)-1} inclusive. Either
17827mode accepts inputs in any range; the sign of @cite{w} affects only
17828the results produced.
17829
17830@kindex b c
17831@pindex calc-clip
17832@tindex clip
17833The @kbd{b c} (@code{calc-clip})
17834[@code{clip}] command can be used to clip a number by reducing it modulo
17835@cite{2^w}. The commands described in this chapter automatically clip
17836their results to the current word size. Note that other operations like
17837addition do not use the current word size, since integer addition
17838generally is not ``binary.'' (However, @pxref{Simplification Modes},
17839@code{calc-bin-simplify-mode}.) For example, with a word size of 8
17840bits @kbd{b c} converts a number to the range 0 to 255; with a word
17841size of @i{-8} @kbd{b c} converts to the range @i{-128} to 127.@refill
17842
17843@kindex b w
17844@pindex calc-word-size
17845The default word size is 32 bits. All operations except the shifts and
17846rotates allow you to specify a different word size for that one
17847operation by giving a numeric prefix argument: @kbd{C-u 8 b c} clips the
17848top of stack to the range 0 to 255 regardless of the current word size.
17849To set the word size permanently, use @kbd{b w} (@code{calc-word-size}).
17850This command displays a prompt with the current word size; press @key{RET}
17851immediately to keep this word size, or type a new word size at the prompt.
17852
17853When the binary operations are written in symbolic form, they take an
17854optional second (or third) word-size parameter. When a formula like
17855@samp{and(a,b)} is finally evaluated, the word size current at that time
17856will be used, but when @samp{and(a,b,-8)} is evaluated, a word size of
17857@i{-8} will always be used. A symbolic binary function will be left
17858in symbolic form unless the all of its argument(s) are integers or
17859integer-valued floats.
17860
17861If either or both arguments are modulo forms for which @cite{M} is a
17862power of two, that power of two is taken as the word size unless a
17863numeric prefix argument overrides it. The current word size is never
17864consulted when modulo-power-of-two forms are involved.
17865
17866@kindex b a
17867@pindex calc-and
17868@tindex and
17869The @kbd{b a} (@code{calc-and}) [@code{and}] command computes the bitwise
17870AND of the two numbers on the top of the stack. In other words, for each
17871of the @cite{w} binary digits of the two numbers (pairwise), the corresponding
17872bit of the result is 1 if and only if both input bits are 1:
17873@samp{and(2#1100, 2#1010) = 2#1000}.
17874
17875@kindex b o
17876@pindex calc-or
17877@tindex or
17878The @kbd{b o} (@code{calc-or}) [@code{or}] command computes the bitwise
17879inclusive OR of two numbers. A bit is 1 if either of the input bits, or
17880both, are 1: @samp{or(2#1100, 2#1010) = 2#1110}.
17881
17882@kindex b x
17883@pindex calc-xor
17884@tindex xor
17885The @kbd{b x} (@code{calc-xor}) [@code{xor}] command computes the bitwise
17886exclusive OR of two numbers. A bit is 1 if exactly one of the input bits
17887is 1: @samp{xor(2#1100, 2#1010) = 2#0110}.
17888
17889@kindex b d
17890@pindex calc-diff
17891@tindex diff
17892The @kbd{b d} (@code{calc-diff}) [@code{diff}] command computes the bitwise
17893difference of two numbers; this is defined by @samp{diff(a,b) = and(a,not(b))},
17894so that @samp{diff(2#1100, 2#1010) = 2#0100}.
17895
17896@kindex b n
17897@pindex calc-not
17898@tindex not
17899The @kbd{b n} (@code{calc-not}) [@code{not}] command computes the bitwise
17900NOT of a number. A bit is 1 if the input bit is 0 and vice-versa.
17901
17902@kindex b l
17903@pindex calc-lshift-binary
17904@tindex lsh
17905The @kbd{b l} (@code{calc-lshift-binary}) [@code{lsh}] command shifts a
17906number left by one bit, or by the number of bits specified in the numeric
17907prefix argument. A negative prefix argument performs a logical right shift,
17908in which zeros are shifted in on the left. In symbolic form, @samp{lsh(a)}
17909is short for @samp{lsh(a,1)}, which in turn is short for @samp{lsh(a,n,w)}.
17910Bits shifted ``off the end,'' according to the current word size, are lost.
17911
17912@kindex H b l
17913@kindex H b r
5d67986c
RS
17914@ignore
17915@mindex @idots
17916@end ignore
d7b8e6c6 17917@kindex H b L
5d67986c
RS
17918@ignore
17919@mindex @null
17920@end ignore
d7b8e6c6 17921@kindex H b R
5d67986c
RS
17922@ignore
17923@mindex @null
17924@end ignore
d7b8e6c6
EZ
17925@kindex H b t
17926The @kbd{H b l} command also does a left shift, but it takes two arguments
17927from the stack (the value to shift, and, at top-of-stack, the number of
17928bits to shift). This version interprets the prefix argument just like
17929the regular binary operations, i.e., as a word size. The Hyperbolic flag
17930has a similar effect on the rest of the binary shift and rotate commands.
17931
17932@kindex b r
17933@pindex calc-rshift-binary
17934@tindex rsh
17935The @kbd{b r} (@code{calc-rshift-binary}) [@code{rsh}] command shifts a
17936number right by one bit, or by the number of bits specified in the numeric
17937prefix argument: @samp{rsh(a,n) = lsh(a,-n)}.
17938
17939@kindex b L
17940@pindex calc-lshift-arith
17941@tindex ash
17942The @kbd{b L} (@code{calc-lshift-arith}) [@code{ash}] command shifts a
17943number left. It is analogous to @code{lsh}, except that if the shift
17944is rightward (the prefix argument is negative), an arithmetic shift
17945is performed as described below.
17946
17947@kindex b R
17948@pindex calc-rshift-arith
17949@tindex rash
17950The @kbd{b R} (@code{calc-rshift-arith}) [@code{rash}] command performs
17951an ``arithmetic'' shift to the right, in which the leftmost bit (according
17952to the current word size) is duplicated rather than shifting in zeros.
17953This corresponds to dividing by a power of two where the input is interpreted
17954as a signed, twos-complement number. (The distinction between the @samp{rsh}
17955and @samp{rash} operations is totally independent from whether the word
17956size is positive or negative.) With a negative prefix argument, this
17957performs a standard left shift.
17958
17959@kindex b t
17960@pindex calc-rotate-binary
17961@tindex rot
17962The @kbd{b t} (@code{calc-rotate-binary}) [@code{rot}] command rotates a
17963number one bit to the left. The leftmost bit (according to the current
17964word size) is dropped off the left and shifted in on the right. With a
17965numeric prefix argument, the number is rotated that many bits to the left
17966or right.
17967
17968@xref{Set Operations}, for the @kbd{b p} and @kbd{b u} commands that
17969pack and unpack binary integers into sets. (For example, @kbd{b u}
17970unpacks the number @samp{2#11001} to the set of bit-numbers
17971@samp{[0, 3, 4]}.) Type @kbd{b u V #} to count the number of ``1''
17972bits in a binary integer.
17973
17974Another interesting use of the set representation of binary integers
17975is to reverse the bits in, say, a 32-bit integer. Type @kbd{b u} to
5d67986c 17976unpack; type @kbd{31 @key{TAB} -} to replace each bit-number in the set
d7b8e6c6
EZ
17977with 31 minus that bit-number; type @kbd{b p} to pack the set back
17978into a binary integer.
17979
17980@node Scientific Functions, Matrix Functions, Arithmetic, Top
17981@chapter Scientific Functions
17982
17983@noindent
17984The functions described here perform trigonometric and other transcendental
17985calculations. They generally produce floating-point answers correct to the
17986full current precision. The @kbd{H} (Hyperbolic) and @kbd{I} (Inverse)
17987flag keys must be used to get some of these functions from the keyboard.
17988
17989@kindex P
17990@pindex calc-pi
17991@cindex @code{pi} variable
17992@vindex pi
17993@kindex H P
17994@cindex @code{e} variable
17995@vindex e
17996@kindex I P
17997@cindex @code{gamma} variable
17998@vindex gamma
17999@cindex Gamma constant, Euler's
18000@cindex Euler's gamma constant
18001@kindex H I P
18002@cindex @code{phi} variable
18003@cindex Phi, golden ratio
18004@cindex Golden ratio
18005One miscellanous command is shift-@kbd{P} (@code{calc-pi}), which pushes
18006the value of @c{$\pi$}
18007@cite{pi} (at the current precision) onto the stack. With the
18008Hyperbolic flag, it pushes the value @cite{e}, the base of natural logarithms.
18009With the Inverse flag, it pushes Euler's constant @c{$\gamma$}
18010@cite{gamma} (about 0.5772). With both Inverse and Hyperbolic, it
18011pushes the ``golden ratio'' @c{$\phi$}
18012@cite{phi} (about 1.618). (At present, Euler's constant is not available
18013to unlimited precision; Calc knows only the first 100 digits.)
18014In Symbolic mode, these commands push the
18015actual variables @samp{pi}, @samp{e}, @samp{gamma}, and @samp{phi},
18016respectively, instead of their values; @pxref{Symbolic Mode}.@refill
18017
5d67986c
RS
18018@ignore
18019@mindex Q
18020@end ignore
18021@ignore
18022@mindex I Q
18023@end ignore
d7b8e6c6
EZ
18024@kindex I Q
18025@tindex sqr
18026The @kbd{Q} (@code{calc-sqrt}) [@code{sqrt}] function is described elsewhere;
18027@pxref{Basic Arithmetic}. With the Inverse flag [@code{sqr}], this command
18028computes the square of the argument.
18029
18030@xref{Prefix Arguments}, for a discussion of the effect of numeric
18031prefix arguments on commands in this chapter which do not otherwise
18032interpret a prefix argument.
18033
18034@menu
18035* Logarithmic Functions::
18036* Trigonometric and Hyperbolic Functions::
18037* Advanced Math Functions::
18038* Branch Cuts::
18039* Random Numbers::
18040* Combinatorial Functions::
18041* Probability Distribution Functions::
18042@end menu
18043
18044@node Logarithmic Functions, Trigonometric and Hyperbolic Functions, Scientific Functions, Scientific Functions
18045@section Logarithmic Functions
18046
18047@noindent
18048@kindex L
18049@pindex calc-ln
18050@tindex ln
5d67986c
RS
18051@ignore
18052@mindex @null
18053@end ignore
d7b8e6c6
EZ
18054@kindex I E
18055The shift-@kbd{L} (@code{calc-ln}) [@code{ln}] command computes the natural
18056logarithm of the real or complex number on the top of the stack. With
18057the Inverse flag it computes the exponential function instead, although
18058this is redundant with the @kbd{E} command.
18059
18060@kindex E
18061@pindex calc-exp
18062@tindex exp
5d67986c
RS
18063@ignore
18064@mindex @null
18065@end ignore
d7b8e6c6
EZ
18066@kindex I L
18067The shift-@kbd{E} (@code{calc-exp}) [@code{exp}] command computes the
18068exponential, i.e., @cite{e} raised to the power of the number on the stack.
18069The meanings of the Inverse and Hyperbolic flags follow from those for
18070the @code{calc-ln} command.
18071
18072@kindex H L
18073@kindex H E
18074@pindex calc-log10
18075@tindex log10
18076@tindex exp10
5d67986c
RS
18077@ignore
18078@mindex @null
18079@end ignore
d7b8e6c6 18080@kindex H I L
5d67986c
RS
18081@ignore
18082@mindex @null
18083@end ignore
d7b8e6c6
EZ
18084@kindex H I E
18085The @kbd{H L} (@code{calc-log10}) [@code{log10}] command computes the common
18086(base-10) logarithm of a number. (With the Inverse flag [@code{exp10}],
18087it raises ten to a given power.) Note that the common logarithm of a
18088complex number is computed by taking the natural logarithm and dividing
18089by @c{$\ln10$}
18090@cite{ln(10)}.
18091
18092@kindex B
18093@kindex I B
18094@pindex calc-log
18095@tindex log
18096@tindex alog
18097The @kbd{B} (@code{calc-log}) [@code{log}] command computes a logarithm
18098to any base. For example, @kbd{1024 @key{RET} 2 B} produces 10, since
18099@c{$2^{10} = 1024$}
18100@cite{2^10 = 1024}. In certain cases like @samp{log(3,9)}, the result
18101will be either @cite{1:2} or @cite{0.5} depending on the current Fraction
18102Mode setting. With the Inverse flag [@code{alog}], this command is
18103similar to @kbd{^} except that the order of the arguments is reversed.
18104
18105@kindex f I
18106@pindex calc-ilog
18107@tindex ilog
18108The @kbd{f I} (@code{calc-ilog}) [@code{ilog}] command computes the
18109integer logarithm of a number to any base. The number and the base must
18110themselves be positive integers. This is the true logarithm, rounded
18111down to an integer. Thus @kbd{ilog(x,10)} is 3 for all @cite{x} in the
18112range from 1000 to 9999. If both arguments are positive integers, exact
18113integer arithmetic is used; otherwise, this is equivalent to
18114@samp{floor(log(x,b))}.
18115
18116@kindex f E
18117@pindex calc-expm1
18118@tindex expm1
18119The @kbd{f E} (@code{calc-expm1}) [@code{expm1}] command computes
18120@c{$e^x - 1$}
18121@cite{exp(x)-1}, but using an algorithm that produces a more accurate
18122answer when the result is close to zero, i.e., when @c{$e^x$}
18123@cite{exp(x)} is close
18124to one.
18125
18126@kindex f L
18127@pindex calc-lnp1
18128@tindex lnp1
18129The @kbd{f L} (@code{calc-lnp1}) [@code{lnp1}] command computes
18130@c{$\ln(x+1)$}
18131@cite{ln(x+1)}, producing a more accurate answer when @cite{x} is close
18132to zero.
18133
18134@node Trigonometric and Hyperbolic Functions, Advanced Math Functions, Logarithmic Functions, Scientific Functions
18135@section Trigonometric/Hyperbolic Functions
18136
18137@noindent
18138@kindex S
18139@pindex calc-sin
18140@tindex sin
18141The shift-@kbd{S} (@code{calc-sin}) [@code{sin}] command computes the sine
18142of an angle or complex number. If the input is an HMS form, it is interpreted
18143as degrees-minutes-seconds; otherwise, the input is interpreted according
18144to the current angular mode. It is best to use Radians mode when operating
18145on complex numbers.@refill
18146
18147Calc's ``units'' mechanism includes angular units like @code{deg},
18148@code{rad}, and @code{grad}. While @samp{sin(45 deg)} is not evaluated
18149all the time, the @kbd{u s} (@code{calc-simplify-units}) command will
18150simplify @samp{sin(45 deg)} by taking the sine of 45 degrees, regardless
18151of the current angular mode. @xref{Basic Operations on Units}.
18152
18153Also, the symbolic variable @code{pi} is not ordinarily recognized in
18154arguments to trigonometric functions, as in @samp{sin(3 pi / 4)}, but
18155the @kbd{a s} (@code{calc-simplify}) command recognizes many such
18156formulas when the current angular mode is radians @emph{and} symbolic
18157mode is enabled; this example would be replaced by @samp{sqrt(2) / 2}.
18158@xref{Symbolic Mode}. Beware, this simplification occurs even if you
18159have stored a different value in the variable @samp{pi}; this is one
18160reason why changing built-in variables is a bad idea. Arguments of
18161the form @cite{x} plus a multiple of @c{$\pi/2$}
18162@cite{pi/2} are also simplified.
18163Calc includes similar formulas for @code{cos} and @code{tan}.@refill
18164
18165The @kbd{a s} command knows all angles which are integer multiples of
18166@c{$\pi/12$}
18167@cite{pi/12}, @c{$\pi/10$}
18168@cite{pi/10}, or @c{$\pi/8$}
18169@cite{pi/8} radians. In degrees mode,
18170analogous simplifications occur for integer multiples of 15 or 18
18171degrees, and for arguments plus multiples of 90 degrees.
18172
18173@kindex I S
18174@pindex calc-arcsin
18175@tindex arcsin
18176With the Inverse flag, @code{calc-sin} computes an arcsine. This is also
18177available as the @code{calc-arcsin} command or @code{arcsin} algebraic
18178function. The returned argument is converted to degrees, radians, or HMS
18179notation depending on the current angular mode.
18180
18181@kindex H S
18182@pindex calc-sinh
18183@tindex sinh
18184@kindex H I S
18185@pindex calc-arcsinh
18186@tindex arcsinh
18187With the Hyperbolic flag, @code{calc-sin} computes the hyperbolic
18188sine, also available as @code{calc-sinh} [@code{sinh}]. With the
18189Hyperbolic and Inverse flags, it computes the hyperbolic arcsine
18190(@code{calc-arcsinh}) [@code{arcsinh}].
18191
18192@kindex C
18193@pindex calc-cos
18194@tindex cos
5d67986c
RS
18195@ignore
18196@mindex @idots
18197@end ignore
d7b8e6c6
EZ
18198@kindex I C
18199@pindex calc-arccos
5d67986c
RS
18200@ignore
18201@mindex @null
18202@end ignore
d7b8e6c6 18203@tindex arccos
5d67986c
RS
18204@ignore
18205@mindex @null
18206@end ignore
d7b8e6c6
EZ
18207@kindex H C
18208@pindex calc-cosh
5d67986c
RS
18209@ignore
18210@mindex @null
18211@end ignore
d7b8e6c6 18212@tindex cosh
5d67986c
RS
18213@ignore
18214@mindex @null
18215@end ignore
d7b8e6c6
EZ
18216@kindex H I C
18217@pindex calc-arccosh
5d67986c
RS
18218@ignore
18219@mindex @null
18220@end ignore
d7b8e6c6 18221@tindex arccosh
5d67986c
RS
18222@ignore
18223@mindex @null
18224@end ignore
d7b8e6c6
EZ
18225@kindex T
18226@pindex calc-tan
5d67986c
RS
18227@ignore
18228@mindex @null
18229@end ignore
d7b8e6c6 18230@tindex tan
5d67986c
RS
18231@ignore
18232@mindex @null
18233@end ignore
d7b8e6c6
EZ
18234@kindex I T
18235@pindex calc-arctan
5d67986c
RS
18236@ignore
18237@mindex @null
18238@end ignore
d7b8e6c6 18239@tindex arctan
5d67986c
RS
18240@ignore
18241@mindex @null
18242@end ignore
d7b8e6c6
EZ
18243@kindex H T
18244@pindex calc-tanh
5d67986c
RS
18245@ignore
18246@mindex @null
18247@end ignore
d7b8e6c6 18248@tindex tanh
5d67986c
RS
18249@ignore
18250@mindex @null
18251@end ignore
d7b8e6c6
EZ
18252@kindex H I T
18253@pindex calc-arctanh
5d67986c
RS
18254@ignore
18255@mindex @null
18256@end ignore
d7b8e6c6
EZ
18257@tindex arctanh
18258The shift-@kbd{C} (@code{calc-cos}) [@code{cos}] command computes the cosine
18259of an angle or complex number, and shift-@kbd{T} (@code{calc-tan}) [@code{tan}]
18260computes the tangent, along with all the various inverse and hyperbolic
18261variants of these functions.
18262
18263@kindex f T
18264@pindex calc-arctan2
18265@tindex arctan2
18266The @kbd{f T} (@code{calc-arctan2}) [@code{arctan2}] command takes two
18267numbers from the stack and computes the arc tangent of their ratio. The
18268result is in the full range from @i{-180} (exclusive) to @i{+180}
18269(inclusive) degrees, or the analogous range in radians. A similar
18270result would be obtained with @kbd{/} followed by @kbd{I T}, but the
18271value would only be in the range from @i{-90} to @i{+90} degrees
18272since the division loses information about the signs of the two
18273components, and an error might result from an explicit division by zero
18274which @code{arctan2} would avoid. By (arbitrary) definition,
18275@samp{arctan2(0,0)=0}.
18276
18277@pindex calc-sincos
5d67986c
RS
18278@ignore
18279@starindex
18280@end ignore
d7b8e6c6 18281@tindex sincos
5d67986c
RS
18282@ignore
18283@starindex
18284@end ignore
18285@ignore
18286@mindex arc@idots
18287@end ignore
d7b8e6c6
EZ
18288@tindex arcsincos
18289The @code{calc-sincos} [@code{sincos}] command computes the sine and
18290cosine of a number, returning them as a vector of the form
18291@samp{[@var{cos}, @var{sin}]}.
18292With the Inverse flag [@code{arcsincos}], this command takes a two-element
18293vector as an argument and computes @code{arctan2} of the elements.
18294(This command does not accept the Hyperbolic flag.)@refill
18295
18296@node Advanced Math Functions, Branch Cuts, Trigonometric and Hyperbolic Functions, Scientific Functions
18297@section Advanced Mathematical Functions
18298
18299@noindent
18300Calc can compute a variety of less common functions that arise in
18301various branches of mathematics. All of the functions described in
18302this section allow arbitrary complex arguments and, except as noted,
18303will work to arbitrarily large precisions. They can not at present
18304handle error forms or intervals as arguments.
18305
18306NOTE: These functions are still experimental. In particular, their
18307accuracy is not guaranteed in all domains. It is advisable to set the
18308current precision comfortably higher than you actually need when
18309using these functions. Also, these functions may be impractically
18310slow for some values of the arguments.
18311
18312@kindex f g
18313@pindex calc-gamma
18314@tindex gamma
18315The @kbd{f g} (@code{calc-gamma}) [@code{gamma}] command computes the Euler
18316gamma function. For positive integer arguments, this is related to the
18317factorial function: @samp{gamma(n+1) = fact(n)}. For general complex
18318arguments the gamma function can be defined by the following definite
18319integral: @c{$\Gamma(a) = \int_0^\infty t^{a-1} e^t dt$}
18320@cite{gamma(a) = integ(t^(a-1) exp(t), t, 0, inf)}.
18321(The actual implementation uses far more efficient computational methods.)
18322
18323@kindex f G
18324@tindex gammaP
5d67986c
RS
18325@ignore
18326@mindex @idots
18327@end ignore
d7b8e6c6 18328@kindex I f G
5d67986c
RS
18329@ignore
18330@mindex @null
18331@end ignore
d7b8e6c6 18332@kindex H f G
5d67986c
RS
18333@ignore
18334@mindex @null
18335@end ignore
d7b8e6c6
EZ
18336@kindex H I f G
18337@pindex calc-inc-gamma
5d67986c
RS
18338@ignore
18339@mindex @null
18340@end ignore
d7b8e6c6 18341@tindex gammaQ
5d67986c
RS
18342@ignore
18343@mindex @null
18344@end ignore
d7b8e6c6 18345@tindex gammag
5d67986c
RS
18346@ignore
18347@mindex @null
18348@end ignore
d7b8e6c6
EZ
18349@tindex gammaG
18350The @kbd{f G} (@code{calc-inc-gamma}) [@code{gammaP}] command computes
18351the incomplete gamma function, denoted @samp{P(a,x)}. This is defined by
18352the integral, @c{$P(a,x) = \left( \int_0^x t^{a-1} e^t dt \right) / \Gamma(a)$}
18353@cite{gammaP(a,x) = integ(t^(a-1) exp(t), t, 0, x) / gamma(a)}.
18354This implies that @samp{gammaP(a,inf) = 1} for any @cite{a} (see the
18355definition of the normal gamma function).
18356
18357Several other varieties of incomplete gamma function are defined.
18358The complement of @cite{P(a,x)}, called @cite{Q(a,x) = 1-P(a,x)} by
18359some authors, is computed by the @kbd{I f G} [@code{gammaQ}] command.
18360You can think of this as taking the other half of the integral, from
18361@cite{x} to infinity.
18362
18363@ifinfo
18364The functions corresponding to the integrals that define @cite{P(a,x)}
18365and @cite{Q(a,x)} but without the normalizing @cite{1/gamma(a)}
18366factor are called @cite{g(a,x)} and @cite{G(a,x)}, respectively
18367(where @cite{g} and @cite{G} represent the lower- and upper-case Greek
18368letter gamma). You can obtain these using the @kbd{H f G} [@code{gammag}]
18369and @kbd{H I f G} [@code{gammaG}] commands.
18370@end ifinfo
18371@tex
18372\turnoffactive
18373The functions corresponding to the integrals that define $P(a,x)$
18374and $Q(a,x)$ but without the normalizing $1/\Gamma(a)$
18375factor are called $\gamma(a,x)$ and $\Gamma(a,x)$, respectively.
18376You can obtain these using the \kbd{H f G} [\code{gammag}] and
18377\kbd{I H f G} [\code{gammaG}] commands.
18378@end tex
18379
18380@kindex f b
18381@pindex calc-beta
18382@tindex beta
18383The @kbd{f b} (@code{calc-beta}) [@code{beta}] command computes the
18384Euler beta function, which is defined in terms of the gamma function as
18385@c{$B(a,b) = \Gamma(a) \Gamma(b) / \Gamma(a+b)$}
18386@cite{beta(a,b) = gamma(a) gamma(b) / gamma(a+b)}, or by
18387@c{$B(a,b) = \int_0^1 t^{a-1} (1-t)^{b-1} dt$}
18388@cite{beta(a,b) = integ(t^(a-1) (1-t)^(b-1), t, 0, 1)}.
18389
18390@kindex f B
18391@kindex H f B
18392@pindex calc-inc-beta
18393@tindex betaI
18394@tindex betaB
18395The @kbd{f B} (@code{calc-inc-beta}) [@code{betaI}] command computes
18396the incomplete beta function @cite{I(x,a,b)}. It is defined by
18397@c{$I(x,a,b) = \left( \int_0^x t^{a-1} (1-t)^{b-1} dt \right) / B(a,b)$}
18398@cite{betaI(x,a,b) = integ(t^(a-1) (1-t)^(b-1), t, 0, x) / beta(a,b)}.
18399Once again, the @kbd{H} (hyperbolic) prefix gives the corresponding
18400un-normalized version [@code{betaB}].
18401
18402@kindex f e
18403@kindex I f e
18404@pindex calc-erf
18405@tindex erf
18406@tindex erfc
18407The @kbd{f e} (@code{calc-erf}) [@code{erf}] command computes the
18408error function @c{$\hbox{erf}(x) = {2 \over \sqrt{\pi}} \int_0^x e^{-t^2} dt$}
18409@cite{erf(x) = 2 integ(exp(-(t^2)), t, 0, x) / sqrt(pi)}.
18410The complementary error function @kbd{I f e} (@code{calc-erfc}) [@code{erfc}]
18411is the corresponding integral from @samp{x} to infinity; the sum
18412@c{$\hbox{erf}(x) + \hbox{erfc}(x) = 1$}
18413@cite{erf(x) + erfc(x) = 1}.
18414
18415@kindex f j
18416@kindex f y
18417@pindex calc-bessel-J
18418@pindex calc-bessel-Y
18419@tindex besJ
18420@tindex besY
18421The @kbd{f j} (@code{calc-bessel-J}) [@code{besJ}] and @kbd{f y}
18422(@code{calc-bessel-Y}) [@code{besY}] commands compute the Bessel
18423functions of the first and second kinds, respectively.
18424In @samp{besJ(n,x)} and @samp{besY(n,x)} the ``order'' parameter
18425@cite{n} is often an integer, but is not required to be one.
18426Calc's implementation of the Bessel functions currently limits the
18427precision to 8 digits, and may not be exact even to that precision.
18428Use with care!@refill
18429
18430@node Branch Cuts, Random Numbers, Advanced Math Functions, Scientific Functions
18431@section Branch Cuts and Principal Values
18432
18433@noindent
18434@cindex Branch cuts
18435@cindex Principal values
18436All of the logarithmic, trigonometric, and other scientific functions are
18437defined for complex numbers as well as for reals.
18438This section describes the values
18439returned in cases where the general result is a family of possible values.
18440Calc follows section 12.5.3 of Steele's @dfn{Common Lisp, the Language},
18441second edition, in these matters. This section will describe each
18442function briefly; for a more detailed discussion (including some nifty
18443diagrams), consult Steele's book.
18444
18445Note that the branch cuts for @code{arctan} and @code{arctanh} were
18446changed between the first and second editions of Steele. Versions of
18447Calc starting with 2.00 follow the second edition.
18448
18449The new branch cuts exactly match those of the HP-28/48 calculators.
18450They also match those of Mathematica 1.2, except that Mathematica's
18451@code{arctan} cut is always in the right half of the complex plane,
18452and its @code{arctanh} cut is always in the top half of the plane.
18453Calc's cuts are continuous with quadrants I and III for @code{arctan},
18454or II and IV for @code{arctanh}.
18455
18456Note: The current implementations of these functions with complex arguments
18457are designed with proper behavior around the branch cuts in mind, @emph{not}
18458efficiency or accuracy. You may need to increase the floating precision
18459and wait a while to get suitable answers from them.
18460
18461For @samp{sqrt(a+bi)}: When @cite{a<0} and @cite{b} is small but positive
18462or zero, the result is close to the @cite{+i} axis. For @cite{b} small and
18463negative, the result is close to the @cite{-i} axis. The result always lies
18464in the right half of the complex plane.
18465
18466For @samp{ln(a+bi)}: The real part is defined as @samp{ln(abs(a+bi))}.
18467The imaginary part is defined as @samp{arg(a+bi) = arctan2(b,a)}.
18468Thus the branch cuts for @code{sqrt} and @code{ln} both lie on the
18469negative real axis.
18470
18471The following table describes these branch cuts in another way.
18472If the real and imaginary parts of @cite{z} are as shown, then
18473the real and imaginary parts of @cite{f(z)} will be as shown.
18474Here @code{eps} stands for a small positive value; each
18475occurrence of @code{eps} may stand for a different small value.
18476
18477@smallexample
18478 z sqrt(z) ln(z)
18479----------------------------------------
18480 +, 0 +, 0 any, 0
18481 -, 0 0, + any, pi
18482 -, +eps +eps, + +eps, +
18483 -, -eps +eps, - +eps, -
18484@end smallexample
18485
18486For @samp{z1^z2}: This is defined by @samp{exp(ln(z1)*z2)}.
18487One interesting consequence of this is that @samp{(-8)^1:3} does
18488not evaluate to @i{-2} as you might expect, but to the complex
18489number @cite{(1., 1.732)}. Both of these are valid cube roots
18490of @i{-8} (as is @cite{(1., -1.732)}); Calc chooses a perhaps
18491less-obvious root for the sake of mathematical consistency.
18492
18493For @samp{arcsin(z)}: This is defined by @samp{-i*ln(i*z + sqrt(1-z^2))}.
18494The branch cuts are on the real axis, less than @i{-1} and greater than 1.
18495
18496For @samp{arccos(z)}: This is defined by @samp{-i*ln(z + i*sqrt(1-z^2))},
18497or equivalently by @samp{pi/2 - arcsin(z)}. The branch cuts are on
18498the real axis, less than @i{-1} and greater than 1.
18499
18500For @samp{arctan(z)}: This is defined by
18501@samp{(ln(1+i*z) - ln(1-i*z)) / (2*i)}. The branch cuts are on the
18502imaginary axis, below @cite{-i} and above @cite{i}.
18503
18504For @samp{arcsinh(z)}: This is defined by @samp{ln(z + sqrt(1+z^2))}.
18505The branch cuts are on the imaginary axis, below @cite{-i} and
18506above @cite{i}.
18507
18508For @samp{arccosh(z)}: This is defined by
18509@samp{ln(z + (z+1)*sqrt((z-1)/(z+1)))}. The branch cut is on the
18510real axis less than 1.
18511
18512For @samp{arctanh(z)}: This is defined by @samp{(ln(1+z) - ln(1-z)) / 2}.
18513The branch cuts are on the real axis, less than @i{-1} and greater than 1.
18514
18515The following tables for @code{arcsin}, @code{arccos}, and
18516@code{arctan} assume the current angular mode is radians. The
18517hyperbolic functions operate independently of the angular mode.
18518
18519@smallexample
18520 z arcsin(z) arccos(z)
18521-------------------------------------------------------
18522 (-1..1), 0 (-pi/2..pi/2), 0 (0..pi), 0
18523 (-1..1), +eps (-pi/2..pi/2), +eps (0..pi), -eps
18524 (-1..1), -eps (-pi/2..pi/2), -eps (0..pi), +eps
18525 <-1, 0 -pi/2, + pi, -
18526 <-1, +eps -pi/2 + eps, + pi - eps, -
18527 <-1, -eps -pi/2 + eps, - pi - eps, +
18528 >1, 0 pi/2, - 0, +
18529 >1, +eps pi/2 - eps, + +eps, -
18530 >1, -eps pi/2 - eps, - +eps, +
18531@end smallexample
18532
18533@smallexample
18534 z arccosh(z) arctanh(z)
18535-----------------------------------------------------
18536 (-1..1), 0 0, (0..pi) any, 0
18537 (-1..1), +eps +eps, (0..pi) any, +eps
18538 (-1..1), -eps +eps, (-pi..0) any, -eps
18539 <-1, 0 +, pi -, pi/2
18540 <-1, +eps +, pi - eps -, pi/2 - eps
18541 <-1, -eps +, -pi + eps -, -pi/2 + eps
18542 >1, 0 +, 0 +, -pi/2
18543 >1, +eps +, +eps +, pi/2 - eps
18544 >1, -eps +, -eps +, -pi/2 + eps
18545@end smallexample
18546
18547@smallexample
18548 z arcsinh(z) arctan(z)
18549-----------------------------------------------------
18550 0, (-1..1) 0, (-pi/2..pi/2) 0, any
18551 0, <-1 -, -pi/2 -pi/2, -
18552 +eps, <-1 +, -pi/2 + eps pi/2 - eps, -
18553 -eps, <-1 -, -pi/2 + eps -pi/2 + eps, -
18554 0, >1 +, pi/2 pi/2, +
18555 +eps, >1 +, pi/2 - eps pi/2 - eps, +
18556 -eps, >1 -, pi/2 - eps -pi/2 + eps, +
18557@end smallexample
18558
18559Finally, the following identities help to illustrate the relationship
18560between the complex trigonometric and hyperbolic functions. They
18561are valid everywhere, including on the branch cuts.
18562
18563@smallexample
18564sin(i*z) = i*sinh(z) arcsin(i*z) = i*arcsinh(z)
18565cos(i*z) = cosh(z) arcsinh(i*z) = i*arcsin(z)
18566tan(i*z) = i*tanh(z) arctan(i*z) = i*arctanh(z)
18567sinh(i*z) = i*sin(z) cosh(i*z) = cos(z)
18568@end smallexample
18569
18570The ``advanced math'' functions (gamma, Bessel, etc.@:) are also defined
18571for general complex arguments, but their branch cuts and principal values
18572are not rigorously specified at present.
18573
18574@node Random Numbers, Combinatorial Functions, Branch Cuts, Scientific Functions
18575@section Random Numbers
18576
18577@noindent
18578@kindex k r
18579@pindex calc-random
18580@tindex random
18581The @kbd{k r} (@code{calc-random}) [@code{random}] command produces
18582random numbers of various sorts.
18583
18584Given a positive numeric prefix argument @cite{M}, it produces a random
18585integer @cite{N} in the range @c{$0 \le N < M$}
18586@cite{0 <= N < M}. Each of the @cite{M}
18587values appears with equal probability.@refill
18588
18589With no numeric prefix argument, the @kbd{k r} command takes its argument
18590from the stack instead. Once again, if this is a positive integer @cite{M}
18591the result is a random integer less than @cite{M}. However, note that
18592while numeric prefix arguments are limited to six digits or so, an @cite{M}
18593taken from the stack can be arbitrarily large. If @cite{M} is negative,
18594the result is a random integer in the range @c{$M < N \le 0$}
18595@cite{M < N <= 0}.
18596
18597If the value on the stack is a floating-point number @cite{M}, the result
18598is a random floating-point number @cite{N} in the range @c{$0 \le N < M$}
18599@cite{0 <= N < M}
18600or @c{$M < N \le 0$}
18601@cite{M < N <= 0}, according to the sign of @cite{M}.
18602
18603If @cite{M} is zero, the result is a Gaussian-distributed random real
18604number; the distribution has a mean of zero and a standard deviation
18605of one. The algorithm used generates random numbers in pairs; thus,
18606every other call to this function will be especially fast.
18607
18608If @cite{M} is an error form @c{$m$ @code{+/-} $\sigma$}
5d67986c 18609@samp{m +/- s} where @var{m}
d7b8e6c6 18610and @c{$\sigma$}
5d67986c
RS
18611@var{s} are both real numbers, the result uses a Gaussian
18612distribution with mean @var{m} and standard deviation @c{$\sigma$}
18613@var{s}.
d7b8e6c6
EZ
18614
18615If @cite{M} is an interval form, the lower and upper bounds specify the
18616acceptable limits of the random numbers. If both bounds are integers,
18617the result is a random integer in the specified range. If either bound
18618is floating-point, the result is a random real number in the specified
18619range. If the interval is open at either end, the result will be sure
18620not to equal that end value. (This makes a big difference for integer
18621intervals, but for floating-point intervals it's relatively minor:
18622with a precision of 6, @samp{random([1.0..2.0))} will return any of one
18623million numbers from 1.00000 to 1.99999; @samp{random([1.0..2.0])} may
18624additionally return 2.00000, but the probability of this happening is
18625extremely small.)
18626
18627If @cite{M} is a vector, the result is one element taken at random from
18628the vector. All elements of the vector are given equal probabilities.
18629
18630@vindex RandSeed
18631The sequence of numbers produced by @kbd{k r} is completely random by
18632default, i.e., the sequence is seeded each time you start Calc using
18633the current time and other information. You can get a reproducible
18634sequence by storing a particular ``seed value'' in the Calc variable
18635@code{RandSeed}. Any integer will do for a seed; integers of from 1
18636to 12 digits are good. If you later store a different integer into
18637@code{RandSeed}, Calc will switch to a different pseudo-random
18638sequence. If you ``unstore'' @code{RandSeed}, Calc will re-seed itself
18639from the current time. If you store the same integer that you used
18640before back into @code{RandSeed}, you will get the exact same sequence
18641of random numbers as before.
18642
18643@pindex calc-rrandom
18644The @code{calc-rrandom} command (not on any key) produces a random real
18645number between zero and one. It is equivalent to @samp{random(1.0)}.
18646
18647@kindex k a
18648@pindex calc-random-again
18649The @kbd{k a} (@code{calc-random-again}) command produces another random
18650number, re-using the most recent value of @cite{M}. With a numeric
18651prefix argument @var{n}, it produces @var{n} more random numbers using
18652that value of @cite{M}.
18653
18654@kindex k h
18655@pindex calc-shuffle
18656@tindex shuffle
18657The @kbd{k h} (@code{calc-shuffle}) command produces a vector of several
18658random values with no duplicates. The value on the top of the stack
18659specifies the set from which the random values are drawn, and may be any
18660of the @cite{M} formats described above. The numeric prefix argument
18661gives the length of the desired list. (If you do not provide a numeric
18662prefix argument, the length of the list is taken from the top of the
18663stack, and @cite{M} from second-to-top.)
18664
18665If @cite{M} is a floating-point number, zero, or an error form (so
18666that the random values are being drawn from the set of real numbers)
18667there is little practical difference between using @kbd{k h} and using
18668@kbd{k r} several times. But if the set of possible values consists
18669of just a few integers, or the elements of a vector, then there is
18670a very real chance that multiple @kbd{k r}'s will produce the same
18671number more than once. The @kbd{k h} command produces a vector whose
18672elements are always distinct. (Actually, there is a slight exception:
18673If @cite{M} is a vector, no given vector element will be drawn more
18674than once, but if several elements of @cite{M} are equal, they may
18675each make it into the result vector.)
18676
18677One use of @kbd{k h} is to rearrange a list at random. This happens
18678if the prefix argument is equal to the number of values in the list:
18679@kbd{[1, 1.5, 2, 2.5, 3] 5 k h} might produce the permuted list
18680@samp{[2.5, 1, 1.5, 3, 2]}. As a convenient feature, if the argument
18681@var{n} is negative it is replaced by the size of the set represented
18682by @cite{M}. Naturally, this is allowed only when @cite{M} specifies
18683a small discrete set of possibilities.
18684
18685To do the equivalent of @kbd{k h} but with duplications allowed,
18686given @cite{M} on the stack and with @var{n} just entered as a numeric
18687prefix, use @kbd{v b} to build a vector of copies of @cite{M}, then use
18688@kbd{V M k r} to ``map'' the normal @kbd{k r} function over the
18689elements of this vector. @xref{Matrix Functions}.
18690
18691@menu
18692* Random Number Generator:: (Complete description of Calc's algorithm)
18693@end menu
18694
18695@node Random Number Generator, , Random Numbers, Random Numbers
18696@subsection Random Number Generator
18697
18698Calc's random number generator uses several methods to ensure that
18699the numbers it produces are highly random. Knuth's @emph{Art of
18700Computer Programming}, Volume II, contains a thorough description
18701of the theory of random number generators and their measurement and
18702characterization.
18703
18704If @code{RandSeed} has no stored value, Calc calls Emacs' built-in
18705@code{random} function to get a stream of random numbers, which it
18706then treats in various ways to avoid problems inherent in the simple
18707random number generators that many systems use to implement @code{random}.
18708
18709When Calc's random number generator is first invoked, it ``seeds''
18710the low-level random sequence using the time of day, so that the
18711random number sequence will be different every time you use Calc.
18712
18713Since Emacs Lisp doesn't specify the range of values that will be
18714returned by its @code{random} function, Calc exercises the function
18715several times to estimate the range. When Calc subsequently uses
18716the @code{random} function, it takes only 10 bits of the result
18717near the most-significant end. (It avoids at least the bottom
18718four bits, preferably more, and also tries to avoid the top two
18719bits.) This strategy works well with the linear congruential
18720generators that are typically used to implement @code{random}.
18721
18722If @code{RandSeed} contains an integer, Calc uses this integer to
18723seed an ``additive congruential'' method (Knuth's algorithm 3.2.2A,
18724computing @c{$X_{n-55} - X_{n-24}$}
18725@cite{X_n-55 - X_n-24}). This method expands the seed
18726value into a large table which is maintained internally; the variable
18727@code{RandSeed} is changed from, e.g., 42 to the vector @cite{[42]}
18728to indicate that the seed has been absorbed into this table. When
18729@code{RandSeed} contains a vector, @kbd{k r} and related commands
18730continue to use the same internal table as last time. There is no
18731way to extract the complete state of the random number generator
18732so that you can restart it from any point; you can only restart it
18733from the same initial seed value. A simple way to restart from the
18734same seed is to type @kbd{s r RandSeed} to get the seed vector,
18735@kbd{v u} to unpack it back into a number, then @kbd{s t RandSeed}
18736to reseed the generator with that number.
18737
18738Calc uses a ``shuffling'' method as described in algorithm 3.2.2B
18739of Knuth. It fills a table with 13 random 10-bit numbers. Then,
18740to generate a new random number, it uses the previous number to
18741index into the table, picks the value it finds there as the new
18742random number, then replaces that table entry with a new value
18743obtained from a call to the base random number generator (either
18744the additive congruential generator or the @code{random} function
18745supplied by the system). If there are any flaws in the base
18746generator, shuffling will tend to even them out. But if the system
18747provides an excellent @code{random} function, shuffling will not
18748damage its randomness.
18749
18750To create a random integer of a certain number of digits, Calc
18751builds the integer three decimal digits at a time. For each group
18752of three digits, Calc calls its 10-bit shuffling random number generator
18753(which returns a value from 0 to 1023); if the random value is 1000
18754or more, Calc throws it out and tries again until it gets a suitable
18755value.
18756
18757To create a random floating-point number with precision @var{p}, Calc
18758simply creates a random @var{p}-digit integer and multiplies by
18759@c{$10^{-p}$}
18760@cite{10^-p}. The resulting random numbers should be very clean, but note
18761that relatively small numbers will have few significant random digits.
18762In other words, with a precision of 12, you will occasionally get
18763numbers on the order of @c{$10^{-9}$}
18764@cite{10^-9} or @c{$10^{-10}$}
18765@cite{10^-10}, but those numbers
18766will only have two or three random digits since they correspond to small
18767integers times @c{$10^{-12}$}
18768@cite{10^-12}.
18769
18770To create a random integer in the interval @samp{[0 .. @var{m})}, Calc
18771counts the digits in @var{m}, creates a random integer with three
18772additional digits, then reduces modulo @var{m}. Unless @var{m} is a
18773power of ten the resulting values will be very slightly biased toward
18774the lower numbers, but this bias will be less than 0.1%. (For example,
18775if @var{m} is 42, Calc will reduce a random integer less than 100000
18776modulo 42 to get a result less than 42. It is easy to show that the
18777numbers 40 and 41 will be only 2380/2381 as likely to result from this
18778modulo operation as numbers 39 and below.) If @var{m} is a power of
18779ten, however, the numbers should be completely unbiased.
18780
18781The Gaussian random numbers generated by @samp{random(0.0)} use the
18782``polar'' method described in Knuth section 3.4.1C. This method
18783generates a pair of Gaussian random numbers at a time, so only every
18784other call to @samp{random(0.0)} will require significant calculations.
18785
18786@node Combinatorial Functions, Probability Distribution Functions, Random Numbers, Scientific Functions
18787@section Combinatorial Functions
18788
18789@noindent
18790Commands relating to combinatorics and number theory begin with the
18791@kbd{k} key prefix.
18792
18793@kindex k g
18794@pindex calc-gcd
18795@tindex gcd
18796The @kbd{k g} (@code{calc-gcd}) [@code{gcd}] command computes the
18797Greatest Common Divisor of two integers. It also accepts fractions;
18798the GCD of two fractions is defined by taking the GCD of the
18799numerators, and the LCM of the denominators. This definition is
18800consistent with the idea that @samp{a / gcd(a,x)} should yield an
18801integer for any @samp{a} and @samp{x}. For other types of arguments,
18802the operation is left in symbolic form.@refill
18803
18804@kindex k l
18805@pindex calc-lcm
18806@tindex lcm
18807The @kbd{k l} (@code{calc-lcm}) [@code{lcm}] command computes the
18808Least Common Multiple of two integers or fractions. The product of
18809the LCM and GCD of two numbers is equal to the product of the
18810numbers.@refill
18811
18812@kindex k E
18813@pindex calc-extended-gcd
18814@tindex egcd
18815The @kbd{k E} (@code{calc-extended-gcd}) [@code{egcd}] command computes
18816the GCD of two integers @cite{x} and @cite{y} and returns a vector
18817@cite{[g, a, b]} where @c{$g = \gcd(x,y) = a x + b y$}
18818@cite{g = gcd(x,y) = a x + b y}.
18819
18820@kindex !
18821@pindex calc-factorial
18822@tindex fact
5d67986c
RS
18823@ignore
18824@mindex @null
18825@end ignore
d7b8e6c6
EZ
18826@tindex !
18827The @kbd{!} (@code{calc-factorial}) [@code{fact}] command computes the
18828factorial of the number at the top of the stack. If the number is an
18829integer, the result is an exact integer. If the number is an
18830integer-valued float, the result is a floating-point approximation. If
18831the number is a non-integral real number, the generalized factorial is used,
18832as defined by the Euler Gamma function. Please note that computation of
18833large factorials can be slow; using floating-point format will help
18834since fewer digits must be maintained. The same is true of many of
18835the commands in this section.@refill
18836
18837@kindex k d
18838@pindex calc-double-factorial
18839@tindex dfact
5d67986c
RS
18840@ignore
18841@mindex @null
18842@end ignore
d7b8e6c6
EZ
18843@tindex !!
18844The @kbd{k d} (@code{calc-double-factorial}) [@code{dfact}] command
18845computes the ``double factorial'' of an integer. For an even integer,
18846this is the product of even integers from 2 to @cite{N}. For an odd
18847integer, this is the product of odd integers from 3 to @cite{N}. If
18848the argument is an integer-valued float, the result is a floating-point
18849approximation. This function is undefined for negative even integers.
18850The notation @cite{N!!} is also recognized for double factorials.@refill
18851
18852@kindex k c
18853@pindex calc-choose
18854@tindex choose
18855The @kbd{k c} (@code{calc-choose}) [@code{choose}] command computes the
18856binomial coefficient @cite{N}-choose-@cite{M}, where @cite{M} is the number
18857on the top of the stack and @cite{N} is second-to-top. If both arguments
18858are integers, the result is an exact integer. Otherwise, the result is a
18859floating-point approximation. The binomial coefficient is defined for all
18860real numbers by @c{$N! \over M! (N-M)!\,$}
18861@cite{N! / M! (N-M)!}.
18862
18863@kindex H k c
18864@pindex calc-perm
18865@tindex perm
18866@ifinfo
18867The @kbd{H k c} (@code{calc-perm}) [@code{perm}] command computes the
18868number-of-permutations function @cite{N! / (N-M)!}.
18869@end ifinfo
18870@tex
18871The \kbd{H k c} (\code{calc-perm}) [\code{perm}] command computes the
18872number-of-perm\-utations function $N! \over (N-M)!\,$.
18873@end tex
18874
18875@kindex k b
18876@kindex H k b
18877@pindex calc-bernoulli-number
18878@tindex bern
18879The @kbd{k b} (@code{calc-bernoulli-number}) [@code{bern}] command
18880computes a given Bernoulli number. The value at the top of the stack
18881is a nonnegative integer @cite{n} that specifies which Bernoulli number
18882is desired. The @kbd{H k b} command computes a Bernoulli polynomial,
18883taking @cite{n} from the second-to-top position and @cite{x} from the
18884top of the stack. If @cite{x} is a variable or formula the result is
18885a polynomial in @cite{x}; if @cite{x} is a number the result is a number.
18886
18887@kindex k e
18888@kindex H k e
18889@pindex calc-euler-number
18890@tindex euler
18891The @kbd{k e} (@code{calc-euler-number}) [@code{euler}] command similarly
18892computes an Euler number, and @w{@kbd{H k e}} computes an Euler polynomial.
18893Bernoulli and Euler numbers occur in the Taylor expansions of several
18894functions.
18895
18896@kindex k s
18897@kindex H k s
18898@pindex calc-stirling-number
18899@tindex stir1
18900@tindex stir2
18901The @kbd{k s} (@code{calc-stirling-number}) [@code{stir1}] command
18902computes a Stirling number of the first kind@c{ $n \brack m$}
18903@asis{}, given two integers
18904@cite{n} and @cite{m} on the stack. The @kbd{H k s} [@code{stir2}]
18905command computes a Stirling number of the second kind@c{ $n \brace m$}
18906@asis{}. These are
18907the number of @cite{m}-cycle permutations of @cite{n} objects, and
18908the number of ways to partition @cite{n} objects into @cite{m}
18909non-empty sets, respectively.
18910
18911@kindex k p
18912@pindex calc-prime-test
18913@cindex Primes
18914The @kbd{k p} (@code{calc-prime-test}) command checks if the integer on
18915the top of the stack is prime. For integers less than eight million, the
18916answer is always exact and reasonably fast. For larger integers, a
18917probabilistic method is used (see Knuth vol. II, section 4.5.4, algorithm P).
18918The number is first checked against small prime factors (up to 13). Then,
18919any number of iterations of the algorithm are performed. Each step either
18920discovers that the number is non-prime, or substantially increases the
18921certainty that the number is prime. After a few steps, the chance that
18922a number was mistakenly described as prime will be less than one percent.
18923(Indeed, this is a worst-case estimate of the probability; in practice
18924even a single iteration is quite reliable.) After the @kbd{k p} command,
18925the number will be reported as definitely prime or non-prime if possible,
18926or otherwise ``probably'' prime with a certain probability of error.
18927
5d67986c
RS
18928@ignore
18929@starindex
18930@end ignore
d7b8e6c6
EZ
18931@tindex prime
18932The normal @kbd{k p} command performs one iteration of the primality
18933test. Pressing @kbd{k p} repeatedly for the same integer will perform
18934additional iterations. Also, @kbd{k p} with a numeric prefix performs
18935the specified number of iterations. There is also an algebraic function
18936@samp{prime(n)} or @samp{prime(n,iters)} which returns 1 if @cite{n}
18937is (probably) prime and 0 if not.
18938
18939@kindex k f
18940@pindex calc-prime-factors
18941@tindex prfac
18942The @kbd{k f} (@code{calc-prime-factors}) [@code{prfac}] command
18943attempts to decompose an integer into its prime factors. For numbers up
18944to 25 million, the answer is exact although it may take some time. The
18945result is a vector of the prime factors in increasing order. For larger
18946inputs, prime factors above 5000 may not be found, in which case the
18947last number in the vector will be an unfactored integer greater than 25
18948million (with a warning message). For negative integers, the first
18949element of the list will be @i{-1}. For inputs @i{-1}, @i{0}, and
18950@i{1}, the result is a list of the same number.
18951
18952@kindex k n
18953@pindex calc-next-prime
5d67986c
RS
18954@ignore
18955@mindex nextpr@idots
18956@end ignore
d7b8e6c6
EZ
18957@tindex nextprime
18958The @kbd{k n} (@code{calc-next-prime}) [@code{nextprime}] command finds
18959the next prime above a given number. Essentially, it searches by calling
18960@code{calc-prime-test} on successive integers until it finds one that
18961passes the test. This is quite fast for integers less than eight million,
18962but once the probabilistic test comes into play the search may be rather
18963slow. Ordinarily this command stops for any prime that passes one iteration
18964of the primality test. With a numeric prefix argument, a number must pass
18965the specified number of iterations before the search stops. (This only
18966matters when searching above eight million.) You can always use additional
18967@kbd{k p} commands to increase your certainty that the number is indeed
18968prime.
18969
18970@kindex I k n
18971@pindex calc-prev-prime
5d67986c
RS
18972@ignore
18973@mindex prevpr@idots
18974@end ignore
d7b8e6c6
EZ
18975@tindex prevprime
18976The @kbd{I k n} (@code{calc-prev-prime}) [@code{prevprime}] command
18977analogously finds the next prime less than a given number.
18978
18979@kindex k t
18980@pindex calc-totient
18981@tindex totient
18982The @kbd{k t} (@code{calc-totient}) [@code{totient}] command computes the
18983Euler ``totient'' function@c{ $\phi(n)$}
18984@asis{}, the number of integers less than @cite{n} which
18985are relatively prime to @cite{n}.
18986
18987@kindex k m
18988@pindex calc-moebius
18989@tindex moebius
18990The @kbd{k m} (@code{calc-moebius}) [@code{moebius}] command computes the
18991@c{M\"obius $\mu$}
18992@asis{Moebius ``mu''} function. If the input number is a product of @cite{k}
18993distinct factors, this is @cite{(-1)^k}. If the input number has any
18994duplicate factors (i.e., can be divided by the same prime more than once),
18995the result is zero.
18996
18997@node Probability Distribution Functions, , Combinatorial Functions, Scientific Functions
18998@section Probability Distribution Functions
18999
19000@noindent
19001The functions in this section compute various probability distributions.
19002For continuous distributions, this is the integral of the probability
19003density function from @cite{x} to infinity. (These are the ``upper
19004tail'' distribution functions; there are also corresponding ``lower
19005tail'' functions which integrate from minus infinity to @cite{x}.)
19006For discrete distributions, the upper tail function gives the sum
19007from @cite{x} to infinity; the lower tail function gives the sum
19008from minus infinity up to, but not including,@w{ }@cite{x}.
19009
19010To integrate from @cite{x} to @cite{y}, just use the distribution
19011function twice and subtract. For example, the probability that a
19012Gaussian random variable with mean 2 and standard deviation 1 will
19013lie in the range from 2.5 to 2.8 is @samp{utpn(2.5,2,1) - utpn(2.8,2,1)}
19014(``the probability that it is greater than 2.5, but not greater than 2.8''),
19015or equivalently @samp{ltpn(2.8,2,1) - ltpn(2.5,2,1)}.
19016
19017@kindex k B
19018@kindex I k B
19019@pindex calc-utpb
19020@tindex utpb
19021@tindex ltpb
19022The @kbd{k B} (@code{calc-utpb}) [@code{utpb}] function uses the
19023binomial distribution. Push the parameters @var{n}, @var{p}, and
19024then @var{x} onto the stack; the result (@samp{utpb(x,n,p)}) is the
19025probability that an event will occur @var{x} or more times out
19026of @var{n} trials, if its probability of occurring in any given
19027trial is @var{p}. The @kbd{I k B} [@code{ltpb}] function is
19028the probability that the event will occur fewer than @var{x} times.
19029
19030The other probability distribution functions similarly take the
19031form @kbd{k @var{X}} (@code{calc-utp@var{x}}) [@code{utp@var{x}}]
19032and @kbd{I k @var{X}} [@code{ltp@var{x}}], for various letters
19033@var{x}. The arguments to the algebraic functions are the value of
19034the random variable first, then whatever other parameters define the
19035distribution. Note these are among the few Calc functions where the
19036order of the arguments in algebraic form differs from the order of
19037arguments as found on the stack. (The random variable comes last on
19038the stack, so that you can type, e.g., @kbd{2 @key{RET} 1 @key{RET} 2.5
19039k N M-@key{RET} @key{DEL} 2.8 k N -}, using @kbd{M-@key{RET} @key{DEL}} to
19040recover the original arguments but substitute a new value for @cite{x}.)
19041
19042@kindex k C
19043@pindex calc-utpc
19044@tindex utpc
5d67986c
RS
19045@ignore
19046@mindex @idots
19047@end ignore
d7b8e6c6 19048@kindex I k C
5d67986c
RS
19049@ignore
19050@mindex @null
19051@end ignore
d7b8e6c6
EZ
19052@tindex ltpc
19053The @samp{utpc(x,v)} function uses the chi-square distribution with
19054@c{$\nu$}
19055@cite{v} degrees of freedom. It is the probability that a model is
19056correct if its chi-square statistic is @cite{x}.
19057
19058@kindex k F
19059@pindex calc-utpf
19060@tindex utpf
5d67986c
RS
19061@ignore
19062@mindex @idots
19063@end ignore
d7b8e6c6 19064@kindex I k F
5d67986c
RS
19065@ignore
19066@mindex @null
19067@end ignore
d7b8e6c6
EZ
19068@tindex ltpf
19069The @samp{utpf(F,v1,v2)} function uses the F distribution, used in
19070various statistical tests. The parameters @c{$\nu_1$}
19071@cite{v1} and @c{$\nu_2$}
19072@cite{v2}
19073are the degrees of freedom in the numerator and denominator,
19074respectively, used in computing the statistic @cite{F}.
19075
19076@kindex k N
19077@pindex calc-utpn
19078@tindex utpn
5d67986c
RS
19079@ignore
19080@mindex @idots
19081@end ignore
d7b8e6c6 19082@kindex I k N
5d67986c
RS
19083@ignore
19084@mindex @null
19085@end ignore
d7b8e6c6
EZ
19086@tindex ltpn
19087The @samp{utpn(x,m,s)} function uses a normal (Gaussian) distribution
19088with mean @cite{m} and standard deviation @c{$\sigma$}
19089@cite{s}. It is the
19090probability that such a normal-distributed random variable would
19091exceed @cite{x}.
19092
19093@kindex k P
19094@pindex calc-utpp
19095@tindex utpp
5d67986c
RS
19096@ignore
19097@mindex @idots
19098@end ignore
d7b8e6c6 19099@kindex I k P
5d67986c
RS
19100@ignore
19101@mindex @null
19102@end ignore
d7b8e6c6
EZ
19103@tindex ltpp
19104The @samp{utpp(n,x)} function uses a Poisson distribution with
19105mean @cite{x}. It is the probability that @cite{n} or more such
19106Poisson random events will occur.
19107
19108@kindex k T
19109@pindex calc-ltpt
19110@tindex utpt
5d67986c
RS
19111@ignore
19112@mindex @idots
19113@end ignore
d7b8e6c6 19114@kindex I k T
5d67986c
RS
19115@ignore
19116@mindex @null
19117@end ignore
d7b8e6c6
EZ
19118@tindex ltpt
19119The @samp{utpt(t,v)} function uses the Student's ``t'' distribution
19120with @c{$\nu$}
19121@cite{v} degrees of freedom. It is the probability that a
19122t-distributed random variable will be greater than @cite{t}.
19123(Note: This computes the distribution function @c{$A(t|\nu)$}
19124@cite{A(t|v)}
19125where @c{$A(0|\nu) = 1$}
19126@cite{A(0|v) = 1} and @c{$A(\infty|\nu) \to 0$}
19127@cite{A(inf|v) -> 0}. The
19128@code{UTPT} operation on the HP-48 uses a different definition
19129which returns half of Calc's value: @samp{UTPT(t,v) = .5*utpt(t,v)}.)
19130
19131While Calc does not provide inverses of the probability distribution
19132functions, the @kbd{a R} command can be used to solve for the inverse.
19133Since the distribution functions are monotonic, @kbd{a R} is guaranteed
19134to be able to find a solution given any initial guess.
19135@xref{Numerical Solutions}.
19136
19137@node Matrix Functions, Algebra, Scientific Functions, Top
19138@chapter Vector/Matrix Functions
19139
19140@noindent
19141Many of the commands described here begin with the @kbd{v} prefix.
19142(For convenience, the shift-@kbd{V} prefix is equivalent to @kbd{v}.)
19143The commands usually apply to both plain vectors and matrices; some
19144apply only to matrices or only to square matrices. If the argument
19145has the wrong dimensions the operation is left in symbolic form.
19146
19147Vectors are entered and displayed using @samp{[a,b,c]} notation.
19148Matrices are vectors of which all elements are vectors of equal length.
19149(Though none of the standard Calc commands use this concept, a
19150three-dimensional matrix or rank-3 tensor could be defined as a
19151vector of matrices, and so on.)
19152
19153@menu
19154* Packing and Unpacking::
19155* Building Vectors::
19156* Extracting Elements::
19157* Manipulating Vectors::
19158* Vector and Matrix Arithmetic::
19159* Set Operations::
19160* Statistical Operations::
19161* Reducing and Mapping::
19162* Vector and Matrix Formats::
19163@end menu
19164
19165@node Packing and Unpacking, Building Vectors, Matrix Functions, Matrix Functions
19166@section Packing and Unpacking
19167
19168@noindent
19169Calc's ``pack'' and ``unpack'' commands collect stack entries to build
19170composite objects such as vectors and complex numbers. They are
19171described in this chapter because they are most often used to build
19172vectors.
19173
19174@kindex v p
19175@pindex calc-pack
19176The @kbd{v p} (@code{calc-pack}) [@code{pack}] command collects several
19177elements from the stack into a matrix, complex number, HMS form, error
19178form, etc. It uses a numeric prefix argument to specify the kind of
19179object to be built; this argument is referred to as the ``packing mode.''
19180If the packing mode is a nonnegative integer, a vector of that
19181length is created. For example, @kbd{C-u 5 v p} will pop the top
19182five stack elements and push back a single vector of those five
19183elements. (@kbd{C-u 0 v p} simply creates an empty vector.)
19184
19185The same effect can be had by pressing @kbd{[} to push an incomplete
19186vector on the stack, using @key{TAB} (@code{calc-roll-down}) to sneak
19187the incomplete object up past a certain number of elements, and
19188then pressing @kbd{]} to complete the vector.
19189
19190Negative packing modes create other kinds of composite objects:
19191
19192@table @cite
19193@item -1
19194Two values are collected to build a complex number. For example,
19195@kbd{5 @key{RET} 7 C-u -1 v p} creates the complex number
19196@cite{(5, 7)}. The result is always a rectangular complex
19197number. The two input values must both be real numbers,
19198i.e., integers, fractions, or floats. If they are not, Calc
19199will instead build a formula like @samp{a + (0, 1) b}. (The
19200other packing modes also create a symbolic answer if the
19201components are not suitable.)
19202
19203@item -2
19204Two values are collected to build a polar complex number.
19205The first is the magnitude; the second is the phase expressed
19206in either degrees or radians according to the current angular
19207mode.
19208
19209@item -3
19210Three values are collected into an HMS form. The first
19211two values (hours and minutes) must be integers or
19212integer-valued floats. The third value may be any real
19213number.
19214
19215@item -4
19216Two values are collected into an error form. The inputs
19217may be real numbers or formulas.
19218
19219@item -5
19220Two values are collected into a modulo form. The inputs
19221must be real numbers.
19222
19223@item -6
19224Two values are collected into the interval @samp{[a .. b]}.
19225The inputs may be real numbers, HMS or date forms, or formulas.
19226
19227@item -7
19228Two values are collected into the interval @samp{[a .. b)}.
19229
19230@item -8
19231Two values are collected into the interval @samp{(a .. b]}.
19232
19233@item -9
19234Two values are collected into the interval @samp{(a .. b)}.
19235
19236@item -10
19237Two integer values are collected into a fraction.
19238
19239@item -11
19240Two values are collected into a floating-point number.
19241The first is the mantissa; the second, which must be an
19242integer, is the exponent. The result is the mantissa
19243times ten to the power of the exponent.
19244
19245@item -12
19246This is treated the same as @i{-11} by the @kbd{v p} command.
19247When unpacking, @i{-12} specifies that a floating-point mantissa
19248is desired.
19249
19250@item -13
19251A real number is converted into a date form.
19252
19253@item -14
19254Three numbers (year, month, day) are packed into a pure date form.
19255
19256@item -15
19257Six numbers are packed into a date/time form.
19258@end table
19259
19260With any of the two-input negative packing modes, either or both
19261of the inputs may be vectors. If both are vectors of the same
19262length, the result is another vector made by packing corresponding
19263elements of the input vectors. If one input is a vector and the
19264other is a plain number, the number is packed along with each vector
19265element to produce a new vector. For example, @kbd{C-u -4 v p}
19266could be used to convert a vector of numbers and a vector of errors
19267into a single vector of error forms; @kbd{C-u -5 v p} could convert
19268a vector of numbers and a single number @var{M} into a vector of
19269numbers modulo @var{M}.
19270
19271If you don't give a prefix argument to @kbd{v p}, it takes
19272the packing mode from the top of the stack. The elements to
19273be packed then begin at stack level 2. Thus
19274@kbd{1 @key{RET} 2 @key{RET} 4 n v p} is another way to
19275enter the error form @samp{1 +/- 2}.
19276
19277If the packing mode taken from the stack is a vector, the result is a
19278matrix with the dimensions specified by the elements of the vector,
19279which must each be integers. For example, if the packing mode is
19280@samp{[2, 3]}, then six numbers will be taken from the stack and
19281returned in the form @samp{[@w{[a, b, c]}, [d, e, f]]}.
19282
19283If any elements of the vector are negative, other kinds of
19284packing are done at that level as described above. For
19285example, @samp{[2, 3, -4]} takes 12 objects and creates a
19286@c{$2\times3$}
19287@asis{2x3} matrix of error forms: @samp{[[a +/- b, c +/- d ... ]]}.
19288Also, @samp{[-4, -10]} will convert four integers into an
19289error form consisting of two fractions: @samp{a:b +/- c:d}.
19290
5d67986c
RS
19291@ignore
19292@starindex
19293@end ignore
d7b8e6c6
EZ
19294@tindex pack
19295There is an equivalent algebraic function,
19296@samp{pack(@var{mode}, @var{items})} where @var{mode} is a
19297packing mode (an integer or a vector of integers) and @var{items}
19298is a vector of objects to be packed (re-packed, really) according
19299to that mode. For example, @samp{pack([3, -4], [a,b,c,d,e,f])}
19300yields @samp{[a +/- b, @w{c +/- d}, e +/- f]}. The function is
19301left in symbolic form if the packing mode is illegal, or if the
19302number of data items does not match the number of items required
19303by the mode.
19304
19305@kindex v u
19306@pindex calc-unpack
19307The @kbd{v u} (@code{calc-unpack}) command takes the vector, complex
19308number, HMS form, or other composite object on the top of the stack and
19309``unpacks'' it, pushing each of its elements onto the stack as separate
19310objects. Thus, it is the ``inverse'' of @kbd{v p}. If the value
19311at the top of the stack is a formula, @kbd{v u} unpacks it by pushing
19312each of the arguments of the top-level operator onto the stack.
19313
19314You can optionally give a numeric prefix argument to @kbd{v u}
19315to specify an explicit (un)packing mode. If the packing mode is
19316negative and the input is actually a vector or matrix, the result
19317will be two or more similar vectors or matrices of the elements.
19318For example, given the vector @samp{[@w{a +/- b}, c^2, d +/- 7]},
19319the result of @kbd{C-u -4 v u} will be the two vectors
19320@samp{[a, c^2, d]} and @w{@samp{[b, 0, 7]}}.
19321
19322Note that the prefix argument can have an effect even when the input is
19323not a vector. For example, if the input is the number @i{-5}, then
19324@kbd{c-u -1 v u} yields @i{-5} and 0 (the components of @i{-5}
19325when viewed as a rectangular complex number); @kbd{C-u -2 v u} yields 5
19326and 180 (assuming degrees mode); and @kbd{C-u -10 v u} yields @i{-5}
19327and 1 (the numerator and denominator of @i{-5}, viewed as a rational
19328number). Plain @kbd{v u} with this input would complain that the input
19329is not a composite object.
19330
19331Unpacking mode @i{-11} converts a float into an integer mantissa and
19332an integer exponent, where the mantissa is not divisible by 10
19333(except that 0.0 is represented by a mantissa and exponent of 0).
19334Unpacking mode @i{-12} converts a float into a floating-point mantissa
19335and integer exponent, where the mantissa (for non-zero numbers)
19336is guaranteed to lie in the range [1 .. 10). In both cases,
19337the mantissa is shifted left or right (and the exponent adjusted
19338to compensate) in order to satisfy these constraints.
19339
19340Positive unpacking modes are treated differently than for @kbd{v p}.
19341A mode of 1 is much like plain @kbd{v u} with no prefix argument,
19342except that in addition to the components of the input object,
19343a suitable packing mode to re-pack the object is also pushed.
19344Thus, @kbd{C-u 1 v u} followed by @kbd{v p} will re-build the
19345original object.
19346
19347A mode of 2 unpacks two levels of the object; the resulting
19348re-packing mode will be a vector of length 2. This might be used
19349to unpack a matrix, say, or a vector of error forms. Higher
19350unpacking modes unpack the input even more deeply.
19351
5d67986c
RS
19352@ignore
19353@starindex
19354@end ignore
d7b8e6c6
EZ
19355@tindex unpack
19356There are two algebraic functions analogous to @kbd{v u}.
19357The @samp{unpack(@var{mode}, @var{item})} function unpacks the
19358@var{item} using the given @var{mode}, returning the result as
19359a vector of components. Here the @var{mode} must be an
19360integer, not a vector. For example, @samp{unpack(-4, a +/- b)}
19361returns @samp{[a, b]}, as does @samp{unpack(1, a +/- b)}.
19362
5d67986c
RS
19363@ignore
19364@starindex
19365@end ignore
d7b8e6c6
EZ
19366@tindex unpackt
19367The @code{unpackt} function is like @code{unpack} but instead
19368of returning a simple vector of items, it returns a vector of
19369two things: The mode, and the vector of items. For example,
19370@samp{unpackt(1, 2:3 +/- 1:4)} returns @samp{[-4, [2:3, 1:4]]},
19371and @samp{unpackt(2, 2:3 +/- 1:4)} returns @samp{[[-4, -10], [2, 3, 1, 4]]}.
19372The identity for re-building the original object is
19373@samp{apply(pack, unpackt(@var{n}, @var{x})) = @var{x}}. (The
19374@code{apply} function builds a function call given the function
19375name and a vector of arguments.)
19376
19377@cindex Numerator of a fraction, extracting
19378Subscript notation is a useful way to extract a particular part
19379of an object. For example, to get the numerator of a rational
19380number, you can use @samp{unpack(-10, @var{x})_1}.
19381
19382@node Building Vectors, Extracting Elements, Packing and Unpacking, Matrix Functions
19383@section Building Vectors
19384
19385@noindent
19386Vectors and matrices can be added,
19387subtracted, multiplied, and divided; @pxref{Basic Arithmetic}.@refill
19388
19389@kindex |
19390@pindex calc-concat
5d67986c
RS
19391@ignore
19392@mindex @null
19393@end ignore
d7b8e6c6
EZ
19394@tindex |
19395The @kbd{|} (@code{calc-concat}) command ``concatenates'' two vectors
19396into one. For example, after @kbd{@w{[ 1 , 2 ]} [ 3 , 4 ] |}, the stack
19397will contain the single vector @samp{[1, 2, 3, 4]}. If the arguments
19398are matrices, the rows of the first matrix are concatenated with the
19399rows of the second. (In other words, two matrices are just two vectors
19400of row-vectors as far as @kbd{|} is concerned.)
19401
19402If either argument to @kbd{|} is a scalar (a non-vector), it is treated
19403like a one-element vector for purposes of concatenation: @kbd{1 [ 2 , 3 ] |}
19404produces the vector @samp{[1, 2, 3]}. Likewise, if one argument is a
19405matrix and the other is a plain vector, the vector is treated as a
19406one-row matrix.
19407
19408@kindex H |
19409@tindex append
19410The @kbd{H |} (@code{calc-append}) [@code{append}] command concatenates
19411two vectors without any special cases. Both inputs must be vectors.
19412Whether or not they are matrices is not taken into account. If either
19413argument is a scalar, the @code{append} function is left in symbolic form.
19414See also @code{cons} and @code{rcons} below.
19415
19416@kindex I |
19417@kindex H I |
19418The @kbd{I |} and @kbd{H I |} commands are similar, but they use their
19419two stack arguments in the opposite order. Thus @kbd{I |} is equivalent
5d67986c 19420to @kbd{@key{TAB} |}, but possibly more convenient and also a bit faster.
d7b8e6c6
EZ
19421
19422@kindex v d
19423@pindex calc-diag
19424@tindex diag
19425The @kbd{v d} (@code{calc-diag}) [@code{diag}] function builds a diagonal
19426square matrix. The optional numeric prefix gives the number of rows
19427and columns in the matrix. If the value at the top of the stack is a
19428vector, the elements of the vector are used as the diagonal elements; the
19429prefix, if specified, must match the size of the vector. If the value on
19430the stack is a scalar, it is used for each element on the diagonal, and
19431the prefix argument is required.
19432
19433To build a constant square matrix, e.g., a @c{$3\times3$}
19434@asis{3x3} matrix filled with ones,
19435use @kbd{0 M-3 v d 1 +}, i.e., build a zero matrix first and then add a
19436constant value to that matrix. (Another alternative would be to use
19437@kbd{v b} and @kbd{v a}; see below.)
19438
19439@kindex v i
19440@pindex calc-ident
19441@tindex idn
19442The @kbd{v i} (@code{calc-ident}) [@code{idn}] function builds an identity
19443matrix of the specified size. It is a convenient form of @kbd{v d}
19444where the diagonal element is always one. If no prefix argument is given,
19445this command prompts for one.
19446
19447In algebraic notation, @samp{idn(a,n)} acts much like @samp{diag(a,n)},
19448except that @cite{a} is required to be a scalar (non-vector) quantity.
19449If @cite{n} is omitted, @samp{idn(a)} represents @cite{a} times an
19450identity matrix of unknown size. Calc can operate algebraically on
19451such generic identity matrices, and if one is combined with a matrix
19452whose size is known, it is converted automatically to an identity
19453matrix of a suitable matching size. The @kbd{v i} command with an
19454argument of zero creates a generic identity matrix, @samp{idn(1)}.
19455Note that in dimensioned matrix mode (@pxref{Matrix Mode}), generic
19456identity matrices are immediately expanded to the current default
19457dimensions.
19458
19459@kindex v x
19460@pindex calc-index
19461@tindex index
19462The @kbd{v x} (@code{calc-index}) [@code{index}] function builds a vector
19463of consecutive integers from 1 to @var{n}, where @var{n} is the numeric
19464prefix argument. If you do not provide a prefix argument, you will be
19465prompted to enter a suitable number. If @var{n} is negative, the result
19466is a vector of negative integers from @var{n} to @i{-1}.
19467
19468With a prefix argument of just @kbd{C-u}, the @kbd{v x} command takes
19469three values from the stack: @var{n}, @var{start}, and @var{incr} (with
19470@var{incr} at top-of-stack). Counting starts at @var{start} and increases
19471by @var{incr} for successive vector elements. If @var{start} or @var{n}
19472is in floating-point format, the resulting vector elements will also be
19473floats. Note that @var{start} and @var{incr} may in fact be any kind
19474of numbers or formulas.
19475
19476When @var{start} and @var{incr} are specified, a negative @var{n} has a
19477different interpretation: It causes a geometric instead of arithmetic
19478sequence to be generated. For example, @samp{index(-3, a, b)} produces
19479@samp{[a, a b, a b^2]}. If you omit @var{incr} in the algebraic form,
19480@samp{index(@var{n}, @var{start})}, the default value for @var{incr}
19481is one for positive @var{n} or two for negative @var{n}.
19482
19483@kindex v b
19484@pindex calc-build-vector
19485@tindex cvec
19486The @kbd{v b} (@code{calc-build-vector}) [@code{cvec}] function builds a
19487vector of @var{n} copies of the value on the top of the stack, where @var{n}
19488is the numeric prefix argument. In algebraic formulas, @samp{cvec(x,n,m)}
19489can also be used to build an @var{n}-by-@var{m} matrix of copies of @var{x}.
19490(Interactively, just use @kbd{v b} twice: once to build a row, then again
19491to build a matrix of copies of that row.)
19492
19493@kindex v h
19494@kindex I v h
19495@pindex calc-head
19496@pindex calc-tail
19497@tindex head
19498@tindex tail
19499The @kbd{v h} (@code{calc-head}) [@code{head}] function returns the first
19500element of a vector. The @kbd{I v h} (@code{calc-tail}) [@code{tail}]
19501function returns the vector with its first element removed. In both
19502cases, the argument must be a non-empty vector.
19503
19504@kindex v k
19505@pindex calc-cons
19506@tindex cons
19507The @kbd{v k} (@code{calc-cons}) [@code{cons}] function takes a value @var{h}
19508and a vector @var{t} from the stack, and produces the vector whose head is
19509@var{h} and whose tail is @var{t}. This is similar to @kbd{|}, except
19510if @var{h} is itself a vector, @kbd{|} will concatenate the two vectors
19511whereas @code{cons} will insert @var{h} at the front of the vector @var{t}.
19512
19513@kindex H v h
19514@tindex rhead
5d67986c
RS
19515@ignore
19516@mindex @idots
19517@end ignore
d7b8e6c6 19518@kindex H I v h
5d67986c
RS
19519@ignore
19520@mindex @null
19521@end ignore
d7b8e6c6 19522@kindex H v k
5d67986c
RS
19523@ignore
19524@mindex @null
19525@end ignore
d7b8e6c6 19526@tindex rtail
5d67986c
RS
19527@ignore
19528@mindex @null
19529@end ignore
d7b8e6c6
EZ
19530@tindex rcons
19531Each of these three functions also accepts the Hyperbolic flag [@code{rhead},
19532@code{rtail}, @code{rcons}] in which case @var{t} instead represents
19533the @emph{last} single element of the vector, with @var{h}
19534representing the remainder of the vector. Thus the vector
19535@samp{[a, b, c, d] = cons(a, [b, c, d]) = rcons([a, b, c], d)}.
19536Also, @samp{head([a, b, c, d]) = a}, @samp{tail([a, b, c, d]) = [b, c, d]},
19537@samp{rhead([a, b, c, d]) = [a, b, c]}, and @samp{rtail([a, b, c, d]) = d}.
19538
19539@node Extracting Elements, Manipulating Vectors, Building Vectors, Matrix Functions
19540@section Extracting Vector Elements
19541
19542@noindent
19543@kindex v r
19544@pindex calc-mrow
19545@tindex mrow
19546The @kbd{v r} (@code{calc-mrow}) [@code{mrow}] command extracts one row of
19547the matrix on the top of the stack, or one element of the plain vector on
19548the top of the stack. The row or element is specified by the numeric
19549prefix argument; the default is to prompt for the row or element number.
19550The matrix or vector is replaced by the specified row or element in the
19551form of a vector or scalar, respectively.
19552
19553@cindex Permutations, applying
19554With a prefix argument of @kbd{C-u} only, @kbd{v r} takes the index of
19555the element or row from the top of the stack, and the vector or matrix
19556from the second-to-top position. If the index is itself a vector of
19557integers, the result is a vector of the corresponding elements of the
19558input vector, or a matrix of the corresponding rows of the input matrix.
19559This command can be used to obtain any permutation of a vector.
19560
19561With @kbd{C-u}, if the index is an interval form with integer components,
19562it is interpreted as a range of indices and the corresponding subvector or
19563submatrix is returned.
19564
19565@cindex Subscript notation
19566@kindex a _
19567@pindex calc-subscript
19568@tindex subscr
19569@tindex _
19570Subscript notation in algebraic formulas (@samp{a_b}) stands for the
19571Calc function @code{subscr}, which is synonymous with @code{mrow}.
19572Thus, @samp{[x, y, z]_k} produces @cite{x}, @cite{y}, or @cite{z} if
19573@cite{k} is one, two, or three, respectively. A double subscript
19574(@samp{M_i_j}, equivalent to @samp{subscr(subscr(M, i), j)}) will
19575access the element at row @cite{i}, column @cite{j} of a matrix.
19576The @kbd{a _} (@code{calc-subscript}) command creates a subscript
19577formula @samp{a_b} out of two stack entries. (It is on the @kbd{a}
19578``algebra'' prefix because subscripted variables are often used
19579purely as an algebraic notation.)
19580
19581@tindex mrrow
19582Given a negative prefix argument, @kbd{v r} instead deletes one row or
19583element from the matrix or vector on the top of the stack. Thus
19584@kbd{C-u 2 v r} replaces a matrix with its second row, but @kbd{C-u -2 v r}
19585replaces the matrix with the same matrix with its second row removed.
19586In algebraic form this function is called @code{mrrow}.
19587
19588@tindex getdiag
19589Given a prefix argument of zero, @kbd{v r} extracts the diagonal elements
19590of a square matrix in the form of a vector. In algebraic form this
19591function is called @code{getdiag}.
19592
19593@kindex v c
19594@pindex calc-mcol
19595@tindex mcol
19596@tindex mrcol
19597The @kbd{v c} (@code{calc-mcol}) [@code{mcol} or @code{mrcol}] command is
19598the analogous operation on columns of a matrix. Given a plain vector
19599it extracts (or removes) one element, just like @kbd{v r}. If the
19600index in @kbd{C-u v c} is an interval or vector and the argument is a
19601matrix, the result is a submatrix with only the specified columns
19602retained (and possibly permuted in the case of a vector index).@refill
19603
19604To extract a matrix element at a given row and column, use @kbd{v r} to
19605extract the row as a vector, then @kbd{v c} to extract the column element
19606from that vector. In algebraic formulas, it is often more convenient to
19607use subscript notation: @samp{m_i_j} gives row @cite{i}, column @cite{j}
19608of matrix @cite{m}.
19609
19610@kindex v s
19611@pindex calc-subvector
19612@tindex subvec
19613The @kbd{v s} (@code{calc-subvector}) [@code{subvec}] command extracts
19614a subvector of a vector. The arguments are the vector, the starting
19615index, and the ending index, with the ending index in the top-of-stack
19616position. The starting index indicates the first element of the vector
19617to take. The ending index indicates the first element @emph{past} the
19618range to be taken. Thus, @samp{subvec([a, b, c, d, e], 2, 4)} produces
19619the subvector @samp{[b, c]}. You could get the same result using
19620@samp{mrow([a, b, c, d, e], @w{[2 .. 4)})}.
19621
19622If either the start or the end index is zero or negative, it is
19623interpreted as relative to the end of the vector. Thus
19624@samp{subvec([a, b, c, d, e], 2, -2)} also produces @samp{[b, c]}. In
19625the algebraic form, the end index can be omitted in which case it
19626is taken as zero, i.e., elements from the starting element to the
19627end of the vector are used. The infinity symbol, @code{inf}, also
19628has this effect when used as the ending index.
19629
19630@kindex I v s
19631@tindex rsubvec
19632With the Inverse flag, @kbd{I v s} [@code{rsubvec}] removes a subvector
19633from a vector. The arguments are interpreted the same as for the
19634normal @kbd{v s} command. Thus, @samp{rsubvec([a, b, c, d, e], 2, 4)}
19635produces @samp{[a, d, e]}. It is always true that @code{subvec} and
19636@code{rsubvec} return complementary parts of the input vector.
19637
19638@xref{Selecting Subformulas}, for an alternative way to operate on
19639vectors one element at a time.
19640
19641@node Manipulating Vectors, Vector and Matrix Arithmetic, Extracting Elements, Matrix Functions
19642@section Manipulating Vectors
19643
19644@noindent
19645@kindex v l
19646@pindex calc-vlength
19647@tindex vlen
19648The @kbd{v l} (@code{calc-vlength}) [@code{vlen}] command computes the
19649length of a vector. The length of a non-vector is considered to be zero.
19650Note that matrices are just vectors of vectors for the purposes of this
19651command.@refill
19652
19653@kindex H v l
19654@tindex mdims
19655With the Hyperbolic flag, @kbd{H v l} [@code{mdims}] computes a vector
19656of the dimensions of a vector, matrix, or higher-order object. For
19657example, @samp{mdims([[a,b,c],[d,e,f]])} returns @samp{[2, 3]} since
19658its argument is a @c{$2\times3$}
19659@asis{2x3} matrix.
19660
19661@kindex v f
19662@pindex calc-vector-find
19663@tindex find
19664The @kbd{v f} (@code{calc-vector-find}) [@code{find}] command searches
19665along a vector for the first element equal to a given target. The target
19666is on the top of the stack; the vector is in the second-to-top position.
19667If a match is found, the result is the index of the matching element.
19668Otherwise, the result is zero. The numeric prefix argument, if given,
19669allows you to select any starting index for the search.
19670
19671@kindex v a
19672@pindex calc-arrange-vector
19673@tindex arrange
19674@cindex Arranging a matrix
19675@cindex Reshaping a matrix
19676@cindex Flattening a matrix
19677The @kbd{v a} (@code{calc-arrange-vector}) [@code{arrange}] command
19678rearranges a vector to have a certain number of columns and rows. The
19679numeric prefix argument specifies the number of columns; if you do not
19680provide an argument, you will be prompted for the number of columns.
19681The vector or matrix on the top of the stack is @dfn{flattened} into a
19682plain vector. If the number of columns is nonzero, this vector is
19683then formed into a matrix by taking successive groups of @var{n} elements.
19684If the number of columns does not evenly divide the number of elements
19685in the vector, the last row will be short and the result will not be
19686suitable for use as a matrix. For example, with the matrix
19687@samp{[[1, 2], @w{[3, 4]}]} on the stack, @kbd{v a 4} produces
19688@samp{[[1, 2, 3, 4]]} (a @c{$1\times4$}
19689@asis{1x4} matrix), @kbd{v a 1} produces
19690@samp{[[1], [2], [3], [4]]} (a @c{$4\times1$}
19691@asis{4x1} matrix), @kbd{v a 2} produces
19692@samp{[[1, 2], [3, 4]]} (the original @c{$2\times2$}
19693@asis{2x2} matrix), @w{@kbd{v a 3}} produces
19694@samp{[[1, 2, 3], [4]]} (not a matrix), and @kbd{v a 0} produces
19695the flattened list @samp{[1, 2, @w{3, 4}]}.
19696
19697@cindex Sorting data
19698@kindex V S
19699@kindex I V S
19700@pindex calc-sort
19701@tindex sort
19702@tindex rsort
19703The @kbd{V S} (@code{calc-sort}) [@code{sort}] command sorts the elements of
19704a vector into increasing order. Real numbers, real infinities, and
19705constant interval forms come first in this ordering; next come other
19706kinds of numbers, then variables (in alphabetical order), then finally
19707come formulas and other kinds of objects; these are sorted according
19708to a kind of lexicographic ordering with the useful property that
19709one vector is less or greater than another if the first corresponding
19710unequal elements are less or greater, respectively. Since quoted strings
19711are stored by Calc internally as vectors of ASCII character codes
19712(@pxref{Strings}), this means vectors of strings are also sorted into
19713alphabetical order by this command.
19714
19715The @kbd{I V S} [@code{rsort}] command sorts a vector into decreasing order.
19716
19717@cindex Permutation, inverse of
19718@cindex Inverse of permutation
19719@cindex Index tables
19720@cindex Rank tables
19721@kindex V G
19722@kindex I V G
19723@pindex calc-grade
19724@tindex grade
19725@tindex rgrade
19726The @kbd{V G} (@code{calc-grade}) [@code{grade}, @code{rgrade}] command
19727produces an index table or permutation vector which, if applied to the
19728input vector (as the index of @kbd{C-u v r}, say), would sort the vector.
19729A permutation vector is just a vector of integers from 1 to @var{n}, where
19730each integer occurs exactly once. One application of this is to sort a
19731matrix of data rows using one column as the sort key; extract that column,
19732grade it with @kbd{V G}, then use the result to reorder the original matrix
19733with @kbd{C-u v r}. Another interesting property of the @code{V G} command
19734is that, if the input is itself a permutation vector, the result will
19735be the inverse of the permutation. The inverse of an index table is
19736a rank table, whose @var{k}th element says where the @var{k}th original
19737vector element will rest when the vector is sorted. To get a rank
19738table, just use @kbd{V G V G}.
19739
19740With the Inverse flag, @kbd{I V G} produces an index table that would
19741sort the input into decreasing order. Note that @kbd{V S} and @kbd{V G}
19742use a ``stable'' sorting algorithm, i.e., any two elements which are equal
19743will not be moved out of their original order. Generally there is no way
19744to tell with @kbd{V S}, since two elements which are equal look the same,
19745but with @kbd{V G} this can be an important issue. In the matrix-of-rows
19746example, suppose you have names and telephone numbers as two columns and
19747you wish to sort by phone number primarily, and by name when the numbers
19748are equal. You can sort the data matrix by names first, and then again
19749by phone numbers. Because the sort is stable, any two rows with equal
19750phone numbers will remain sorted by name even after the second sort.
19751
19752@cindex Histograms
19753@kindex V H
19754@pindex calc-histogram
5d67986c
RS
19755@ignore
19756@mindex histo@idots
19757@end ignore
d7b8e6c6
EZ
19758@tindex histogram
19759The @kbd{V H} (@code{calc-histogram}) [@code{histogram}] command builds a
19760histogram of a vector of numbers. Vector elements are assumed to be
19761integers or real numbers in the range [0..@var{n}) for some ``number of
19762bins'' @var{n}, which is the numeric prefix argument given to the
19763command. The result is a vector of @var{n} counts of how many times
19764each value appeared in the original vector. Non-integers in the input
19765are rounded down to integers. Any vector elements outside the specified
19766range are ignored. (You can tell if elements have been ignored by noting
19767that the counts in the result vector don't add up to the length of the
19768input vector.)
19769
19770@kindex H V H
19771With the Hyperbolic flag, @kbd{H V H} pulls two vectors from the stack.
19772The second-to-top vector is the list of numbers as before. The top
19773vector is an equal-sized list of ``weights'' to attach to the elements
19774of the data vector. For example, if the first data element is 4.2 and
19775the first weight is 10, then 10 will be added to bin 4 of the result
19776vector. Without the hyperbolic flag, every element has a weight of one.
19777
19778@kindex v t
19779@pindex calc-transpose
19780@tindex trn
19781The @kbd{v t} (@code{calc-transpose}) [@code{trn}] command computes
19782the transpose of the matrix at the top of the stack. If the argument
19783is a plain vector, it is treated as a row vector and transposed into
19784a one-column matrix.
19785
19786@kindex v v
19787@pindex calc-reverse-vector
19788@tindex rev
19789The @kbd{v v} (@code{calc-reverse-vector}) [@code{vec}] command reverses
19790a vector end-for-end. Given a matrix, it reverses the order of the rows.
19791(To reverse the columns instead, just use @kbd{v t v v v t}. The same
19792principle can be used to apply other vector commands to the columns of
19793a matrix.)
19794
19795@kindex v m
19796@pindex calc-mask-vector
19797@tindex vmask
19798The @kbd{v m} (@code{calc-mask-vector}) [@code{vmask}] command uses
19799one vector as a mask to extract elements of another vector. The mask
19800is in the second-to-top position; the target vector is on the top of
19801the stack. These vectors must have the same length. The result is
19802the same as the target vector, but with all elements which correspond
19803to zeros in the mask vector deleted. Thus, for example,
19804@samp{vmask([1, 0, 1, 0, 1], [a, b, c, d, e])} produces @samp{[a, c, e]}.
19805@xref{Logical Operations}.
19806
19807@kindex v e
19808@pindex calc-expand-vector
19809@tindex vexp
19810The @kbd{v e} (@code{calc-expand-vector}) [@code{vexp}] command
19811expands a vector according to another mask vector. The result is a
19812vector the same length as the mask, but with nonzero elements replaced
19813by successive elements from the target vector. The length of the target
19814vector is normally the number of nonzero elements in the mask. If the
19815target vector is longer, its last few elements are lost. If the target
19816vector is shorter, the last few nonzero mask elements are left
19817unreplaced in the result. Thus @samp{vexp([2, 0, 3, 0, 7], [a, b])}
19818produces @samp{[a, 0, b, 0, 7]}.
19819
19820@kindex H v e
19821With the Hyperbolic flag, @kbd{H v e} takes a filler value from the
19822top of the stack; the mask and target vectors come from the third and
19823second elements of the stack. This filler is used where the mask is
19824zero: @samp{vexp([2, 0, 3, 0, 7], [a, b], z)} produces
19825@samp{[a, z, c, z, 7]}. If the filler value is itself a vector,
19826then successive values are taken from it, so that the effect is to
19827interleave two vectors according to the mask:
19828@samp{vexp([2, 0, 3, 7, 0, 0], [a, b], [x, y])} produces
19829@samp{[a, x, b, 7, y, 0]}.
19830
19831Another variation on the masking idea is to combine @samp{[a, b, c, d, e]}
19832with the mask @samp{[1, 0, 1, 0, 1]} to produce @samp{[a, 0, c, 0, e]}.
19833You can accomplish this with @kbd{V M a &}, mapping the logical ``and''
19834operation across the two vectors. @xref{Logical Operations}. Note that
19835the @code{? :} operation also discussed there allows other types of
19836masking using vectors.
19837
19838@node Vector and Matrix Arithmetic, Set Operations, Manipulating Vectors, Matrix Functions
19839@section Vector and Matrix Arithmetic
19840
19841@noindent
19842Basic arithmetic operations like addition and multiplication are defined
19843for vectors and matrices as well as for numbers. Division of matrices, in
19844the sense of multiplying by the inverse, is supported. (Division by a
19845matrix actually uses LU-decomposition for greater accuracy and speed.)
19846@xref{Basic Arithmetic}.
19847
19848The following functions are applied element-wise if their arguments are
19849vectors or matrices: @code{change-sign}, @code{conj}, @code{arg},
19850@code{re}, @code{im}, @code{polar}, @code{rect}, @code{clean},
19851@code{float}, @code{frac}. @xref{Function Index}.@refill
19852
19853@kindex V J
19854@pindex calc-conj-transpose
19855@tindex ctrn
19856The @kbd{V J} (@code{calc-conj-transpose}) [@code{ctrn}] command computes
19857the conjugate transpose of its argument, i.e., @samp{conj(trn(x))}.
19858
5d67986c
RS
19859@ignore
19860@mindex A
19861@end ignore
d7b8e6c6
EZ
19862@kindex A (vectors)
19863@pindex calc-abs (vectors)
5d67986c
RS
19864@ignore
19865@mindex abs
19866@end ignore
d7b8e6c6
EZ
19867@tindex abs (vectors)
19868The @kbd{A} (@code{calc-abs}) [@code{abs}] command computes the
19869Frobenius norm of a vector or matrix argument. This is the square
19870root of the sum of the squares of the absolute values of the
19871elements of the vector or matrix. If the vector is interpreted as
19872a point in two- or three-dimensional space, this is the distance
19873from that point to the origin.@refill
19874
19875@kindex v n
19876@pindex calc-rnorm
19877@tindex rnorm
19878The @kbd{v n} (@code{calc-rnorm}) [@code{rnorm}] command computes
19879the row norm, or infinity-norm, of a vector or matrix. For a plain
19880vector, this is the maximum of the absolute values of the elements.
19881For a matrix, this is the maximum of the row-absolute-value-sums,
19882i.e., of the sums of the absolute values of the elements along the
19883various rows.
19884
19885@kindex V N
19886@pindex calc-cnorm
19887@tindex cnorm
19888The @kbd{V N} (@code{calc-cnorm}) [@code{cnorm}] command computes
19889the column norm, or one-norm, of a vector or matrix. For a plain
19890vector, this is the sum of the absolute values of the elements.
19891For a matrix, this is the maximum of the column-absolute-value-sums.
19892General @cite{k}-norms for @cite{k} other than one or infinity are
19893not provided.
19894
19895@kindex V C
19896@pindex calc-cross
19897@tindex cross
19898The @kbd{V C} (@code{calc-cross}) [@code{cross}] command computes the
19899right-handed cross product of two vectors, each of which must have
19900exactly three elements.
19901
5d67986c
RS
19902@ignore
19903@mindex &
19904@end ignore
d7b8e6c6
EZ
19905@kindex & (matrices)
19906@pindex calc-inv (matrices)
5d67986c
RS
19907@ignore
19908@mindex inv
19909@end ignore
d7b8e6c6
EZ
19910@tindex inv (matrices)
19911The @kbd{&} (@code{calc-inv}) [@code{inv}] command computes the
19912inverse of a square matrix. If the matrix is singular, the inverse
19913operation is left in symbolic form. Matrix inverses are recorded so
19914that once an inverse (or determinant) of a particular matrix has been
19915computed, the inverse and determinant of the matrix can be recomputed
19916quickly in the future.
19917
19918If the argument to @kbd{&} is a plain number @cite{x}, this
19919command simply computes @cite{1/x}. This is okay, because the
19920@samp{/} operator also does a matrix inversion when dividing one
19921by a matrix.
19922
19923@kindex V D
19924@pindex calc-mdet
19925@tindex det
19926The @kbd{V D} (@code{calc-mdet}) [@code{det}] command computes the
19927determinant of a square matrix.
19928
19929@kindex V L
19930@pindex calc-mlud
19931@tindex lud
19932The @kbd{V L} (@code{calc-mlud}) [@code{lud}] command computes the
19933LU decomposition of a matrix. The result is a list of three matrices
19934which, when multiplied together left-to-right, form the original matrix.
19935The first is a permutation matrix that arises from pivoting in the
19936algorithm, the second is lower-triangular with ones on the diagonal,
19937and the third is upper-triangular.
19938
19939@kindex V T
19940@pindex calc-mtrace
19941@tindex tr
19942The @kbd{V T} (@code{calc-mtrace}) [@code{tr}] command computes the
19943trace of a square matrix. This is defined as the sum of the diagonal
19944elements of the matrix.
19945
19946@node Set Operations, Statistical Operations, Vector and Matrix Arithmetic, Matrix Functions
19947@section Set Operations using Vectors
19948
19949@noindent
19950@cindex Sets, as vectors
19951Calc includes several commands which interpret vectors as @dfn{sets} of
19952objects. A set is a collection of objects; any given object can appear
19953only once in the set. Calc stores sets as vectors of objects in
19954sorted order. Objects in a Calc set can be any of the usual things,
19955such as numbers, variables, or formulas. Two set elements are considered
19956equal if they are identical, except that numerically equal numbers like
19957the integer 4 and the float 4.0 are considered equal even though they
19958are not ``identical.'' Variables are treated like plain symbols without
19959attached values by the set operations; subtracting the set @samp{[b]}
19960from @samp{[a, b]} always yields the set @samp{[a]} even though if
19961the variables @samp{a} and @samp{b} both equalled 17, you might
19962expect the answer @samp{[]}.
19963
19964If a set contains interval forms, then it is assumed to be a set of
19965real numbers. In this case, all set operations require the elements
19966of the set to be only things that are allowed in intervals: Real
19967numbers, plus and minus infinity, HMS forms, and date forms. If
19968there are variables or other non-real objects present in a real set,
19969all set operations on it will be left in unevaluated form.
19970
19971If the input to a set operation is a plain number or interval form
19972@var{a}, it is treated like the one-element vector @samp{[@var{a}]}.
19973The result is always a vector, except that if the set consists of a
19974single interval, the interval itself is returned instead.
19975
19976@xref{Logical Operations}, for the @code{in} function which tests if
19977a certain value is a member of a given set. To test if the set @cite{A}
19978is a subset of the set @cite{B}, use @samp{vdiff(A, B) = []}.
19979
19980@kindex V +
19981@pindex calc-remove-duplicates
19982@tindex rdup
19983The @kbd{V +} (@code{calc-remove-duplicates}) [@code{rdup}] command
19984converts an arbitrary vector into set notation. It works by sorting
19985the vector as if by @kbd{V S}, then removing duplicates. (For example,
19986@kbd{[a, 5, 4, a, 4.0]} is sorted to @samp{[4, 4.0, 5, a, a]} and then
19987reduced to @samp{[4, 5, a]}). Overlapping intervals are merged as
19988necessary. You rarely need to use @kbd{V +} explicitly, since all the
19989other set-based commands apply @kbd{V +} to their inputs before using
19990them.
19991
19992@kindex V V
19993@pindex calc-set-union
19994@tindex vunion
19995The @kbd{V V} (@code{calc-set-union}) [@code{vunion}] command computes
19996the union of two sets. An object is in the union of two sets if and
19997only if it is in either (or both) of the input sets. (You could
19998accomplish the same thing by concatenating the sets with @kbd{|},
19999then using @kbd{V +}.)
20000
20001@kindex V ^
20002@pindex calc-set-intersect
20003@tindex vint
20004The @kbd{V ^} (@code{calc-set-intersect}) [@code{vint}] command computes
20005the intersection of two sets. An object is in the intersection if
20006and only if it is in both of the input sets. Thus if the input
20007sets are disjoint, i.e., if they share no common elements, the result
20008will be the empty vector @samp{[]}. Note that the characters @kbd{V}
20009and @kbd{^} were chosen to be close to the conventional mathematical
20010notation for set union@c{ ($A \cup B$)}
20011@asis{} and intersection@c{ ($A \cap B$)}
20012@asis{}.
20013
20014@kindex V -
20015@pindex calc-set-difference
20016@tindex vdiff
20017The @kbd{V -} (@code{calc-set-difference}) [@code{vdiff}] command computes
20018the difference between two sets. An object is in the difference
20019@cite{A - B} if and only if it is in @cite{A} but not in @cite{B}.
20020Thus subtracting @samp{[y,z]} from a set will remove the elements
20021@samp{y} and @samp{z} if they are present. You can also think of this
20022as a general @dfn{set complement} operator; if @cite{A} is the set of
20023all possible values, then @cite{A - B} is the ``complement'' of @cite{B}.
20024Obviously this is only practical if the set of all possible values in
20025your problem is small enough to list in a Calc vector (or simple
20026enough to express in a few intervals).
20027
20028@kindex V X
20029@pindex calc-set-xor
20030@tindex vxor
20031The @kbd{V X} (@code{calc-set-xor}) [@code{vxor}] command computes
20032the ``exclusive-or,'' or ``symmetric difference'' of two sets.
20033An object is in the symmetric difference of two sets if and only
20034if it is in one, but @emph{not} both, of the sets. Objects that
20035occur in both sets ``cancel out.''
20036
20037@kindex V ~
20038@pindex calc-set-complement
20039@tindex vcompl
20040The @kbd{V ~} (@code{calc-set-complement}) [@code{vcompl}] command
20041computes the complement of a set with respect to the real numbers.
20042Thus @samp{vcompl(x)} is equivalent to @samp{vdiff([-inf .. inf], x)}.
20043For example, @samp{vcompl([2, (3 .. 4]])} evaluates to
20044@samp{[[-inf .. 2), (2 .. 3], (4 .. inf]]}.
20045
20046@kindex V F
20047@pindex calc-set-floor
20048@tindex vfloor
20049The @kbd{V F} (@code{calc-set-floor}) [@code{vfloor}] command
20050reinterprets a set as a set of integers. Any non-integer values,
20051and intervals that do not enclose any integers, are removed. Open
20052intervals are converted to equivalent closed intervals. Successive
20053integers are converted into intervals of integers. For example, the
20054complement of the set @samp{[2, 6, 7, 8]} is messy, but if you wanted
20055the complement with respect to the set of integers you could type
20056@kbd{V ~ V F} to get @samp{[[-inf .. 1], [3 .. 5], [9 .. inf]]}.
20057
20058@kindex V E
20059@pindex calc-set-enumerate
20060@tindex venum
20061The @kbd{V E} (@code{calc-set-enumerate}) [@code{venum}] command
20062converts a set of integers into an explicit vector. Intervals in
20063the set are expanded out to lists of all integers encompassed by
20064the intervals. This only works for finite sets (i.e., sets which
20065do not involve @samp{-inf} or @samp{inf}).
20066
20067@kindex V :
20068@pindex calc-set-span
20069@tindex vspan
20070The @kbd{V :} (@code{calc-set-span}) [@code{vspan}] command converts any
20071set of reals into an interval form that encompasses all its elements.
20072The lower limit will be the smallest element in the set; the upper
20073limit will be the largest element. For an empty set, @samp{vspan([])}
20074returns the empty interval @w{@samp{[0 .. 0)}}.
20075
20076@kindex V #
20077@pindex calc-set-cardinality
20078@tindex vcard
20079The @kbd{V #} (@code{calc-set-cardinality}) [@code{vcard}] command counts
20080the number of integers in a set. The result is the length of the vector
20081that would be produced by @kbd{V E}, although the computation is much
20082more efficient than actually producing that vector.
20083
20084@cindex Sets, as binary numbers
20085Another representation for sets that may be more appropriate in some
20086cases is binary numbers. If you are dealing with sets of integers
20087in the range 0 to 49, you can use a 50-bit binary number where a
20088particular bit is 1 if the corresponding element is in the set.
20089@xref{Binary Functions}, for a list of commands that operate on
20090binary numbers. Note that many of the above set operations have
20091direct equivalents in binary arithmetic: @kbd{b o} (@code{calc-or}),
20092@kbd{b a} (@code{calc-and}), @kbd{b d} (@code{calc-diff}),
20093@kbd{b x} (@code{calc-xor}), and @kbd{b n} (@code{calc-not}),
20094respectively. You can use whatever representation for sets is most
20095convenient to you.
20096
20097@kindex b p
20098@kindex b u
20099@pindex calc-pack-bits
20100@pindex calc-unpack-bits
20101@tindex vpack
20102@tindex vunpack
20103The @kbd{b u} (@code{calc-unpack-bits}) [@code{vunpack}] command
20104converts an integer that represents a set in binary into a set
20105in vector/interval notation. For example, @samp{vunpack(67)}
20106returns @samp{[[0 .. 1], 6]}. If the input is negative, the set
20107it represents is semi-infinite: @samp{vunpack(-4) = [2 .. inf)}.
20108Use @kbd{V E} afterwards to expand intervals to individual
20109values if you wish. Note that this command uses the @kbd{b}
20110(binary) prefix key.
20111
20112The @kbd{b p} (@code{calc-pack-bits}) [@code{vpack}] command
20113converts the other way, from a vector or interval representing
20114a set of nonnegative integers into a binary integer describing
20115the same set. The set may include positive infinity, but must
20116not include any negative numbers. The input is interpreted as a
20117set of integers in the sense of @kbd{V F} (@code{vfloor}). Beware
20118that a simple input like @samp{[100]} can result in a huge integer
20119representation (@c{$2^{100}$}
20120@cite{2^100}, a 31-digit integer, in this case).
20121
20122@node Statistical Operations, Reducing and Mapping, Set Operations, Matrix Functions
20123@section Statistical Operations on Vectors
20124
20125@noindent
20126@cindex Statistical functions
20127The commands in this section take vectors as arguments and compute
20128various statistical measures on the data stored in the vectors. The
20129references used in the definitions of these functions are Bevington's
20130@emph{Data Reduction and Error Analysis for the Physical Sciences},
20131and @emph{Numerical Recipes} by Press, Flannery, Teukolsky and
20132Vetterling.
20133
20134The statistical commands use the @kbd{u} prefix key followed by
20135a shifted letter or other character.
20136
20137@xref{Manipulating Vectors}, for a description of @kbd{V H}
20138(@code{calc-histogram}).
20139
20140@xref{Curve Fitting}, for the @kbd{a F} command for doing
20141least-squares fits to statistical data.
20142
20143@xref{Probability Distribution Functions}, for several common
20144probability distribution functions.
20145
20146@menu
20147* Single-Variable Statistics::
20148* Paired-Sample Statistics::
20149@end menu
20150
20151@node Single-Variable Statistics, Paired-Sample Statistics, Statistical Operations, Statistical Operations
20152@subsection Single-Variable Statistics
20153
20154@noindent
20155These functions do various statistical computations on single
20156vectors. Given a numeric prefix argument, they actually pop
20157@var{n} objects from the stack and combine them into a data
20158vector. Each object may be either a number or a vector; if a
20159vector, any sub-vectors inside it are ``flattened'' as if by
20160@kbd{v a 0}; @pxref{Manipulating Vectors}. By default one object
20161is popped, which (in order to be useful) is usually a vector.
20162
20163If an argument is a variable name, and the value stored in that
20164variable is a vector, then the stored vector is used. This method
20165has the advantage that if your data vector is large, you can avoid
20166the slow process of manipulating it directly on the stack.
20167
20168These functions are left in symbolic form if any of their arguments
20169are not numbers or vectors, e.g., if an argument is a formula, or
20170a non-vector variable. However, formulas embedded within vector
20171arguments are accepted; the result is a symbolic representation
20172of the computation, based on the assumption that the formula does
20173not itself represent a vector. All varieties of numbers such as
20174error forms and interval forms are acceptable.
20175
20176Some of the functions in this section also accept a single error form
20177or interval as an argument. They then describe a property of the
20178normal or uniform (respectively) statistical distribution described
20179by the argument. The arguments are interpreted in the same way as
20180the @var{M} argument of the random number function @kbd{k r}. In
20181particular, an interval with integer limits is considered an integer
20182distribution, so that @samp{[2 .. 6)} is the same as @samp{[2 .. 5]}.
20183An interval with at least one floating-point limit is a continuous
20184distribution: @samp{[2.0 .. 6.0)} is @emph{not} the same as
20185@samp{[2.0 .. 5.0]}!
20186
20187@kindex u #
20188@pindex calc-vector-count
20189@tindex vcount
20190The @kbd{u #} (@code{calc-vector-count}) [@code{vcount}] command
20191computes the number of data values represented by the inputs.
20192For example, @samp{vcount(1, [2, 3], [[4, 5], [], x, y])} returns 7.
20193If the argument is a single vector with no sub-vectors, this
20194simply computes the length of the vector.
20195
20196@kindex u +
20197@kindex u *
20198@pindex calc-vector-sum
20199@pindex calc-vector-prod
20200@tindex vsum
20201@tindex vprod
20202@cindex Summations (statistical)
20203The @kbd{u +} (@code{calc-vector-sum}) [@code{vsum}] command
20204computes the sum of the data values. The @kbd{u *}
20205(@code{calc-vector-prod}) [@code{vprod}] command computes the
20206product of the data values. If the input is a single flat vector,
20207these are the same as @kbd{V R +} and @kbd{V R *}
20208(@pxref{Reducing and Mapping}).@refill
20209
20210@kindex u X
20211@kindex u N
20212@pindex calc-vector-max
20213@pindex calc-vector-min
20214@tindex vmax
20215@tindex vmin
20216The @kbd{u X} (@code{calc-vector-max}) [@code{vmax}] command
20217computes the maximum of the data values, and the @kbd{u N}
20218(@code{calc-vector-min}) [@code{vmin}] command computes the minimum.
20219If the argument is an interval, this finds the minimum or maximum
20220value in the interval. (Note that @samp{vmax([2..6)) = 5} as
20221described above.) If the argument is an error form, this returns
20222plus or minus infinity.
20223
20224@kindex u M
20225@pindex calc-vector-mean
20226@tindex vmean
20227@cindex Mean of data values
20228The @kbd{u M} (@code{calc-vector-mean}) [@code{vmean}] command
20229computes the average (arithmetic mean) of the data values.
20230If the inputs are error forms @c{$x$ @code{+/-} $\sigma$}
20231@samp{x +/- s}, this is the weighted
20232mean of the @cite{x} values with weights @c{$1 / \sigma^2$}
20233@cite{1 / s^2}.
20234@tex
20235\turnoffactive
20236$$ \mu = { \displaystyle \sum { x_i \over \sigma_i^2 } \over
20237 \displaystyle \sum { 1 \over \sigma_i^2 } } $$
20238@end tex
20239If the inputs are not error forms, this is simply the sum of the
20240values divided by the count of the values.@refill
20241
20242Note that a plain number can be considered an error form with
20243error @c{$\sigma = 0$}
20244@cite{s = 0}. If the input to @kbd{u M} is a mixture of
20245plain numbers and error forms, the result is the mean of the
20246plain numbers, ignoring all values with non-zero errors. (By the
20247above definitions it's clear that a plain number effectively
20248has an infinite weight, next to which an error form with a finite
20249weight is completely negligible.)
20250
20251This function also works for distributions (error forms or
5d67986c 20252intervals). The mean of an error form `@var{a} @t{+/-} @var{b}' is simply
d7b8e6c6
EZ
20253@cite{a}. The mean of an interval is the mean of the minimum
20254and maximum values of the interval.
20255
20256@kindex I u M
20257@pindex calc-vector-mean-error
20258@tindex vmeane
20259The @kbd{I u M} (@code{calc-vector-mean-error}) [@code{vmeane}]
20260command computes the mean of the data points expressed as an
20261error form. This includes the estimated error associated with
20262the mean. If the inputs are error forms, the error is the square
20263root of the reciprocal of the sum of the reciprocals of the squares
20264of the input errors. (I.e., the variance is the reciprocal of the
20265sum of the reciprocals of the variances.)
20266@tex
20267\turnoffactive
20268$$ \sigma_\mu^2 = {1 \over \displaystyle \sum {1 \over \sigma_i^2}} $$
20269@end tex
20270If the inputs are plain
20271numbers, the error is equal to the standard deviation of the values
20272divided by the square root of the number of values. (This works
20273out to be equivalent to calculating the standard deviation and
20274then assuming each value's error is equal to this standard
20275deviation.)@refill
20276@tex
20277\turnoffactive
20278$$ \sigma_\mu^2 = {\sigma^2 \over N} $$
20279@end tex
20280
20281@kindex H u M
20282@pindex calc-vector-median
20283@tindex vmedian
20284@cindex Median of data values
20285The @kbd{H u M} (@code{calc-vector-median}) [@code{vmedian}]
20286command computes the median of the data values. The values are
20287first sorted into numerical order; the median is the middle
20288value after sorting. (If the number of data values is even,
20289the median is taken to be the average of the two middle values.)
20290The median function is different from the other functions in
20291this section in that the arguments must all be real numbers;
20292variables are not accepted even when nested inside vectors.
20293(Otherwise it is not possible to sort the data values.) If
20294any of the input values are error forms, their error parts are
20295ignored.
20296
20297The median function also accepts distributions. For both normal
20298(error form) and uniform (interval) distributions, the median is
20299the same as the mean.
20300
20301@kindex H I u M
20302@pindex calc-vector-harmonic-mean
20303@tindex vhmean
20304@cindex Harmonic mean
20305The @kbd{H I u M} (@code{calc-vector-harmonic-mean}) [@code{vhmean}]
20306command computes the harmonic mean of the data values. This is
20307defined as the reciprocal of the arithmetic mean of the reciprocals
20308of the values.
20309@tex
20310\turnoffactive
20311$$ { N \over \displaystyle \sum {1 \over x_i} } $$
20312@end tex
20313
20314@kindex u G
20315@pindex calc-vector-geometric-mean
20316@tindex vgmean
20317@cindex Geometric mean
20318The @kbd{u G} (@code{calc-vector-geometric-mean}) [@code{vgmean}]
20319command computes the geometric mean of the data values. This
5d67986c 20320is the @var{n}th root of the product of the values. This is also
d7b8e6c6
EZ
20321equal to the @code{exp} of the arithmetic mean of the logarithms
20322of the data values.
20323@tex
20324\turnoffactive
20325$$ \exp \left ( \sum { \ln x_i } \right ) =
20326 \left ( \prod { x_i } \right)^{1 / N} $$
20327@end tex
20328
20329@kindex H u G
20330@tindex agmean
20331The @kbd{H u G} [@code{agmean}] command computes the ``arithmetic-geometric
20332mean'' of two numbers taken from the stack. This is computed by
20333replacing the two numbers with their arithmetic mean and geometric
20334mean, then repeating until the two values converge.
20335@tex
20336\turnoffactive
20337$$ a_{i+1} = { a_i + b_i \over 2 } , \qquad b_{i+1} = \sqrt{a_i b_i} $$
20338@end tex
20339
20340@cindex Root-mean-square
20341Another commonly used mean, the RMS (root-mean-square), can be computed
20342for a vector of numbers simply by using the @kbd{A} command.
20343
20344@kindex u S
20345@pindex calc-vector-sdev
20346@tindex vsdev
20347@cindex Standard deviation
20348@cindex Sample statistics
20349The @kbd{u S} (@code{calc-vector-sdev}) [@code{vsdev}] command
20350computes the standard deviation@c{ $\sigma$}
20351@asis{} of the data values. If the
20352values are error forms, the errors are used as weights just
20353as for @kbd{u M}. This is the @emph{sample} standard deviation,
20354whose value is the square root of the sum of the squares of the
20355differences between the values and the mean of the @cite{N} values,
20356divided by @cite{N-1}.
20357@tex
20358\turnoffactive
20359$$ \sigma^2 = {1 \over N - 1} \sum (x_i - \mu)^2 $$
20360@end tex
20361
20362This function also applies to distributions. The standard deviation
20363of a single error form is simply the error part. The standard deviation
20364of a continuous interval happens to equal the difference between the
20365limits, divided by @c{$\sqrt{12}$}
20366@cite{sqrt(12)}. The standard deviation of an
20367integer interval is the same as the standard deviation of a vector
20368of those integers.
20369
20370@kindex I u S
20371@pindex calc-vector-pop-sdev
20372@tindex vpsdev
20373@cindex Population statistics
20374The @kbd{I u S} (@code{calc-vector-pop-sdev}) [@code{vpsdev}]
20375command computes the @emph{population} standard deviation.
20376It is defined by the same formula as above but dividing
20377by @cite{N} instead of by @cite{N-1}. The population standard
20378deviation is used when the input represents the entire set of
20379data values in the distribution; the sample standard deviation
20380is used when the input represents a sample of the set of all
20381data values, so that the mean computed from the input is itself
20382only an estimate of the true mean.
20383@tex
20384\turnoffactive
20385$$ \sigma^2 = {1 \over N} \sum (x_i - \mu)^2 $$
20386@end tex
20387
20388For error forms and continuous intervals, @code{vpsdev} works
20389exactly like @code{vsdev}. For integer intervals, it computes the
20390population standard deviation of the equivalent vector of integers.
20391
20392@kindex H u S
20393@kindex H I u S
20394@pindex calc-vector-variance
20395@pindex calc-vector-pop-variance
20396@tindex vvar
20397@tindex vpvar
20398@cindex Variance of data values
20399The @kbd{H u S} (@code{calc-vector-variance}) [@code{vvar}] and
20400@kbd{H I u S} (@code{calc-vector-pop-variance}) [@code{vpvar}]
20401commands compute the variance of the data values. The variance
20402is the square@c{ $\sigma^2$}
20403@asis{} of the standard deviation, i.e., the sum of the
20404squares of the deviations of the data values from the mean.
20405(This definition also applies when the argument is a distribution.)
20406
5d67986c
RS
20407@ignore
20408@starindex
20409@end ignore
d7b8e6c6
EZ
20410@tindex vflat
20411The @code{vflat} algebraic function returns a vector of its
20412arguments, interpreted in the same way as the other functions
20413in this section. For example, @samp{vflat(1, [2, [3, 4]], 5)}
20414returns @samp{[1, 2, 3, 4, 5]}.
20415
20416@node Paired-Sample Statistics, , Single-Variable Statistics, Statistical Operations
20417@subsection Paired-Sample Statistics
20418
20419@noindent
20420The functions in this section take two arguments, which must be
20421vectors of equal size. The vectors are each flattened in the same
20422way as by the single-variable statistical functions. Given a numeric
20423prefix argument of 1, these functions instead take one object from
20424the stack, which must be an @c{$N\times2$}
20425@asis{Nx2} matrix of data values. Once
20426again, variable names can be used in place of actual vectors and
20427matrices.
20428
20429@kindex u C
20430@pindex calc-vector-covariance
20431@tindex vcov
20432@cindex Covariance
20433The @kbd{u C} (@code{calc-vector-covariance}) [@code{vcov}] command
20434computes the sample covariance of two vectors. The covariance
20435of vectors @var{x} and @var{y} is the sum of the products of the
20436differences between the elements of @var{x} and the mean of @var{x}
20437times the differences between the corresponding elements of @var{y}
20438and the mean of @var{y}, all divided by @cite{N-1}. Note that
20439the variance of a vector is just the covariance of the vector
20440with itself. Once again, if the inputs are error forms the
20441errors are used as weight factors. If both @var{x} and @var{y}
20442are composed of error forms, the error for a given data point
20443is taken as the square root of the sum of the squares of the two
20444input errors.
20445@tex
20446\turnoffactive
20447$$ \sigma_{x\!y}^2 = {1 \over N-1} \sum (x_i - \mu_x) (y_i - \mu_y) $$
20448$$ \sigma_{x\!y}^2 =
20449 {\displaystyle {1 \over N-1}
20450 \sum {(x_i - \mu_x) (y_i - \mu_y) \over \sigma_i^2}
20451 \over \displaystyle {1 \over N} \sum {1 \over \sigma_i^2}}
20452$$
20453@end tex
20454
20455@kindex I u C
20456@pindex calc-vector-pop-covariance
20457@tindex vpcov
20458The @kbd{I u C} (@code{calc-vector-pop-covariance}) [@code{vpcov}]
20459command computes the population covariance, which is the same as the
20460sample covariance computed by @kbd{u C} except dividing by @cite{N}
20461instead of @cite{N-1}.
20462
20463@kindex H u C
20464@pindex calc-vector-correlation
20465@tindex vcorr
20466@cindex Correlation coefficient
20467@cindex Linear correlation
20468The @kbd{H u C} (@code{calc-vector-correlation}) [@code{vcorr}]
20469command computes the linear correlation coefficient of two vectors.
20470This is defined by the covariance of the vectors divided by the
20471product of their standard deviations. (There is no difference
20472between sample or population statistics here.)
20473@tex
20474\turnoffactive
20475$$ r_{x\!y} = { \sigma_{x\!y}^2 \over \sigma_x^2 \sigma_y^2 } $$
20476@end tex
20477
20478@node Reducing and Mapping, Vector and Matrix Formats, Statistical Operations, Matrix Functions
20479@section Reducing and Mapping Vectors
20480
20481@noindent
20482The commands in this section allow for more general operations on the
20483elements of vectors.
20484
20485@kindex V A
20486@pindex calc-apply
20487@tindex apply
20488The simplest of these operations is @kbd{V A} (@code{calc-apply})
20489[@code{apply}], which applies a given operator to the elements of a vector.
20490For example, applying the hypothetical function @code{f} to the vector
20491@w{@samp{[1, 2, 3]}} would produce the function call @samp{f(1, 2, 3)}.
20492Applying the @code{+} function to the vector @samp{[a, b]} gives
20493@samp{a + b}. Applying @code{+} to the vector @samp{[a, b, c]} is an
20494error, since the @code{+} function expects exactly two arguments.
20495
20496While @kbd{V A} is useful in some cases, you will usually find that either
20497@kbd{V R} or @kbd{V M}, described below, is closer to what you want.
20498
20499@menu
20500* Specifying Operators::
20501* Mapping::
20502* Reducing::
20503* Nesting and Fixed Points::
20504* Generalized Products::
20505@end menu
20506
20507@node Specifying Operators, Mapping, Reducing and Mapping, Reducing and Mapping
20508@subsection Specifying Operators
20509
20510@noindent
20511Commands in this section (like @kbd{V A}) prompt you to press the key
20512corresponding to the desired operator. Press @kbd{?} for a partial
20513list of the available operators. Generally, an operator is any key or
20514sequence of keys that would normally take one or more arguments from
20515the stack and replace them with a result. For example, @kbd{V A H C}
20516uses the hyperbolic cosine operator, @code{cosh}. (Since @code{cosh}
20517expects one argument, @kbd{V A H C} requires a vector with a single
20518element as its argument.)
20519
20520You can press @kbd{x} at the operator prompt to select any algebraic
20521function by name to use as the operator. This includes functions you
20522have defined yourself using the @kbd{Z F} command. (@xref{Algebraic
20523Definitions}.) If you give a name for which no function has been
20524defined, the result is left in symbolic form, as in @samp{f(1, 2, 3)}.
20525Calc will prompt for the number of arguments the function takes if it
20526can't figure it out on its own (say, because you named a function that
20527is currently undefined). It is also possible to type a digit key before
20528the function name to specify the number of arguments, e.g.,
5d67986c 20529@kbd{V M 3 x f @key{RET}} calls @code{f} with three arguments even if it
d7b8e6c6
EZ
20530looks like it ought to have only two. This technique may be necessary
20531if the function allows a variable number of arguments. For example,
20532the @kbd{v e} [@code{vexp}] function accepts two or three arguments;
20533if you want to map with the three-argument version, you will have to
20534type @kbd{V M 3 v e}.
20535
20536It is also possible to apply any formula to a vector by treating that
20537formula as a function. When prompted for the operator to use, press
20538@kbd{'} (the apostrophe) and type your formula as an algebraic entry.
20539You will then be prompted for the argument list, which defaults to a
20540list of all variables that appear in the formula, sorted into alphabetic
20541order. For example, suppose you enter the formula @w{@samp{x + 2y^x}}.
20542The default argument list would be @samp{(x y)}, which means that if
20543this function is applied to the arguments @samp{[3, 10]} the result will
20544be @samp{3 + 2*10^3}. (If you plan to use a certain formula in this
20545way often, you might consider defining it as a function with @kbd{Z F}.)
20546
20547Another way to specify the arguments to the formula you enter is with
20548@kbd{$}, @kbd{$$}, and so on. For example, @kbd{V A ' $$ + 2$^$$}
20549has the same effect as the previous example. The argument list is
20550automatically taken to be @samp{($$ $)}. (The order of the arguments
20551may seem backwards, but it is analogous to the way normal algebraic
20552entry interacts with the stack.)
20553
20554If you press @kbd{$} at the operator prompt, the effect is similar to
20555the apostrophe except that the relevant formula is taken from top-of-stack
20556instead. The actual vector arguments of the @kbd{V A $} or related command
20557then start at the second-to-top stack position. You will still be
20558prompted for an argument list.
20559
20560@cindex Nameless functions
20561@cindex Generic functions
20562A function can be written without a name using the notation @samp{<#1 - #2>},
20563which means ``a function of two arguments that computes the first
20564argument minus the second argument.'' The symbols @samp{#1} and @samp{#2}
20565are placeholders for the arguments. You can use any names for these
20566placeholders if you wish, by including an argument list followed by a
5d67986c 20567colon: @samp{<x, y : x - y>}. When you type @kbd{V A ' $$ + 2$^$$ @key{RET}},
d7b8e6c6 20568Calc builds the nameless function @samp{<#1 + 2 #2^#1>} as the function
5d67986c 20569to map across the vectors. When you type @kbd{V A ' x + 2y^x @key{RET} @key{RET}},
d7b8e6c6
EZ
20570Calc builds the nameless function @w{@samp{<x, y : x + 2 y^x>}}. In both
20571cases, Calc also writes the nameless function to the Trail so that you
20572can get it back later if you wish.
20573
20574If there is only one argument, you can write @samp{#} in place of @samp{#1}.
20575(Note that @samp{< >} notation is also used for date forms. Calc tells
20576that @samp{<@var{stuff}>} is a nameless function by the presence of
20577@samp{#} signs inside @var{stuff}, or by the fact that @var{stuff}
20578begins with a list of variables followed by a colon.)
20579
20580You can type a nameless function directly to @kbd{V A '}, or put one on
20581the stack and use it with @w{@kbd{V A $}}. Calc will not prompt for an
20582argument list in this case, since the nameless function specifies the
20583argument list as well as the function itself. In @kbd{V A '}, you can
20584omit the @samp{< >} marks if you use @samp{#} notation for the arguments,
5d67986c
RS
20585so that @kbd{V A ' #1+#2 @key{RET}} is the same as @kbd{V A ' <#1+#2> @key{RET}},
20586which in turn is the same as @kbd{V A ' $$+$ @key{RET}}.
d7b8e6c6
EZ
20587
20588@cindex Lambda expressions
5d67986c
RS
20589@ignore
20590@starindex
20591@end ignore
d7b8e6c6
EZ
20592@tindex lambda
20593The internal format for @samp{<x, y : x + y>} is @samp{lambda(x, y, x + y)}.
20594(The word @code{lambda} derives from Lisp notation and the theory of
20595functions.) The internal format for @samp{<#1 + #2>} is @samp{lambda(ArgA,
20596ArgB, ArgA + ArgB)}. Note that there is no actual Calc function called
20597@code{lambda}; the whole point is that the @code{lambda} expression is
20598used in its symbolic form, not evaluated for an answer until it is applied
20599to specific arguments by a command like @kbd{V A} or @kbd{V M}.
20600
20601(Actually, @code{lambda} does have one special property: Its arguments
20602are never evaluated; for example, putting @samp{<(2/3) #>} on the stack
20603will not simplify the @samp{2/3} until the nameless function is actually
20604called.)
20605
20606@tindex add
20607@tindex sub
5d67986c
RS
20608@ignore
20609@mindex @idots
20610@end ignore
d7b8e6c6 20611@tindex mul
5d67986c
RS
20612@ignore
20613@mindex @null
20614@end ignore
d7b8e6c6 20615@tindex div
5d67986c
RS
20616@ignore
20617@mindex @null
20618@end ignore
d7b8e6c6 20619@tindex pow
5d67986c
RS
20620@ignore
20621@mindex @null
20622@end ignore
d7b8e6c6 20623@tindex neg
5d67986c
RS
20624@ignore
20625@mindex @null
20626@end ignore
d7b8e6c6 20627@tindex mod
5d67986c
RS
20628@ignore
20629@mindex @null
20630@end ignore
d7b8e6c6
EZ
20631@tindex vconcat
20632As usual, commands like @kbd{V A} have algebraic function name equivalents.
20633For example, @kbd{V A k g} with an argument of @samp{v} is equivalent to
20634@samp{apply(gcd, v)}. The first argument specifies the operator name,
20635and is either a variable whose name is the same as the function name,
20636or a nameless function like @samp{<#^3+1>}. Operators that are normally
20637written as algebraic symbols have the names @code{add}, @code{sub},
20638@code{mul}, @code{div}, @code{pow}, @code{neg}, @code{mod}, and
20639@code{vconcat}.@refill
20640
5d67986c
RS
20641@ignore
20642@starindex
20643@end ignore
d7b8e6c6
EZ
20644@tindex call
20645The @code{call} function builds a function call out of several arguments:
20646@samp{call(gcd, x, y)} is the same as @samp{apply(gcd, [x, y])}, which
20647in turn is the same as @samp{gcd(x, y)}. The first argument of @code{call},
20648like the other functions described here, may be either a variable naming a
20649function, or a nameless function (@samp{call(<#1+2#2>, x, y)} is the same
20650as @samp{x + 2y}).
20651
20652(Experts will notice that it's not quite proper to use a variable to name
20653a function, since the name @code{gcd} corresponds to the Lisp variable
20654@code{var-gcd} but to the Lisp function @code{calcFunc-gcd}. Calc
20655automatically makes this translation, so you don't have to worry
20656about it.)
20657
20658@node Mapping, Reducing, Specifying Operators, Reducing and Mapping
20659@subsection Mapping
20660
20661@noindent
20662@kindex V M
20663@pindex calc-map
20664@tindex map
20665The @kbd{V M} (@code{calc-map}) [@code{map}] command applies a given
20666operator elementwise to one or more vectors. For example, mapping
20667@code{A} [@code{abs}] produces a vector of the absolute values of the
20668elements in the input vector. Mapping @code{+} pops two vectors from
20669the stack, which must be of equal length, and produces a vector of the
20670pairwise sums of the elements. If either argument is a non-vector, it
20671is duplicated for each element of the other vector. For example,
20672@kbd{[1,2,3] 2 V M ^} squares the elements of the specified vector.
20673With the 2 listed first, it would have computed a vector of powers of
20674two. Mapping a user-defined function pops as many arguments from the
20675stack as the function requires. If you give an undefined name, you will
20676be prompted for the number of arguments to use.@refill
20677
20678If any argument to @kbd{V M} is a matrix, the operator is normally mapped
20679across all elements of the matrix. For example, given the matrix
20680@cite{[[1, -2, 3], [-4, 5, -6]]}, @kbd{V M A} takes six absolute values to
20681produce another @c{$3\times2$}
20682@asis{3x2} matrix, @cite{[[1, 2, 3], [4, 5, 6]]}.
20683
20684@tindex mapr
20685The command @kbd{V M _} [@code{mapr}] (i.e., type an underscore at the
20686operator prompt) maps by rows instead. For example, @kbd{V M _ A} views
20687the above matrix as a vector of two 3-element row vectors. It produces
20688a new vector which contains the absolute values of those row vectors,
20689namely @cite{[3.74, 8.77]}. (Recall, the absolute value of a vector is
20690defined as the square root of the sum of the squares of the elements.)
20691Some operators accept vectors and return new vectors; for example,
20692@kbd{v v} reverses a vector, so @kbd{V M _ v v} would reverse each row
20693of the matrix to get a new matrix, @cite{[[3, -2, 1], [-6, 5, -4]]}.
20694
20695Sometimes a vector of vectors (representing, say, strings, sets, or lists)
20696happens to look like a matrix. If so, remember to use @kbd{V M _} if you
20697want to map a function across the whole strings or sets rather than across
20698their individual elements.
20699
20700@tindex mapc
20701The command @kbd{V M :} [@code{mapc}] maps by columns. Basically, it
20702transposes the input matrix, maps by rows, and then, if the result is a
20703matrix, transposes again. For example, @kbd{V M : A} takes the absolute
20704values of the three columns of the matrix, treating each as a 2-vector,
20705and @kbd{V M : v v} reverses the columns to get the matrix
20706@cite{[[-4, 5, -6], [1, -2, 3]]}.
20707
20708(The symbols @kbd{_} and @kbd{:} were chosen because they had row-like
20709and column-like appearances, and were not already taken by useful
20710operators. Also, they appear shifted on most keyboards so they are easy
20711to type after @kbd{V M}.)
20712
20713The @kbd{_} and @kbd{:} modifiers have no effect on arguments that are
20714not matrices (so if none of the arguments are matrices, they have no
20715effect at all). If some of the arguments are matrices and others are
20716plain numbers, the plain numbers are held constant for all rows of the
20717matrix (so that @kbd{2 V M _ ^} squares every row of a matrix; squaring
20718a vector takes a dot product of the vector with itself).
20719
20720If some of the arguments are vectors with the same lengths as the
20721rows (for @kbd{V M _}) or columns (for @kbd{V M :}) of the matrix
20722arguments, those vectors are also held constant for every row or
20723column.
20724
20725Sometimes it is useful to specify another mapping command as the operator
20726to use with @kbd{V M}. For example, @kbd{V M _ V A +} applies @kbd{V A +}
20727to each row of the input matrix, which in turn adds the two values on that
20728row. If you give another vector-operator command as the operator for
20729@kbd{V M}, it automatically uses map-by-rows mode if you don't specify
20730otherwise; thus @kbd{V M V A +} is equivalent to @kbd{V M _ V A +}. (If
20731you really want to map-by-elements another mapping command, you can use
20732a triple-nested mapping command: @kbd{V M V M V A +} means to map
20733@kbd{V M V A +} over the rows of the matrix; in turn, @kbd{V A +} is
20734mapped over the elements of each row.)
20735
20736@tindex mapa
20737@tindex mapd
20738Previous versions of Calc had ``map across'' and ``map down'' modes
20739that are now considered obsolete; the old ``map across'' is now simply
20740@kbd{V M V A}, and ``map down'' is now @kbd{V M : V A}. The algebraic
20741functions @code{mapa} and @code{mapd} are still supported, though.
20742Note also that, while the old mapping modes were persistent (once you
20743set the mode, it would apply to later mapping commands until you reset
20744it), the new @kbd{:} and @kbd{_} modifiers apply only to the current
20745mapping command. The default @kbd{V M} always means map-by-elements.
20746
20747@xref{Algebraic Manipulation}, for the @kbd{a M} command, which is like
20748@kbd{V M} but for equations and inequalities instead of vectors.
20749@xref{Storing Variables}, for the @kbd{s m} command which modifies a
20750variable's stored value using a @kbd{V M}-like operator.
20751
20752@node Reducing, Nesting and Fixed Points, Mapping, Reducing and Mapping
20753@subsection Reducing
20754
20755@noindent
20756@kindex V R
20757@pindex calc-reduce
20758@tindex reduce
20759The @kbd{V R} (@code{calc-reduce}) [@code{reduce}] command applies a given
20760binary operator across all the elements of a vector. A binary operator is
20761a function such as @code{+} or @code{max} which takes two arguments. For
20762example, reducing @code{+} over a vector computes the sum of the elements
20763of the vector. Reducing @code{-} computes the first element minus each of
20764the remaining elements. Reducing @code{max} computes the maximum element
20765and so on. In general, reducing @code{f} over the vector @samp{[a, b, c, d]}
20766produces @samp{f(f(f(a, b), c), d)}.
20767
20768@kindex I V R
20769@tindex rreduce
20770The @kbd{I V R} [@code{rreduce}] command is similar to @kbd{V R} except
20771that works from right to left through the vector. For example, plain
20772@kbd{V R -} on the vector @samp{[a, b, c, d]} produces @samp{a - b - c - d}
20773but @kbd{I V R -} on the same vector produces @samp{a - (b - (c - d))},
20774or @samp{a - b + c - d}. This ``alternating sum'' occurs frequently
20775in power series expansions.
20776
20777@kindex V U
20778@tindex accum
20779The @kbd{V U} (@code{calc-accumulate}) [@code{accum}] command does an
20780accumulation operation. Here Calc does the corresponding reduction
20781operation, but instead of producing only the final result, it produces
20782a vector of all the intermediate results. Accumulating @code{+} over
20783the vector @samp{[a, b, c, d]} produces the vector
20784@samp{[a, a + b, a + b + c, a + b + c + d]}.
20785
20786@kindex I V U
20787@tindex raccum
20788The @kbd{I V U} [@code{raccum}] command does a right-to-left accumulation.
20789For example, @kbd{I V U -} on the vector @samp{[a, b, c, d]} produces the
20790vector @samp{[a - b + c - d, b - c + d, c - d, d]}.
20791
20792@tindex reducea
20793@tindex rreducea
20794@tindex reduced
20795@tindex rreduced
20796As for @kbd{V M}, @kbd{V R} normally reduces a matrix elementwise. For
20797example, given the matrix @cite{[[a, b, c], [d, e, f]]}, @kbd{V R +} will
20798compute @cite{a + b + c + d + e + f}. You can type @kbd{V R _} or
20799@kbd{V R :} to modify this behavior. The @kbd{V R _} [@code{reducea}]
20800command reduces ``across'' the matrix; it reduces each row of the matrix
20801as a vector, then collects the results. Thus @kbd{V R _ +} of this
20802matrix would produce @cite{[a + b + c, d + e + f]}. Similarly, @kbd{V R :}
20803[@code{reduced}] reduces down; @kbd{V R : +} would produce @cite{[a + d,
20804b + e, c + f]}.
20805
20806@tindex reducer
20807@tindex rreducer
20808There is a third ``by rows'' mode for reduction that is occasionally
20809useful; @kbd{V R =} [@code{reducer}] simply reduces the operator over
20810the rows of the matrix themselves. Thus @kbd{V R = +} on the above
20811matrix would get the same result as @kbd{V R : +}, since adding two
20812row vectors is equivalent to adding their elements. But @kbd{V R = *}
20813would multiply the two rows (to get a single number, their dot product),
20814while @kbd{V R : *} would produce a vector of the products of the columns.
20815
20816These three matrix reduction modes work with @kbd{V R} and @kbd{I V R},
20817but they are not currently supported with @kbd{V U} or @kbd{I V U}.
20818
20819@tindex reducec
20820@tindex rreducec
20821The obsolete reduce-by-columns function, @code{reducec}, is still
20822supported but there is no way to get it through the @kbd{V R} command.
20823
20824The commands @kbd{M-# :} and @kbd{M-# _} are equivalent to typing
20825@kbd{M-# r} to grab a rectangle of data into Calc, and then typing
20826@kbd{V R : +} or @kbd{V R _ +}, respectively, to sum the columns or
20827rows of the matrix. @xref{Grabbing From Buffers}.
20828
20829@node Nesting and Fixed Points, Generalized Products, Reducing, Reducing and Mapping
20830@subsection Nesting and Fixed Points
20831
20832@noindent
20833@kindex H V R
20834@tindex nest
20835The @kbd{H V R} [@code{nest}] command applies a function to a given
20836argument repeatedly. It takes two values, @samp{a} and @samp{n}, from
20837the stack, where @samp{n} must be an integer. It then applies the
20838function nested @samp{n} times; if the function is @samp{f} and @samp{n}
20839is 3, the result is @samp{f(f(f(a)))}. The number @samp{n} may be
20840negative if Calc knows an inverse for the function @samp{f}; for
20841example, @samp{nest(sin, a, -2)} returns @samp{arcsin(arcsin(a))}.
20842
20843@kindex H V U
20844@tindex anest
20845The @kbd{H V U} [@code{anest}] command is an accumulating version of
20846@code{nest}: It returns a vector of @samp{n+1} values, e.g.,
20847@samp{[a, f(a), f(f(a)), f(f(f(a)))]}. If @samp{n} is negative and
20848@samp{F} is the inverse of @samp{f}, then the result is of the
20849form @samp{[a, F(a), F(F(a)), F(F(F(a)))]}.
20850
20851@kindex H I V R
20852@tindex fixp
20853@cindex Fixed points
20854The @kbd{H I V R} [@code{fixp}] command is like @kbd{H V R}, except
20855that it takes only an @samp{a} value from the stack; the function is
20856applied until it reaches a ``fixed point,'' i.e., until the result
20857no longer changes.
20858
20859@kindex H I V U
20860@tindex afixp
20861The @kbd{H I V U} [@code{afixp}] command is an accumulating @code{fixp}.
20862The first element of the return vector will be the initial value @samp{a};
20863the last element will be the final result that would have been returned
20864by @code{fixp}.
20865
20866For example, 0.739085 is a fixed point of the cosine function (in radians):
20867@samp{cos(0.739085) = 0.739085}. You can find this value by putting, say,
208681.0 on the stack and typing @kbd{H I V U C}. (We use the accumulating
20869version so we can see the intermediate results: @samp{[1, 0.540302, 0.857553,
208700.65329, ...]}. With a precision of six, this command will take 36 steps
20871to converge to 0.739085.)
20872
20873Newton's method for finding roots is a classic example of iteration
20874to a fixed point. To find the square root of five starting with an
20875initial guess, Newton's method would look for a fixed point of the
20876function @samp{(x + 5/x) / 2}. Putting a guess of 1 on the stack
5d67986c 20877and typing @kbd{H I V R ' ($ + 5/$)/2 @key{RET}} quickly yields the result
d7b8e6c6
EZ
208782.23607. This is equivalent to using the @kbd{a R} (@code{calc-find-root})
20879command to find a root of the equation @samp{x^2 = 5}.
20880
20881These examples used numbers for @samp{a} values. Calc keeps applying
20882the function until two successive results are equal to within the
20883current precision. For complex numbers, both the real parts and the
20884imaginary parts must be equal to within the current precision. If
20885@samp{a} is a formula (say, a variable name), then the function is
20886applied until two successive results are exactly the same formula.
20887It is up to you to ensure that the function will eventually converge;
20888if it doesn't, you may have to press @kbd{C-g} to stop the Calculator.
20889
20890The algebraic @code{fixp} function takes two optional arguments, @samp{n}
20891and @samp{tol}. The first is the maximum number of steps to be allowed,
20892and must be either an integer or the symbol @samp{inf} (infinity, the
20893default). The second is a convergence tolerance. If a tolerance is
20894specified, all results during the calculation must be numbers, not
20895formulas, and the iteration stops when the magnitude of the difference
20896between two successive results is less than or equal to the tolerance.
20897(This implies that a tolerance of zero iterates until the results are
20898exactly equal.)
20899
20900Putting it all together, @samp{fixp(<(# + A/#)/2>, B, 20, 1e-10)}
20901computes the square root of @samp{A} given the initial guess @samp{B},
20902stopping when the result is correct within the specified tolerance, or
20903when 20 steps have been taken, whichever is sooner.
20904
20905@node Generalized Products, , Nesting and Fixed Points, Reducing and Mapping
20906@subsection Generalized Products
20907
20908@kindex V O
20909@pindex calc-outer-product
20910@tindex outer
20911The @kbd{V O} (@code{calc-outer-product}) [@code{outer}] command applies
20912a given binary operator to all possible pairs of elements from two
20913vectors, to produce a matrix. For example, @kbd{V O *} with @samp{[a, b]}
20914and @samp{[x, y, z]} on the stack produces a multiplication table:
20915@samp{[[a x, a y, a z], [b x, b y, b z]]}. Element @var{r},@var{c} of
20916the result matrix is obtained by applying the operator to element @var{r}
20917of the lefthand vector and element @var{c} of the righthand vector.
20918
20919@kindex V I
20920@pindex calc-inner-product
20921@tindex inner
20922The @kbd{V I} (@code{calc-inner-product}) [@code{inner}] command computes
20923the generalized inner product of two vectors or matrices, given a
20924``multiplicative'' operator and an ``additive'' operator. These can each
20925actually be any binary operators; if they are @samp{*} and @samp{+},
20926respectively, the result is a standard matrix multiplication. Element
20927@var{r},@var{c} of the result matrix is obtained by mapping the
20928multiplicative operator across row @var{r} of the lefthand matrix and
20929column @var{c} of the righthand matrix, and then reducing with the additive
20930operator. Just as for the standard @kbd{*} command, this can also do a
20931vector-matrix or matrix-vector inner product, or a vector-vector
20932generalized dot product.
20933
20934Since @kbd{V I} requires two operators, it prompts twice. In each case,
20935you can use any of the usual methods for entering the operator. If you
20936use @kbd{$} twice to take both operator formulas from the stack, the
20937first (multiplicative) operator is taken from the top of the stack
20938and the second (additive) operator is taken from second-to-top.
20939
20940@node Vector and Matrix Formats, , Reducing and Mapping, Matrix Functions
20941@section Vector and Matrix Display Formats
20942
20943@noindent
20944Commands for controlling vector and matrix display use the @kbd{v} prefix
20945instead of the usual @kbd{d} prefix. But they are display modes; in
20946particular, they are influenced by the @kbd{I} and @kbd{H} prefix keys
20947in the same way (@pxref{Display Modes}). Matrix display is also
20948influenced by the @kbd{d O} (@code{calc-flat-language}) mode;
20949@pxref{Normal Language Modes}.
20950
20951@kindex V <
20952@pindex calc-matrix-left-justify
20953@kindex V =
20954@pindex calc-matrix-center-justify
20955@kindex V >
20956@pindex calc-matrix-right-justify
20957The commands @kbd{v <} (@code{calc-matrix-left-justify}), @kbd{v >}
20958(@code{calc-matrix-right-justify}), and @w{@kbd{v =}}
20959(@code{calc-matrix-center-justify}) control whether matrix elements
20960are justified to the left, right, or center of their columns.@refill
20961
20962@kindex V [
20963@pindex calc-vector-brackets
20964@kindex V @{
20965@pindex calc-vector-braces
20966@kindex V (
20967@pindex calc-vector-parens
20968The @kbd{v [} (@code{calc-vector-brackets}) command turns the square
20969brackets that surround vectors and matrices displayed in the stack on
20970and off. The @kbd{v @{} (@code{calc-vector-braces}) and @kbd{v (}
20971(@code{calc-vector-parens}) commands use curly braces or parentheses,
20972respectively, instead of square brackets. For example, @kbd{v @{} might
20973be used in preparation for yanking a matrix into a buffer running
20974Mathematica. (In fact, the Mathematica language mode uses this mode;
20975@pxref{Mathematica Language Mode}.) Note that, regardless of the
20976display mode, either brackets or braces may be used to enter vectors,
20977and parentheses may never be used for this purpose.@refill
20978
20979@kindex V ]
20980@pindex calc-matrix-brackets
20981The @kbd{v ]} (@code{calc-matrix-brackets}) command controls the
20982``big'' style display of matrices. It prompts for a string of code
20983letters; currently implemented letters are @code{R}, which enables
20984brackets on each row of the matrix; @code{O}, which enables outer
20985brackets in opposite corners of the matrix; and @code{C}, which
20986enables commas or semicolons at the ends of all rows but the last.
20987The default format is @samp{RO}. (Before Calc 2.00, the format
20988was fixed at @samp{ROC}.) Here are some example matrices:
20989
d7b8e6c6 20990@example
5d67986c 20991@group
d7b8e6c6
EZ
20992[ [ 123, 0, 0 ] [ [ 123, 0, 0 ],
20993 [ 0, 123, 0 ] [ 0, 123, 0 ],
20994 [ 0, 0, 123 ] ] [ 0, 0, 123 ] ]
20995
20996 RO ROC
20997
d7b8e6c6 20998@end group
5d67986c 20999@end example
d7b8e6c6 21000@noindent
d7b8e6c6 21001@example
5d67986c 21002@group
d7b8e6c6
EZ
21003 [ 123, 0, 0 [ 123, 0, 0 ;
21004 0, 123, 0 0, 123, 0 ;
21005 0, 0, 123 ] 0, 0, 123 ]
21006
21007 O OC
21008
d7b8e6c6 21009@end group
5d67986c 21010@end example
d7b8e6c6 21011@noindent
d7b8e6c6 21012@example
5d67986c 21013@group
d7b8e6c6
EZ
21014 [ 123, 0, 0 ] 123, 0, 0
21015 [ 0, 123, 0 ] 0, 123, 0
21016 [ 0, 0, 123 ] 0, 0, 123
21017
21018 R @r{blank}
d7b8e6c6 21019@end group
5d67986c 21020@end example
d7b8e6c6
EZ
21021
21022@noindent
21023Note that of the formats shown here, @samp{RO}, @samp{ROC}, and
21024@samp{OC} are all recognized as matrices during reading, while
21025the others are useful for display only.
21026
21027@kindex V ,
21028@pindex calc-vector-commas
21029The @kbd{v ,} (@code{calc-vector-commas}) command turns commas on and
21030off in vector and matrix display.@refill
21031
21032In vectors of length one, and in all vectors when commas have been
21033turned off, Calc adds extra parentheses around formulas that might
21034otherwise be ambiguous. For example, @samp{[a b]} could be a vector
21035of the one formula @samp{a b}, or it could be a vector of two
21036variables with commas turned off. Calc will display the former
21037case as @samp{[(a b)]}. You can disable these extra parentheses
21038(to make the output less cluttered at the expense of allowing some
21039ambiguity) by adding the letter @code{P} to the control string you
21040give to @kbd{v ]} (as described above).
21041
21042@kindex V .
21043@pindex calc-full-vectors
21044The @kbd{v .} (@code{calc-full-vectors}) command turns abbreviated
21045display of long vectors on and off. In this mode, vectors of six
21046or more elements, or matrices of six or more rows or columns, will
21047be displayed in an abbreviated form that displays only the first
21048three elements and the last element: @samp{[a, b, c, ..., z]}.
21049When very large vectors are involved this will substantially
21050improve Calc's display speed.
21051
21052@kindex t .
21053@pindex calc-full-trail-vectors
21054The @kbd{t .} (@code{calc-full-trail-vectors}) command controls a
21055similar mode for recording vectors in the Trail. If you turn on
21056this mode, vectors of six or more elements and matrices of six or
21057more rows or columns will be abbreviated when they are put in the
21058Trail. The @kbd{t y} (@code{calc-trail-yank}) command will be
21059unable to recover those vectors. If you are working with very
21060large vectors, this mode will improve the speed of all operations
21061that involve the trail.
21062
21063@kindex V /
21064@pindex calc-break-vectors
21065The @kbd{v /} (@code{calc-break-vectors}) command turns multi-line
21066vector display on and off. Normally, matrices are displayed with one
21067row per line but all other types of vectors are displayed in a single
21068line. This mode causes all vectors, whether matrices or not, to be
21069displayed with a single element per line. Sub-vectors within the
21070vectors will still use the normal linear form.
21071
21072@node Algebra, Units, Matrix Functions, Top
21073@chapter Algebra
21074
21075@noindent
21076This section covers the Calc features that help you work with
21077algebraic formulas. First, the general sub-formula selection
21078mechanism is described; this works in conjunction with any Calc
21079commands. Then, commands for specific algebraic operations are
21080described. Finally, the flexible @dfn{rewrite rule} mechanism
21081is discussed.
21082
21083The algebraic commands use the @kbd{a} key prefix; selection
21084commands use the @kbd{j} (for ``just a letter that wasn't used
21085for anything else'') prefix.
21086
21087@xref{Editing Stack Entries}, to see how to manipulate formulas
21088using regular Emacs editing commands.@refill
21089
21090When doing algebraic work, you may find several of the Calculator's
21091modes to be helpful, including algebraic-simplification mode (@kbd{m A})
21092or no-simplification mode (@kbd{m O}),
21093algebraic-entry mode (@kbd{m a}), fraction mode (@kbd{m f}), and
21094symbolic mode (@kbd{m s}). @xref{Mode Settings}, for discussions
21095of these modes. You may also wish to select ``big'' display mode (@kbd{d B}).
21096@xref{Normal Language Modes}.@refill
21097
21098@menu
21099* Selecting Subformulas::
21100* Algebraic Manipulation::
21101* Simplifying Formulas::
21102* Polynomials::
21103* Calculus::
21104* Solving Equations::
21105* Numerical Solutions::
21106* Curve Fitting::
21107* Summations::
21108* Logical Operations::
21109* Rewrite Rules::
21110@end menu
21111
21112@node Selecting Subformulas, Algebraic Manipulation, Algebra, Algebra
21113@section Selecting Sub-Formulas
21114
21115@noindent
21116@cindex Selections
21117@cindex Sub-formulas
21118@cindex Parts of formulas
21119When working with an algebraic formula it is often necessary to
21120manipulate a portion of the formula rather than the formula as a
21121whole. Calc allows you to ``select'' a portion of any formula on
21122the stack. Commands which would normally operate on that stack
21123entry will now operate only on the sub-formula, leaving the
21124surrounding part of the stack entry alone.
21125
21126One common non-algebraic use for selection involves vectors. To work
21127on one element of a vector in-place, simply select that element as a
21128``sub-formula'' of the vector.
21129
21130@menu
21131* Making Selections::
21132* Changing Selections::
21133* Displaying Selections::
21134* Operating on Selections::
21135* Rearranging with Selections::
21136@end menu
21137
21138@node Making Selections, Changing Selections, Selecting Subformulas, Selecting Subformulas
21139@subsection Making Selections
21140
21141@noindent
21142@kindex j s
21143@pindex calc-select-here
21144To select a sub-formula, move the Emacs cursor to any character in that
21145sub-formula, and press @w{@kbd{j s}} (@code{calc-select-here}). Calc will
21146highlight the smallest portion of the formula that contains that
21147character. By default the sub-formula is highlighted by blanking out
21148all of the rest of the formula with dots. Selection works in any
21149display mode but is perhaps easiest in ``big'' (@kbd{d B}) mode.
21150Suppose you enter the following formula:
21151
d7b8e6c6 21152@smallexample
5d67986c 21153@group
d7b8e6c6
EZ
21154 3 ___
21155 (a + b) + V c
211561: ---------------
21157 2 x + 1
d7b8e6c6 21158@end group
5d67986c 21159@end smallexample
d7b8e6c6
EZ
21160
21161@noindent
21162(by typing @kbd{' ((a+b)^3 + sqrt(c)) / (2x+1)}). If you move the
21163cursor to the letter @samp{b} and press @w{@kbd{j s}}, the display changes
21164to
21165
d7b8e6c6 21166@smallexample
5d67986c 21167@group
d7b8e6c6
EZ
21168 . ...
21169 .. . b. . . .
211701* ...............
21171 . . . .
d7b8e6c6 21172@end group
5d67986c 21173@end smallexample
d7b8e6c6
EZ
21174
21175@noindent
21176Every character not part of the sub-formula @samp{b} has been changed
21177to a dot. The @samp{*} next to the line number is to remind you that
21178the formula has a portion of it selected. (In this case, it's very
21179obvious, but it might not always be. If Embedded Mode is enabled,
21180the word @samp{Sel} also appears in the mode line because the stack
21181may not be visible. @pxref{Embedded Mode}.)
21182
21183If you had instead placed the cursor on the parenthesis immediately to
21184the right of the @samp{b}, the selection would have been:
21185
d7b8e6c6 21186@smallexample
5d67986c 21187@group
d7b8e6c6
EZ
21188 . ...
21189 (a + b) . . .
211901* ...............
21191 . . . .
d7b8e6c6 21192@end group
5d67986c 21193@end smallexample
d7b8e6c6
EZ
21194
21195@noindent
21196The portion selected is always large enough to be considered a complete
21197formula all by itself, so selecting the parenthesis selects the whole
21198formula that it encloses. Putting the cursor on the the @samp{+} sign
21199would have had the same effect.
21200
21201(Strictly speaking, the Emacs cursor is really the manifestation of
21202the Emacs ``point,'' which is a position @emph{between} two characters
21203in the buffer. So purists would say that Calc selects the smallest
21204sub-formula which contains the character to the right of ``point.'')
21205
21206If you supply a numeric prefix argument @var{n}, the selection is
21207expanded to the @var{n}th enclosing sub-formula. Thus, positioning
21208the cursor on the @samp{b} and typing @kbd{C-u 1 j s} will select
21209@samp{a + b}; typing @kbd{C-u 2 j s} will select @samp{(a + b)^3},
21210and so on.
21211
21212If the cursor is not on any part of the formula, or if you give a
21213numeric prefix that is too large, the entire formula is selected.
21214
21215If the cursor is on the @samp{.} line that marks the top of the stack
21216(i.e., its normal ``rest position''), this command selects the entire
21217formula at stack level 1. Most selection commands similarly operate
21218on the formula at the top of the stack if you haven't positioned the
21219cursor on any stack entry.
21220
21221@kindex j a
21222@pindex calc-select-additional
21223The @kbd{j a} (@code{calc-select-additional}) command enlarges the
21224current selection to encompass the cursor. To select the smallest
21225sub-formula defined by two different points, move to the first and
21226press @kbd{j s}, then move to the other and press @kbd{j a}. This
21227is roughly analogous to using @kbd{C-@@} (@code{set-mark-command}) to
21228select the two ends of a region of text during normal Emacs editing.
21229
21230@kindex j o
21231@pindex calc-select-once
21232The @kbd{j o} (@code{calc-select-once}) command selects a formula in
21233exactly the same way as @kbd{j s}, except that the selection will
21234last only as long as the next command that uses it. For example,
21235@kbd{j o 1 +} is a handy way to add one to the sub-formula indicated
21236by the cursor.
21237
21238(A somewhat more precise definition: The @kbd{j o} command sets a flag
21239such that the next command involving selected stack entries will clear
21240the selections on those stack entries afterwards. All other selection
21241commands except @kbd{j a} and @kbd{j O} clear this flag.)
21242
21243@kindex j S
21244@kindex j O
21245@pindex calc-select-here-maybe
21246@pindex calc-select-once-maybe
21247The @kbd{j S} (@code{calc-select-here-maybe}) and @kbd{j O}
21248(@code{calc-select-once-maybe}) commands are equivalent to @kbd{j s}
21249and @kbd{j o}, respectively, except that if the formula already
21250has a selection they have no effect. This is analogous to the
21251behavior of some commands such as @kbd{j r} (@code{calc-rewrite-selection};
21252@pxref{Selections with Rewrite Rules}) and is mainly intended to be
21253used in keyboard macros that implement your own selection-oriented
21254commands.@refill
21255
21256Selection of sub-formulas normally treats associative terms like
21257@samp{a + b - c + d} and @samp{x * y * z} as single levels of the formula.
21258If you place the cursor anywhere inside @samp{a + b - c + d} except
21259on one of the variable names and use @kbd{j s}, you will select the
21260entire four-term sum.
21261
21262@kindex j b
21263@pindex calc-break-selections
21264The @kbd{j b} (@code{calc-break-selections}) command controls a mode
21265in which the ``deep structure'' of these associative formulas shows
21266through. Calc actually stores the above formulas as @samp{((a + b) - c) + d}
21267and @samp{x * (y * z)}. (Note that for certain obscure reasons, Calc
21268treats multiplication as right-associative.) Once you have enabled
21269@kbd{j b} mode, selecting with the cursor on the @samp{-} sign would
21270only select the @samp{a + b - c} portion, which makes sense when the
21271deep structure of the sum is considered. There is no way to select
21272the @samp{b - c + d} portion; although this might initially look
21273like just as legitimate a sub-formula as @samp{a + b - c}, the deep
21274structure shows that it isn't. The @kbd{d U} command can be used
21275to view the deep structure of any formula (@pxref{Normal Language Modes}).
21276
21277When @kbd{j b} mode has not been enabled, the deep structure is
21278generally hidden by the selection commands---what you see is what
21279you get.
21280
21281@kindex j u
21282@pindex calc-unselect
21283The @kbd{j u} (@code{calc-unselect}) command unselects the formula
21284that the cursor is on. If there was no selection in the formula,
21285this command has no effect. With a numeric prefix argument, it
21286unselects the @var{n}th stack element rather than using the cursor
21287position.
21288
21289@kindex j c
21290@pindex calc-clear-selections
21291The @kbd{j c} (@code{calc-clear-selections}) command unselects all
21292stack elements.
21293
21294@node Changing Selections, Displaying Selections, Making Selections, Selecting Subformulas
21295@subsection Changing Selections
21296
21297@noindent
21298@kindex j m
21299@pindex calc-select-more
21300Once you have selected a sub-formula, you can expand it using the
21301@w{@kbd{j m}} (@code{calc-select-more}) command. If @samp{a + b} is
21302selected, pressing @w{@kbd{j m}} repeatedly works as follows:
21303
d7b8e6c6 21304@smallexample
5d67986c 21305@group
d7b8e6c6
EZ
21306 3 ... 3 ___ 3 ___
21307 (a + b) . . . (a + b) + V c (a + b) + V c
213081* ............... 1* ............... 1* ---------------
21309 . . . . . . . . 2 x + 1
d7b8e6c6 21310@end group
5d67986c 21311@end smallexample
d7b8e6c6
EZ
21312
21313@noindent
21314In the last example, the entire formula is selected. This is roughly
21315the same as having no selection at all, but because there are subtle
21316differences the @samp{*} character is still there on the line number.
21317
21318With a numeric prefix argument @var{n}, @kbd{j m} expands @var{n}
21319times (or until the entire formula is selected). Note that @kbd{j s}
21320with argument @var{n} is equivalent to plain @kbd{j s} followed by
21321@kbd{j m} with argument @var{n}. If @w{@kbd{j m}} is used when there
21322is no current selection, it is equivalent to @w{@kbd{j s}}.
21323
21324Even though @kbd{j m} does not explicitly use the location of the
21325cursor within the formula, it nevertheless uses the cursor to determine
21326which stack element to operate on. As usual, @kbd{j m} when the cursor
21327is not on any stack element operates on the top stack element.
21328
21329@kindex j l
21330@pindex calc-select-less
21331The @kbd{j l} (@code{calc-select-less}) command reduces the current
21332selection around the cursor position. That is, it selects the
21333immediate sub-formula of the current selection which contains the
21334cursor, the opposite of @kbd{j m}. If the cursor is not inside the
21335current selection, the command de-selects the formula.
21336
21337@kindex j 1-9
21338@pindex calc-select-part
21339The @kbd{j 1} through @kbd{j 9} (@code{calc-select-part}) commands
21340select the @var{n}th sub-formula of the current selection. They are
21341like @kbd{j l} (@code{calc-select-less}) except they use counting
21342rather than the cursor position to decide which sub-formula to select.
21343For example, if the current selection is @kbd{a + b + c} or
21344@kbd{f(a, b, c)} or @kbd{[a, b, c]}, then @kbd{j 1} selects @samp{a},
21345@kbd{j 2} selects @samp{b}, and @kbd{j 3} selects @samp{c}; in each of
21346these cases, @kbd{j 4} through @kbd{j 9} would be errors.
21347
21348If there is no current selection, @kbd{j 1} through @kbd{j 9} select
21349the @var{n}th top-level sub-formula. (In other words, they act as if
21350the entire stack entry were selected first.) To select the @var{n}th
21351sub-formula where @var{n} is greater than nine, you must instead invoke
21352@w{@kbd{j 1}} with @var{n} as a numeric prefix argument.@refill
21353
21354@kindex j n
21355@kindex j p
21356@pindex calc-select-next
21357@pindex calc-select-previous
21358The @kbd{j n} (@code{calc-select-next}) and @kbd{j p}
21359(@code{calc-select-previous}) commands change the current selection
21360to the next or previous sub-formula at the same level. For example,
21361if @samp{b} is selected in @w{@samp{2 + a*b*c + x}}, then @kbd{j n}
21362selects @samp{c}. Further @kbd{j n} commands would be in error because,
21363even though there is something to the right of @samp{c} (namely, @samp{x}),
21364it is not at the same level; in this case, it is not a term of the
21365same product as @samp{b} and @samp{c}. However, @kbd{j m} (to select
21366the whole product @samp{a*b*c} as a term of the sum) followed by
21367@w{@kbd{j n}} would successfully select the @samp{x}.
21368
21369Similarly, @kbd{j p} moves the selection from the @samp{b} in this
21370sample formula to the @samp{a}. Both commands accept numeric prefix
21371arguments to move several steps at a time.
21372
21373It is interesting to compare Calc's selection commands with the
21374Emacs Info system's commands for navigating through hierarchically
21375organized documentation. Calc's @kbd{j n} command is completely
21376analogous to Info's @kbd{n} command. Likewise, @kbd{j p} maps to
21377@kbd{p}, @kbd{j 2} maps to @kbd{2}, and Info's @kbd{u} is like @kbd{j m}.
21378(Note that @kbd{j u} stands for @code{calc-unselect}, not ``up''.)
21379The Info @kbd{m} command is somewhat similar to Calc's @kbd{j s} and
21380@kbd{j l}; in each case, you can jump directly to a sub-component
21381of the hierarchy simply by pointing to it with the cursor.
21382
21383@node Displaying Selections, Operating on Selections, Changing Selections, Selecting Subformulas
21384@subsection Displaying Selections
21385
21386@noindent
21387@kindex j d
21388@pindex calc-show-selections
21389The @kbd{j d} (@code{calc-show-selections}) command controls how
21390selected sub-formulas are displayed. One of the alternatives is
21391illustrated in the above examples; if we press @kbd{j d} we switch
21392to the other style in which the selected portion itself is obscured
21393by @samp{#} signs:
21394
d7b8e6c6 21395@smallexample
5d67986c 21396@group
d7b8e6c6
EZ
21397 3 ... # ___
21398 (a + b) . . . ## # ## + V c
213991* ............... 1* ---------------
21400 . . . . 2 x + 1
d7b8e6c6 21401@end group
5d67986c 21402@end smallexample
d7b8e6c6
EZ
21403
21404@node Operating on Selections, Rearranging with Selections, Displaying Selections, Selecting Subformulas
21405@subsection Operating on Selections
21406
21407@noindent
21408Once a selection is made, all Calc commands that manipulate items
21409on the stack will operate on the selected portions of the items
21410instead. (Note that several stack elements may have selections
21411at once, though there can be only one selection at a time in any
21412given stack element.)
21413
21414@kindex j e
21415@pindex calc-enable-selections
21416The @kbd{j e} (@code{calc-enable-selections}) command disables the
21417effect that selections have on Calc commands. The current selections
21418still exist, but Calc commands operate on whole stack elements anyway.
21419This mode can be identified by the fact that the @samp{*} markers on
21420the line numbers are gone, even though selections are visible. To
21421reactivate the selections, press @kbd{j e} again.
21422
21423To extract a sub-formula as a new formula, simply select the
21424sub-formula and press @key{RET}. This normally duplicates the top
21425stack element; here it duplicates only the selected portion of that
21426element.
21427
21428To replace a sub-formula with something different, you can enter the
21429new value onto the stack and press @key{TAB}. This normally exchanges
21430the top two stack elements; here it swaps the value you entered into
21431the selected portion of the formula, returning the old selected
21432portion to the top of the stack.
21433
d7b8e6c6 21434@smallexample
5d67986c 21435@group
d7b8e6c6
EZ
21436 3 ... ... ___
21437 (a + b) . . . 17 x y . . . 17 x y + V c
214382* ............... 2* ............. 2: -------------
21439 . . . . . . . . 2 x + 1
21440
21441 3 3
214421: 17 x y 1: (a + b) 1: (a + b)
d7b8e6c6 21443@end group
5d67986c 21444@end smallexample
d7b8e6c6
EZ
21445
21446In this example we select a sub-formula of our original example,
21447enter a new formula, @key{TAB} it into place, then deselect to see
21448the complete, edited formula.
21449
21450If you want to swap whole formulas around even though they contain
21451selections, just use @kbd{j e} before and after.
21452
21453@kindex j '
21454@pindex calc-enter-selection
21455The @kbd{j '} (@code{calc-enter-selection}) command is another way
21456to replace a selected sub-formula. This command does an algebraic
21457entry just like the regular @kbd{'} key. When you press @key{RET},
21458the formula you type replaces the original selection. You can use
21459the @samp{$} symbol in the formula to refer to the original
21460selection. If there is no selection in the formula under the cursor,
21461the cursor is used to make a temporary selection for the purposes of
21462the command. Thus, to change a term of a formula, all you have to
21463do is move the Emacs cursor to that term and press @kbd{j '}.
21464
21465@kindex j `
21466@pindex calc-edit-selection
21467The @kbd{j `} (@code{calc-edit-selection}) command is a similar
21468analogue of the @kbd{`} (@code{calc-edit}) command. It edits the
21469selected sub-formula in a separate buffer. If there is no
21470selection, it edits the sub-formula indicated by the cursor.
21471
21472To delete a sub-formula, press @key{DEL}. This generally replaces
21473the sub-formula with the constant zero, but in a few suitable contexts
21474it uses the constant one instead. The @key{DEL} key automatically
21475deselects and re-simplifies the entire formula afterwards. Thus:
21476
d7b8e6c6 21477@smallexample
5d67986c 21478@group
d7b8e6c6
EZ
21479 ###
21480 17 x y + # # 17 x y 17 # y 17 y
214811* ------------- 1: ------- 1* ------- 1: -------
21482 2 x + 1 2 x + 1 2 x + 1 2 x + 1
d7b8e6c6 21483@end group
5d67986c 21484@end smallexample
d7b8e6c6
EZ
21485
21486In this example, we first delete the @samp{sqrt(c)} term; Calc
21487accomplishes this by replacing @samp{sqrt(c)} with zero and
21488resimplifying. We then delete the @kbd{x} in the numerator;
21489since this is part of a product, Calc replaces it with @samp{1}
21490and resimplifies.
21491
21492If you select an element of a vector and press @key{DEL}, that
21493element is deleted from the vector. If you delete one side of
21494an equation or inequality, only the opposite side remains.
21495
5d67986c 21496@kindex j @key{DEL}
d7b8e6c6
EZ
21497@pindex calc-del-selection
21498The @kbd{j @key{DEL}} (@code{calc-del-selection}) command is like
21499@key{DEL} but with the auto-selecting behavior of @kbd{j '} and
21500@kbd{j `}. It deletes the selected portion of the formula
21501indicated by the cursor, or, in the absence of a selection, it
21502deletes the sub-formula indicated by the cursor position.
21503
5d67986c 21504@kindex j @key{RET}
d7b8e6c6
EZ
21505@pindex calc-grab-selection
21506(There is also an auto-selecting @kbd{j @key{RET}} (@code{calc-copy-selection})
21507command.)
21508
21509Normal arithmetic operations also apply to sub-formulas. Here we
21510select the denominator, press @kbd{5 -} to subtract five from the
21511denominator, press @kbd{n} to negate the denominator, then
21512press @kbd{Q} to take the square root.
21513
d7b8e6c6 21514@smallexample
5d67986c 21515@group
d7b8e6c6
EZ
21516 .. . .. . .. . .. .
215171* ....... 1* ....... 1* ....... 1* ..........
21518 2 x + 1 2 x - 4 4 - 2 x _________
21519 V 4 - 2 x
d7b8e6c6 21520@end group
5d67986c 21521@end smallexample
d7b8e6c6
EZ
21522
21523Certain types of operations on selections are not allowed. For
21524example, for an arithmetic function like @kbd{-} no more than one of
21525the arguments may be a selected sub-formula. (As the above example
21526shows, the result of the subtraction is spliced back into the argument
21527which had the selection; if there were more than one selection involved,
21528this would not be well-defined.) If you try to subtract two selections,
21529the command will abort with an error message.
21530
21531Operations on sub-formulas sometimes leave the formula as a whole
21532in an ``un-natural'' state. Consider negating the @samp{2 x} term
21533of our sample formula by selecting it and pressing @kbd{n}
21534(@code{calc-change-sign}).@refill
21535
d7b8e6c6 21536@smallexample
5d67986c 21537@group
d7b8e6c6
EZ
21538 .. . .. .
215391* .......... 1* ...........
21540 ......... ..........
21541 . . . 2 x . . . -2 x
d7b8e6c6 21542@end group
5d67986c 21543@end smallexample
d7b8e6c6
EZ
21544
21545Unselecting the sub-formula reveals that the minus sign, which would
21546normally have cancelled out with the subtraction automatically, has
21547not been able to do so because the subtraction was not part of the
21548selected portion. Pressing @kbd{=} (@code{calc-evaluate}) or doing
21549any other mathematical operation on the whole formula will cause it
21550to be simplified.
21551
d7b8e6c6 21552@smallexample
5d67986c 21553@group
d7b8e6c6
EZ
21554 17 y 17 y
215551: ----------- 1: ----------
21556 __________ _________
21557 V 4 - -2 x V 4 + 2 x
d7b8e6c6 21558@end group
5d67986c 21559@end smallexample
d7b8e6c6
EZ
21560
21561@node Rearranging with Selections, , Operating on Selections, Selecting Subformulas
21562@subsection Rearranging Formulas using Selections
21563
21564@noindent
21565@kindex j R
21566@pindex calc-commute-right
21567The @kbd{j R} (@code{calc-commute-right}) command moves the selected
21568sub-formula to the right in its surrounding formula. Generally the
21569selection is one term of a sum or product; the sum or product is
21570rearranged according to the commutative laws of algebra.
21571
5d67986c 21572As with @kbd{j '} and @kbd{j @key{DEL}}, the term under the cursor is used
d7b8e6c6
EZ
21573if there is no selection in the current formula. All commands described
21574in this section share this property. In this example, we place the
21575cursor on the @samp{a} and type @kbd{j R}, then repeat.
21576
21577@smallexample
215781: a + b - c 1: b + a - c 1: b - c + a
21579@end smallexample
21580
21581@noindent
21582Note that in the final step above, the @samp{a} is switched with
21583the @samp{c} but the signs are adjusted accordingly. When moving
21584terms of sums and products, @kbd{j R} will never change the
21585mathematical meaning of the formula.
21586
21587The selected term may also be an element of a vector or an argument
21588of a function. The term is exchanged with the one to its right.
21589In this case, the ``meaning'' of the vector or function may of
21590course be drastically changed.
21591
21592@smallexample
215931: [a, b, c] 1: [b, a, c] 1: [b, c, a]
21594
215951: f(a, b, c) 1: f(b, a, c) 1: f(b, c, a)
21596@end smallexample
21597
21598@kindex j L
21599@pindex calc-commute-left
21600The @kbd{j L} (@code{calc-commute-left}) command is like @kbd{j R}
21601except that it swaps the selected term with the one to its left.
21602
21603With numeric prefix arguments, these commands move the selected
21604term several steps at a time. It is an error to try to move a
21605term left or right past the end of its enclosing formula.
21606With numeric prefix arguments of zero, these commands move the
21607selected term as far as possible in the given direction.
21608
21609@kindex j D
21610@pindex calc-sel-distribute
21611The @kbd{j D} (@code{calc-sel-distribute}) command mixes the selected
21612sum or product into the surrounding formula using the distributive
21613law. For example, in @samp{a * (b - c)} with the @samp{b - c}
21614selected, the result is @samp{a b - a c}. This also distributes
21615products or quotients into surrounding powers, and can also do
21616transformations like @samp{exp(a + b)} to @samp{exp(a) exp(b)},
21617where @samp{a + b} is the selected term, and @samp{ln(a ^ b)}
21618to @samp{ln(a) b}, where @samp{a ^ b} is the selected term.
21619
21620For multiple-term sums or products, @kbd{j D} takes off one term
21621at a time: @samp{a * (b + c - d)} goes to @samp{a * (c - d) + a b}
21622with the @samp{c - d} selected so that you can type @kbd{j D}
21623repeatedly to expand completely. The @kbd{j D} command allows a
21624numeric prefix argument which specifies the maximum number of
21625times to expand at once; the default is one time only.
21626
21627@vindex DistribRules
21628The @kbd{j D} command is implemented using rewrite rules.
21629@xref{Selections with Rewrite Rules}. The rules are stored in
21630the Calc variable @code{DistribRules}. A convenient way to view
21631these rules is to use @kbd{s e} (@code{calc-edit-variable}) which
0d48e8aa 21632displays and edits the stored value of a variable. Press @kbd{M-# M-#}
d7b8e6c6
EZ
21633to return from editing mode; be careful not to make any actual changes
21634or else you will affect the behavior of future @kbd{j D} commands!
21635
21636To extend @kbd{j D} to handle new cases, just edit @code{DistribRules}
21637as described above. You can then use the @kbd{s p} command to save
21638this variable's value permanently for future Calc sessions.
21639@xref{Operations on Variables}.
21640
21641@kindex j M
21642@pindex calc-sel-merge
21643@vindex MergeRules
21644The @kbd{j M} (@code{calc-sel-merge}) command is the complement
21645of @kbd{j D}; given @samp{a b - a c} with either @samp{a b} or
21646@samp{a c} selected, the result is @samp{a * (b - c)}. Once
21647again, @kbd{j M} can also merge calls to functions like @code{exp}
21648and @code{ln}; examine the variable @code{MergeRules} to see all
21649the relevant rules.
21650
21651@kindex j C
21652@pindex calc-sel-commute
21653@vindex CommuteRules
21654The @kbd{j C} (@code{calc-sel-commute}) command swaps the arguments
21655of the selected sum, product, or equation. It always behaves as
21656if @kbd{j b} mode were in effect, i.e., the sum @samp{a + b + c} is
21657treated as the nested sums @samp{(a + b) + c} by this command.
21658If you put the cursor on the first @samp{+}, the result is
21659@samp{(b + a) + c}; if you put the cursor on the second @samp{+}, the
21660result is @samp{c + (a + b)} (which the default simplifications
21661will rearrange to @samp{(c + a) + b}). The relevant rules are stored
21662in the variable @code{CommuteRules}.
21663
21664You may need to turn default simplifications off (with the @kbd{m O}
21665command) in order to get the full benefit of @kbd{j C}. For example,
21666commuting @samp{a - b} produces @samp{-b + a}, but the default
21667simplifications will ``simplify'' this right back to @samp{a - b} if
21668you don't turn them off. The same is true of some of the other
21669manipulations described in this section.
21670
21671@kindex j N
21672@pindex calc-sel-negate
21673@vindex NegateRules
21674The @kbd{j N} (@code{calc-sel-negate}) command replaces the selected
21675term with the negative of that term, then adjusts the surrounding
21676formula in order to preserve the meaning. For example, given
21677@samp{exp(a - b)} where @samp{a - b} is selected, the result is
21678@samp{1 / exp(b - a)}. By contrast, selecting a term and using the
21679regular @kbd{n} (@code{calc-change-sign}) command negates the
21680term without adjusting the surroundings, thus changing the meaning
21681of the formula as a whole. The rules variable is @code{NegateRules}.
21682
21683@kindex j &
21684@pindex calc-sel-invert
21685@vindex InvertRules
21686The @kbd{j &} (@code{calc-sel-invert}) command is similar to @kbd{j N}
21687except it takes the reciprocal of the selected term. For example,
21688given @samp{a - ln(b)} with @samp{b} selected, the result is
21689@samp{a + ln(1/b)}. The rules variable is @code{InvertRules}.
21690
21691@kindex j E
21692@pindex calc-sel-jump-equals
21693@vindex JumpRules
21694The @kbd{j E} (@code{calc-sel-jump-equals}) command moves the
21695selected term from one side of an equation to the other. Given
21696@samp{a + b = c + d} with @samp{c} selected, the result is
21697@samp{a + b - c = d}. This command also works if the selected
21698term is part of a @samp{*}, @samp{/}, or @samp{^} formula. The
21699relevant rules variable is @code{JumpRules}.
21700
21701@kindex j I
21702@kindex H j I
21703@pindex calc-sel-isolate
21704The @kbd{j I} (@code{calc-sel-isolate}) command isolates the
21705selected term on its side of an equation. It uses the @kbd{a S}
21706(@code{calc-solve-for}) command to solve the equation, and the
21707Hyperbolic flag affects it in the same way. @xref{Solving Equations}.
21708When it applies, @kbd{j I} is often easier to use than @kbd{j E}.
21709It understands more rules of algebra, and works for inequalities
21710as well as equations.
21711
21712@kindex j *
21713@kindex j /
21714@pindex calc-sel-mult-both-sides
21715@pindex calc-sel-div-both-sides
21716The @kbd{j *} (@code{calc-sel-mult-both-sides}) command prompts for a
21717formula using algebraic entry, then multiplies both sides of the
21718selected quotient or equation by that formula. It simplifies each
21719side with @kbd{a s} (@code{calc-simplify}) before re-forming the
21720quotient or equation. You can suppress this simplification by
21721providing any numeric prefix argument. There is also a @kbd{j /}
21722(@code{calc-sel-div-both-sides}) which is similar to @kbd{j *} but
21723dividing instead of multiplying by the factor you enter.
21724
21725As a special feature, if the numerator of the quotient is 1, then
21726the denominator is expanded at the top level using the distributive
21727law (i.e., using the @kbd{C-u -1 a x} command). Suppose the
21728formula on the stack is @samp{1 / (sqrt(a) + 1)}, and you wish
21729to eliminate the square root in the denominator by multiplying both
21730sides by @samp{sqrt(a) - 1}. Calc's default simplifications would
21731change the result @samp{(sqrt(a) - 1) / (sqrt(a) - 1) (sqrt(a) + 1)}
21732right back to the original form by cancellation; Calc expands the
21733denominator to @samp{sqrt(a) (sqrt(a) - 1) + sqrt(a) - 1} to prevent
21734this. (You would now want to use an @kbd{a x} command to expand
21735the rest of the way, whereupon the denominator would cancel out to
21736the desired form, @samp{a - 1}.) When the numerator is not 1, this
21737initial expansion is not necessary because Calc's default
21738simplifications will not notice the potential cancellation.
21739
21740If the selection is an inequality, @kbd{j *} and @kbd{j /} will
21741accept any factor, but will warn unless they can prove the factor
21742is either positive or negative. (In the latter case the direction
21743of the inequality will be switched appropriately.) @xref{Declarations},
21744for ways to inform Calc that a given variable is positive or
21745negative. If Calc can't tell for sure what the sign of the factor
21746will be, it will assume it is positive and display a warning
21747message.
21748
21749For selections that are not quotients, equations, or inequalities,
21750these commands pull out a multiplicative factor: They divide (or
21751multiply) by the entered formula, simplify, then multiply (or divide)
21752back by the formula.
21753
21754@kindex j +
21755@kindex j -
21756@pindex calc-sel-add-both-sides
21757@pindex calc-sel-sub-both-sides
21758The @kbd{j +} (@code{calc-sel-add-both-sides}) and @kbd{j -}
21759(@code{calc-sel-sub-both-sides}) commands analogously add to or
21760subtract from both sides of an equation or inequality. For other
21761types of selections, they extract an additive factor. A numeric
21762prefix argument suppresses simplification of the intermediate
21763results.
21764
21765@kindex j U
21766@pindex calc-sel-unpack
21767The @kbd{j U} (@code{calc-sel-unpack}) command replaces the
21768selected function call with its argument. For example, given
21769@samp{a + sin(x^2)} with @samp{sin(x^2)} selected, the result
21770is @samp{a + x^2}. (The @samp{x^2} will remain selected; if you
21771wanted to change the @code{sin} to @code{cos}, just press @kbd{C}
21772now to take the cosine of the selected part.)
21773
21774@kindex j v
21775@pindex calc-sel-evaluate
21776The @kbd{j v} (@code{calc-sel-evaluate}) command performs the
21777normal default simplifications on the selected sub-formula.
21778These are the simplifications that are normally done automatically
21779on all results, but which may have been partially inhibited by
21780previous selection-related operations, or turned off altogether
21781by the @kbd{m O} command. This command is just an auto-selecting
21782version of the @w{@kbd{a v}} command (@pxref{Algebraic Manipulation}).
21783
21784With a numeric prefix argument of 2, @kbd{C-u 2 j v} applies
21785the @kbd{a s} (@code{calc-simplify}) command to the selected
21786sub-formula. With a prefix argument of 3 or more, e.g., @kbd{C-u j v}
21787applies the @kbd{a e} (@code{calc-simplify-extended}) command.
21788@xref{Simplifying Formulas}. With a negative prefix argument
21789it simplifies at the top level only, just as with @kbd{a v}.
21790Here the ``top'' level refers to the top level of the selected
21791sub-formula.
21792
21793@kindex j "
21794@pindex calc-sel-expand-formula
21795The @kbd{j "} (@code{calc-sel-expand-formula}) command is to @kbd{a "}
21796(@pxref{Algebraic Manipulation}) what @kbd{j v} is to @kbd{a v}.
21797
21798You can use the @kbd{j r} (@code{calc-rewrite-selection}) command
21799to define other algebraic operations on sub-formulas. @xref{Rewrite Rules}.
21800
21801@node Algebraic Manipulation, Simplifying Formulas, Selecting Subformulas, Algebra
21802@section Algebraic Manipulation
21803
21804@noindent
21805The commands in this section perform general-purpose algebraic
21806manipulations. They work on the whole formula at the top of the
21807stack (unless, of course, you have made a selection in that
21808formula).
21809
21810Many algebra commands prompt for a variable name or formula. If you
21811answer the prompt with a blank line, the variable or formula is taken
21812from top-of-stack, and the normal argument for the command is taken
21813from the second-to-top stack level.
21814
21815@kindex a v
21816@pindex calc-alg-evaluate
21817The @kbd{a v} (@code{calc-alg-evaluate}) command performs the normal
21818default simplifications on a formula; for example, @samp{a - -b} is
21819changed to @samp{a + b}. These simplifications are normally done
21820automatically on all Calc results, so this command is useful only if
21821you have turned default simplifications off with an @kbd{m O}
21822command. @xref{Simplification Modes}.
21823
21824It is often more convenient to type @kbd{=}, which is like @kbd{a v}
21825but which also substitutes stored values for variables in the formula.
21826Use @kbd{a v} if you want the variables to ignore their stored values.
21827
21828If you give a numeric prefix argument of 2 to @kbd{a v}, it simplifies
21829as if in algebraic simplification mode. This is equivalent to typing
21830@kbd{a s}; @pxref{Simplifying Formulas}. If you give a numeric prefix
21831of 3 or more, it uses extended simplification mode (@kbd{a e}).
21832
21833If you give a negative prefix argument @i{-1}, @i{-2}, or @i{-3},
21834it simplifies in the corresponding mode but only works on the top-level
21835function call of the formula. For example, @samp{(2 + 3) * (2 + 3)} will
21836simplify to @samp{(2 + 3)^2}, without simplifying the sub-formulas
21837@samp{2 + 3}. As another example, typing @kbd{V R +} to sum the vector
21838@samp{[1, 2, 3, 4]} produces the formula @samp{reduce(add, [1, 2, 3, 4])}
21839in no-simplify mode. Using @kbd{a v} will evaluate this all the way to
2184010; using @kbd{C-u - a v} will evaluate it only to @samp{1 + 2 + 3 + 4}.
21841(@xref{Reducing and Mapping}.)
21842
21843@tindex evalv
21844@tindex evalvn
21845The @kbd{=} command corresponds to the @code{evalv} function, and
21846the related @kbd{N} command, which is like @kbd{=} but temporarily
21847disables symbolic (@kbd{m s}) mode during the evaluation, corresponds
21848to the @code{evalvn} function. (These commands interpret their prefix
21849arguments differently than @kbd{a v}; @kbd{=} treats the prefix as
21850the number of stack elements to evaluate at once, and @kbd{N} treats
21851it as a temporary different working precision.)
21852
21853The @code{evalvn} function can take an alternate working precision
21854as an optional second argument. This argument can be either an
21855integer, to set the precision absolutely, or a vector containing
21856a single integer, to adjust the precision relative to the current
21857precision. Note that @code{evalvn} with a larger than current
21858precision will do the calculation at this higher precision, but the
21859result will as usual be rounded back down to the current precision
21860afterward. For example, @samp{evalvn(pi - 3.1415)} at a precision
21861of 12 will return @samp{9.265359e-5}; @samp{evalvn(pi - 3.1415, 30)}
21862will return @samp{9.26535897932e-5} (computing a 25-digit result which
21863is then rounded down to 12); and @samp{evalvn(pi - 3.1415, [-2])}
21864will return @samp{9.2654e-5}.
21865
21866@kindex a "
21867@pindex calc-expand-formula
21868The @kbd{a "} (@code{calc-expand-formula}) command expands functions
21869into their defining formulas wherever possible. For example,
21870@samp{deg(x^2)} is changed to @samp{180 x^2 / pi}. Most functions,
21871like @code{sin} and @code{gcd}, are not defined by simple formulas
21872and so are unaffected by this command. One important class of
21873functions which @emph{can} be expanded is the user-defined functions
21874created by the @kbd{Z F} command. @xref{Algebraic Definitions}.
21875Other functions which @kbd{a "} can expand include the probability
21876distribution functions, most of the financial functions, and the
21877hyperbolic and inverse hyperbolic functions. A numeric prefix argument
21878affects @kbd{a "} in the same way as it does @kbd{a v}: A positive
21879argument expands all functions in the formula and then simplifies in
21880various ways; a negative argument expands and simplifies only the
21881top-level function call.
21882
21883@kindex a M
21884@pindex calc-map-equation
21885@tindex mapeq
21886The @kbd{a M} (@code{calc-map-equation}) [@code{mapeq}] command applies
21887a given function or operator to one or more equations. It is analogous
21888to @kbd{V M}, which operates on vectors instead of equations.
21889@pxref{Reducing and Mapping}. For example, @kbd{a M S} changes
21890@samp{x = y+1} to @samp{sin(x) = sin(y+1)}, and @kbd{a M +} with
21891@samp{x = y+1} and @cite{6} on the stack produces @samp{x+6 = y+7}.
21892With two equations on the stack, @kbd{a M +} would add the lefthand
21893sides together and the righthand sides together to get the two
21894respective sides of a new equation.
21895
21896Mapping also works on inequalities. Mapping two similar inequalities
21897produces another inequality of the same type. Mapping an inequality
21898with an equation produces an inequality of the same type. Mapping a
21899@samp{<=} with a @samp{<} or @samp{!=} (not-equal) produces a @samp{<}.
21900If inequalities with opposite direction (e.g., @samp{<} and @samp{>})
21901are mapped, the direction of the second inequality is reversed to
21902match the first: Using @kbd{a M +} on @samp{a < b} and @samp{a > 2}
21903reverses the latter to get @samp{2 < a}, which then allows the
21904combination @samp{a + 2 < b + a}, which the @kbd{a s} command can
21905then simplify to get @samp{2 < b}.
21906
21907Using @kbd{a M *}, @kbd{a M /}, @kbd{a M n}, or @kbd{a M &} to negate
21908or invert an inequality will reverse the direction of the inequality.
21909Other adjustments to inequalities are @emph{not} done automatically;
21910@kbd{a M S} will change @w{@samp{x < y}} to @samp{sin(x) < sin(y)} even
21911though this is not true for all values of the variables.
21912
21913@kindex H a M
21914@tindex mapeqp
21915With the Hyperbolic flag, @kbd{H a M} [@code{mapeqp}] does a plain
21916mapping operation without reversing the direction of any inequalities.
21917Thus, @kbd{H a M &} would change @kbd{x > 2} to @kbd{1/x > 0.5}.
21918(This change is mathematically incorrect, but perhaps you were
21919fixing an inequality which was already incorrect.)
21920
21921@kindex I a M
21922@tindex mapeqr
21923With the Inverse flag, @kbd{I a M} [@code{mapeqr}] always reverses
21924the direction of the inequality. You might use @kbd{I a M C} to
21925change @samp{x < y} to @samp{cos(x) > cos(y)} if you know you are
21926working with small positive angles.
21927
21928@kindex a b
21929@pindex calc-substitute
21930@tindex subst
21931The @kbd{a b} (@code{calc-substitute}) [@code{subst}] command substitutes
21932all occurrences
21933of some variable or sub-expression of an expression with a new
21934sub-expression. For example, substituting @samp{sin(x)} with @samp{cos(y)}
21935in @samp{2 sin(x)^2 + x sin(x) + sin(2 x)} produces
21936@samp{2 cos(y)^2 + x cos(y) + @w{sin(2 x)}}.
21937Note that this is a purely structural substitution; the lone @samp{x} and
21938the @samp{sin(2 x)} stayed the same because they did not look like
21939@samp{sin(x)}. @xref{Rewrite Rules}, for a more general method for
21940doing substitutions.@refill
21941
21942The @kbd{a b} command normally prompts for two formulas, the old
21943one and the new one. If you enter a blank line for the first
21944prompt, all three arguments are taken from the stack (new, then old,
21945then target expression). If you type an old formula but then enter a
21946blank line for the new one, the new formula is taken from top-of-stack
21947and the target from second-to-top. If you answer both prompts, the
21948target is taken from top-of-stack as usual.
21949
21950Note that @kbd{a b} has no understanding of commutativity or
21951associativity. The pattern @samp{x+y} will not match the formula
21952@samp{y+x}. Also, @samp{y+z} will not match inside the formula @samp{x+y+z}
21953because the @samp{+} operator is left-associative, so the ``deep
21954structure'' of that formula is @samp{(x+y) + z}. Use @kbd{d U}
21955(@code{calc-unformatted-language}) mode to see the true structure of
21956a formula. The rewrite rule mechanism, discussed later, does not have
21957these limitations.
21958
21959As an algebraic function, @code{subst} takes three arguments:
21960Target expression, old, new. Note that @code{subst} is always
21961evaluated immediately, even if its arguments are variables, so if
21962you wish to put a call to @code{subst} onto the stack you must
21963turn the default simplifications off first (with @kbd{m O}).
21964
21965@node Simplifying Formulas, Polynomials, Algebraic Manipulation, Algebra
21966@section Simplifying Formulas
21967
21968@noindent
21969@kindex a s
21970@pindex calc-simplify
21971@tindex simplify
21972The @kbd{a s} (@code{calc-simplify}) [@code{simplify}] command applies
21973various algebraic rules to simplify a formula. This includes rules which
21974are not part of the default simplifications because they may be too slow
21975to apply all the time, or may not be desirable all of the time. For
21976example, non-adjacent terms of sums are combined, as in @samp{a + b + 2 a}
21977to @samp{b + 3 a}, and some formulas like @samp{sin(arcsin(x))} are
21978simplified to @samp{x}.
21979
21980The sections below describe all the various kinds of algebraic
21981simplifications Calc provides in full detail. None of Calc's
21982simplification commands are designed to pull rabbits out of hats;
21983they simply apply certain specific rules to put formulas into
21984less redundant or more pleasing forms. Serious algebra in Calc
21985must be done manually, usually with a combination of selections
21986and rewrite rules. @xref{Rearranging with Selections}.
21987@xref{Rewrite Rules}.
21988
21989@xref{Simplification Modes}, for commands to control what level of
21990simplification occurs automatically. Normally only the ``default
21991simplifications'' occur.
21992
21993@menu
21994* Default Simplifications::
21995* Algebraic Simplifications::
21996* Unsafe Simplifications::
21997* Simplification of Units::
21998@end menu
21999
22000@node Default Simplifications, Algebraic Simplifications, Simplifying Formulas, Simplifying Formulas
22001@subsection Default Simplifications
22002
22003@noindent
22004@cindex Default simplifications
22005This section describes the ``default simplifications,'' those which are
22006normally applied to all results. For example, if you enter the variable
22007@cite{x} on the stack twice and push @kbd{+}, Calc's default
22008simplifications automatically change @cite{x + x} to @cite{2 x}.
22009
22010The @kbd{m O} command turns off the default simplifications, so that
22011@cite{x + x} will remain in this form unless you give an explicit
22012``simplify'' command like @kbd{=} or @kbd{a v}. @xref{Algebraic
22013Manipulation}. The @kbd{m D} command turns the default simplifications
22014back on.
22015
22016The most basic default simplification is the evaluation of functions.
22017For example, @cite{2 + 3} is evaluated to @cite{5}, and @cite{@t{sqrt}(9)}
22018is evaluated to @cite{3}. Evaluation does not occur if the arguments
22019to a function are somehow of the wrong type (@cite{@t{tan}([2,3,4])},
22020range (@cite{@t{tan}(90)}), or number (@cite{@t{tan}(3,5)}), or if the
22021function name is not recognized (@cite{@t{f}(5)}), or if ``symbolic''
22022mode (@pxref{Symbolic Mode}) prevents evaluation (@cite{@t{sqrt}(2)}).
22023
22024Calc simplifies (evaluates) the arguments to a function before it
22025simplifies the function itself. Thus @cite{@t{sqrt}(5+4)} is
22026simplified to @cite{@t{sqrt}(9)} before the @code{sqrt} function
22027itself is applied. There are very few exceptions to this rule:
22028@code{quote}, @code{lambda}, and @code{condition} (the @code{::}
22029operator) do not evaluate their arguments, @code{if} (the @code{? :}
22030operator) does not evaluate all of its arguments, and @code{evalto}
22031does not evaluate its lefthand argument.
22032
22033Most commands apply the default simplifications to all arguments they
22034take from the stack, perform a particular operation, then simplify
22035the result before pushing it back on the stack. In the common special
22036case of regular arithmetic commands like @kbd{+} and @kbd{Q} [@code{sqrt}],
22037the arguments are simply popped from the stack and collected into a
22038suitable function call, which is then simplified (the arguments being
22039simplified first as part of the process, as described above).
22040
22041The default simplifications are too numerous to describe completely
22042here, but this section will describe the ones that apply to the
22043major arithmetic operators. This list will be rather technical in
22044nature, and will probably be interesting to you only if you are
22045a serious user of Calc's algebra facilities.
22046
22047@tex
22048\bigskip
22049@end tex
22050
22051As well as the simplifications described here, if you have stored
22052any rewrite rules in the variable @code{EvalRules} then these rules
22053will also be applied before any built-in default simplifications.
22054@xref{Automatic Rewrites}, for details.
22055
22056@tex
22057\bigskip
22058@end tex
22059
22060And now, on with the default simplifications:
22061
22062Arithmetic operators like @kbd{+} and @kbd{*} always take two
22063arguments in Calc's internal form. Sums and products of three or
22064more terms are arranged by the associative law of algebra into
22065a left-associative form for sums, @cite{((a + b) + c) + d}, and
22066a right-associative form for products, @cite{a * (b * (c * d))}.
22067Formulas like @cite{(a + b) + (c + d)} are rearranged to
22068left-associative form, though this rarely matters since Calc's
22069algebra commands are designed to hide the inner structure of
22070sums and products as much as possible. Sums and products in
22071their proper associative form will be written without parentheses
22072in the examples below.
22073
22074Sums and products are @emph{not} rearranged according to the
22075commutative law (@cite{a + b} to @cite{b + a}) except in a few
22076special cases described below. Some algebra programs always
22077rearrange terms into a canonical order, which enables them to
22078see that @cite{a b + b a} can be simplified to @cite{2 a b}.
22079Calc assumes you have put the terms into the order you want
22080and generally leaves that order alone, with the consequence
22081that formulas like the above will only be simplified if you
22082explicitly give the @kbd{a s} command. @xref{Algebraic
22083Simplifications}.
22084
22085Differences @cite{a - b} are treated like sums @cite{a + (-b)}
22086for purposes of simplification; one of the default simplifications
22087is to rewrite @cite{a + (-b)} or @cite{(-b) + a}, where @cite{-b}
22088represents a ``negative-looking'' term, into @cite{a - b} form.
22089``Negative-looking'' means negative numbers, negated formulas like
22090@cite{-x}, and products or quotients in which either term is
22091negative-looking.
22092
22093Other simplifications involving negation are @cite{-(-x)} to @cite{x};
22094@cite{-(a b)} or @cite{-(a/b)} where either @cite{a} or @cite{b} is
22095negative-looking, simplified by negating that term, or else where
22096@cite{a} or @cite{b} is any number, by negating that number;
22097@cite{-(a + b)} to @cite{-a - b}, and @cite{-(b - a)} to @cite{a - b}.
22098(This, and rewriting @cite{(-b) + a} to @cite{a - b}, are the only
22099cases where the order of terms in a sum is changed by the default
22100simplifications.)
22101
22102The distributive law is used to simplify sums in some cases:
22103@cite{a x + b x} to @cite{(a + b) x}, where @cite{a} represents
22104a number or an implicit 1 or @i{-1} (as in @cite{x} or @cite{-x})
22105and similarly for @cite{b}. Use the @kbd{a c}, @w{@kbd{a f}}, or
22106@kbd{j M} commands to merge sums with non-numeric coefficients
22107using the distributive law.
22108
22109The distributive law is only used for sums of two terms, or
22110for adjacent terms in a larger sum. Thus @cite{a + b + b + c}
22111is simplified to @cite{a + 2 b + c}, but @cite{a + b + c + b}
22112is not simplified. The reason is that comparing all terms of a
22113sum with one another would require time proportional to the
22114square of the number of terms; Calc relegates potentially slow
22115operations like this to commands that have to be invoked
22116explicitly, like @kbd{a s}.
22117
22118Finally, @cite{a + 0} and @cite{0 + a} are simplified to @cite{a}.
22119A consequence of the above rules is that @cite{0 - a} is simplified
22120to @cite{-a}.
22121
22122@tex
22123\bigskip
22124@end tex
22125
22126The products @cite{1 a} and @cite{a 1} are simplified to @cite{a};
22127@cite{(-1) a} and @cite{a (-1)} are simplified to @cite{-a};
22128@cite{0 a} and @cite{a 0} are simplified to @cite{0}, except that
22129in matrix mode where @cite{a} is not provably scalar the result
22130is the generic zero matrix @samp{idn(0)}, and that if @cite{a} is
22131infinite the result is @samp{nan}.
22132
22133Also, @cite{(-a) b} and @cite{a (-b)} are simplified to @cite{-(a b)},
22134where this occurs for negated formulas but not for regular negative
22135numbers.
22136
22137Products are commuted only to move numbers to the front:
22138@cite{a b 2} is commuted to @cite{2 a b}.
22139
22140The product @cite{a (b + c)} is distributed over the sum only if
22141@cite{a} and at least one of @cite{b} and @cite{c} are numbers:
22142@cite{2 (x + 3)} goes to @cite{2 x + 6}. The formula
22143@cite{(-a) (b - c)}, where @cite{-a} is a negative number, is
22144rewritten to @cite{a (c - b)}.
22145
22146The distributive law of products and powers is used for adjacent
22147terms of the product: @cite{x^a x^b} goes to @c{$x^{a+b}$}
22148@cite{x^(a+b)}
22149where @cite{a} is a number, or an implicit 1 (as in @cite{x}),
22150or the implicit one-half of @cite{@t{sqrt}(x)}, and similarly for
22151@cite{b}. The result is written using @samp{sqrt} or @samp{1/sqrt}
22152if the sum of the powers is @cite{1/2} or @cite{-1/2}, respectively.
22153If the sum of the powers is zero, the product is simplified to
22154@cite{1} or to @samp{idn(1)} if matrix mode is enabled.
22155
22156The product of a negative power times anything but another negative
22157power is changed to use division: @c{$x^{-2} y$}
22158@cite{x^(-2) y} goes to @cite{y / x^2} unless matrix mode is
22159in effect and neither @cite{x} nor @cite{y} are scalar (in which
22160case it is considered unsafe to rearrange the order of the terms).
22161
22162Finally, @cite{a (b/c)} is rewritten to @cite{(a b)/c}, and also
22163@cite{(a/b) c} is changed to @cite{(a c)/b} unless in matrix mode.
22164
22165@tex
22166\bigskip
22167@end tex
22168
22169Simplifications for quotients are analogous to those for products.
22170The quotient @cite{0 / x} is simplified to @cite{0}, with the same
22171exceptions that were noted for @cite{0 x}. Likewise, @cite{x / 1}
22172and @cite{x / (-1)} are simplified to @cite{x} and @cite{-x},
22173respectively.
22174
22175The quotient @cite{x / 0} is left unsimplified or changed to an
22176infinite quantity, as directed by the current infinite mode.
22177@xref{Infinite Mode}.
22178
22179The expression @c{$a / b^{-c}$}
22180@cite{a / b^(-c)} is changed to @cite{a b^c},
22181where @cite{-c} is any negative-looking power. Also, @cite{1 / b^c}
22182is changed to @c{$b^{-c}$}
22183@cite{b^(-c)} for any power @cite{c}.
22184
22185Also, @cite{(-a) / b} and @cite{a / (-b)} go to @cite{-(a/b)};
22186@cite{(a/b) / c} goes to @cite{a / (b c)}; and @cite{a / (b/c)}
22187goes to @cite{(a c) / b} unless matrix mode prevents this
22188rearrangement. Similarly, @cite{a / (b:c)} is simplified to
22189@cite{(c:b) a} for any fraction @cite{b:c}.
22190
22191The distributive law is applied to @cite{(a + b) / c} only if
22192@cite{c} and at least one of @cite{a} and @cite{b} are numbers.
22193Quotients of powers and square roots are distributed just as
22194described for multiplication.
22195
22196Quotients of products cancel only in the leading terms of the
22197numerator and denominator. In other words, @cite{a x b / a y b}
22198is cancelled to @cite{x b / y b} but not to @cite{x / y}. Once
22199again this is because full cancellation can be slow; use @kbd{a s}
22200to cancel all terms of the quotient.
22201
22202Quotients of negative-looking values are simplified according
22203to @cite{(-a) / (-b)} to @cite{a / b}, @cite{(-a) / (b - c)}
22204to @cite{a / (c - b)}, and @cite{(a - b) / (-c)} to @cite{(b - a) / c}.
22205
22206@tex
22207\bigskip
22208@end tex
22209
22210The formula @cite{x^0} is simplified to @cite{1}, or to @samp{idn(1)}
22211in matrix mode. The formula @cite{0^x} is simplified to @cite{0}
22212unless @cite{x} is a negative number or complex number, in which
22213case the result is an infinity or an unsimplified formula according
22214to the current infinite mode. Note that @cite{0^0} is an
22215indeterminate form, as evidenced by the fact that the simplifications
22216for @cite{x^0} and @cite{0^x} conflict when @cite{x=0}.
22217
22218Powers of products or quotients @cite{(a b)^c}, @cite{(a/b)^c}
22219are distributed to @cite{a^c b^c}, @cite{a^c / b^c} only if @cite{c}
22220is an integer, or if either @cite{a} or @cite{b} are nonnegative
22221real numbers. Powers of powers @cite{(a^b)^c} are simplified to
22222@c{$a^{b c}$}
22223@cite{a^(b c)} only when @cite{c} is an integer and @cite{b c} also
22224evaluates to an integer. Without these restrictions these simplifications
22225would not be safe because of problems with principal values.
22226(In other words, @c{$((-3)^{1/2})^2$}
22227@cite{((-3)^1:2)^2} is safe to simplify, but
22228@c{$((-3)^2)^{1/2}$}
22229@cite{((-3)^2)^1:2} is not.) @xref{Declarations}, for ways to inform
22230Calc that your variables satisfy these requirements.
22231
22232As a special case of this rule, @cite{@t{sqrt}(x)^n} is simplified to
22233@c{$x^{n/2}$}
22234@cite{x^(n/2)} only for even integers @cite{n}.
22235
22236If @cite{a} is known to be real, @cite{b} is an even integer, and
22237@cite{c} is a half- or quarter-integer, then @cite{(a^b)^c} is
22238simplified to @c{$@t{abs}(a^{b c})$}
22239@cite{@t{abs}(a^(b c))}.
22240
22241Also, @cite{(-a)^b} is simplified to @cite{a^b} if @cite{b} is an
22242even integer, or to @cite{-(a^b)} if @cite{b} is an odd integer,
22243for any negative-looking expression @cite{-a}.
22244
22245Square roots @cite{@t{sqrt}(x)} generally act like one-half powers
22246@c{$x^{1:2}$}
22247@cite{x^1:2} for the purposes of the above-listed simplifications.
22248
22249Also, note that @c{$1 / x^{1:2}$}
22250@cite{1 / x^1:2} is changed to @c{$x^{-1:2}$}
22251@cite{x^(-1:2)},
22252but @cite{1 / @t{sqrt}(x)} is left alone.
22253
22254@tex
22255\bigskip
22256@end tex
22257
22258Generic identity matrices (@pxref{Matrix Mode}) are simplified by the
22259following rules: @cite{@t{idn}(a) + b} to @cite{a + b} if @cite{b}
22260is provably scalar, or expanded out if @cite{b} is a matrix;
22261@cite{@t{idn}(a) + @t{idn}(b)} to @cite{@t{idn}(a + b)};
22262@cite{-@t{idn}(a)} to @cite{@t{idn}(-a)}; @cite{a @t{idn}(b)} to
22263@cite{@t{idn}(a b)} if @cite{a} is provably scalar, or to @cite{a b}
22264if @cite{a} is provably non-scalar; @cite{@t{idn}(a) @t{idn}(b)}
22265to @cite{@t{idn}(a b)}; analogous simplifications for quotients
22266involving @code{idn}; and @cite{@t{idn}(a)^n} to @cite{@t{idn}(a^n)}
22267where @cite{n} is an integer.
22268
22269@tex
22270\bigskip
22271@end tex
22272
22273The @code{floor} function and other integer truncation functions
22274vanish if the argument is provably integer-valued, so that
22275@cite{@t{floor}(@t{round}(x))} simplifies to @cite{@t{round}(x)}.
22276Also, combinations of @code{float}, @code{floor} and its friends,
22277and @code{ffloor} and its friends, are simplified in appropriate
22278ways. @xref{Integer Truncation}.
22279
22280The expression @cite{@t{abs}(-x)} changes to @cite{@t{abs}(x)}.
22281The expression @cite{@t{abs}(@t{abs}(x))} changes to @cite{@t{abs}(x)};
22282in fact, @cite{@t{abs}(x)} changes to @cite{x} or @cite{-x} if @cite{x}
22283is provably nonnegative or nonpositive (@pxref{Declarations}).
22284
22285While most functions do not recognize the variable @code{i} as an
22286imaginary number, the @code{arg} function does handle the two cases
22287@cite{@t{arg}(@t{i})} and @cite{@t{arg}(-@t{i})} just for convenience.
22288
22289The expression @cite{@t{conj}(@t{conj}(x))} simplifies to @cite{x}.
22290Various other expressions involving @code{conj}, @code{re}, and
22291@code{im} are simplified, especially if some of the arguments are
22292provably real or involve the constant @code{i}. For example,
22293@cite{@t{conj}(a + b i)} is changed to @cite{@t{conj}(a) - @t{conj}(b) i},
22294or to @cite{a - b i} if @cite{a} and @cite{b} are known to be real.
22295
22296Functions like @code{sin} and @code{arctan} generally don't have
22297any default simplifications beyond simply evaluating the functions
22298for suitable numeric arguments and infinity. The @kbd{a s} command
22299described in the next section does provide some simplifications for
22300these functions, though.
22301
22302One important simplification that does occur is that @cite{@t{ln}(@t{e})}
22303is simplified to 1, and @cite{@t{ln}(@t{e}^x)} is simplified to @cite{x}
22304for any @cite{x}. This occurs even if you have stored a different
22305value in the Calc variable @samp{e}; but this would be a bad idea
22306in any case if you were also using natural logarithms!
22307
5d67986c
RS
22308Among the logical functions, @t{(@var{a} <= @var{b})} changes to
22309@t{@var{a} > @var{b}} and so on. Equations and inequalities where both sides
d7b8e6c6
EZ
22310are either negative-looking or zero are simplified by negating both sides
22311and reversing the inequality. While it might seem reasonable to simplify
22312@cite{!!x} to @cite{x}, this would not be valid in general because
22313@cite{!!2} is 1, not 2.
22314
22315Most other Calc functions have few if any default simplifications
22316defined, aside of course from evaluation when the arguments are
22317suitable numbers.
22318
22319@node Algebraic Simplifications, Unsafe Simplifications, Default Simplifications, Simplifying Formulas
22320@subsection Algebraic Simplifications
22321
22322@noindent
22323@cindex Algebraic simplifications
22324The @kbd{a s} command makes simplifications that may be too slow to
22325do all the time, or that may not be desirable all of the time.
22326If you find these simplifications are worthwhile, you can type
22327@kbd{m A} to have Calc apply them automatically.
22328
22329This section describes all simplifications that are performed by
22330the @kbd{a s} command. Note that these occur in addition to the
22331default simplifications; even if the default simplifications have
22332been turned off by an @kbd{m O} command, @kbd{a s} will turn them
22333back on temporarily while it simplifies the formula.
22334
22335There is a variable, @code{AlgSimpRules}, in which you can put rewrites
22336to be applied by @kbd{a s}. Its use is analogous to @code{EvalRules},
22337but without the special restrictions. Basically, the simplifier does
22338@samp{@w{a r} AlgSimpRules} with an infinite repeat count on the whole
22339expression being simplified, then it traverses the expression applying
22340the built-in rules described below. If the result is different from
22341the original expression, the process repeats with the default
22342simplifications (including @code{EvalRules}), then @code{AlgSimpRules},
22343then the built-in simplifications, and so on.
22344
22345@tex
22346\bigskip
22347@end tex
22348
22349Sums are simplified in two ways. Constant terms are commuted to the
22350end of the sum, so that @cite{a + 2 + b} changes to @cite{a + b + 2}.
22351The only exception is that a constant will not be commuted away
22352from the first position of a difference, i.e., @cite{2 - x} is not
22353commuted to @cite{-x + 2}.
22354
22355Also, terms of sums are combined by the distributive law, as in
22356@cite{x + y + 2 x} to @cite{y + 3 x}. This always occurs for
22357adjacent terms, but @kbd{a s} compares all pairs of terms including
22358non-adjacent ones.
22359
22360@tex
22361\bigskip
22362@end tex
22363
22364Products are sorted into a canonical order using the commutative
22365law. For example, @cite{b c a} is commuted to @cite{a b c}.
22366This allows easier comparison of products; for example, the default
22367simplifications will not change @cite{x y + y x} to @cite{2 x y},
22368but @kbd{a s} will; it first rewrites the sum to @cite{x y + x y},
22369and then the default simplifications are able to recognize a sum
22370of identical terms.
22371
22372The canonical ordering used to sort terms of products has the
22373property that real-valued numbers, interval forms and infinities
22374come first, and are sorted into increasing order. The @kbd{V S}
22375command uses the same ordering when sorting a vector.
22376
22377Sorting of terms of products is inhibited when matrix mode is
22378turned on; in this case, Calc will never exchange the order of
22379two terms unless it knows at least one of the terms is a scalar.
22380
22381Products of powers are distributed by comparing all pairs of
22382terms, using the same method that the default simplifications
22383use for adjacent terms of products.
22384
22385Even though sums are not sorted, the commutative law is still
22386taken into account when terms of a product are being compared.
22387Thus @cite{(x + y) (y + x)} will be simplified to @cite{(x + y)^2}.
22388A subtle point is that @cite{(x - y) (y - x)} will @emph{not}
22389be simplified to @cite{-(x - y)^2}; Calc does not notice that
22390one term can be written as a constant times the other, even if
22391that constant is @i{-1}.
22392
22393A fraction times any expression, @cite{(a:b) x}, is changed to
22394a quotient involving integers: @cite{a x / b}. This is not
22395done for floating-point numbers like @cite{0.5}, however. This
22396is one reason why you may find it convenient to turn Fraction mode
22397on while doing algebra; @pxref{Fraction Mode}.
22398
22399@tex
22400\bigskip
22401@end tex
22402
22403Quotients are simplified by comparing all terms in the numerator
22404with all terms in the denominator for possible cancellation using
22405the distributive law. For example, @cite{a x^2 b / c x^3 d} will
22406cancel @cite{x^2} from both sides to get @cite{a b / c x d}.
22407(The terms in the denominator will then be rearranged to @cite{c d x}
22408as described above.) If there is any common integer or fractional
22409factor in the numerator and denominator, it is cancelled out;
22410for example, @cite{(4 x + 6) / 8 x} simplifies to @cite{(2 x + 3) / 4 x}.
22411
22412Non-constant common factors are not found even by @kbd{a s}. To
22413cancel the factor @cite{a} in @cite{(a x + a) / a^2} you could first
22414use @kbd{j M} on the product @cite{a x} to Merge the numerator to
22415@cite{a (1+x)}, which can then be simplified successfully.
22416
22417@tex
22418\bigskip
22419@end tex
22420
22421Integer powers of the variable @code{i} are simplified according
22422to the identity @cite{i^2 = -1}. If you store a new value other
22423than the complex number @cite{(0,1)} in @code{i}, this simplification
22424will no longer occur. This is done by @kbd{a s} instead of by default
22425in case someone (unwisely) uses the name @code{i} for a variable
22426unrelated to complex numbers; it would be unfortunate if Calc
22427quietly and automatically changed this formula for reasons the
22428user might not have been thinking of.
22429
22430Square roots of integer or rational arguments are simplified in
22431several ways. (Note that these will be left unevaluated only in
22432Symbolic mode.) First, square integer or rational factors are
22433pulled out so that @cite{@t{sqrt}(8)} is rewritten as
22434@c{$2\,\t{sqrt}(2)$}
22435@cite{2 sqrt(2)}. Conceptually speaking this implies factoring
22436the argument into primes and moving pairs of primes out of the
22437square root, but for reasons of efficiency Calc only looks for
22438primes up to 29.
22439
22440Square roots in the denominator of a quotient are moved to the
22441numerator: @cite{1 / @t{sqrt}(3)} changes to @cite{@t{sqrt}(3) / 3}.
22442The same effect occurs for the square root of a fraction:
22443@cite{@t{sqrt}(2:3)} changes to @cite{@t{sqrt}(6) / 3}.
22444
22445@tex
22446\bigskip
22447@end tex
22448
22449The @code{%} (modulo) operator is simplified in several ways
22450when the modulus @cite{M} is a positive real number. First, if
22451the argument is of the form @cite{x + n} for some real number
22452@cite{n}, then @cite{n} is itself reduced modulo @cite{M}. For
22453example, @samp{(x - 23) % 10} is simplified to @samp{(x + 7) % 10}.
22454
22455If the argument is multiplied by a constant, and this constant
22456has a common integer divisor with the modulus, then this factor is
22457cancelled out. For example, @samp{12 x % 15} is changed to
22458@samp{3 (4 x % 5)} by factoring out 3. Also, @samp{(12 x + 1) % 15}
22459is changed to @samp{3 ((4 x + 1:3) % 5)}. While these forms may
22460not seem ``simpler,'' they allow Calc to discover useful information
22461about modulo forms in the presence of declarations.
22462
22463If the modulus is 1, then Calc can use @code{int} declarations to
22464evaluate the expression. For example, the idiom @samp{x % 2} is
22465often used to check whether a number is odd or even. As described
22466above, @w{@samp{2 n % 2}} and @samp{(2 n + 1) % 2} are simplified to
22467@samp{2 (n % 1)} and @samp{2 ((n + 1:2) % 1)}, respectively; Calc
22468can simplify these to 0 and 1 (respectively) if @code{n} has been
22469declared to be an integer.
22470
22471@tex
22472\bigskip
22473@end tex
22474
22475Trigonometric functions are simplified in several ways. First,
22476@cite{@t{sin}(@t{arcsin}(x))} is simplified to @cite{x}, and
22477similarly for @code{cos} and @code{tan}. If the argument to
22478@code{sin} is negative-looking, it is simplified to @cite{-@t{sin}(x)},
22479and similarly for @code{cos} and @code{tan}. Finally, certain
22480special values of the argument are recognized;
22481@pxref{Trigonometric and Hyperbolic Functions}.
22482
22483Trigonometric functions of inverses of different trigonometric
22484functions can also be simplified, as in @cite{@t{sin}(@t{arccos}(x))}
22485to @cite{@t{sqrt}(1 - x^2)}.
22486
22487Hyperbolic functions of their inverses and of negative-looking
22488arguments are also handled, as are exponentials of inverse
22489hyperbolic functions.
22490
22491No simplifications for inverse trigonometric and hyperbolic
22492functions are known, except for negative arguments of @code{arcsin},
22493@code{arctan}, @code{arcsinh}, and @code{arctanh}. Note that
22494@cite{@t{arcsin}(@t{sin}(x))} can @emph{not} safely change to
22495@cite{x}, since this only correct within an integer multiple
22496of @c{$2 \pi$}
22497@cite{2 pi} radians or 360 degrees. However,
22498@cite{@t{arcsinh}(@t{sinh}(x))} is simplified to @cite{x} if
22499@cite{x} is known to be real.
22500
22501Several simplifications that apply to logarithms and exponentials
22502are that @cite{@t{exp}(@t{ln}(x))}, @c{$@t{e}^{\ln(x)}$}
22503@cite{e^@t{ln}(x)}, and
22504@c{$10^{{\rm log10}(x)}$}
22505@cite{10^@t{log10}(x)} all reduce to @cite{x}.
22506Also, @cite{@t{ln}(@t{exp}(x))}, etc., can reduce to @cite{x} if
22507@cite{x} is provably real. The form @cite{@t{exp}(x)^y} is simplified
22508to @cite{@t{exp}(x y)}. If @cite{x} is a suitable multiple of @c{$\pi i$}
22509@cite{pi i}
22510(as described above for the trigonometric functions), then @cite{@t{exp}(x)}
22511or @cite{e^x} will be expanded. Finally, @cite{@t{ln}(x)} is simplified
22512to a form involving @code{pi} and @code{i} where @cite{x} is provably
22513negative, positive imaginary, or negative imaginary.
22514
22515The error functions @code{erf} and @code{erfc} are simplified when
22516their arguments are negative-looking or are calls to the @code{conj}
22517function.
22518
22519@tex
22520\bigskip
22521@end tex
22522
22523Equations and inequalities are simplified by cancelling factors
22524of products, quotients, or sums on both sides. Inequalities
22525change sign if a negative multiplicative factor is cancelled.
22526Non-constant multiplicative factors as in @cite{a b = a c} are
22527cancelled from equations only if they are provably nonzero (generally
22528because they were declared so; @pxref{Declarations}). Factors
22529are cancelled from inequalities only if they are nonzero and their
22530sign is known.
22531
22532Simplification also replaces an equation or inequality with
225331 or 0 (``true'' or ``false'') if it can through the use of
22534declarations. If @cite{x} is declared to be an integer greater
22535than 5, then @cite{x < 3}, @cite{x = 3}, and @cite{x = 7.5} are
22536all simplified to 0, but @cite{x > 3} is simplified to 1.
22537By a similar analysis, @cite{abs(x) >= 0} is simplified to 1,
22538as is @cite{x^2 >= 0} if @cite{x} is known to be real.
22539
22540@node Unsafe Simplifications, Simplification of Units, Algebraic Simplifications, Simplifying Formulas
22541@subsection ``Unsafe'' Simplifications
22542
22543@noindent
22544@cindex Unsafe simplifications
22545@cindex Extended simplification
22546@kindex a e
22547@pindex calc-simplify-extended
5d67986c
RS
22548@ignore
22549@mindex esimpl@idots
22550@end ignore
d7b8e6c6
EZ
22551@tindex esimplify
22552The @kbd{a e} (@code{calc-simplify-extended}) [@code{esimplify}] command
22553is like @kbd{a s}
22554except that it applies some additional simplifications which are not
22555``safe'' in all cases. Use this only if you know the values in your
22556formula lie in the restricted ranges for which these simplifications
22557are valid. The symbolic integrator uses @kbd{a e};
22558one effect of this is that the integrator's results must be used with
22559caution. Where an integral table will often attach conditions like
22560``for positive @cite{a} only,'' Calc (like most other symbolic
22561integration programs) will simply produce an unqualified result.@refill
22562
22563Because @kbd{a e}'s simplifications are unsafe, it is sometimes better
22564to type @kbd{C-u -3 a v}, which does extended simplification only
22565on the top level of the formula without affecting the sub-formulas.
22566In fact, @kbd{C-u -3 j v} allows you to target extended simplification
22567to any specific part of a formula.
22568
22569The variable @code{ExtSimpRules} contains rewrites to be applied by
22570the @kbd{a e} command. These are applied in addition to
22571@code{EvalRules} and @code{AlgSimpRules}. (The @kbd{a r AlgSimpRules}
22572step described above is simply followed by an @kbd{a r ExtSimpRules} step.)
22573
22574Following is a complete list of ``unsafe'' simplifications performed
22575by @kbd{a e}.
22576
22577@tex
22578\bigskip
22579@end tex
22580
22581Inverse trigonometric or hyperbolic functions, called with their
22582corresponding non-inverse functions as arguments, are simplified
22583by @kbd{a e}. For example, @cite{@t{arcsin}(@t{sin}(x))} changes
22584to @cite{x}. Also, @cite{@t{arcsin}(@t{cos}(x))} and
22585@cite{@t{arccos}(@t{sin}(x))} both change to @cite{@t{pi}/2 - x}.
22586These simplifications are unsafe because they are valid only for
22587values of @cite{x} in a certain range; outside that range, values
22588are folded down to the 360-degree range that the inverse trigonometric
22589functions always produce.
22590
22591Powers of powers @cite{(x^a)^b} are simplified to @c{$x^{a b}$}
22592@cite{x^(a b)}
22593for all @cite{a} and @cite{b}. These results will be valid only
22594in a restricted range of @cite{x}; for example, in @c{$(x^2)^{1:2}$}
22595@cite{(x^2)^1:2}
22596the powers cancel to get @cite{x}, which is valid for positive values
22597of @cite{x} but not for negative or complex values.
22598
22599Similarly, @cite{@t{sqrt}(x^a)} and @cite{@t{sqrt}(x)^a} are both
22600simplified (possibly unsafely) to @c{$x^{a/2}$}
22601@cite{x^(a/2)}.
22602
22603Forms like @cite{@t{sqrt}(1 - @t{sin}(x)^2)} are simplified to, e.g.,
22604@cite{@t{cos}(x)}. Calc has identities of this sort for @code{sin},
22605@code{cos}, @code{tan}, @code{sinh}, and @code{cosh}.
22606
22607Arguments of square roots are partially factored to look for
22608squared terms that can be extracted. For example,
22609@cite{@t{sqrt}(a^2 b^3 + a^3 b^2)} simplifies to @cite{a b @t{sqrt}(a+b)}.
22610
22611The simplifications of @cite{@t{ln}(@t{exp}(x))}, @cite{@t{ln}(@t{e}^x)},
22612and @cite{@t{log10}(10^x)} to @cite{x} are also unsafe because
22613of problems with principal values (although these simplifications
22614are safe if @cite{x} is known to be real).
22615
22616Common factors are cancelled from products on both sides of an
22617equation, even if those factors may be zero: @cite{a x / b x}
22618to @cite{a / b}. Such factors are never cancelled from
22619inequalities: Even @kbd{a e} is not bold enough to reduce
22620@cite{a x < b x} to @cite{a < b} (or @cite{a > b}, depending
22621on whether you believe @cite{x} is positive or negative).
22622The @kbd{a M /} command can be used to divide a factor out of
22623both sides of an inequality.
22624
22625@node Simplification of Units, , Unsafe Simplifications, Simplifying Formulas
22626@subsection Simplification of Units
22627
22628@noindent
22629The simplifications described in this section are applied by the
22630@kbd{u s} (@code{calc-simplify-units}) command. These are in addition
22631to the regular @kbd{a s} (but not @kbd{a e}) simplifications described
22632earlier. @xref{Basic Operations on Units}.
22633
22634The variable @code{UnitSimpRules} contains rewrites to be applied by
22635the @kbd{u s} command. These are applied in addition to @code{EvalRules}
22636and @code{AlgSimpRules}.
22637
22638Scalar mode is automatically put into effect when simplifying units.
22639@xref{Matrix Mode}.
22640
22641Sums @cite{a + b} involving units are simplified by extracting the
22642units of @cite{a} as if by the @kbd{u x} command (call the result
22643@cite{u_a}), then simplifying the expression @cite{b / u_a}
22644using @kbd{u b} and @kbd{u s}. If the result has units then the sum
22645is inconsistent and is left alone. Otherwise, it is rewritten
22646in terms of the units @cite{u_a}.
22647
22648If units auto-ranging mode is enabled, products or quotients in
22649which the first argument is a number which is out of range for the
22650leading unit are modified accordingly.
22651
22652When cancelling and combining units in products and quotients,
22653Calc accounts for unit names that differ only in the prefix letter.
22654For example, @samp{2 km m} is simplified to @samp{2000 m^2}.
22655However, compatible but different units like @code{ft} and @code{in}
22656are not combined in this way.
22657
22658Quotients @cite{a / b} are simplified in three additional ways. First,
22659if @cite{b} is a number or a product beginning with a number, Calc
22660computes the reciprocal of this number and moves it to the numerator.
22661
22662Second, for each pair of unit names from the numerator and denominator
22663of a quotient, if the units are compatible (e.g., they are both
22664units of area) then they are replaced by the ratio between those
22665units. For example, in @samp{3 s in N / kg cm} the units
22666@samp{in / cm} will be replaced by @cite{2.54}.
22667
22668Third, if the units in the quotient exactly cancel out, so that
22669a @kbd{u b} command on the quotient would produce a dimensionless
22670number for an answer, then the quotient simplifies to that number.
22671
22672For powers and square roots, the ``unsafe'' simplifications
22673@cite{(a b)^c} to @cite{a^c b^c}, @cite{(a/b)^c} to @cite{a^c / b^c},
22674and @cite{(a^b)^c} to @c{$a^{b c}$}
22675@cite{a^(b c)} are done if the powers are
22676real numbers. (These are safe in the context of units because
22677all numbers involved can reasonably be assumed to be real.)
22678
22679Also, if a unit name is raised to a fractional power, and the
22680base units in that unit name all occur to powers which are a
22681multiple of the denominator of the power, then the unit name
22682is expanded out into its base units, which can then be simplified
22683according to the previous paragraph. For example, @samp{acre^1.5}
22684is simplified by noting that @cite{1.5 = 3:2}, that @samp{acre}
22685is defined in terms of @samp{m^2}, and that the 2 in the power of
22686@code{m} is a multiple of 2 in @cite{3:2}. Thus, @code{acre^1.5} is
22687replaced by approximately @c{$(4046 m^2)^{1.5}$}
22688@cite{(4046 m^2)^1.5}, which is then
22689changed to @c{$4046^{1.5} \, (m^2)^{1.5}$}
22690@cite{4046^1.5 (m^2)^1.5}, then to @cite{257440 m^3}.
22691
22692The functions @code{float}, @code{frac}, @code{clean}, @code{abs},
22693as well as @code{floor} and the other integer truncation functions,
22694applied to unit names or products or quotients involving units, are
22695simplified. For example, @samp{round(1.6 in)} is changed to
22696@samp{round(1.6) round(in)}; the lefthand term evaluates to 2,
22697and the righthand term simplifies to @code{in}.
22698
22699The functions @code{sin}, @code{cos}, and @code{tan} with arguments
22700that have angular units like @code{rad} or @code{arcmin} are
22701simplified by converting to base units (radians), then evaluating
22702with the angular mode temporarily set to radians.
22703
22704@node Polynomials, Calculus, Simplifying Formulas, Algebra
22705@section Polynomials
22706
22707A @dfn{polynomial} is a sum of terms which are coefficients times
22708various powers of a ``base'' variable. For example, @cite{2 x^2 + 3 x - 4}
22709is a polynomial in @cite{x}. Some formulas can be considered
22710polynomials in several different variables: @cite{1 + 2 x + 3 y + 4 x y^2}
22711is a polynomial in both @cite{x} and @cite{y}. Polynomial coefficients
22712are often numbers, but they may in general be any formulas not
22713involving the base variable.
22714
22715@kindex a f
22716@pindex calc-factor
22717@tindex factor
22718The @kbd{a f} (@code{calc-factor}) [@code{factor}] command factors a
22719polynomial into a product of terms. For example, the polynomial
22720@cite{x^3 + 2 x^2 + x} is factored into @samp{x*(x+1)^2}. As another
22721example, @cite{a c + b d + b c + a d} is factored into the product
22722@cite{(a + b) (c + d)}.
22723
22724Calc currently has three algorithms for factoring. Formulas which are
22725linear in several variables, such as the second example above, are
22726merged according to the distributive law. Formulas which are
22727polynomials in a single variable, with constant integer or fractional
22728coefficients, are factored into irreducible linear and/or quadratic
22729terms. The first example above factors into three linear terms
22730(@cite{x}, @cite{x+1}, and @cite{x+1} again). Finally, formulas
22731which do not fit the above criteria are handled by the algebraic
22732rewrite mechanism.
22733
22734Calc's polynomial factorization algorithm works by using the general
22735root-finding command (@w{@kbd{a P}}) to solve for the roots of the
22736polynomial. It then looks for roots which are rational numbers
22737or complex-conjugate pairs, and converts these into linear and
22738quadratic terms, respectively. Because it uses floating-point
22739arithmetic, it may be unable to find terms that involve large
22740integers (whose number of digits approaches the current precision).
22741Also, irreducible factors of degree higher than quadratic are not
22742found, and polynomials in more than one variable are not treated.
22743(A more robust factorization algorithm may be included in a future
22744version of Calc.)
22745
22746@vindex FactorRules
5d67986c
RS
22747@ignore
22748@starindex
22749@end ignore
d7b8e6c6 22750@tindex thecoefs
5d67986c
RS
22751@ignore
22752@starindex
22753@end ignore
22754@ignore
22755@mindex @idots
22756@end ignore
d7b8e6c6
EZ
22757@tindex thefactors
22758The rewrite-based factorization method uses rules stored in the variable
22759@code{FactorRules}. @xref{Rewrite Rules}, for a discussion of the
22760operation of rewrite rules. The default @code{FactorRules} are able
22761to factor quadratic forms symbolically into two linear terms,
22762@cite{(a x + b) (c x + d)}. You can edit these rules to include other
22763cases if you wish. To use the rules, Calc builds the formula
22764@samp{thecoefs(x, [a, b, c, ...])} where @code{x} is the polynomial
22765base variable and @code{a}, @code{b}, etc., are polynomial coefficients
22766(which may be numbers or formulas). The constant term is written first,
22767i.e., in the @code{a} position. When the rules complete, they should have
22768changed the formula into the form @samp{thefactors(x, [f1, f2, f3, ...])}
22769where each @code{fi} should be a factored term, e.g., @samp{x - ai}.
22770Calc then multiplies these terms together to get the complete
22771factored form of the polynomial. If the rules do not change the
22772@code{thecoefs} call to a @code{thefactors} call, @kbd{a f} leaves the
22773polynomial alone on the assumption that it is unfactorable. (Note that
22774the function names @code{thecoefs} and @code{thefactors} are used only
22775as placeholders; there are no actual Calc functions by those names.)
22776
22777@kindex H a f
22778@tindex factors
22779The @kbd{H a f} [@code{factors}] command also factors a polynomial,
22780but it returns a list of factors instead of an expression which is the
22781product of the factors. Each factor is represented by a sub-vector
22782of the factor, and the power with which it appears. For example,
22783@cite{x^5 + x^4 - 33 x^3 + 63 x^2} factors to @cite{(x + 7) x^2 (x - 3)^2}
22784in @kbd{a f}, or to @cite{[ [x, 2], [x+7, 1], [x-3, 2] ]} in @kbd{H a f}.
22785If there is an overall numeric factor, it always comes first in the list.
22786The functions @code{factor} and @code{factors} allow a second argument
22787when written in algebraic form; @samp{factor(x,v)} factors @cite{x} with
22788respect to the specific variable @cite{v}. The default is to factor with
22789respect to all the variables that appear in @cite{x}.
22790
22791@kindex a c
22792@pindex calc-collect
22793@tindex collect
22794The @kbd{a c} (@code{calc-collect}) [@code{collect}] command rearranges a
22795formula as a
22796polynomial in a given variable, ordered in decreasing powers of that
22797variable. For example, given @cite{1 + 2 x + 3 y + 4 x y^2} on
22798the stack, @kbd{a c x} would produce @cite{(2 + 4 y^2) x + (1 + 3 y)},
22799and @kbd{a c y} would produce @cite{(4 x) y^2 + 3 y + (1 + 2 x)}.
22800The polynomial will be expanded out using the distributive law as
22801necessary: Collecting @cite{x} in @cite{(x - 1)^3} produces
22802@cite{x^3 - 3 x^2 + 3 x - 1}. Terms not involving @cite{x} will
22803not be expanded.
22804
22805The ``variable'' you specify at the prompt can actually be any
22806expression: @kbd{a c ln(x+1)} will collect together all terms multiplied
22807by @samp{ln(x+1)} or integer powers thereof. If @samp{x} also appears
22808in the formula in a context other than @samp{ln(x+1)}, @kbd{a c} will
22809treat those occurrences as unrelated to @samp{ln(x+1)}, i.e., as constants.
22810
22811@kindex a x
22812@pindex calc-expand
22813@tindex expand
22814The @kbd{a x} (@code{calc-expand}) [@code{expand}] command expands an
22815expression by applying the distributive law everywhere. It applies to
22816products, quotients, and powers involving sums. By default, it fully
22817distributes all parts of the expression. With a numeric prefix argument,
22818the distributive law is applied only the specified number of times, then
22819the partially expanded expression is left on the stack.
22820
22821The @kbd{a x} and @kbd{j D} commands are somewhat redundant. Use
22822@kbd{a x} if you want to expand all products of sums in your formula.
22823Use @kbd{j D} if you want to expand a particular specified term of
22824the formula. There is an exactly analogous correspondence between
22825@kbd{a f} and @kbd{j M}. (The @kbd{j D} and @kbd{j M} commands
22826also know many other kinds of expansions, such as
22827@samp{exp(a + b) = exp(a) exp(b)}, which @kbd{a x} and @kbd{a f}
22828do not do.)
22829
22830Calc's automatic simplifications will sometimes reverse a partial
22831expansion. For example, the first step in expanding @cite{(x+1)^3} is
22832to write @cite{(x+1) (x+1)^2}. If @kbd{a x} stops there and tries
22833to put this formula onto the stack, though, Calc will automatically
22834simplify it back to @cite{(x+1)^3} form. The solution is to turn
22835simplification off first (@pxref{Simplification Modes}), or to run
22836@kbd{a x} without a numeric prefix argument so that it expands all
22837the way in one step.
22838
22839@kindex a a
22840@pindex calc-apart
22841@tindex apart
22842The @kbd{a a} (@code{calc-apart}) [@code{apart}] command expands a
22843rational function by partial fractions. A rational function is the
22844quotient of two polynomials; @code{apart} pulls this apart into a
22845sum of rational functions with simple denominators. In algebraic
22846notation, the @code{apart} function allows a second argument that
22847specifies which variable to use as the ``base''; by default, Calc
22848chooses the base variable automatically.
22849
22850@kindex a n
22851@pindex calc-normalize-rat
22852@tindex nrat
22853The @kbd{a n} (@code{calc-normalize-rat}) [@code{nrat}] command
22854attempts to arrange a formula into a quotient of two polynomials.
22855For example, given @cite{1 + (a + b/c) / d}, the result would be
22856@cite{(b + a c + c d) / c d}. The quotient is reduced, so that
22857@kbd{a n} will simplify @cite{(x^2 + 2x + 1) / (x^2 - 1)} by dividing
22858out the common factor @cite{x + 1}, yielding @cite{(x + 1) / (x - 1)}.
22859
22860@kindex a \
22861@pindex calc-poly-div
22862@tindex pdiv
22863The @kbd{a \} (@code{calc-poly-div}) [@code{pdiv}] command divides
22864two polynomials @cite{u} and @cite{v}, yielding a new polynomial
22865@cite{q}. If several variables occur in the inputs, the inputs are
22866considered multivariate polynomials. (Calc divides by the variable
22867with the largest power in @cite{u} first, or, in the case of equal
22868powers, chooses the variables in alphabetical order.) For example,
22869dividing @cite{x^2 + 3 x + 2} by @cite{x + 2} yields @cite{x + 1}.
22870The remainder from the division, if any, is reported at the bottom
22871of the screen and is also placed in the Trail along with the quotient.
22872
22873Using @code{pdiv} in algebraic notation, you can specify the particular
5d67986c 22874variable to be used as the base: @code{pdiv(@var{a},@var{b},@var{x})}.
d7b8e6c6
EZ
22875If @code{pdiv} is given only two arguments (as is always the case with
22876the @kbd{a \} command), then it does a multivariate division as outlined
22877above.
22878
22879@kindex a %
22880@pindex calc-poly-rem
22881@tindex prem
22882The @kbd{a %} (@code{calc-poly-rem}) [@code{prem}] command divides
22883two polynomials and keeps the remainder @cite{r}. The quotient
22884@cite{q} is discarded. For any formulas @cite{a} and @cite{b}, the
22885results of @kbd{a \} and @kbd{a %} satisfy @cite{a = q b + r}.
22886(This is analogous to plain @kbd{\} and @kbd{%}, which compute the
22887integer quotient and remainder from dividing two numbers.)
22888
22889@kindex a /
22890@kindex H a /
22891@pindex calc-poly-div-rem
22892@tindex pdivrem
22893@tindex pdivide
22894The @kbd{a /} (@code{calc-poly-div-rem}) [@code{pdivrem}] command
22895divides two polynomials and reports both the quotient and the
22896remainder as a vector @cite{[q, r]}. The @kbd{H a /} [@code{pdivide}]
22897command divides two polynomials and constructs the formula
22898@cite{q + r/b} on the stack. (Naturally if the remainder is zero,
22899this will immediately simplify to @cite{q}.)
22900
22901@kindex a g
22902@pindex calc-poly-gcd
22903@tindex pgcd
22904The @kbd{a g} (@code{calc-poly-gcd}) [@code{pgcd}] command computes
22905the greatest common divisor of two polynomials. (The GCD actually
22906is unique only to within a constant multiplier; Calc attempts to
22907choose a GCD which will be unsurprising.) For example, the @kbd{a n}
22908command uses @kbd{a g} to take the GCD of the numerator and denominator
22909of a quotient, then divides each by the result using @kbd{a \}. (The
22910definition of GCD ensures that this division can take place without
22911leaving a remainder.)
22912
22913While the polynomials used in operations like @kbd{a /} and @kbd{a g}
22914often have integer coefficients, this is not required. Calc can also
22915deal with polynomials over the rationals or floating-point reals.
22916Polynomials with modulo-form coefficients are also useful in many
22917applications; if you enter @samp{(x^2 + 3 x - 1) mod 5}, Calc
22918automatically transforms this into a polynomial over the field of
22919integers mod 5: @samp{(1 mod 5) x^2 + (3 mod 5) x + (4 mod 5)}.
22920
22921Congratulations and thanks go to Ove Ewerlid
22922(@code{ewerlid@@mizar.DoCS.UU.SE}), who contributed many of the
22923polynomial routines used in the above commands.
22924
22925@xref{Decomposing Polynomials}, for several useful functions for
22926extracting the individual coefficients of a polynomial.
22927
22928@node Calculus, Solving Equations, Polynomials, Algebra
22929@section Calculus
22930
22931@noindent
22932The following calculus commands do not automatically simplify their
22933inputs or outputs using @code{calc-simplify}. You may find it helps
22934to do this by hand by typing @kbd{a s} or @kbd{a e}. It may also help
22935to use @kbd{a x} and/or @kbd{a c} to arrange a result in the most
22936readable way.
22937
22938@menu
22939* Differentiation::
22940* Integration::
22941* Customizing the Integrator::
22942* Numerical Integration::
22943* Taylor Series::
22944@end menu
22945
22946@node Differentiation, Integration, Calculus, Calculus
22947@subsection Differentiation
22948
22949@noindent
22950@kindex a d
22951@kindex H a d
22952@pindex calc-derivative
22953@tindex deriv
22954@tindex tderiv
22955The @kbd{a d} (@code{calc-derivative}) [@code{deriv}] command computes
22956the derivative of the expression on the top of the stack with respect to
22957some variable, which it will prompt you to enter. Normally, variables
22958in the formula other than the specified differentiation variable are
22959considered constant, i.e., @samp{deriv(y,x)} is reduced to zero. With
22960the Hyperbolic flag, the @code{tderiv} (total derivative) operation is used
22961instead, in which derivatives of variables are not reduced to zero
22962unless those variables are known to be ``constant,'' i.e., independent
22963of any other variables. (The built-in special variables like @code{pi}
22964are considered constant, as are variables that have been declared
22965@code{const}; @pxref{Declarations}.)
22966
22967With a numeric prefix argument @var{n}, this command computes the
22968@var{n}th derivative.
22969
22970When working with trigonometric functions, it is best to switch to
22971radians mode first (with @w{@kbd{m r}}). The derivative of @samp{sin(x)}
22972in degrees is @samp{(pi/180) cos(x)}, probably not the expected
22973answer!
22974
22975If you use the @code{deriv} function directly in an algebraic formula,
22976you can write @samp{deriv(f,x,x0)} which represents the derivative
22977of @cite{f} with respect to @cite{x}, evaluated at the point @c{$x=x_0$}
22978@cite{x=x0}.
22979
22980If the formula being differentiated contains functions which Calc does
22981not know, the derivatives of those functions are produced by adding
22982primes (apostrophe characters). For example, @samp{deriv(f(2x), x)}
22983produces @samp{2 f'(2 x)}, where the function @code{f'} represents the
22984derivative of @code{f}.
22985
22986For functions you have defined with the @kbd{Z F} command, Calc expands
22987the functions according to their defining formulas unless you have
22988also defined @code{f'} suitably. For example, suppose we define
22989@samp{sinc(x) = sin(x)/x} using @kbd{Z F}. If we then differentiate
22990the formula @samp{sinc(2 x)}, the formula will be expanded to
22991@samp{sin(2 x) / (2 x)} and differentiated. However, if we also
22992define @samp{sinc'(x) = dsinc(x)}, say, then Calc will write the
22993result as @samp{2 dsinc(2 x)}. @xref{Algebraic Definitions}.
22994
22995For multi-argument functions @samp{f(x,y,z)}, the derivative with respect
22996to the first argument is written @samp{f'(x,y,z)}; derivatives with
22997respect to the other arguments are @samp{f'2(x,y,z)} and @samp{f'3(x,y,z)}.
22998Various higher-order derivatives can be formed in the obvious way, e.g.,
22999@samp{f'@var{}'(x)} (the second derivative of @code{f}) or
23000@samp{f'@var{}'2'3(x,y,z)} (@code{f} differentiated with respect to each
23001argument once).@refill
23002
23003@node Integration, Customizing the Integrator, Differentiation, Calculus
23004@subsection Integration
23005
23006@noindent
23007@kindex a i
23008@pindex calc-integral
23009@tindex integ
23010The @kbd{a i} (@code{calc-integral}) [@code{integ}] command computes the
23011indefinite integral of the expression on the top of the stack with
23012respect to a variable. The integrator is not guaranteed to work for
23013all integrable functions, but it is able to integrate several large
23014classes of formulas. In particular, any polynomial or rational function
23015(a polynomial divided by a polynomial) is acceptable. (Rational functions
23016don't have to be in explicit quotient form, however; @c{$x/(1+x^{-2})$}
23017@cite{x/(1+x^-2)}
23018is not strictly a quotient of polynomials, but it is equivalent to
23019@cite{x^3/(x^2+1)}, which is.) Also, square roots of terms involving
23020@cite{x} and @cite{x^2} may appear in rational functions being
23021integrated. Finally, rational functions involving trigonometric or
23022hyperbolic functions can be integrated.
23023
23024@ifinfo
23025If you use the @code{integ} function directly in an algebraic formula,
23026you can also write @samp{integ(f,x,v)} which expresses the resulting
23027indefinite integral in terms of variable @code{v} instead of @code{x}.
23028With four arguments, @samp{integ(f(x),x,a,b)} represents a definite
23029integral from @code{a} to @code{b}.
23030@end ifinfo
23031@tex
23032If you use the @code{integ} function directly in an algebraic formula,
23033you can also write @samp{integ(f,x,v)} which expresses the resulting
23034indefinite integral in terms of variable @code{v} instead of @code{x}.
23035With four arguments, @samp{integ(f(x),x,a,b)} represents a definite
23036integral $\int_a^b f(x) \, dx$.
23037@end tex
23038
23039Please note that the current implementation of Calc's integrator sometimes
23040produces results that are significantly more complex than they need to
23041be. For example, the integral Calc finds for @c{$1/(x+\sqrt{x^2+1})$}
23042@cite{1/(x+sqrt(x^2+1))}
23043is several times more complicated than the answer Mathematica
23044returns for the same input, although the two forms are numerically
23045equivalent. Also, any indefinite integral should be considered to have
23046an arbitrary constant of integration added to it, although Calc does not
23047write an explicit constant of integration in its result. For example,
23048Calc's solution for @c{$1/(1+\tan x)$}
23049@cite{1/(1+tan(x))} differs from the solution given
23050in the @emph{CRC Math Tables} by a constant factor of @c{$\pi i / 2$}
23051@cite{pi i / 2},
23052due to a different choice of constant of integration.
23053
23054The Calculator remembers all the integrals it has done. If conditions
23055change in a way that would invalidate the old integrals, say, a switch
23056from degrees to radians mode, then they will be thrown out. If you
23057suspect this is not happening when it should, use the
23058@code{calc-flush-caches} command; @pxref{Caches}.
23059
23060@vindex IntegLimit
23061Calc normally will pursue integration by substitution or integration by
23062parts up to 3 nested times before abandoning an approach as fruitless.
23063If the integrator is taking too long, you can lower this limit by storing
23064a number (like 2) in the variable @code{IntegLimit}. (The @kbd{s I}
23065command is a convenient way to edit @code{IntegLimit}.) If this variable
23066has no stored value or does not contain a nonnegative integer, a limit
23067of 3 is used. The lower this limit is, the greater the chance that Calc
23068will be unable to integrate a function it could otherwise handle. Raising
23069this limit allows the Calculator to solve more integrals, though the time
23070it takes may grow exponentially. You can monitor the integrator's actions
23071by creating an Emacs buffer called @code{*Trace*}. If such a buffer
23072exists, the @kbd{a i} command will write a log of its actions there.
23073
23074If you want to manipulate integrals in a purely symbolic way, you can
23075set the integration nesting limit to 0 to prevent all but fast
23076table-lookup solutions of integrals. You might then wish to define
23077rewrite rules for integration by parts, various kinds of substitutions,
23078and so on. @xref{Rewrite Rules}.
23079
23080@node Customizing the Integrator, Numerical Integration, Integration, Calculus
23081@subsection Customizing the Integrator
23082
23083@noindent
23084@vindex IntegRules
23085Calc has two built-in rewrite rules called @code{IntegRules} and
23086@code{IntegAfterRules} which you can edit to define new integration
23087methods. @xref{Rewrite Rules}. At each step of the integration process,
23088Calc wraps the current integrand in a call to the fictitious function
23089@samp{integtry(@var{expr},@var{var})}, where @var{expr} is the
23090integrand and @var{var} is the integration variable. If your rules
23091rewrite this to be a plain formula (not a call to @code{integtry}), then
23092Calc will use this formula as the integral of @var{expr}. For example,
23093the rule @samp{integtry(mysin(x),x) := -mycos(x)} would define a rule to
23094integrate a function @code{mysin} that acts like the sine function.
23095Then, putting @samp{4 mysin(2y+1)} on the stack and typing @kbd{a i y}
23096will produce the integral @samp{-2 mycos(2y+1)}. Note that Calc has
23097automatically made various transformations on the integral to allow it
23098to use your rule; integral tables generally give rules for
23099@samp{mysin(a x + b)}, but you don't need to use this much generality
23100in your @code{IntegRules}.
23101
23102@cindex Exponential integral Ei(x)
5d67986c
RS
23103@ignore
23104@starindex
23105@end ignore
d7b8e6c6
EZ
23106@tindex Ei
23107As a more serious example, the expression @samp{exp(x)/x} cannot be
23108integrated in terms of the standard functions, so the ``exponential
23109integral'' function @c{${\rm Ei}(x)$}
23110@cite{Ei(x)} was invented to describe it.
23111We can get Calc to do this integral in terms of a made-up @code{Ei}
23112function by adding the rule @samp{[integtry(exp(x)/x, x) := Ei(x)]}
23113to @code{IntegRules}. Now entering @samp{exp(2x)/x} on the stack
23114and typing @kbd{a i x} yields @samp{Ei(2 x)}. This new rule will
23115work with Calc's various built-in integration methods (such as
23116integration by substitution) to solve a variety of other problems
23117involving @code{Ei}: For example, now Calc will also be able to
23118integrate @samp{exp(exp(x))} and @samp{ln(ln(x))} (to get @samp{Ei(exp(x))}
23119and @samp{x ln(ln(x)) - Ei(ln(x))}, respectively).
23120
23121Your rule may do further integration by calling @code{integ}. For
23122example, @samp{integtry(twice(u),x) := twice(integ(u))} allows Calc
23123to integrate @samp{twice(sin(x))} to get @samp{twice(-cos(x))}.
23124Note that @code{integ} was called with only one argument. This notation
23125is allowed only within @code{IntegRules}; it means ``integrate this
23126with respect to the same integration variable.'' If Calc is unable
23127to integrate @code{u}, the integration that invoked @code{IntegRules}
23128also fails. Thus integrating @samp{twice(f(x))} fails, returning the
23129unevaluated integral @samp{integ(twice(f(x)), x)}. It is still legal
23130to call @code{integ} with two or more arguments, however; in this case,
23131if @code{u} is not integrable, @code{twice} itself will still be
23132integrated: If the above rule is changed to @samp{... := twice(integ(u,x))},
23133then integrating @samp{twice(f(x))} will yield @samp{twice(integ(f(x),x))}.
23134
23135If a rule instead produces the formula @samp{integsubst(@var{sexpr},
23136@var{svar})}, either replacing the top-level @code{integtry} call or
23137nested anywhere inside the expression, then Calc will apply the
23138substitution @samp{@var{u} = @var{sexpr}(@var{svar})} to try to
23139integrate the original @var{expr}. For example, the rule
23140@samp{sqrt(a) := integsubst(sqrt(x),x)} says that if Calc ever finds
23141a square root in the integrand, it should attempt the substitution
23142@samp{u = sqrt(x)}. (This particular rule is unnecessary because
23143Calc always tries ``obvious'' substitutions where @var{sexpr} actually
23144appears in the integrand.) The variable @var{svar} may be the same
23145as the @var{var} that appeared in the call to @code{integtry}, but
23146it need not be.
23147
23148When integrating according to an @code{integsubst}, Calc uses the
23149equation solver to find the inverse of @var{sexpr} (if the integrand
23150refers to @var{var} anywhere except in subexpressions that exactly
23151match @var{sexpr}). It uses the differentiator to find the derivative
23152of @var{sexpr} and/or its inverse (it has two methods that use one
23153derivative or the other). You can also specify these items by adding
23154extra arguments to the @code{integsubst} your rules construct; the
23155general form is @samp{integsubst(@var{sexpr}, @var{svar}, @var{sinv},
23156@var{sprime})}, where @var{sinv} is the inverse of @var{sexpr} (still
23157written as a function of @var{svar}), and @var{sprime} is the
23158derivative of @var{sexpr} with respect to @var{svar}. If you don't
23159specify these things, and Calc is not able to work them out on its
23160own with the information it knows, then your substitution rule will
23161work only in very specific, simple cases.
23162
23163Calc applies @code{IntegRules} as if by @kbd{C-u 1 a r IntegRules};
23164in other words, Calc stops rewriting as soon as any rule in your rule
23165set succeeds. (If it weren't for this, the @samp{integsubst(sqrt(x),x)}
23166example above would keep on adding layers of @code{integsubst} calls
23167forever!)
23168
23169@vindex IntegSimpRules
23170Another set of rules, stored in @code{IntegSimpRules}, are applied
23171every time the integrator uses @kbd{a s} to simplify an intermediate
23172result. For example, putting the rule @samp{twice(x) := 2 x} into
23173@code{IntegSimpRules} would tell Calc to convert the @code{twice}
23174function into a form it knows whenever integration is attempted.
23175
23176One more way to influence the integrator is to define a function with
23177the @kbd{Z F} command (@pxref{Algebraic Definitions}). Calc's
23178integrator automatically expands such functions according to their
23179defining formulas, even if you originally asked for the function to
23180be left unevaluated for symbolic arguments. (Certain other Calc
23181systems, such as the differentiator and the equation solver, also
23182do this.)
23183
23184@vindex IntegAfterRules
23185Sometimes Calc is able to find a solution to your integral, but it
23186expresses the result in a way that is unnecessarily complicated. If
23187this happens, you can either use @code{integsubst} as described
23188above to try to hint at a more direct path to the desired result, or
23189you can use @code{IntegAfterRules}. This is an extra rule set that
23190runs after the main integrator returns its result; basically, Calc does
23191an @kbd{a r IntegAfterRules} on the result before showing it to you.
23192(It also does an @kbd{a s}, without @code{IntegSimpRules}, after that
23193to further simplify the result.) For example, Calc's integrator
23194sometimes produces expressions of the form @samp{ln(1+x) - ln(1-x)};
23195the default @code{IntegAfterRules} rewrite this into the more readable
23196form @samp{2 arctanh(x)}. Note that, unlike @code{IntegRules},
23197@code{IntegSimpRules} and @code{IntegAfterRules} are applied any number
23198of times until no further changes are possible. Rewriting by
23199@code{IntegAfterRules} occurs only after the main integrator has
23200finished, not at every step as for @code{IntegRules} and
23201@code{IntegSimpRules}.
23202
23203@node Numerical Integration, Taylor Series, Customizing the Integrator, Calculus
23204@subsection Numerical Integration
23205
23206@noindent
23207@kindex a I
23208@pindex calc-num-integral
23209@tindex ninteg
23210If you want a purely numerical answer to an integration problem, you can
23211use the @kbd{a I} (@code{calc-num-integral}) [@code{ninteg}] command. This
23212command prompts for an integration variable, a lower limit, and an
23213upper limit. Except for the integration variable, all other variables
23214that appear in the integrand formula must have stored values. (A stored
23215value, if any, for the integration variable itself is ignored.)
23216
23217Numerical integration works by evaluating your formula at many points in
23218the specified interval. Calc uses an ``open Romberg'' method; this means
23219that it does not evaluate the formula actually at the endpoints (so that
23220it is safe to integrate @samp{sin(x)/x} from zero, for example). Also,
23221the Romberg method works especially well when the function being
23222integrated is fairly smooth. If the function is not smooth, Calc will
23223have to evaluate it at quite a few points before it can accurately
23224determine the value of the integral.
23225
23226Integration is much faster when the current precision is small. It is
23227best to set the precision to the smallest acceptable number of digits
23228before you use @kbd{a I}. If Calc appears to be taking too long, press
23229@kbd{C-g} to halt it and try a lower precision. If Calc still appears
23230to need hundreds of evaluations, check to make sure your function is
23231well-behaved in the specified interval.
23232
23233It is possible for the lower integration limit to be @samp{-inf} (minus
23234infinity). Likewise, the upper limit may be plus infinity. Calc
23235internally transforms the integral into an equivalent one with finite
23236limits. However, integration to or across singularities is not supported:
23237The integral of @samp{1/sqrt(x)} from 0 to 1 exists (it can be found
23238by Calc's symbolic integrator, for example), but @kbd{a I} will fail
23239because the integrand goes to infinity at one of the endpoints.
23240
23241@node Taylor Series, , Numerical Integration, Calculus
23242@subsection Taylor Series
23243
23244@noindent
23245@kindex a t
23246@pindex calc-taylor
23247@tindex taylor
23248The @kbd{a t} (@code{calc-taylor}) [@code{taylor}] command computes a
23249power series expansion or Taylor series of a function. You specify the
23250variable and the desired number of terms. You may give an expression of
23251the form @samp{@var{var} = @var{a}} or @samp{@var{var} - @var{a}} instead
23252of just a variable to produce a Taylor expansion about the point @var{a}.
23253You may specify the number of terms with a numeric prefix argument;
23254otherwise the command will prompt you for the number of terms. Note that
23255many series expansions have coefficients of zero for some terms, so you
23256may appear to get fewer terms than you asked for.@refill
23257
23258If the @kbd{a i} command is unable to find a symbolic integral for a
23259function, you can get an approximation by integrating the function's
23260Taylor series.
23261
23262@node Solving Equations, Numerical Solutions, Calculus, Algebra
23263@section Solving Equations
23264
23265@noindent
23266@kindex a S
23267@pindex calc-solve-for
23268@tindex solve
23269@cindex Equations, solving
23270@cindex Solving equations
23271The @kbd{a S} (@code{calc-solve-for}) [@code{solve}] command rearranges
23272an equation to solve for a specific variable. An equation is an
23273expression of the form @cite{L = R}. For example, the command @kbd{a S x}
23274will rearrange @cite{y = 3x + 6} to the form, @cite{x = y/3 - 2}. If the
23275input is not an equation, it is treated like an equation of the
23276form @cite{X = 0}.
23277
23278This command also works for inequalities, as in @cite{y < 3x + 6}.
23279Some inequalities cannot be solved where the analogous equation could
23280be; for example, solving @c{$a < b \, c$}
23281@cite{a < b c} for @cite{b} is impossible
23282without knowing the sign of @cite{c}. In this case, @kbd{a S} will
23283produce the result @c{$b \mathbin{\hbox{\code{!=}}} a/c$}
23284@cite{b != a/c} (using the not-equal-to operator)
23285to signify that the direction of the inequality is now unknown. The
23286inequality @c{$a \le b \, c$}
23287@cite{a <= b c} is not even partially solved.
23288@xref{Declarations}, for a way to tell Calc that the signs of the
23289variables in a formula are in fact known.
23290
23291Two useful commands for working with the result of @kbd{a S} are
23292@kbd{a .} (@pxref{Logical Operations}), which converts @cite{x = y/3 - 2}
23293to @cite{y/3 - 2}, and @kbd{s l} (@pxref{Let Command}) which evaluates
23294another formula with @cite{x} set equal to @cite{y/3 - 2}.
23295
23296@menu
23297* Multiple Solutions::
23298* Solving Systems of Equations::
23299* Decomposing Polynomials::
23300@end menu
23301
23302@node Multiple Solutions, Solving Systems of Equations, Solving Equations, Solving Equations
23303@subsection Multiple Solutions
23304
23305@noindent
23306@kindex H a S
23307@tindex fsolve
23308Some equations have more than one solution. The Hyperbolic flag
23309(@code{H a S}) [@code{fsolve}] tells the solver to report the fully
23310general family of solutions. It will invent variables @code{n1},
23311@code{n2}, @dots{}, which represent independent arbitrary integers, and
23312@code{s1}, @code{s2}, @dots{}, which represent independent arbitrary
23313signs (either @i{+1} or @i{-1}). If you don't use the Hyperbolic
23314flag, Calc will use zero in place of all arbitrary integers, and plus
23315one in place of all arbitrary signs. Note that variables like @code{n1}
23316and @code{s1} are not given any special interpretation in Calc except by
23317the equation solver itself. As usual, you can use the @w{@kbd{s l}}
23318(@code{calc-let}) command to obtain solutions for various actual values
23319of these variables.
23320
23321For example, @kbd{' x^2 = y @key{RET} H a S x @key{RET}} solves to
23322get @samp{x = s1 sqrt(y)}, indicating that the two solutions to the
23323equation are @samp{sqrt(y)} and @samp{-sqrt(y)}. Another way to
23324think about it is that the square-root operation is really a
23325two-valued function; since every Calc function must return a
23326single result, @code{sqrt} chooses to return the positive result.
23327Then @kbd{H a S} doctors this result using @code{s1} to indicate
23328the full set of possible values of the mathematical square-root.
23329
23330There is a similar phenomenon going the other direction: Suppose
23331we solve @samp{sqrt(y) = x} for @code{y}. Calc squares both sides
23332to get @samp{y = x^2}. This is correct, except that it introduces
23333some dubious solutions. Consider solving @samp{sqrt(y) = -3}:
23334Calc will report @cite{y = 9} as a valid solution, which is true
23335in the mathematical sense of square-root, but false (there is no
23336solution) for the actual Calc positive-valued @code{sqrt}. This
23337happens for both @kbd{a S} and @kbd{H a S}.
23338
23339@cindex @code{GenCount} variable
23340@vindex GenCount
5d67986c
RS
23341@ignore
23342@starindex
23343@end ignore
d7b8e6c6 23344@tindex an
5d67986c
RS
23345@ignore
23346@starindex
23347@end ignore
d7b8e6c6
EZ
23348@tindex as
23349If you store a positive integer in the Calc variable @code{GenCount},
23350then Calc will generate formulas of the form @samp{as(@var{n})} for
23351arbitrary signs, and @samp{an(@var{n})} for arbitrary integers,
23352where @var{n} represents successive values taken by incrementing
23353@code{GenCount} by one. While the normal arbitrary sign and
23354integer symbols start over at @code{s1} and @code{n1} with each
23355new Calc command, the @code{GenCount} approach will give each
23356arbitrary value a name that is unique throughout the entire Calc
23357session. Also, the arbitrary values are function calls instead
23358of variables, which is advantageous in some cases. For example,
23359you can make a rewrite rule that recognizes all arbitrary signs
23360using a pattern like @samp{as(n)}. The @kbd{s l} command only works
23361on variables, but you can use the @kbd{a b} (@code{calc-substitute})
23362command to substitute actual values for function calls like @samp{as(3)}.
23363
23364The @kbd{s G} (@code{calc-edit-GenCount}) command is a convenient
23365way to create or edit this variable. Press @kbd{M-# M-#} to finish.
23366
23367If you have not stored a value in @code{GenCount}, or if the value
23368in that variable is not a positive integer, the regular
23369@code{s1}/@code{n1} notation is used.
23370
23371@kindex I a S
23372@kindex H I a S
23373@tindex finv
23374@tindex ffinv
23375With the Inverse flag, @kbd{I a S} [@code{finv}] treats the expression
23376on top of the stack as a function of the specified variable and solves
23377to find the inverse function, written in terms of the same variable.
23378For example, @kbd{I a S x} inverts @cite{2x + 6} to @cite{x/2 - 3}.
23379You can use both Inverse and Hyperbolic [@code{ffinv}] to obtain a
23380fully general inverse, as described above.
23381
23382@kindex a P
23383@pindex calc-poly-roots
23384@tindex roots
23385Some equations, specifically polynomials, have a known, finite number
23386of solutions. The @kbd{a P} (@code{calc-poly-roots}) [@code{roots}]
23387command uses @kbd{H a S} to solve an equation in general form, then, for
23388all arbitrary-sign variables like @code{s1}, and all arbitrary-integer
23389variables like @code{n1} for which @code{n1} only usefully varies over
23390a finite range, it expands these variables out to all their possible
23391values. The results are collected into a vector, which is returned.
23392For example, @samp{roots(x^4 = 1, x)} returns the four solutions
23393@samp{[1, -1, (0, 1), (0, -1)]}. Generally an @var{n}th degree
23394polynomial will always have @var{n} roots on the complex plane.
23395(If you have given a @code{real} declaration for the solution
23396variable, then only the real-valued solutions, if any, will be
23397reported; @pxref{Declarations}.)
23398
23399Note that because @kbd{a P} uses @kbd{H a S}, it is able to deliver
23400symbolic solutions if the polynomial has symbolic coefficients. Also
23401note that Calc's solver is not able to get exact symbolic solutions
23402to all polynomials. Polynomials containing powers up to @cite{x^4}
23403can always be solved exactly; polynomials of higher degree sometimes
23404can be: @cite{x^6 + x^3 + 1} is converted to @cite{(x^3)^2 + (x^3) + 1},
23405which can be solved for @cite{x^3} using the quadratic equation, and then
23406for @cite{x} by taking cube roots. But in many cases, like
23407@cite{x^6 + x + 1}, Calc does not know how to rewrite the polynomial
23408into a form it can solve. The @kbd{a P} command can still deliver a
23409list of numerical roots, however, provided that symbolic mode (@kbd{m s})
23410is not turned on. (If you work with symbolic mode on, recall that the
23411@kbd{N} (@code{calc-eval-num}) key is a handy way to reevaluate the
23412formula on the stack with symbolic mode temporarily off.) Naturally,
23413@kbd{a P} can only provide numerical roots if the polynomial coefficents
23414are all numbers (real or complex).
23415
23416@node Solving Systems of Equations, Decomposing Polynomials, Multiple Solutions, Solving Equations
23417@subsection Solving Systems of Equations
23418
23419@noindent
23420@cindex Systems of equations, symbolic
23421You can also use the commands described above to solve systems of
23422simultaneous equations. Just create a vector of equations, then
23423specify a vector of variables for which to solve. (You can omit
23424the surrounding brackets when entering the vector of variables
23425at the prompt.)
23426
23427For example, putting @samp{[x + y = a, x - y = b]} on the stack
23428and typing @kbd{a S x,y @key{RET}} produces the vector of solutions
23429@samp{[x = a - (a-b)/2, y = (a-b)/2]}. The result vector will
23430have the same length as the variables vector, and the variables
23431will be listed in the same order there. Note that the solutions
23432are not always simplified as far as possible; the solution for
23433@cite{x} here could be improved by an application of the @kbd{a n}
23434command.
23435
23436Calc's algorithm works by trying to eliminate one variable at a
23437time by solving one of the equations for that variable and then
23438substituting into the other equations. Calc will try all the
23439possibilities, but you can speed things up by noting that Calc
23440first tries to eliminate the first variable with the first
23441equation, then the second variable with the second equation,
23442and so on. It also helps to put the simpler (e.g., more linear)
23443equations toward the front of the list. Calc's algorithm will
23444solve any system of linear equations, and also many kinds of
23445nonlinear systems.
23446
5d67986c
RS
23447@ignore
23448@starindex
23449@end ignore
d7b8e6c6
EZ
23450@tindex elim
23451Normally there will be as many variables as equations. If you
23452give fewer variables than equations (an ``over-determined'' system
23453of equations), Calc will find a partial solution. For example,
23454typing @kbd{a S y @key{RET}} with the above system of equations
23455would produce @samp{[y = a - x]}. There are now several ways to
23456express this solution in terms of the original variables; Calc uses
23457the first one that it finds. You can control the choice by adding
23458variable specifiers of the form @samp{elim(@var{v})} to the
23459variables list. This says that @var{v} should be eliminated from
23460the equations; the variable will not appear at all in the solution.
23461For example, typing @kbd{a S y,elim(x)} would yield
23462@samp{[y = a - (b+a)/2]}.
23463
23464If the variables list contains only @code{elim} specifiers,
23465Calc simply eliminates those variables from the equations
23466and then returns the resulting set of equations. For example,
23467@kbd{a S elim(x)} produces @samp{[a - 2 y = b]}. Every variable
23468eliminated will reduce the number of equations in the system
23469by one.
23470
23471Again, @kbd{a S} gives you one solution to the system of
23472equations. If there are several solutions, you can use @kbd{H a S}
23473to get a general family of solutions, or, if there is a finite
23474number of solutions, you can use @kbd{a P} to get a list. (In
23475the latter case, the result will take the form of a matrix where
23476the rows are different solutions and the columns correspond to the
23477variables you requested.)
23478
23479Another way to deal with certain kinds of overdetermined systems of
23480equations is the @kbd{a F} command, which does least-squares fitting
23481to satisfy the equations. @xref{Curve Fitting}.
23482
23483@node Decomposing Polynomials, , Solving Systems of Equations, Solving Equations
23484@subsection Decomposing Polynomials
23485
23486@noindent
5d67986c
RS
23487@ignore
23488@starindex
23489@end ignore
d7b8e6c6
EZ
23490@tindex poly
23491The @code{poly} function takes a polynomial and a variable as
23492arguments, and returns a vector of polynomial coefficients (constant
23493coefficient first). For example, @samp{poly(x^3 + 2 x, x)} returns
23494@cite{[0, 2, 0, 1]}. If the input is not a polynomial in @cite{x},
23495the call to @code{poly} is left in symbolic form. If the input does
23496not involve the variable @cite{x}, the input is returned in a list
23497of length one, representing a polynomial with only a constant
23498coefficient. The call @samp{poly(x, x)} returns the vector @cite{[0, 1]}.
23499The last element of the returned vector is guaranteed to be nonzero;
23500note that @samp{poly(0, x)} returns the empty vector @cite{[]}.
23501Note also that @cite{x} may actually be any formula; for example,
23502@samp{poly(sin(x)^2 - sin(x) + 3, sin(x))} returns @cite{[3, -1, 1]}.
23503
23504@cindex Coefficients of polynomial
23505@cindex Degree of polynomial
23506To get the @cite{x^k} coefficient of polynomial @cite{p}, use
23507@samp{poly(p, x)_(k+1)}. To get the degree of polynomial @cite{p},
23508use @samp{vlen(poly(p, x)) - 1}. For example, @samp{poly((x+1)^4, x)}
23509returns @samp{[1, 4, 6, 4, 1]}, so @samp{poly((x+1)^4, x)_(2+1)}
23510gives the @cite{x^2} coefficient of this polynomial, 6.
23511
5d67986c
RS
23512@ignore
23513@starindex
23514@end ignore
d7b8e6c6
EZ
23515@tindex gpoly
23516One important feature of the solver is its ability to recognize
23517formulas which are ``essentially'' polynomials. This ability is
23518made available to the user through the @code{gpoly} function, which
23519is used just like @code{poly}: @samp{gpoly(@var{expr}, @var{var})}.
23520If @var{expr} is a polynomial in some term which includes @var{var}, then
23521this function will return a vector @samp{[@var{x}, @var{c}, @var{a}]}
23522where @var{x} is the term that depends on @var{var}, @var{c} is a
23523vector of polynomial coefficients (like the one returned by @code{poly}),
23524and @var{a} is a multiplier which is usually 1. Basically,
23525@samp{@var{expr} = @var{a}*(@var{c}_1 + @var{c}_2 @var{x} +
23526@var{c}_3 @var{x}^2 + ...)}. The last element of @var{c} is
23527guaranteed to be non-zero, and @var{c} will not equal @samp{[1]}
23528(i.e., the trivial decomposition @var{expr} = @var{x} is not
23529considered a polynomial). One side effect is that @samp{gpoly(x, x)}
23530and @samp{gpoly(6, x)}, both of which might be expected to recognize
23531their arguments as polynomials, will not because the decomposition
23532is considered trivial.
23533
23534For example, @samp{gpoly((x-2)^2, x)} returns @samp{[x, [4, -4, 1], 1]},
23535since the expanded form of this polynomial is @cite{4 - 4 x + x^2}.
23536
23537The term @var{x} may itself be a polynomial in @var{var}. This is
23538done to reduce the size of the @var{c} vector. For example,
23539@samp{gpoly(x^4 + x^2 - 1, x)} returns @samp{[x^2, [-1, 1, 1], 1]},
23540since a quadratic polynomial in @cite{x^2} is easier to solve than
23541a quartic polynomial in @cite{x}.
23542
23543A few more examples of the kinds of polynomials @code{gpoly} can
23544discover:
23545
23546@smallexample
23547sin(x) - 1 [sin(x), [-1, 1], 1]
23548x + 1/x - 1 [x, [1, -1, 1], 1/x]
23549x + 1/x [x^2, [1, 1], 1/x]
23550x^3 + 2 x [x^2, [2, 1], x]
23551x + x^2:3 + sqrt(x) [x^1:6, [1, 1, 0, 1], x^1:2]
23552x^(2a) + 2 x^a + 5 [x^a, [5, 2, 1], 1]
23553(exp(-x) + exp(x)) / 2 [e^(2 x), [0.5, 0.5], e^-x]
23554@end smallexample
23555
23556The @code{poly} and @code{gpoly} functions accept a third integer argument
23557which specifies the largest degree of polynomial that is acceptable.
23558If this is @cite{n}, then only @var{c} vectors of length @cite{n+1}
23559or less will be returned. Otherwise, the @code{poly} or @code{gpoly}
23560call will remain in symbolic form. For example, the equation solver
23561can handle quartics and smaller polynomials, so it calls
23562@samp{gpoly(@var{expr}, @var{var}, 4)} to discover whether @var{expr}
23563can be treated by its linear, quadratic, cubic, or quartic formulas.
23564
5d67986c
RS
23565@ignore
23566@starindex
23567@end ignore
d7b8e6c6
EZ
23568@tindex pdeg
23569The @code{pdeg} function computes the degree of a polynomial;
23570@samp{pdeg(p,x)} is the highest power of @code{x} that appears in
23571@code{p}. This is the same as @samp{vlen(poly(p,x))-1}, but is
23572much more efficient. If @code{p} is constant with respect to @code{x},
23573then @samp{pdeg(p,x) = 0}. If @code{p} is not a polynomial in @code{x}
23574(e.g., @samp{pdeg(2 cos(x), x)}, the function remains unevaluated.
23575It is possible to omit the second argument @code{x}, in which case
23576@samp{pdeg(p)} returns the highest total degree of any term of the
23577polynomial, counting all variables that appear in @code{p}. Note
23578that @code{pdeg(c) = pdeg(c,x) = 0} for any nonzero constant @code{c};
23579the degree of the constant zero is considered to be @code{-inf}
23580(minus infinity).
23581
5d67986c
RS
23582@ignore
23583@starindex
23584@end ignore
d7b8e6c6
EZ
23585@tindex plead
23586The @code{plead} function finds the leading term of a polynomial.
23587Thus @samp{plead(p,x)} is equivalent to @samp{poly(p,x)_vlen(poly(p,x))},
23588though again more efficient. In particular, @samp{plead((2x+1)^10, x)}
23589returns 1024 without expanding out the list of coefficients. The
23590value of @code{plead(p,x)} will be zero only if @cite{p = 0}.
23591
5d67986c
RS
23592@ignore
23593@starindex
23594@end ignore
d7b8e6c6
EZ
23595@tindex pcont
23596The @code{pcont} function finds the @dfn{content} of a polynomial. This
23597is the greatest common divisor of all the coefficients of the polynomial.
23598With two arguments, @code{pcont(p,x)} effectively uses @samp{poly(p,x)}
23599to get a list of coefficients, then uses @code{pgcd} (the polynomial
23600GCD function) to combine these into an answer. For example,
23601@samp{pcont(4 x y^2 + 6 x^2 y, x)} is @samp{2 y}. The content is
23602basically the ``biggest'' polynomial that can be divided into @code{p}
23603exactly. The sign of the content is the same as the sign of the leading
23604coefficient.
23605
23606With only one argument, @samp{pcont(p)} computes the numerical
23607content of the polynomial, i.e., the @code{gcd} of the numerical
23608coefficients of all the terms in the formula. Note that @code{gcd}
23609is defined on rational numbers as well as integers; it computes
23610the @code{gcd} of the numerators and the @code{lcm} of the
23611denominators. Thus @samp{pcont(4:3 x y^2 + 6 x^2 y)} returns 2:3.
23612Dividing the polynomial by this number will clear all the
23613denominators, as well as dividing by any common content in the
23614numerators. The numerical content of a polynomial is negative only
23615if all the coefficients in the polynomial are negative.
23616
5d67986c
RS
23617@ignore
23618@starindex
23619@end ignore
d7b8e6c6
EZ
23620@tindex pprim
23621The @code{pprim} function finds the @dfn{primitive part} of a
23622polynomial, which is simply the polynomial divided (using @code{pdiv}
23623if necessary) by its content. If the input polynomial has rational
23624coefficients, the result will have integer coefficients in simplest
23625terms.
23626
23627@node Numerical Solutions, Curve Fitting, Solving Equations, Algebra
23628@section Numerical Solutions
23629
23630@noindent
23631Not all equations can be solved symbolically. The commands in this
23632section use numerical algorithms that can find a solution to a specific
23633instance of an equation to any desired accuracy. Note that the
23634numerical commands are slower than their algebraic cousins; it is a
23635good idea to try @kbd{a S} before resorting to these commands.
23636
23637(@xref{Curve Fitting}, for some other, more specialized, operations
23638on numerical data.)
23639
23640@menu
23641* Root Finding::
23642* Minimization::
23643* Numerical Systems of Equations::
23644@end menu
23645
23646@node Root Finding, Minimization, Numerical Solutions, Numerical Solutions
23647@subsection Root Finding
23648
23649@noindent
23650@kindex a R
23651@pindex calc-find-root
23652@tindex root
23653@cindex Newton's method
23654@cindex Roots of equations
23655@cindex Numerical root-finding
23656The @kbd{a R} (@code{calc-find-root}) [@code{root}] command finds a
23657numerical solution (or @dfn{root}) of an equation. (This command treats
23658inequalities the same as equations. If the input is any other kind
23659of formula, it is interpreted as an equation of the form @cite{X = 0}.)
23660
23661The @kbd{a R} command requires an initial guess on the top of the
23662stack, and a formula in the second-to-top position. It prompts for a
23663solution variable, which must appear in the formula. All other variables
23664that appear in the formula must have assigned values, i.e., when
23665a value is assigned to the solution variable and the formula is
23666evaluated with @kbd{=}, it should evaluate to a number. Any assigned
23667value for the solution variable itself is ignored and unaffected by
23668this command.
23669
23670When the command completes, the initial guess is replaced on the stack
23671by a vector of two numbers: The value of the solution variable that
23672solves the equation, and the difference between the lefthand and
23673righthand sides of the equation at that value. Ordinarily, the second
23674number will be zero or very nearly zero. (Note that Calc uses a
23675slightly higher precision while finding the root, and thus the second
23676number may be slightly different from the value you would compute from
23677the equation yourself.)
23678
23679The @kbd{v h} (@code{calc-head}) command is a handy way to extract
23680the first element of the result vector, discarding the error term.
23681
23682The initial guess can be a real number, in which case Calc searches
23683for a real solution near that number, or a complex number, in which
23684case Calc searches the whole complex plane near that number for a
23685solution, or it can be an interval form which restricts the search
23686to real numbers inside that interval.
23687
23688Calc tries to use @kbd{a d} to take the derivative of the equation.
23689If this succeeds, it uses Newton's method. If the equation is not
23690differentiable Calc uses a bisection method. (If Newton's method
23691appears to be going astray, Calc switches over to bisection if it
23692can, or otherwise gives up. In this case it may help to try again
23693with a slightly different initial guess.) If the initial guess is a
23694complex number, the function must be differentiable.
23695
23696If the formula (or the difference between the sides of an equation)
23697is negative at one end of the interval you specify and positive at
23698the other end, the root finder is guaranteed to find a root.
23699Otherwise, Calc subdivides the interval into small parts looking for
23700positive and negative values to bracket the root. When your guess is
23701an interval, Calc will not look outside that interval for a root.
23702
23703@kindex H a R
23704@tindex wroot
23705The @kbd{H a R} [@code{wroot}] command is similar to @kbd{a R}, except
23706that if the initial guess is an interval for which the function has
23707the same sign at both ends, then rather than subdividing the interval
23708Calc attempts to widen it to enclose a root. Use this mode if
23709you are not sure if the function has a root in your interval.
23710
23711If the function is not differentiable, and you give a simple number
23712instead of an interval as your initial guess, Calc uses this widening
23713process even if you did not type the Hyperbolic flag. (If the function
23714@emph{is} differentiable, Calc uses Newton's method which does not
23715require a bounding interval in order to work.)
23716
23717If Calc leaves the @code{root} or @code{wroot} function in symbolic
23718form on the stack, it will normally display an explanation for why
23719no root was found. If you miss this explanation, press @kbd{w}
23720(@code{calc-why}) to get it back.
23721
23722@node Minimization, Numerical Systems of Equations, Root Finding, Numerical Solutions
23723@subsection Minimization
23724
23725@noindent
23726@kindex a N
23727@kindex H a N
23728@kindex a X
23729@kindex H a X
23730@pindex calc-find-minimum
23731@pindex calc-find-maximum
23732@tindex minimize
23733@tindex maximize
23734@cindex Minimization, numerical
23735The @kbd{a N} (@code{calc-find-minimum}) [@code{minimize}] command
23736finds a minimum value for a formula. It is very similar in operation
23737to @kbd{a R} (@code{calc-find-root}): You give the formula and an initial
23738guess on the stack, and are prompted for the name of a variable. The guess
23739may be either a number near the desired minimum, or an interval enclosing
23740the desired minimum. The function returns a vector containing the
23741value of the the variable which minimizes the formula's value, along
23742with the minimum value itself.
23743
23744Note that this command looks for a @emph{local} minimum. Many functions
23745have more than one minimum; some, like @c{$x \sin x$}
23746@cite{x sin(x)}, have infinitely
23747many. In fact, there is no easy way to define the ``global'' minimum
23748of @c{$x \sin x$}
23749@cite{x sin(x)} but Calc can still locate any particular local minimum
23750for you. Calc basically goes downhill from the initial guess until it
23751finds a point at which the function's value is greater both to the left
23752and to the right. Calc does not use derivatives when minimizing a function.
23753
23754If your initial guess is an interval and it looks like the minimum
23755occurs at one or the other endpoint of the interval, Calc will return
23756that endpoint only if that endpoint is closed; thus, minimizing @cite{17 x}
23757over @cite{[2..3]} will return @cite{[2, 38]}, but minimizing over
23758@cite{(2..3]} would report no minimum found. In general, you should
23759use closed intervals to find literally the minimum value in that
23760range of @cite{x}, or open intervals to find the local minimum, if
23761any, that happens to lie in that range.
23762
23763Most functions are smooth and flat near their minimum values. Because
23764of this flatness, if the current precision is, say, 12 digits, the
23765variable can only be determined meaningfully to about six digits. Thus
23766you should set the precision to twice as many digits as you need in your
23767answer.
23768
5d67986c
RS
23769@ignore
23770@mindex wmin@idots
23771@end ignore
d7b8e6c6 23772@tindex wminimize
5d67986c
RS
23773@ignore
23774@mindex wmax@idots
23775@end ignore
d7b8e6c6
EZ
23776@tindex wmaximize
23777The @kbd{H a N} [@code{wminimize}] command, analogously to @kbd{H a R},
23778expands the guess interval to enclose a minimum rather than requiring
23779that the minimum lie inside the interval you supply.
23780
23781The @kbd{a X} (@code{calc-find-maximum}) [@code{maximize}] and
23782@kbd{H a X} [@code{wmaximize}] commands effectively minimize the
23783negative of the formula you supply.
23784
23785The formula must evaluate to a real number at all points inside the
23786interval (or near the initial guess if the guess is a number). If
23787the initial guess is a complex number the variable will be minimized
23788over the complex numbers; if it is real or an interval it will
23789be minimized over the reals.
23790
23791@node Numerical Systems of Equations, , Minimization, Numerical Solutions
23792@subsection Systems of Equations
23793
23794@noindent
23795@cindex Systems of equations, numerical
23796The @kbd{a R} command can also solve systems of equations. In this
23797case, the equation should instead be a vector of equations, the
23798guess should instead be a vector of numbers (intervals are not
23799supported), and the variable should be a vector of variables. You
23800can omit the brackets while entering the list of variables. Each
23801equation must be differentiable by each variable for this mode to
23802work. The result will be a vector of two vectors: The variable
23803values that solved the system of equations, and the differences
23804between the sides of the equations with those variable values.
23805There must be the same number of equations as variables. Since
23806only plain numbers are allowed as guesses, the Hyperbolic flag has
23807no effect when solving a system of equations.
23808
23809It is also possible to minimize over many variables with @kbd{a N}
23810(or maximize with @kbd{a X}). Once again the variable name should
23811be replaced by a vector of variables, and the initial guess should
23812be an equal-sized vector of initial guesses. But, unlike the case of
23813multidimensional @kbd{a R}, the formula being minimized should
23814still be a single formula, @emph{not} a vector. Beware that
23815multidimensional minimization is currently @emph{very} slow.
23816
23817@node Curve Fitting, Summations, Numerical Solutions, Algebra
23818@section Curve Fitting
23819
23820@noindent
23821The @kbd{a F} command fits a set of data to a @dfn{model formula},
23822such as @cite{y = m x + b} where @cite{m} and @cite{b} are parameters
23823to be determined. For a typical set of measured data there will be
23824no single @cite{m} and @cite{b} that exactly fit the data; in this
23825case, Calc chooses values of the parameters that provide the closest
23826possible fit.
23827
23828@menu
23829* Linear Fits::
23830* Polynomial and Multilinear Fits::
23831* Error Estimates for Fits::
23832* Standard Nonlinear Models::
23833* Curve Fitting Details::
23834* Interpolation::
23835@end menu
23836
23837@node Linear Fits, Polynomial and Multilinear Fits, Curve Fitting, Curve Fitting
23838@subsection Linear Fits
23839
23840@noindent
23841@kindex a F
23842@pindex calc-curve-fit
23843@tindex fit
23844@cindex Linear regression
23845@cindex Least-squares fits
23846The @kbd{a F} (@code{calc-curve-fit}) [@code{fit}] command attempts
23847to fit a set of data (@cite{x} and @cite{y} vectors of numbers) to a
23848straight line, polynomial, or other function of @cite{x}. For the
23849moment we will consider only the case of fitting to a line, and we
23850will ignore the issue of whether or not the model was in fact a good
23851fit for the data.
23852
23853In a standard linear least-squares fit, we have a set of @cite{(x,y)}
23854data points that we wish to fit to the model @cite{y = m x + b}
23855by adjusting the parameters @cite{m} and @cite{b} to make the @cite{y}
23856values calculated from the formula be as close as possible to the actual
23857@cite{y} values in the data set. (In a polynomial fit, the model is
23858instead, say, @cite{y = a x^3 + b x^2 + c x + d}. In a multilinear fit,
23859we have data points of the form @cite{(x_1,x_2,x_3,y)} and our model is
23860@cite{y = a x_1 + b x_2 + c x_3 + d}. These will be discussed later.)
23861
23862In the model formula, variables like @cite{x} and @cite{x_2} are called
23863the @dfn{independent variables}, and @cite{y} is the @dfn{dependent
23864variable}. Variables like @cite{m}, @cite{a}, and @cite{b} are called
23865the @dfn{parameters} of the model.
23866
23867The @kbd{a F} command takes the data set to be fitted from the stack.
23868By default, it expects the data in the form of a matrix. For example,
23869for a linear or polynomial fit, this would be a @c{$2\times N$}
23870@asis{2xN} matrix where
23871the first row is a list of @cite{x} values and the second row has the
23872corresponding @cite{y} values. For the multilinear fit shown above,
23873the matrix would have four rows (@cite{x_1}, @cite{x_2}, @cite{x_3}, and
23874@cite{y}, respectively).
23875
23876If you happen to have an @c{$N\times2$}
23877@asis{Nx2} matrix instead of a @c{$2\times N$}
23878@asis{2xN} matrix,
23879just press @kbd{v t} first to transpose the matrix.
23880
23881After you type @kbd{a F}, Calc prompts you to select a model. For a
23882linear fit, press the digit @kbd{1}.
23883
23884Calc then prompts for you to name the variables. By default it chooses
23885high letters like @cite{x} and @cite{y} for independent variables and
23886low letters like @cite{a} and @cite{b} for parameters. (The dependent
23887variable doesn't need a name.) The two kinds of variables are separated
23888by a semicolon. Since you generally care more about the names of the
23889independent variables than of the parameters, Calc also allows you to
23890name only those and let the parameters use default names.
23891
23892For example, suppose the data matrix
23893
23894@ifinfo
d7b8e6c6 23895@example
5d67986c 23896@group
d7b8e6c6
EZ
23897[ [ 1, 2, 3, 4, 5 ]
23898 [ 5, 7, 9, 11, 13 ] ]
d7b8e6c6 23899@end group
5d67986c 23900@end example
d7b8e6c6
EZ
23901@end ifinfo
23902@tex
23903\turnoffactive
23904\turnoffactive
23905\beforedisplay
23906$$ \pmatrix{ 1 & 2 & 3 & 4 & 5 \cr
23907 5 & 7 & 9 & 11 & 13 }
23908$$
23909\afterdisplay
23910@end tex
23911
23912@noindent
23913is on the stack and we wish to do a simple linear fit. Type
5d67986c 23914@kbd{a F}, then @kbd{1} for the model, then @key{RET} to use
d7b8e6c6
EZ
23915the default names. The result will be the formula @cite{3 + 2 x}
23916on the stack. Calc has created the model expression @kbd{a + b x},
23917then found the optimal values of @cite{a} and @cite{b} to fit the
23918data. (In this case, it was able to find an exact fit.) Calc then
23919substituted those values for @cite{a} and @cite{b} in the model
23920formula.
23921
23922The @kbd{a F} command puts two entries in the trail. One is, as
23923always, a copy of the result that went to the stack; the other is
23924a vector of the actual parameter values, written as equations:
23925@cite{[a = 3, b = 2]}, in case you'd rather read them in a list
23926than pick them out of the formula. (You can type @kbd{t y}
b275eac7 23927to move this vector to the stack; see @ref{Trail Commands}.
d7b8e6c6
EZ
23928
23929Specifying a different independent variable name will affect the
5d67986c
RS
23930resulting formula: @kbd{a F 1 k @key{RET}} produces @kbd{3 + 2 k}.
23931Changing the parameter names (say, @kbd{a F 1 k;b,m @key{RET}}) will affect
d7b8e6c6
EZ
23932the equations that go into the trail.
23933
23934@tex
23935\bigskip
23936@end tex
23937
23938To see what happens when the fit is not exact, we could change
23939the number 13 in the data matrix to 14 and try the fit again.
23940The result is:
23941
23942@example
239432.6 + 2.2 x
23944@end example
23945
5d67986c 23946Evaluating this formula, say with @kbd{v x 5 @key{RET} @key{TAB} V M $ @key{RET}}, shows
d7b8e6c6
EZ
23947a reasonably close match to the y-values in the data.
23948
23949@example
23950[4.8, 7., 9.2, 11.4, 13.6]
23951@end example
23952
5d67986c 23953Since there is no line which passes through all the @var{n} data points,
d7b8e6c6
EZ
23954Calc has chosen a line that best approximates the data points using
23955the method of least squares. The idea is to define the @dfn{chi-square}
23956error measure
23957
23958@ifinfo
23959@example
23960chi^2 = sum((y_i - (a + b x_i))^2, i, 1, N)
23961@end example
23962@end ifinfo
23963@tex
23964\turnoffactive
23965\beforedisplay
23966$$ \chi^2 = \sum_{i=1}^N (y_i - (a + b x_i))^2 $$
23967\afterdisplay
23968@end tex
23969
23970@noindent
23971which is clearly zero if @cite{a + b x} exactly fits all data points,
23972and increases as various @cite{a + b x_i} values fail to match the
23973corresponding @cite{y_i} values. There are several reasons why the
23974summand is squared, one of them being to ensure that @c{$\chi^2 \ge 0$}
23975@cite{chi^2 >= 0}.
23976Least-squares fitting simply chooses the values of @cite{a} and @cite{b}
23977for which the error @c{$\chi^2$}
23978@cite{chi^2} is as small as possible.
23979
23980Other kinds of models do the same thing but with a different model
23981formula in place of @cite{a + b x_i}.
23982
23983@tex
23984\bigskip
23985@end tex
23986
23987A numeric prefix argument causes the @kbd{a F} command to take the
5d67986c
RS
23988data in some other form than one big matrix. A positive argument @var{n}
23989will take @var{N} items from the stack, corresponding to the @var{n} rows
23990of a data matrix. In the linear case, @var{n} must be 2 since there
d7b8e6c6
EZ
23991is always one independent variable and one dependent variable.
23992
23993A prefix of zero or plain @kbd{C-u} is a compromise; Calc takes two
5d67986c 23994items from the stack, an @var{n}-row matrix of @cite{x} values, and a
d7b8e6c6
EZ
23995vector of @cite{y} values. If there is only one independent variable,
23996the @cite{x} values can be either a one-row matrix or a plain vector,
23997in which case the @kbd{C-u} prefix is the same as a @w{@kbd{C-u 2}} prefix.
23998
23999@node Polynomial and Multilinear Fits, Error Estimates for Fits, Linear Fits, Curve Fitting
24000@subsection Polynomial and Multilinear Fits
24001
24002@noindent
24003To fit the data to higher-order polynomials, just type one of the
24004digits @kbd{2} through @kbd{9} when prompted for a model. For example,
24005we could fit the original data matrix from the previous section
24006(with 13, not 14) to a parabola instead of a line by typing
5d67986c 24007@kbd{a F 2 @key{RET}}.
d7b8e6c6
EZ
24008
24009@example
240102.00000000001 x - 1.5e-12 x^2 + 2.99999999999
24011@end example
24012
24013Note that since the constant and linear terms are enough to fit the
24014data exactly, it's no surprise that Calc chose a tiny contribution
24015for @cite{x^2}. (The fact that it's not exactly zero is due only
24016to roundoff error. Since our data are exact integers, we could get
24017an exact answer by typing @kbd{m f} first to get fraction mode.
24018Then the @cite{x^2} term would vanish altogether. Usually, though,
24019the data being fitted will be approximate floats so fraction mode
24020won't help.)
24021
24022Doing the @kbd{a F 2} fit on the data set with 14 instead of 13
24023gives a much larger @cite{x^2} contribution, as Calc bends the
24024line slightly to improve the fit.
24025
24026@example
240270.142857142855 x^2 + 1.34285714287 x + 3.59999999998
24028@end example
24029
24030An important result from the theory of polynomial fitting is that it
5d67986c
RS
24031is always possible to fit @var{n} data points exactly using a polynomial
24032of degree @i{@var{n}-1}, sometimes called an @dfn{interpolating polynomial}.
d7b8e6c6
EZ
24033Using the modified (14) data matrix, a model number of 4 gives
24034a polynomial that exactly matches all five data points:
24035
24036@example
240370.04167 x^4 - 0.4167 x^3 + 1.458 x^2 - 0.08333 x + 4.
24038@end example
24039
24040The actual coefficients we get with a precision of 12, like
24041@cite{0.0416666663588}, clearly suffer from loss of precision.
24042It is a good idea to increase the working precision to several
24043digits beyond what you need when you do a fitting operation.
24044Or, if your data are exact, use fraction mode to get exact
24045results.
24046
24047You can type @kbd{i} instead of a digit at the model prompt to fit
24048the data exactly to a polynomial. This just counts the number of
24049columns of the data matrix to choose the degree of the polynomial
24050automatically.
24051
24052Fitting data ``exactly'' to high-degree polynomials is not always
24053a good idea, though. High-degree polynomials have a tendency to
24054wiggle uncontrollably in between the fitting data points. Also,
24055if the exact-fit polynomial is going to be used to interpolate or
24056extrapolate the data, it is numerically better to use the @kbd{a p}
24057command described below. @xref{Interpolation}.
24058
24059@tex
24060\bigskip
24061@end tex
24062
24063Another generalization of the linear model is to assume the
24064@cite{y} values are a sum of linear contributions from several
24065@cite{x} values. This is a @dfn{multilinear} fit, and it is also
24066selected by the @kbd{1} digit key. (Calc decides whether the fit
24067is linear or multilinear by counting the rows in the data matrix.)
24068
24069Given the data matrix,
24070
d7b8e6c6 24071@example
5d67986c 24072@group
d7b8e6c6
EZ
24073[ [ 1, 2, 3, 4, 5 ]
24074 [ 7, 2, 3, 5, 2 ]
24075 [ 14.5, 15, 18.5, 22.5, 24 ] ]
d7b8e6c6 24076@end group
5d67986c 24077@end example
d7b8e6c6
EZ
24078
24079@noindent
5d67986c 24080the command @kbd{a F 1 @key{RET}} will call the first row @cite{x} and the
d7b8e6c6
EZ
24081second row @cite{y}, and will fit the values in the third row to the
24082model @cite{a + b x + c y}.
24083
24084@example
240858. + 3. x + 0.5 y
24086@end example
24087
24088Calc can do multilinear fits with any number of independent variables
24089(i.e., with any number of data rows).
24090
24091@tex
24092\bigskip
24093@end tex
24094
24095Yet another variation is @dfn{homogeneous} linear models, in which
24096the constant term is known to be zero. In the linear case, this
24097means the model formula is simply @cite{a x}; in the multilinear
24098case, the model might be @cite{a x + b y + c z}; and in the polynomial
24099case, the model could be @cite{a x + b x^2 + c x^3}. You can get
24100a homogeneous linear or multilinear model by pressing the letter
24101@kbd{h} followed by a regular model key, like @kbd{1} or @kbd{2}.
24102
24103It is certainly possible to have other constrained linear models,
24104like @cite{2.3 + a x} or @cite{a - 4 x}. While there is no single
24105key to select models like these, a later section shows how to enter
24106any desired model by hand. In the first case, for example, you
24107would enter @kbd{a F ' 2.3 + a x}.
24108
24109Another class of models that will work but must be entered by hand
24110are multinomial fits, e.g., @cite{a + b x + c y + d x^2 + e y^2 + f x y}.
24111
24112@node Error Estimates for Fits, Standard Nonlinear Models, Polynomial and Multilinear Fits, Curve Fitting
24113@subsection Error Estimates for Fits
24114
24115@noindent
24116@kindex H a F
24117@tindex efit
24118With the Hyperbolic flag, @kbd{H a F} [@code{efit}] performs the same
24119fitting operation as @kbd{a F}, but reports the coefficients as error
24120forms instead of plain numbers. Fitting our two data matrices (first
24121with 13, then with 14) to a line with @kbd{H a F} gives the results,
24122
24123@example
241243. + 2. x
241252.6 +/- 0.382970843103 + 2.2 +/- 0.115470053838 x
24126@end example
24127
24128In the first case the estimated errors are zero because the linear
24129fit is perfect. In the second case, the errors are nonzero but
24130moderately small, because the data are still very close to linear.
24131
24132It is also possible for the @emph{input} to a fitting operation to
24133contain error forms. The data values must either all include errors
24134or all be plain numbers. Error forms can go anywhere but generally
24135go on the numbers in the last row of the data matrix. If the last
24136row contains error forms
5d67986c
RS
24137`@var{y_i}@w{ @t{+/-} }@c{$\sigma_i$}
24138@var{sigma_i}', then the @c{$\chi^2$}
d7b8e6c6
EZ
24139@cite{chi^2}
24140statistic is now,
24141
24142@ifinfo
24143@example
24144chi^2 = sum(((y_i - (a + b x_i)) / sigma_i)^2, i, 1, N)
24145@end example
24146@end ifinfo
24147@tex
24148\turnoffactive
24149\beforedisplay
24150$$ \chi^2 = \sum_{i=1}^N \left(y_i - (a + b x_i) \over \sigma_i\right)^2 $$
24151\afterdisplay
24152@end tex
24153
24154@noindent
24155so that data points with larger error estimates contribute less to
24156the fitting operation.
24157
24158If there are error forms on other rows of the data matrix, all the
24159errors for a given data point are combined; the square root of the
24160sum of the squares of the errors forms the @c{$\sigma_i$}
24161@cite{sigma_i} used for
24162the data point.
24163
24164Both @kbd{a F} and @kbd{H a F} can accept error forms in the input
24165matrix, although if you are concerned about error analysis you will
24166probably use @kbd{H a F} so that the output also contains error
24167estimates.
24168
24169If the input contains error forms but all the @c{$\sigma_i$}
24170@cite{sigma_i} values are
24171the same, it is easy to see that the resulting fitted model will be
24172the same as if the input did not have error forms at all (@c{$\chi^2$}
24173@cite{chi^2}
24174is simply scaled uniformly by @c{$1 / \sigma^2$}
24175@cite{1 / sigma^2}, which doesn't affect
24176where it has a minimum). But there @emph{will} be a difference
24177in the estimated errors of the coefficients reported by @kbd{H a F}.
24178
24179Consult any text on statistical modelling of data for a discussion
24180of where these error estimates come from and how they should be
24181interpreted.
24182
24183@tex
24184\bigskip
24185@end tex
24186
24187@kindex I a F
24188@tindex xfit
24189With the Inverse flag, @kbd{I a F} [@code{xfit}] produces even more
24190information. The result is a vector of six items:
24191
24192@enumerate
24193@item
24194The model formula with error forms for its coefficients or
24195parameters. This is the result that @kbd{H a F} would have
24196produced.
24197
24198@item
24199A vector of ``raw'' parameter values for the model. These are the
24200polynomial coefficients or other parameters as plain numbers, in the
24201same order as the parameters appeared in the final prompt of the
24202@kbd{I a F} command. For polynomials of degree @cite{d}, this vector
24203will have length @cite{M = d+1} with the constant term first.
24204
24205@item
24206The covariance matrix @cite{C} computed from the fit. This is
5d67986c 24207an @var{m}x@var{m} symmetric matrix; the diagonal elements
d7b8e6c6
EZ
24208@c{$C_{jj}$}
24209@cite{C_j_j} are the variances @c{$\sigma_j^2$}
24210@cite{sigma_j^2} of the parameters.
24211The other elements are covariances @c{$\sigma_{ij}^2$}
24212@cite{sigma_i_j^2} that describe the
24213correlation between pairs of parameters. (A related set of
24214numbers, the @dfn{linear correlation coefficients} @c{$r_{ij}$}
24215@cite{r_i_j},
24216are defined as @c{$\sigma_{ij}^2 / \sigma_i \, \sigma_j$}
24217@cite{sigma_i_j^2 / sigma_i sigma_j}.)
24218
24219@item
24220A vector of @cite{M} ``parameter filter'' functions whose
24221meanings are described below. If no filters are necessary this
24222will instead be an empty vector; this is always the case for the
24223polynomial and multilinear fits described so far.
24224
24225@item
24226The value of @c{$\chi^2$}
24227@cite{chi^2} for the fit, calculated by the formulas
24228shown above. This gives a measure of the quality of the fit;
24229statisticians consider @c{$\chi^2 \approx N - M$}
24230@cite{chi^2 = N - M} to indicate a moderately good fit
24231(where again @cite{N} is the number of data points and @cite{M}
24232is the number of parameters).
24233
24234@item
24235A measure of goodness of fit expressed as a probability @cite{Q}.
24236This is computed from the @code{utpc} probability distribution
24237function using @c{$\chi^2$}
24238@cite{chi^2} with @cite{N - M} degrees of freedom. A
24239value of 0.5 implies a good fit; some texts recommend that often
24240@cite{Q = 0.1} or even 0.001 can signify an acceptable fit. In
24241particular, @c{$\chi^2$}
24242@cite{chi^2} statistics assume the errors in your inputs
24243follow a normal (Gaussian) distribution; if they don't, you may
24244have to accept smaller values of @cite{Q}.
24245
24246The @cite{Q} value is computed only if the input included error
24247estimates. Otherwise, Calc will report the symbol @code{nan}
24248for @cite{Q}. The reason is that in this case the @c{$\chi^2$}
24249@cite{chi^2}
24250value has effectively been used to estimate the original errors
24251in the input, and thus there is no redundant information left
24252over to use for a confidence test.
24253@end enumerate
24254
24255@node Standard Nonlinear Models, Curve Fitting Details, Error Estimates for Fits, Curve Fitting
24256@subsection Standard Nonlinear Models
24257
24258@noindent
24259The @kbd{a F} command also accepts other kinds of models besides
24260lines and polynomials. Some common models have quick single-key
24261abbreviations; others must be entered by hand as algebraic formulas.
24262
24263Here is a complete list of the standard models recognized by @kbd{a F}:
24264
24265@table @kbd
24266@item 1
24267Linear or multilinear. @i{a + b x + c y + d z}.
24268@item 2-9
24269Polynomials. @i{a + b x + c x^2 + d x^3}.
24270@item e
24271Exponential. @i{a} @t{exp}@i{(b x)} @t{exp}@i{(c y)}.
24272@item E
24273Base-10 exponential. @i{a} @t{10^}@i{(b x)} @t{10^}@i{(c y)}.
24274@item x
24275Exponential (alternate notation). @t{exp}@i{(a + b x + c y)}.
24276@item X
24277Base-10 exponential (alternate). @t{10^}@i{(a + b x + c y)}.
24278@item l
24279Logarithmic. @i{a + b} @t{ln}@i{(x) + c} @t{ln}@i{(y)}.
24280@item L
24281Base-10 logarithmic. @i{a + b} @t{log10}@i{(x) + c} @t{log10}@i{(y)}.
24282@item ^
24283General exponential. @i{a b^x c^y}.
24284@item p
24285Power law. @i{a x^b y^c}.
24286@item q
24287Quadratic. @i{a + b (x-c)^2 + d (x-e)^2}.
24288@item g
24289Gaussian. @c{${a \over b \sqrt{2 \pi}} \exp\left( -{1 \over 2} \left( x - c \over b \right)^2 \right)$}
24290@i{(a / b sqrt(2 pi)) exp(-0.5*((x-c)/b)^2)}.
24291@end table
24292
24293All of these models are used in the usual way; just press the appropriate
24294letter at the model prompt, and choose variable names if you wish. The
24295result will be a formula as shown in the above table, with the best-fit
24296values of the parameters substituted. (You may find it easier to read
24297the parameter values from the vector that is placed in the trail.)
24298
24299All models except Gaussian and polynomials can generalize as shown to any
24300number of independent variables. Also, all the built-in models have an
24301additive or multiplicative parameter shown as @cite{a} in the above table
24302which can be replaced by zero or one, as appropriate, by typing @kbd{h}
24303before the model key.
24304
24305Note that many of these models are essentially equivalent, but express
24306the parameters slightly differently. For example, @cite{a b^x} and
24307the other two exponential models are all algebraic rearrangements of
24308each other. Also, the ``quadratic'' model is just a degree-2 polynomial
24309with the parameters expressed differently. Use whichever form best
24310matches the problem.
24311
24312The HP-28/48 calculators support four different models for curve
24313fitting, called @code{LIN}, @code{LOG}, @code{EXP}, and @code{PWR}.
24314These correspond to Calc models @samp{a + b x}, @samp{a + b ln(x)},
24315@samp{a exp(b x)}, and @samp{a x^b}, respectively. In each case,
24316@cite{a} is what the HP-48 identifies as the ``intercept,'' and
24317@cite{b} is what it calls the ``slope.''
24318
24319@tex
24320\bigskip
24321@end tex
24322
24323If the model you want doesn't appear on this list, press @kbd{'}
24324(the apostrophe key) at the model prompt to enter any algebraic
24325formula, such as @kbd{m x - b}, as the model. (Not all models
24326will work, though---see the next section for details.)
24327
24328The model can also be an equation like @cite{y = m x + b}.
24329In this case, Calc thinks of all the rows of the data matrix on
24330equal terms; this model effectively has two parameters
24331(@cite{m} and @cite{b}) and two independent variables (@cite{x}
24332and @cite{y}), with no ``dependent'' variables. Model equations
24333do not need to take this @cite{y =} form. For example, the
24334implicit line equation @cite{a x + b y = 1} works fine as a
24335model.
24336
24337When you enter a model, Calc makes an alphabetical list of all
24338the variables that appear in the model. These are used for the
24339default parameters, independent variables, and dependent variable
24340(in that order). If you enter a plain formula (not an equation),
24341Calc assumes the dependent variable does not appear in the formula
24342and thus does not need a name.
24343
24344For example, if the model formula has the variables @cite{a,mu,sigma,t,x},
24345and the data matrix has three rows (meaning two independent variables),
24346Calc will use @cite{a,mu,sigma} as the default parameters, and the
24347data rows will be named @cite{t} and @cite{x}, respectively. If you
24348enter an equation instead of a plain formula, Calc will use @cite{a,mu}
24349as the parameters, and @cite{sigma,t,x} as the three independent
24350variables.
24351
24352You can, of course, override these choices by entering something
24353different at the prompt. If you leave some variables out of the list,
24354those variables must have stored values and those stored values will
24355be used as constants in the model. (Stored values for the parameters
24356and independent variables are ignored by the @kbd{a F} command.)
24357If you list only independent variables, all the remaining variables
24358in the model formula will become parameters.
24359
24360If there are @kbd{$} signs in the model you type, they will stand
24361for parameters and all other variables (in alphabetical order)
24362will be independent. Use @kbd{$} for one parameter, @kbd{$$} for
24363another, and so on. Thus @kbd{$ x + $$} is another way to describe
24364a linear model.
24365
24366If you type a @kbd{$} instead of @kbd{'} at the model prompt itself,
24367Calc will take the model formula from the stack. (The data must then
24368appear at the second stack level.) The same conventions are used to
24369choose which variables in the formula are independent by default and
24370which are parameters.
24371
24372Models taken from the stack can also be expressed as vectors of
24373two or three elements, @cite{[@var{model}, @var{vars}]} or
24374@cite{[@var{model}, @var{vars}, @var{params}]}. Each of @var{vars}
24375and @var{params} may be either a variable or a vector of variables.
24376(If @var{params} is omitted, all variables in @var{model} except
24377those listed as @var{vars} are parameters.)@refill
24378
24379When you enter a model manually with @kbd{'}, Calc puts a 3-vector
24380describing the model in the trail so you can get it back if you wish.
24381
24382@tex
24383\bigskip
24384@end tex
24385
24386@vindex Model1
24387@vindex Model2
24388Finally, you can store a model in one of the Calc variables
24389@code{Model1} or @code{Model2}, then use this model by typing
24390@kbd{a F u} or @kbd{a F U} (respectively). The value stored in
24391the variable can be any of the formats that @kbd{a F $} would
24392accept for a model on the stack.
24393
24394@tex
24395\bigskip
24396@end tex
24397
24398Calc uses the principal values of inverse functions like @code{ln}
24399and @code{arcsin} when doing fits. For example, when you enter
24400the model @samp{y = sin(a t + b)} Calc actually uses the easier
24401form @samp{arcsin(y) = a t + b}. The @code{arcsin} function always
24402returns results in the range from @i{-90} to 90 degrees (or the
24403equivalent range in radians). Suppose you had data that you
24404believed to represent roughly three oscillations of a sine wave,
24405so that the argument of the sine might go from zero to @c{$3\times360$}
24406@i{3*360} degrees.
24407The above model would appear to be a good way to determine the
24408true frequency and phase of the sine wave, but in practice it
24409would fail utterly. The righthand side of the actual model
24410@samp{arcsin(y) = a t + b} will grow smoothly with @cite{t}, but
24411the lefthand side will bounce back and forth between @i{-90} and 90.
24412No values of @cite{a} and @cite{b} can make the two sides match,
24413even approximately.
24414
24415There is no good solution to this problem at present. You could
24416restrict your data to small enough ranges so that the above problem
24417doesn't occur (i.e., not straddling any peaks in the sine wave).
24418Or, in this case, you could use a totally different method such as
24419Fourier analysis, which is beyond the scope of the @kbd{a F} command.
24420(Unfortunately, Calc does not currently have any facilities for
24421taking Fourier and related transforms.)
24422
24423@node Curve Fitting Details, Interpolation, Standard Nonlinear Models, Curve Fitting
24424@subsection Curve Fitting Details
24425
24426@noindent
24427Calc's internal least-squares fitter can only handle multilinear
24428models. More precisely, it can handle any model of the form
24429@cite{a f(x,y,z) + b g(x,y,z) + c h(x,y,z)}, where @cite{a,b,c}
24430are the parameters and @cite{x,y,z} are the independent variables
24431(of course there can be any number of each, not just three).
24432
24433In a simple multilinear or polynomial fit, it is easy to see how
24434to convert the model into this form. For example, if the model
24435is @cite{a + b x + c x^2}, then @cite{f(x) = 1}, @cite{g(x) = x},
24436and @cite{h(x) = x^2} are suitable functions.
24437
24438For other models, Calc uses a variety of algebraic manipulations
24439to try to put the problem into the form
24440
24441@smallexample
24442Y(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)
24443@end smallexample
24444
24445@noindent
24446where @cite{Y,A,B,C,F,G,H} are arbitrary functions. It computes
24447@cite{Y}, @cite{F}, @cite{G}, and @cite{H} for all the data points,
24448does a standard linear fit to find the values of @cite{A}, @cite{B},
24449and @cite{C}, then uses the equation solver to solve for @cite{a,b,c}
24450in terms of @cite{A,B,C}.
24451
24452A remarkable number of models can be cast into this general form.
24453We'll look at two examples here to see how it works. The power-law
24454model @cite{y = a x^b} with two independent variables and two parameters
24455can be rewritten as follows:
24456
24457@example
24458y = a x^b
24459y = a exp(b ln(x))
24460y = exp(ln(a) + b ln(x))
24461ln(y) = ln(a) + b ln(x)
24462@end example
24463
24464@noindent
24465which matches the desired form with @c{$Y = \ln(y)$}
24466@cite{Y = ln(y)}, @c{$A = \ln(a)$}
24467@cite{A = ln(a)},
24468@cite{F = 1}, @cite{B = b}, and @c{$G = \ln(x)$}
24469@cite{G = ln(x)}. Calc thus computes
24470the logarithms of your @cite{y} and @cite{x} values, does a linear fit
24471for @cite{A} and @cite{B}, then solves to get @c{$a = \exp(A)$}
24472@cite{a = exp(A)} and
24473@cite{b = B}.
24474
24475Another interesting example is the ``quadratic'' model, which can
24476be handled by expanding according to the distributive law.
24477
24478@example
24479y = a + b*(x - c)^2
24480y = a + b c^2 - 2 b c x + b x^2
24481@end example
24482
24483@noindent
24484which matches with @cite{Y = y}, @cite{A = a + b c^2}, @cite{F = 1},
24485@cite{B = -2 b c}, @cite{G = x} (the @i{-2} factor could just as easily
24486have been put into @cite{G} instead of @cite{B}), @cite{C = b}, and
24487@cite{H = x^2}.
24488
24489The Gaussian model looks quite complicated, but a closer examination
24490shows that it's actually similar to the quadratic model but with an
24491exponential that can be brought to the top and moved into @cite{Y}.
24492
24493An example of a model that cannot be put into general linear
24494form is a Gaussian with a constant background added on, i.e.,
24495@cite{d} + the regular Gaussian formula. If you have a model like
24496this, your best bet is to replace enough of your parameters with
24497constants to make the model linearizable, then adjust the constants
24498manually by doing a series of fits. You can compare the fits by
24499graphing them, by examining the goodness-of-fit measures returned by
24500@kbd{I a F}, or by some other method suitable to your application.
24501Note that some models can be linearized in several ways. The
5d67986c 24502Gaussian-plus-@var{d} model can be linearized by setting @cite{d}
d7b8e6c6
EZ
24503(the background) to a constant, or by setting @cite{b} (the standard
24504deviation) and @cite{c} (the mean) to constants.
24505
24506To fit a model with constants substituted for some parameters, just
24507store suitable values in those parameter variables, then omit them
24508from the list of parameters when you answer the variables prompt.
24509
24510@tex
24511\bigskip
24512@end tex
24513
24514A last desperate step would be to use the general-purpose
24515@code{minimize} function rather than @code{fit}. After all, both
24516functions solve the problem of minimizing an expression (the @c{$\chi^2$}
24517@cite{chi^2}
24518sum) by adjusting certain parameters in the expression. The @kbd{a F}
24519command is able to use a vastly more efficient algorithm due to its
24520special knowledge about linear chi-square sums, but the @kbd{a N}
24521command can do the same thing by brute force.
24522
24523A compromise would be to pick out a few parameters without which the
24524fit is linearizable, and use @code{minimize} on a call to @code{fit}
24525which efficiently takes care of the rest of the parameters. The thing
24526to be minimized would be the value of @c{$\chi^2$}
24527@cite{chi^2} returned as
24528the fifth result of the @code{xfit} function:
24529
24530@smallexample
24531minimize(xfit(gaus(a,b,c,d,x), x, [a,b,c], data)_5, d, guess)
24532@end smallexample
24533
24534@noindent
24535where @code{gaus} represents the Gaussian model with background,
24536@code{data} represents the data matrix, and @code{guess} represents
24537the initial guess for @cite{d} that @code{minimize} requires.
24538This operation will only be, shall we say, extraordinarily slow
24539rather than astronomically slow (as would be the case if @code{minimize}
24540were used by itself to solve the problem).
24541
24542@tex
24543\bigskip
24544@end tex
24545
24546The @kbd{I a F} [@code{xfit}] command is somewhat trickier when
24547nonlinear models are used. The second item in the result is the
24548vector of ``raw'' parameters @cite{A}, @cite{B}, @cite{C}. The
24549covariance matrix is written in terms of those raw parameters.
24550The fifth item is a vector of @dfn{filter} expressions. This
24551is the empty vector @samp{[]} if the raw parameters were the same
24552as the requested parameters, i.e., if @cite{A = a}, @cite{B = b},
24553and so on (which is always true if the model is already linear
24554in the parameters as written, e.g., for polynomial fits). If the
24555parameters had to be rearranged, the fifth item is instead a vector
24556of one formula per parameter in the original model. The raw
24557parameters are expressed in these ``filter'' formulas as
24558@samp{fitdummy(1)} for @cite{A}, @samp{fitdummy(2)} for @cite{B},
24559and so on.
24560
24561When Calc needs to modify the model to return the result, it replaces
24562@samp{fitdummy(1)} in all the filters with the first item in the raw
24563parameters list, and so on for the other raw parameters, then
24564evaluates the resulting filter formulas to get the actual parameter
24565values to be substituted into the original model. In the case of
24566@kbd{H a F} and @kbd{I a F} where the parameters must be error forms,
24567Calc uses the square roots of the diagonal entries of the covariance
24568matrix as error values for the raw parameters, then lets Calc's
24569standard error-form arithmetic take it from there.
24570
24571If you use @kbd{I a F} with a nonlinear model, be sure to remember
24572that the covariance matrix is in terms of the raw parameters,
24573@emph{not} the actual requested parameters. It's up to you to
24574figure out how to interpret the covariances in the presence of
24575nontrivial filter functions.
24576
24577Things are also complicated when the input contains error forms.
24578Suppose there are three independent and dependent variables, @cite{x},
24579@cite{y}, and @cite{z}, one or more of which are error forms in the
24580data. Calc combines all the error values by taking the square root
24581of the sum of the squares of the errors. It then changes @cite{x}
24582and @cite{y} to be plain numbers, and makes @cite{z} into an error
24583form with this combined error. The @cite{Y(x,y,z)} part of the
24584linearized model is evaluated, and the result should be an error
24585form. The error part of that result is used for @c{$\sigma_i$}
24586@cite{sigma_i} for
24587the data point. If for some reason @cite{Y(x,y,z)} does not return
24588an error form, the combined error from @cite{z} is used directly
24589for @c{$\sigma_i$}
24590@cite{sigma_i}. Finally, @cite{z} is also stripped of its error
24591for use in computing @cite{F(x,y,z)}, @cite{G(x,y,z)} and so on;
24592the righthand side of the linearized model is computed in regular
24593arithmetic with no error forms.
24594
24595(While these rules may seem complicated, they are designed to do
24596the most reasonable thing in the typical case that @cite{Y(x,y,z)}
24597depends only on the dependent variable @cite{z}, and in fact is
24598often simply equal to @cite{z}. For common cases like polynomials
24599and multilinear models, the combined error is simply used as the
24600@c{$\sigma$}
24601@cite{sigma} for the data point with no further ado.)
24602
24603@tex
24604\bigskip
24605@end tex
24606
24607@vindex FitRules
24608It may be the case that the model you wish to use is linearizable,
24609but Calc's built-in rules are unable to figure it out. Calc uses
24610its algebraic rewrite mechanism to linearize a model. The rewrite
24611rules are kept in the variable @code{FitRules}. You can edit this
24612variable using the @kbd{s e FitRules} command; in fact, there is
24613a special @kbd{s F} command just for editing @code{FitRules}.
24614@xref{Operations on Variables}.
24615
24616@xref{Rewrite Rules}, for a discussion of rewrite rules.
24617
5d67986c
RS
24618@ignore
24619@starindex
24620@end ignore
d7b8e6c6 24621@tindex fitvar
5d67986c
RS
24622@ignore
24623@starindex
24624@end ignore
24625@ignore
24626@mindex @idots
24627@end ignore
d7b8e6c6 24628@tindex fitparam
5d67986c
RS
24629@ignore
24630@starindex
24631@end ignore
24632@ignore
24633@mindex @null
24634@end ignore
d7b8e6c6 24635@tindex fitmodel
5d67986c
RS
24636@ignore
24637@starindex
24638@end ignore
24639@ignore
24640@mindex @null
24641@end ignore
d7b8e6c6 24642@tindex fitsystem
5d67986c
RS
24643@ignore
24644@starindex
24645@end ignore
24646@ignore
24647@mindex @null
24648@end ignore
d7b8e6c6
EZ
24649@tindex fitdummy
24650Calc uses @code{FitRules} as follows. First, it converts the model
24651to an equation if necessary and encloses the model equation in a
24652call to the function @code{fitmodel} (which is not actually a defined
24653function in Calc; it is only used as a placeholder by the rewrite rules).
24654Parameter variables are renamed to function calls @samp{fitparam(1)},
24655@samp{fitparam(2)}, and so on, and independent variables are renamed
24656to @samp{fitvar(1)}, @samp{fitvar(2)}, etc. The dependent variable
24657is the highest-numbered @code{fitvar}. For example, the power law
24658model @cite{a x^b} is converted to @cite{y = a x^b}, then to
24659
d7b8e6c6 24660@smallexample
5d67986c 24661@group
d7b8e6c6 24662fitmodel(fitvar(2) = fitparam(1) fitvar(1)^fitparam(2))
d7b8e6c6 24663@end group
5d67986c 24664@end smallexample
d7b8e6c6
EZ
24665
24666Calc then applies the rewrites as if by @samp{C-u 0 a r FitRules}.
24667(The zero prefix means that rewriting should continue until no further
24668changes are possible.)
24669
24670When rewriting is complete, the @code{fitmodel} call should have
24671been replaced by a @code{fitsystem} call that looks like this:
24672
24673@example
24674fitsystem(@var{Y}, @var{FGH}, @var{abc})
24675@end example
24676
24677@noindent
24678where @var{Y} is a formula that describes the function @cite{Y(x,y,z)},
24679@var{FGH} is the vector of formulas @cite{[F(x,y,z), G(x,y,z), H(x,y,z)]},
24680and @var{abc} is the vector of parameter filters which refer to the
24681raw parameters as @samp{fitdummy(1)} for @cite{A}, @samp{fitdummy(2)}
24682for @cite{B}, etc. While the number of raw parameters (the length of
24683the @var{FGH} vector) is usually the same as the number of original
24684parameters (the length of the @var{abc} vector), this is not required.
24685
24686The power law model eventually boils down to
24687
d7b8e6c6 24688@smallexample
5d67986c 24689@group
d7b8e6c6
EZ
24690fitsystem(ln(fitvar(2)),
24691 [1, ln(fitvar(1))],
24692 [exp(fitdummy(1)), fitdummy(2)])
d7b8e6c6 24693@end group
5d67986c 24694@end smallexample
d7b8e6c6
EZ
24695
24696The actual implementation of @code{FitRules} is complicated; it
24697proceeds in four phases. First, common rearrangements are done
24698to try to bring linear terms together and to isolate functions like
24699@code{exp} and @code{ln} either all the way ``out'' (so that they
24700can be put into @var{Y}) or all the way ``in'' (so that they can
24701be put into @var{abc} or @var{FGH}). In particular, all
24702non-constant powers are converted to logs-and-exponentials form,
24703and the distributive law is used to expand products of sums.
24704Quotients are rewritten to use the @samp{fitinv} function, where
24705@samp{fitinv(x)} represents @cite{1/x} while the @code{FitRules}
24706are operating. (The use of @code{fitinv} makes recognition of
24707linear-looking forms easier.) If you modify @code{FitRules}, you
24708will probably only need to modify the rules for this phase.
24709
24710Phase two, whose rules can actually also apply during phases one
24711and three, first rewrites @code{fitmodel} to a two-argument
24712form @samp{fitmodel(@var{Y}, @var{model})}, where @var{Y} is
24713initially zero and @var{model} has been changed from @cite{a=b}
24714to @cite{a-b} form. It then tries to peel off invertible functions
24715from the outside of @var{model} and put them into @var{Y} instead,
24716calling the equation solver to invert the functions. Finally, when
24717this is no longer possible, the @code{fitmodel} is changed to a
24718four-argument @code{fitsystem}, where the fourth argument is
24719@var{model} and the @var{FGH} and @var{abc} vectors are initially
24720empty. (The last vector is really @var{ABC}, corresponding to
24721raw parameters, for now.)
24722
24723Phase three converts a sum of items in the @var{model} to a sum
24724of @samp{fitpart(@var{a}, @var{b}, @var{c})} terms which represent
24725terms @samp{@var{a}*@var{b}*@var{c}} of the sum, where @var{a}
24726is all factors that do not involve any variables, @var{b} is all
24727factors that involve only parameters, and @var{c} is the factors
24728that involve only independent variables. (If this decomposition
24729is not possible, the rule set will not complete and Calc will
24730complain that the model is too complex.) Then @code{fitpart}s
24731with equal @var{b} or @var{c} components are merged back together
24732using the distributive law in order to minimize the number of
24733raw parameters needed.
24734
24735Phase four moves the @code{fitpart} terms into the @var{FGH} and
24736@var{ABC} vectors. Also, some of the algebraic expansions that
24737were done in phase 1 are undone now to make the formulas more
24738computationally efficient. Finally, it calls the solver one more
24739time to convert the @var{ABC} vector to an @var{abc} vector, and
24740removes the fourth @var{model} argument (which by now will be zero)
24741to obtain the three-argument @code{fitsystem} that the linear
24742least-squares solver wants to see.
24743
5d67986c
RS
24744@ignore
24745@starindex
24746@end ignore
24747@ignore
24748@mindex hasfit@idots
24749@end ignore
d7b8e6c6 24750@tindex hasfitparams
5d67986c
RS
24751@ignore
24752@starindex
24753@end ignore
24754@ignore
24755@mindex @null
24756@end ignore
d7b8e6c6
EZ
24757@tindex hasfitvars
24758Two functions which are useful in connection with @code{FitRules}
24759are @samp{hasfitparams(x)} and @samp{hasfitvars(x)}, which check
24760whether @cite{x} refers to any parameters or independent variables,
24761respectively. Specifically, these functions return ``true'' if the
24762argument contains any @code{fitparam} (or @code{fitvar}) function
24763calls, and ``false'' otherwise. (Recall that ``true'' means a
24764nonzero number, and ``false'' means zero. The actual nonzero number
24765returned is the largest @var{n} from all the @samp{fitparam(@var{n})}s
24766or @samp{fitvar(@var{n})}s, respectively, that appear in the formula.)
24767
24768@tex
24769\bigskip
24770@end tex
24771
24772The @code{fit} function in algebraic notation normally takes four
24773arguments, @samp{fit(@var{model}, @var{vars}, @var{params}, @var{data})},
24774where @var{model} is the model formula as it would be typed after
24775@kbd{a F '}, @var{vars} is the independent variable or a vector of
24776independent variables, @var{params} likewise gives the parameter(s),
24777and @var{data} is the data matrix. Note that the length of @var{vars}
24778must be equal to the number of rows in @var{data} if @var{model} is
24779an equation, or one less than the number of rows if @var{model} is
24780a plain formula. (Actually, a name for the dependent variable is
24781allowed but will be ignored in the plain-formula case.)
24782
24783If @var{params} is omitted, the parameters are all variables in
24784@var{model} except those that appear in @var{vars}. If @var{vars}
24785is also omitted, Calc sorts all the variables that appear in
24786@var{model} alphabetically and uses the higher ones for @var{vars}
24787and the lower ones for @var{params}.
24788
24789Alternatively, @samp{fit(@var{modelvec}, @var{data})} is allowed
24790where @var{modelvec} is a 2- or 3-vector describing the model
24791and variables, as discussed previously.
24792
24793If Calc is unable to do the fit, the @code{fit} function is left
24794in symbolic form, ordinarily with an explanatory message. The
24795message will be ``Model expression is too complex'' if the
24796linearizer was unable to put the model into the required form.
24797
24798The @code{efit} (corresponding to @kbd{H a F}) and @code{xfit}
24799(for @kbd{I a F}) functions are completely analogous.
24800
24801@node Interpolation, , Curve Fitting Details, Curve Fitting
24802@subsection Polynomial Interpolation
24803
24804@kindex a p
24805@pindex calc-poly-interp
24806@tindex polint
24807The @kbd{a p} (@code{calc-poly-interp}) [@code{polint}] command does
24808a polynomial interpolation at a particular @cite{x} value. It takes
24809two arguments from the stack: A data matrix of the sort used by
24810@kbd{a F}, and a single number which represents the desired @cite{x}
24811value. Calc effectively does an exact polynomial fit as if by @kbd{a F i},
24812then substitutes the @cite{x} value into the result in order to get an
24813approximate @cite{y} value based on the fit. (Calc does not actually
24814use @kbd{a F i}, however; it uses a direct method which is both more
24815efficient and more numerically stable.)
24816
24817The result of @kbd{a p} is actually a vector of two values: The @cite{y}
24818value approximation, and an error measure @cite{dy} that reflects Calc's
24819estimation of the probable error of the approximation at that value of
24820@cite{x}. If the input @cite{x} is equal to any of the @cite{x} values
24821in the data matrix, the output @cite{y} will be the corresponding @cite{y}
24822value from the matrix, and the output @cite{dy} will be exactly zero.
24823
24824A prefix argument of 2 causes @kbd{a p} to take separate x- and
24825y-vectors from the stack instead of one data matrix.
24826
24827If @cite{x} is a vector of numbers, @kbd{a p} will return a matrix of
24828interpolated results for each of those @cite{x} values. (The matrix will
24829have two columns, the @cite{y} values and the @cite{dy} values.)
24830If @cite{x} is a formula instead of a number, the @code{polint} function
24831remains in symbolic form; use the @kbd{a "} command to expand it out to
24832a formula that describes the fit in symbolic terms.
24833
24834In all cases, the @kbd{a p} command leaves the data vectors or matrix
24835on the stack. Only the @cite{x} value is replaced by the result.
24836
24837@kindex H a p
24838@tindex ratint
24839The @kbd{H a p} [@code{ratint}] command does a rational function
24840interpolation. It is used exactly like @kbd{a p}, except that it
24841uses as its model the quotient of two polynomials. If there are
24842@cite{N} data points, the numerator and denominator polynomials will
24843each have degree @cite{N/2} (if @cite{N} is odd, the denominator will
24844have degree one higher than the numerator).
24845
24846Rational approximations have the advantage that they can accurately
24847describe functions that have poles (points at which the function's value
24848goes to infinity, so that the denominator polynomial of the approximation
24849goes to zero). If @cite{x} corresponds to a pole of the fitted rational
24850function, then the result will be a division by zero. If Infinite mode
24851is enabled, the result will be @samp{[uinf, uinf]}.
24852
24853There is no way to get the actual coefficients of the rational function
24854used by @kbd{H a p}. (The algorithm never generates these coefficients
24855explicitly, and quotients of polynomials are beyond @w{@kbd{a F}}'s
24856capabilities to fit.)
24857
24858@node Summations, Logical Operations, Curve Fitting, Algebra
24859@section Summations
24860
24861@noindent
24862@cindex Summation of a series
24863@kindex a +
24864@pindex calc-summation
24865@tindex sum
24866The @kbd{a +} (@code{calc-summation}) [@code{sum}] command computes
24867the sum of a formula over a certain range of index values. The formula
24868is taken from the top of the stack; the command prompts for the
24869name of the summation index variable, the lower limit of the
24870sum (any formula), and the upper limit of the sum. If you
24871enter a blank line at any of these prompts, that prompt and
24872any later ones are answered by reading additional elements from
5d67986c 24873the stack. Thus, @kbd{' k^2 @key{RET} ' k @key{RET} 1 @key{RET} 5 @key{RET} a + @key{RET}}
d7b8e6c6
EZ
24874produces the result 55.
24875@tex
24876\turnoffactive
24877$$ \sum_{k=1}^5 k^2 = 55 $$
24878@end tex
24879
24880The choice of index variable is arbitrary, but it's best not to
24881use a variable with a stored value. In particular, while
24882@code{i} is often a favorite index variable, it should be avoided
24883in Calc because @code{i} has the imaginary constant @cite{(0, 1)}
24884as a value. If you pressed @kbd{=} on a sum over @code{i}, it would
24885be changed to a nonsensical sum over the ``variable'' @cite{(0, 1)}!
24886If you really want to use @code{i} as an index variable, use
5d67986c 24887@w{@kbd{s u i @key{RET}}} first to ``unstore'' this variable.
d7b8e6c6
EZ
24888(@xref{Storing Variables}.)
24889
24890A numeric prefix argument steps the index by that amount rather
5d67986c 24891than by one. Thus @kbd{' a_k @key{RET} C-u -2 a + k @key{RET} 10 @key{RET} 0 @key{RET}}
d7b8e6c6
EZ
24892yields @samp{a_10 + a_8 + a_6 + a_4 + a_2 + a_0}. A prefix
24893argument of plain @kbd{C-u} causes @kbd{a +} to prompt for the
24894step value, in which case you can enter any formula or enter
24895a blank line to take the step value from the stack. With the
24896@kbd{C-u} prefix, @kbd{a +} can take up to five arguments from
24897the stack: The formula, the variable, the lower limit, the
24898upper limit, and (at the top of the stack), the step value.
24899
24900Calc knows how to do certain sums in closed form. For example,
24901@samp{sum(6 k^2, k, 1, n) = @w{2 n^3} + 3 n^2 + n}. In particular,
24902this is possible if the formula being summed is polynomial or
24903exponential in the index variable. Sums of logarithms are
24904transformed into logarithms of products. Sums of trigonometric
24905and hyperbolic functions are transformed to sums of exponentials
24906and then done in closed form. Also, of course, sums in which the
24907lower and upper limits are both numbers can always be evaluated
24908just by grinding them out, although Calc will use closed forms
24909whenever it can for the sake of efficiency.
24910
24911The notation for sums in algebraic formulas is
24912@samp{sum(@var{expr}, @var{var}, @var{low}, @var{high}, @var{step})}.
24913If @var{step} is omitted, it defaults to one. If @var{high} is
24914omitted, @var{low} is actually the upper limit and the lower limit
24915is one. If @var{low} is also omitted, the limits are @samp{-inf}
24916and @samp{inf}, respectively.
24917
24918Infinite sums can sometimes be evaluated: @samp{sum(.5^k, k, 1, inf)}
24919returns @cite{1}. This is done by evaluating the sum in closed
24920form (to @samp{1. - 0.5^n} in this case), then evaluating this
24921formula with @code{n} set to @code{inf}. Calc's usual rules
24922for ``infinite'' arithmetic can find the answer from there. If
24923infinite arithmetic yields a @samp{nan}, or if the sum cannot be
24924solved in closed form, Calc leaves the @code{sum} function in
24925symbolic form. @xref{Infinities}.
24926
24927As a special feature, if the limits are infinite (or omitted, as
24928described above) but the formula includes vectors subscripted by
24929expressions that involve the iteration variable, Calc narrows
24930the limits to include only the range of integers which result in
24931legal subscripts for the vector. For example, the sum
24932@samp{sum(k [a,b,c,d,e,f,g]_(2k),k)} evaluates to @samp{b + 2 d + 3 f}.
24933
24934The limits of a sum do not need to be integers. For example,
24935@samp{sum(a_k, k, 0, 2 n, n)} produces @samp{a_0 + a_n + a_(2 n)}.
24936Calc computes the number of iterations using the formula
24937@samp{1 + (@var{high} - @var{low}) / @var{step}}, which must,
24938after simplification as if by @kbd{a s}, evaluate to an integer.
24939
24940If the number of iterations according to the above formula does
24941not come out to an integer, the sum is illegal and will be left
24942in symbolic form. However, closed forms are still supplied, and
24943you are on your honor not to misuse the resulting formulas by
24944substituting mismatched bounds into them. For example,
24945@samp{sum(k, k, 1, 10, 2)} is invalid, but Calc will go ahead and
24946evaluate the closed form solution for the limits 1 and 10 to get
24947the rather dubious answer, 29.25.
24948
24949If the lower limit is greater than the upper limit (assuming a
24950positive step size), the result is generally zero. However,
24951Calc only guarantees a zero result when the upper limit is
24952exactly one step less than the lower limit, i.e., if the number
24953of iterations is @i{-1}. Thus @samp{sum(f(k), k, n, n-1)} is zero
24954but the sum from @samp{n} to @samp{n-2} may report a nonzero value
24955if Calc used a closed form solution.
24956
24957Calc's logical predicates like @cite{a < b} return 1 for ``true''
24958and 0 for ``false.'' @xref{Logical Operations}. This can be
24959used to advantage for building conditional sums. For example,
24960@samp{sum(prime(k)*k^2, k, 1, 20)} is the sum of the squares of all
24961prime numbers from 1 to 20; the @code{prime} predicate returns 1 if
24962its argument is prime and 0 otherwise. You can read this expression
24963as ``the sum of @cite{k^2}, where @cite{k} is prime.'' Indeed,
24964@samp{sum(prime(k)*k^2, k)} would represent the sum of @emph{all} primes
24965squared, since the limits default to plus and minus infinity, but
24966there are no such sums that Calc's built-in rules can do in
24967closed form.
24968
24969As another example, @samp{sum((k != k_0) * f(k), k, 1, n)} is the
24970sum of @cite{f(k)} for all @cite{k} from 1 to @cite{n}, excluding
24971one value @cite{k_0}. Slightly more tricky is the summand
24972@samp{(k != k_0) / (k - k_0)}, which is an attempt to describe
24973the sum of all @cite{1/(k-k_0)} except at @cite{k = k_0}, where
24974this would be a division by zero. But at @cite{k = k_0}, this
24975formula works out to the indeterminate form @cite{0 / 0}, which
24976Calc will not assume is zero. Better would be to use
24977@samp{(k != k_0) ? 1/(k-k_0) : 0}; the @samp{? :} operator does
24978an ``if-then-else'' test: This expression says, ``if @c{$k \ne k_0$}
24979@cite{k != k_0},
24980then @cite{1/(k-k_0)}, else zero.'' Now the formula @cite{1/(k-k_0)}
24981will not even be evaluated by Calc when @cite{k = k_0}.
24982
24983@cindex Alternating sums
24984@kindex a -
24985@pindex calc-alt-summation
24986@tindex asum
24987The @kbd{a -} (@code{calc-alt-summation}) [@code{asum}] command
24988computes an alternating sum. Successive terms of the sequence
24989are given alternating signs, with the first term (corresponding
24990to the lower index value) being positive. Alternating sums
24991are converted to normal sums with an extra term of the form
24992@samp{(-1)^(k-@var{low})}. This formula is adjusted appropriately
24993if the step value is other than one. For example, the Taylor
24994series for the sine function is @samp{asum(x^k / k!, k, 1, inf, 2)}.
24995(Calc cannot evaluate this infinite series, but it can approximate
24996it if you replace @code{inf} with any particular odd number.)
24997Calc converts this series to a regular sum with a step of one,
24998namely @samp{sum((-1)^k x^(2k+1) / (2k+1)!, k, 0, inf)}.
24999
25000@cindex Product of a sequence
25001@kindex a *
25002@pindex calc-product
25003@tindex prod
25004The @kbd{a *} (@code{calc-product}) [@code{prod}] command is
25005the analogous way to take a product of many terms. Calc also knows
25006some closed forms for products, such as @samp{prod(k, k, 1, n) = n!}.
25007Conditional products can be written @samp{prod(k^prime(k), k, 1, n)}
25008or @samp{prod(prime(k) ? k : 1, k, 1, n)}.
25009
25010@kindex a T
25011@pindex calc-tabulate
25012@tindex table
25013The @kbd{a T} (@code{calc-tabulate}) [@code{table}] command
25014evaluates a formula at a series of iterated index values, just
25015like @code{sum} and @code{prod}, but its result is simply a
25016vector of the results. For example, @samp{table(a_i, i, 1, 7, 2)}
25017produces @samp{[a_1, a_3, a_5, a_7]}.
25018
25019@node Logical Operations, Rewrite Rules, Summations, Algebra
25020@section Logical Operations
25021
25022@noindent
25023The following commands and algebraic functions return true/false values,
25024where 1 represents ``true'' and 0 represents ``false.'' In cases where
25025a truth value is required (such as for the condition part of a rewrite
25026rule, or as the condition for a @w{@kbd{Z [ Z ]}} control structure), any
25027nonzero value is accepted to mean ``true.'' (Specifically, anything
25028for which @code{dnonzero} returns 1 is ``true,'' and anything for
25029which @code{dnonzero} returns 0 or cannot decide is assumed ``false.''
25030Note that this means that @w{@kbd{Z [ Z ]}} will execute the ``then''
25031portion if its condition is provably true, but it will execute the
25032``else'' portion for any condition like @cite{a = b} that is not
25033provably true, even if it might be true. Algebraic functions that
25034have conditions as arguments, like @code{? :} and @code{&&}, remain
25035unevaluated if the condition is neither provably true nor provably
25036false. @xref{Declarations}.)
25037
25038@kindex a =
25039@pindex calc-equal-to
25040@tindex eq
25041@tindex =
25042@tindex ==
25043The @kbd{a =} (@code{calc-equal-to}) command, or @samp{eq(a,b)} function
25044(which can also be written @samp{a = b} or @samp{a == b} in an algebraic
25045formula) is true if @cite{a} and @cite{b} are equal, either because they
25046are identical expressions, or because they are numbers which are
25047numerically equal. (Thus the integer 1 is considered equal to the float
250481.0.) If the equality of @cite{a} and @cite{b} cannot be determined,
25049the comparison is left in symbolic form. Note that as a command, this
25050operation pops two values from the stack and pushes back either a 1 or
25051a 0, or a formula @samp{a = b} if the values' equality cannot be determined.
25052
25053Many Calc commands use @samp{=} formulas to represent @dfn{equations}.
25054For example, the @kbd{a S} (@code{calc-solve-for}) command rearranges
25055an equation to solve for a given variable. The @kbd{a M}
25056(@code{calc-map-equation}) command can be used to apply any
25057function to both sides of an equation; for example, @kbd{2 a M *}
25058multiplies both sides of the equation by two. Note that just
25059@kbd{2 *} would not do the same thing; it would produce the formula
25060@samp{2 (a = b)} which represents 2 if the equality is true or
25061zero if not.
25062
25063The @code{eq} function with more than two arguments (e.g., @kbd{C-u 3 a =}
25064or @samp{a = b = c}) tests if all of its arguments are equal. In
25065algebraic notation, the @samp{=} operator is unusual in that it is
25066neither left- nor right-associative: @samp{a = b = c} is not the
25067same as @samp{(a = b) = c} or @samp{a = (b = c)} (which each compare
25068one variable with the 1 or 0 that results from comparing two other
25069variables).
25070
25071@kindex a #
25072@pindex calc-not-equal-to
25073@tindex neq
25074@tindex !=
25075The @kbd{a #} (@code{calc-not-equal-to}) command, or @samp{neq(a,b)} or
25076@samp{a != b} function, is true if @cite{a} and @cite{b} are not equal.
25077This also works with more than two arguments; @samp{a != b != c != d}
25078tests that all four of @cite{a}, @cite{b}, @cite{c}, and @cite{d} are
25079distinct numbers.
25080
25081@kindex a <
25082@tindex lt
5d67986c
RS
25083@ignore
25084@mindex @idots
25085@end ignore
d7b8e6c6 25086@kindex a >
5d67986c
RS
25087@ignore
25088@mindex @null
25089@end ignore
d7b8e6c6 25090@kindex a [
5d67986c
RS
25091@ignore
25092@mindex @null
25093@end ignore
d7b8e6c6
EZ
25094@kindex a ]
25095@pindex calc-less-than
25096@pindex calc-greater-than
25097@pindex calc-less-equal
25098@pindex calc-greater-equal
5d67986c
RS
25099@ignore
25100@mindex @null
25101@end ignore
d7b8e6c6 25102@tindex gt
5d67986c
RS
25103@ignore
25104@mindex @null
25105@end ignore
d7b8e6c6 25106@tindex leq
5d67986c
RS
25107@ignore
25108@mindex @null
25109@end ignore
d7b8e6c6 25110@tindex geq
5d67986c
RS
25111@ignore
25112@mindex @null
25113@end ignore
d7b8e6c6 25114@tindex <
5d67986c
RS
25115@ignore
25116@mindex @null
25117@end ignore
d7b8e6c6 25118@tindex >
5d67986c
RS
25119@ignore
25120@mindex @null
25121@end ignore
d7b8e6c6 25122@tindex <=
5d67986c
RS
25123@ignore
25124@mindex @null
25125@end ignore
d7b8e6c6
EZ
25126@tindex >=
25127The @kbd{a <} (@code{calc-less-than}) [@samp{lt(a,b)} or @samp{a < b}]
25128operation is true if @cite{a} is less than @cite{b}. Similar functions
25129are @kbd{a >} (@code{calc-greater-than}) [@samp{gt(a,b)} or @samp{a > b}],
25130@kbd{a [} (@code{calc-less-equal}) [@samp{leq(a,b)} or @samp{a <= b}], and
25131@kbd{a ]} (@code{calc-greater-equal}) [@samp{geq(a,b)} or @samp{a >= b}].
25132
25133While the inequality functions like @code{lt} do not accept more
25134than two arguments, the syntax @w{@samp{a <= b < c}} is translated to an
25135equivalent expression involving intervals: @samp{b in [a .. c)}.
25136(See the description of @code{in} below.) All four combinations
25137of @samp{<} and @samp{<=} are allowed, or any of the four combinations
25138of @samp{>} and @samp{>=}. Four-argument constructions like
25139@samp{a < b < c < d}, and mixtures like @w{@samp{a < b = c}} that
25140involve both equalities and inequalities, are not allowed.
25141
25142@kindex a .
25143@pindex calc-remove-equal
25144@tindex rmeq
25145The @kbd{a .} (@code{calc-remove-equal}) [@code{rmeq}] command extracts
25146the righthand side of the equation or inequality on the top of the
25147stack. It also works elementwise on vectors. For example, if
25148@samp{[x = 2.34, y = z / 2]} is on the stack, then @kbd{a .} produces
25149@samp{[2.34, z / 2]}. As a special case, if the righthand side is a
25150variable and the lefthand side is a number (as in @samp{2.34 = x}), then
25151Calc keeps the lefthand side instead. Finally, this command works with
25152assignments @samp{x := 2.34} as well as equations, always taking the
25153the righthand side, and for @samp{=>} (evaluates-to) operators, always
25154taking the lefthand side.
25155
25156@kindex a &
25157@pindex calc-logical-and
25158@tindex land
25159@tindex &&
25160The @kbd{a &} (@code{calc-logical-and}) [@samp{land(a,b)} or @samp{a && b}]
25161function is true if both of its arguments are true, i.e., are
25162non-zero numbers. In this case, the result will be either @cite{a} or
25163@cite{b}, chosen arbitrarily. If either argument is zero, the result is
25164zero. Otherwise, the formula is left in symbolic form.
25165
25166@kindex a |
25167@pindex calc-logical-or
25168@tindex lor
25169@tindex ||
25170The @kbd{a |} (@code{calc-logical-or}) [@samp{lor(a,b)} or @samp{a || b}]
25171function is true if either or both of its arguments are true (nonzero).
25172The result is whichever argument was nonzero, choosing arbitrarily if both
25173are nonzero. If both @cite{a} and @cite{b} are zero, the result is
25174zero.
25175
25176@kindex a !
25177@pindex calc-logical-not
25178@tindex lnot
25179@tindex !
25180The @kbd{a !} (@code{calc-logical-not}) [@samp{lnot(a)} or @samp{!@: a}]
25181function is true if @cite{a} is false (zero), or false if @cite{a} is
25182true (nonzero). It is left in symbolic form if @cite{a} is not a
25183number.
25184
25185@kindex a :
25186@pindex calc-logical-if
25187@tindex if
5d67986c
RS
25188@ignore
25189@mindex ? :
25190@end ignore
d7b8e6c6 25191@tindex ?
5d67986c
RS
25192@ignore
25193@mindex @null
25194@end ignore
d7b8e6c6
EZ
25195@tindex :
25196@cindex Arguments, not evaluated
25197The @kbd{a :} (@code{calc-logical-if}) [@samp{if(a,b,c)} or @samp{a ? b :@: c}]
25198function is equal to either @cite{b} or @cite{c} if @cite{a} is a nonzero
25199number or zero, respectively. If @cite{a} is not a number, the test is
25200left in symbolic form and neither @cite{b} nor @cite{c} is evaluated in
25201any way. In algebraic formulas, this is one of the few Calc functions
25202whose arguments are not automatically evaluated when the function itself
25203is evaluated. The others are @code{lambda}, @code{quote}, and
25204@code{condition}.
25205
25206One minor surprise to watch out for is that the formula @samp{a?3:4}
25207will not work because the @samp{3:4} is parsed as a fraction instead of
25208as three separate symbols. Type something like @samp{a ? 3 : 4} or
25209@samp{a?(3):4} instead.
25210
25211As a special case, if @cite{a} evaluates to a vector, then both @cite{b}
25212and @cite{c} are evaluated; the result is a vector of the same length
25213as @cite{a} whose elements are chosen from corresponding elements of
25214@cite{b} and @cite{c} according to whether each element of @cite{a}
25215is zero or nonzero. Each of @cite{b} and @cite{c} must be either a
25216vector of the same length as @cite{a}, or a non-vector which is matched
25217with all elements of @cite{a}.
25218
25219@kindex a @{
25220@pindex calc-in-set
25221@tindex in
25222The @kbd{a @{} (@code{calc-in-set}) [@samp{in(a,b)}] function is true if
25223the number @cite{a} is in the set of numbers represented by @cite{b}.
25224If @cite{b} is an interval form, @cite{a} must be one of the values
25225encompassed by the interval. If @cite{b} is a vector, @cite{a} must be
25226equal to one of the elements of the vector. (If any vector elements are
25227intervals, @cite{a} must be in any of the intervals.) If @cite{b} is a
25228plain number, @cite{a} must be numerically equal to @cite{b}.
25229@xref{Set Operations}, for a group of commands that manipulate sets
25230of this sort.
25231
5d67986c
RS
25232@ignore
25233@starindex
25234@end ignore
d7b8e6c6
EZ
25235@tindex typeof
25236The @samp{typeof(a)} function produces an integer or variable which
25237characterizes @cite{a}. If @cite{a} is a number, vector, or variable,
25238the result will be one of the following numbers:
25239
25240@example
25241 1 Integer
25242 2 Fraction
25243 3 Floating-point number
25244 4 HMS form
25245 5 Rectangular complex number
25246 6 Polar complex number
25247 7 Error form
25248 8 Interval form
25249 9 Modulo form
2525010 Date-only form
2525111 Date/time form
2525212 Infinity (inf, uinf, or nan)
25253100 Variable
25254101 Vector (but not a matrix)
25255102 Matrix
25256@end example
25257
25258Otherwise, @cite{a} is a formula, and the result is a variable which
25259represents the name of the top-level function call.
25260
5d67986c
RS
25261@ignore
25262@starindex
25263@end ignore
d7b8e6c6 25264@tindex integer
5d67986c
RS
25265@ignore
25266@starindex
25267@end ignore
d7b8e6c6 25268@tindex real
5d67986c
RS
25269@ignore
25270@starindex
25271@end ignore
d7b8e6c6
EZ
25272@tindex constant
25273The @samp{integer(a)} function returns true if @cite{a} is an integer.
25274The @samp{real(a)} function
25275is true if @cite{a} is a real number, either integer, fraction, or
25276float. The @samp{constant(a)} function returns true if @cite{a} is
25277any of the objects for which @code{typeof} would produce an integer
25278code result except for variables, and provided that the components of
25279an object like a vector or error form are themselves constant.
25280Note that infinities do not satisfy any of these tests, nor do
25281special constants like @code{pi} and @code{e}.@refill
25282
25283@xref{Declarations}, for a set of similar functions that recognize
25284formulas as well as actual numbers. For example, @samp{dint(floor(x))}
25285is true because @samp{floor(x)} is provably integer-valued, but
25286@samp{integer(floor(x))} does not because @samp{floor(x)} is not
25287literally an integer constant.
25288
5d67986c
RS
25289@ignore
25290@starindex
25291@end ignore
d7b8e6c6
EZ
25292@tindex refers
25293The @samp{refers(a,b)} function is true if the variable (or sub-expression)
25294@cite{b} appears in @cite{a}, or false otherwise. Unlike the other
25295tests described here, this function returns a definite ``no'' answer
25296even if its arguments are still in symbolic form. The only case where
25297@code{refers} will be left unevaluated is if @cite{a} is a plain
25298variable (different from @cite{b}).
25299
5d67986c
RS
25300@ignore
25301@starindex
25302@end ignore
d7b8e6c6
EZ
25303@tindex negative
25304The @samp{negative(a)} function returns true if @cite{a} ``looks'' negative,
25305because it is a negative number, because it is of the form @cite{-x},
25306or because it is a product or quotient with a term that looks negative.
25307This is most useful in rewrite rules. Beware that @samp{negative(a)}
25308evaluates to 1 or 0 for @emph{any} argument @cite{a}, so it can only
25309be stored in a formula if the default simplifications are turned off
25310first with @kbd{m O} (or if it appears in an unevaluated context such
25311as a rewrite rule condition).
25312
5d67986c
RS
25313@ignore
25314@starindex
25315@end ignore
d7b8e6c6
EZ
25316@tindex variable
25317The @samp{variable(a)} function is true if @cite{a} is a variable,
25318or false if not. If @cite{a} is a function call, this test is left
25319in symbolic form. Built-in variables like @code{pi} and @code{inf}
25320are considered variables like any others by this test.
25321
5d67986c
RS
25322@ignore
25323@starindex
25324@end ignore
d7b8e6c6
EZ
25325@tindex nonvar
25326The @samp{nonvar(a)} function is true if @cite{a} is a non-variable.
25327If its argument is a variable it is left unsimplified; it never
25328actually returns zero. However, since Calc's condition-testing
25329commands consider ``false'' anything not provably true, this is
25330often good enough.
25331
5d67986c
RS
25332@ignore
25333@starindex
25334@end ignore
d7b8e6c6 25335@tindex lin
5d67986c
RS
25336@ignore
25337@starindex
25338@end ignore
d7b8e6c6 25339@tindex linnt
5d67986c
RS
25340@ignore
25341@starindex
25342@end ignore
d7b8e6c6 25343@tindex islin
5d67986c
RS
25344@ignore
25345@starindex
25346@end ignore
d7b8e6c6
EZ
25347@tindex islinnt
25348@cindex Linearity testing
25349The functions @code{lin}, @code{linnt}, @code{islin}, and @code{islinnt}
25350check if an expression is ``linear,'' i.e., can be written in the form
25351@cite{a + b x} for some constants @cite{a} and @cite{b}, and some
25352variable or subformula @cite{x}. The function @samp{islin(f,x)} checks
25353if formula @cite{f} is linear in @cite{x}, returning 1 if so. For
25354example, @samp{islin(x,x)}, @samp{islin(-x,x)}, @samp{islin(3,x)}, and
25355@samp{islin(x y / 3 - 2, x)} all return 1. The @samp{lin(f,x)} function
25356is similar, except that instead of returning 1 it returns the vector
25357@cite{[a, b, x]}. For the above examples, this vector would be
25358@cite{[0, 1, x]}, @cite{[0, -1, x]}, @cite{[3, 0, x]}, and
25359@cite{[-2, y/3, x]}, respectively. Both @code{lin} and @code{islin}
25360generally remain unevaluated for expressions which are not linear,
25361e.g., @samp{lin(2 x^2, x)} and @samp{lin(sin(x), x)}. The second
25362argument can also be a formula; @samp{islin(2 + 3 sin(x), sin(x))}
25363returns true.
25364
25365The @code{linnt} and @code{islinnt} functions perform a similar check,
25366but require a ``non-trivial'' linear form, which means that the
25367@cite{b} coefficient must be non-zero. For example, @samp{lin(2,x)}
25368returns @cite{[2, 0, x]} and @samp{lin(y,x)} returns @cite{[y, 0, x]},
25369but @samp{linnt(2,x)} and @samp{linnt(y,x)} are left unevaluated
25370(in other words, these formulas are considered to be only ``trivially''
25371linear in @cite{x}).
25372
25373All four linearity-testing functions allow you to omit the second
25374argument, in which case the input may be linear in any non-constant
25375formula. Here, the @cite{a=0}, @cite{b=1} case is also considered
25376trivial, and only constant values for @cite{a} and @cite{b} are
25377recognized. Thus, @samp{lin(2 x y)} returns @cite{[0, 2, x y]},
25378@samp{lin(2 - x y)} returns @cite{[2, -1, x y]}, and @samp{lin(x y)}
25379returns @cite{[0, 1, x y]}. The @code{linnt} function would allow the
25380first two cases but not the third. Also, neither @code{lin} nor
25381@code{linnt} accept plain constants as linear in the one-argument
25382case: @samp{islin(2,x)} is true, but @samp{islin(2)} is false.
25383
5d67986c
RS
25384@ignore
25385@starindex
25386@end ignore
d7b8e6c6
EZ
25387@tindex istrue
25388The @samp{istrue(a)} function returns 1 if @cite{a} is a nonzero
25389number or provably nonzero formula, or 0 if @cite{a} is anything else.
25390Calls to @code{istrue} can only be manipulated if @kbd{m O} mode is
25391used to make sure they are not evaluated prematurely. (Note that
25392declarations are used when deciding whether a formula is true;
25393@code{istrue} returns 1 when @code{dnonzero} would return 1, and
25394it returns 0 when @code{dnonzero} would return 0 or leave itself
25395in symbolic form.)
25396
25397@node Rewrite Rules, , Logical Operations, Algebra
25398@section Rewrite Rules
25399
25400@noindent
25401@cindex Rewrite rules
25402@cindex Transformations
25403@cindex Pattern matching
25404@kindex a r
25405@pindex calc-rewrite
25406@tindex rewrite
25407The @kbd{a r} (@code{calc-rewrite}) [@code{rewrite}] command makes
25408substitutions in a formula according to a specified pattern or patterns
25409known as @dfn{rewrite rules}. Whereas @kbd{a b} (@code{calc-substitute})
25410matches literally, so that substituting @samp{sin(x)} with @samp{cos(x)}
25411matches only the @code{sin} function applied to the variable @code{x},
25412rewrite rules match general kinds of formulas; rewriting using the rule
25413@samp{sin(x) := cos(x)} matches @code{sin} of any argument and replaces
25414it with @code{cos} of that same argument. The only significance of the
25415name @code{x} is that the same name is used on both sides of the rule.
25416
25417Rewrite rules rearrange formulas already in Calc's memory.
25418@xref{Syntax Tables}, to read about @dfn{syntax rules}, which are
25419similar to algebraic rewrite rules but operate when new algebraic
25420entries are being parsed, converting strings of characters into
25421Calc formulas.
25422
25423@menu
25424* Entering Rewrite Rules::
25425* Basic Rewrite Rules::
25426* Conditional Rewrite Rules::
25427* Algebraic Properties of Rewrite Rules::
25428* Other Features of Rewrite Rules::
25429* Composing Patterns in Rewrite Rules::
25430* Nested Formulas with Rewrite Rules::
25431* Multi-Phase Rewrite Rules::
25432* Selections with Rewrite Rules::
25433* Matching Commands::
25434* Automatic Rewrites::
25435* Debugging Rewrites::
25436* Examples of Rewrite Rules::
25437@end menu
25438
25439@node Entering Rewrite Rules, Basic Rewrite Rules, Rewrite Rules, Rewrite Rules
25440@subsection Entering Rewrite Rules
25441
25442@noindent
25443Rewrite rules normally use the ``assignment'' operator
25444@samp{@var{old} := @var{new}}.
25445This operator is equivalent to the function call @samp{assign(old, new)}.
25446The @code{assign} function is undefined by itself in Calc, so an
25447assignment formula such as a rewrite rule will be left alone by ordinary
25448Calc commands. But certain commands, like the rewrite system, interpret
25449assignments in special ways.@refill
25450
25451For example, the rule @samp{sin(x)^2 := 1-cos(x)^2} says to replace
25452every occurrence of the sine of something, squared, with one minus the
25453square of the cosine of that same thing. All by itself as a formula
25454on the stack it does nothing, but when given to the @kbd{a r} command
25455it turns that command into a sine-squared-to-cosine-squared converter.
25456
25457To specify a set of rules to be applied all at once, make a vector of
25458rules.
25459
25460When @kbd{a r} prompts you to enter the rewrite rules, you can answer
25461in several ways:
25462
25463@enumerate
25464@item
5d67986c 25465With a rule: @kbd{f(x) := g(x) @key{RET}}.
d7b8e6c6 25466@item
5d67986c 25467With a vector of rules: @kbd{[f1(x) := g1(x), f2(x) := g2(x)] @key{RET}}.
d7b8e6c6
EZ
25468(You can omit the enclosing square brackets if you wish.)
25469@item
25470With the name of a variable that contains the rule or rules vector:
5d67986c 25471@kbd{myrules @key{RET}}.
d7b8e6c6
EZ
25472@item
25473With any formula except a rule, a vector, or a variable name; this
25474will be interpreted as the @var{old} half of a rewrite rule,
25475and you will be prompted a second time for the @var{new} half:
25476@kbd{f(x) @key{RET} g(x) @key{RET}}.
25477@item
25478With a blank line, in which case the rule, rules vector, or variable
25479will be taken from the top of the stack (and the formula to be
25480rewritten will come from the second-to-top position).
25481@end enumerate
25482
25483If you enter the rules directly (as opposed to using rules stored
25484in a variable), those rules will be put into the Trail so that you
25485can retrieve them later. @xref{Trail Commands}.
25486
25487It is most convenient to store rules you use often in a variable and
25488invoke them by giving the variable name. The @kbd{s e}
25489(@code{calc-edit-variable}) command is an easy way to create or edit a
25490rule set stored in a variable. You may also wish to use @kbd{s p}
25491(@code{calc-permanent-variable}) to save your rules permanently;
25492@pxref{Operations on Variables}.@refill
25493
25494Rewrite rules are compiled into a special internal form for faster
25495matching. If you enter a rule set directly it must be recompiled
25496every time. If you store the rules in a variable and refer to them
25497through that variable, they will be compiled once and saved away
25498along with the variable for later reference. This is another good
25499reason to store your rules in a variable.
25500
25501Calc also accepts an obsolete notation for rules, as vectors
25502@samp{[@var{old}, @var{new}]}. But because it is easily confused with a
25503vector of two rules, the use of this notation is no longer recommended.
25504
25505@node Basic Rewrite Rules, Conditional Rewrite Rules, Entering Rewrite Rules, Rewrite Rules
25506@subsection Basic Rewrite Rules
25507
25508@noindent
25509To match a particular formula @cite{x} with a particular rewrite rule
25510@samp{@var{old} := @var{new}}, Calc compares the structure of @cite{x} with
25511the structure of @var{old}. Variables that appear in @var{old} are
25512treated as @dfn{meta-variables}; the corresponding positions in @cite{x}
25513may contain any sub-formulas. For example, the pattern @samp{f(x,y)}
25514would match the expression @samp{f(12, a+1)} with the meta-variable
25515@samp{x} corresponding to 12 and with @samp{y} corresponding to
25516@samp{a+1}. However, this pattern would not match @samp{f(12)} or
25517@samp{g(12, a+1)}, since there is no assignment of the meta-variables
25518that will make the pattern match these expressions. Notice that if
25519the pattern is a single meta-variable, it will match any expression.
25520
25521If a given meta-variable appears more than once in @var{old}, the
25522corresponding sub-formulas of @cite{x} must be identical. Thus
25523the pattern @samp{f(x,x)} would match @samp{f(12, 12)} and
25524@samp{f(a+1, a+1)} but not @samp{f(12, a+1)} or @samp{f(a+b, b+a)}.
25525(@xref{Conditional Rewrite Rules}, for a way to match the latter.)
25526
25527Things other than variables must match exactly between the pattern
25528and the target formula. To match a particular variable exactly, use
25529the pseudo-function @samp{quote(v)} in the pattern. For example, the
25530pattern @samp{x+quote(y)} matches @samp{x+y}, @samp{2+y}, or
25531@samp{sin(a)+y}.
25532
25533The special variable names @samp{e}, @samp{pi}, @samp{i}, @samp{phi},
25534@samp{gamma}, @samp{inf}, @samp{uinf}, and @samp{nan} always match
25535literally. Thus the pattern @samp{sin(d + e + f)} acts exactly like
25536@samp{sin(d + quote(e) + f)}.
25537
25538If the @var{old} pattern is found to match a given formula, that
25539formula is replaced by @var{new}, where any occurrences in @var{new}
25540of meta-variables from the pattern are replaced with the sub-formulas
25541that they matched. Thus, applying the rule @samp{f(x,y) := g(y+x,x)}
25542to @samp{f(12, a+1)} would produce @samp{g(a+13, 12)}.
25543
25544The normal @kbd{a r} command applies rewrite rules over and over
25545throughout the target formula until no further changes are possible
25546(up to a limit of 100 times). Use @kbd{C-u 1 a r} to make only one
25547change at a time.
25548
25549@node Conditional Rewrite Rules, Algebraic Properties of Rewrite Rules, Basic Rewrite Rules, Rewrite Rules
25550@subsection Conditional Rewrite Rules
25551
25552@noindent
25553A rewrite rule can also be @dfn{conditional}, written in the form
25554@samp{@var{old} := @var{new} :: @var{cond}}. (There is also the obsolete
25555form @samp{[@var{old}, @var{new}, @var{cond}]}.) If a @var{cond} part
25556is present in the
25557rule, this is an additional condition that must be satisfied before
25558the rule is accepted. Once @var{old} has been successfully matched
25559to the target expression, @var{cond} is evaluated (with all the
25560meta-variables substituted for the values they matched) and simplified
25561with @kbd{a s} (@code{calc-simplify}). If the result is a nonzero
25562number or any other object known to be nonzero (@pxref{Declarations}),
25563the rule is accepted. If the result is zero or if it is a symbolic
25564formula that is not known to be nonzero, the rule is rejected.
25565@xref{Logical Operations}, for a number of functions that return
255661 or 0 according to the results of various tests.@refill
25567
25568For example, the formula @samp{n > 0} simplifies to 1 or 0 if @cite{n}
25569is replaced by a positive or nonpositive number, respectively (or if
25570@cite{n} has been declared to be positive or nonpositive). Thus,
25571the rule @samp{f(x,y) := g(y+x,x) :: x+y > 0} would apply to
25572@samp{f(0, 4)} but not to @samp{f(-3, 2)} or @samp{f(12, a+1)}
25573(assuming no outstanding declarations for @cite{a}). In the case of
25574@samp{f(-3, 2)}, the condition can be shown not to be satisfied; in
25575the case of @samp{f(12, a+1)}, the condition merely cannot be shown
25576to be satisfied, but that is enough to reject the rule.
25577
25578While Calc will use declarations to reason about variables in the
25579formula being rewritten, declarations do not apply to meta-variables.
25580For example, the rule @samp{f(a) := g(a+1)} will match for any values
25581of @samp{a}, such as complex numbers, vectors, or formulas, even if
25582@samp{a} has been declared to be real or scalar. If you want the
25583meta-variable @samp{a} to match only literal real numbers, use
25584@samp{f(a) := g(a+1) :: real(a)}. If you want @samp{a} to match only
25585reals and formulas which are provably real, use @samp{dreal(a)} as
25586the condition.
25587
25588The @samp{::} operator is a shorthand for the @code{condition}
25589function; @samp{@var{old} := @var{new} :: @var{cond}} is equivalent to
25590the formula @samp{condition(assign(@var{old}, @var{new}), @var{cond})}.
25591
25592If you have several conditions, you can use @samp{... :: c1 :: c2 :: c3}
25593or @samp{... :: c1 && c2 && c3}. The two are entirely equivalent.
25594
25595It is also possible to embed conditions inside the pattern:
25596@samp{f(x :: x>0, y) := g(y+x, x)}. This is purely a notational
25597convenience, though; where a condition appears in a rule has no
25598effect on when it is tested. The rewrite-rule compiler automatically
25599decides when it is best to test each condition while a rule is being
25600matched.
25601
25602Certain conditions are handled as special cases by the rewrite rule
25603system and are tested very efficiently: Where @cite{x} is any
25604meta-variable, these conditions are @samp{integer(x)}, @samp{real(x)},
25605@samp{constant(x)}, @samp{negative(x)}, @samp{x >= y} where @cite{y}
25606is either a constant or another meta-variable and @samp{>=} may be
25607replaced by any of the six relational operators, and @samp{x % a = b}
25608where @cite{a} and @cite{b} are constants. Other conditions, like
25609@samp{x >= y+1} or @samp{dreal(x)}, will be less efficient to check
25610since Calc must bring the whole evaluator and simplifier into play.
25611
25612An interesting property of @samp{::} is that neither of its arguments
25613will be touched by Calc's default simplifications. This is important
25614because conditions often are expressions that cannot safely be
25615evaluated early. For example, the @code{typeof} function never
25616remains in symbolic form; entering @samp{typeof(a)} will put the
25617number 100 (the type code for variables like @samp{a}) on the stack.
25618But putting the condition @samp{... :: typeof(a) = 6} on the stack
25619is safe since @samp{::} prevents the @code{typeof} from being
25620evaluated until the condition is actually used by the rewrite system.
25621
25622Since @samp{::} protects its lefthand side, too, you can use a dummy
25623condition to protect a rule that must itself not evaluate early.
25624For example, it's not safe to put @samp{a(f,x) := apply(f, [x])} on
25625the stack because it will immediately evaluate to @samp{a(f,x) := f(x)},
25626where the meta-variable-ness of @code{f} on the righthand side has been
25627lost. But @samp{a(f,x) := apply(f, [x]) :: 1} is safe, and of course
25628the condition @samp{1} is always true (nonzero) so it has no effect on
25629the functioning of the rule. (The rewrite compiler will ensure that
25630it doesn't even impact the speed of matching the rule.)
25631
25632@node Algebraic Properties of Rewrite Rules, Other Features of Rewrite Rules, Conditional Rewrite Rules, Rewrite Rules
25633@subsection Algebraic Properties of Rewrite Rules
25634
25635@noindent
25636The rewrite mechanism understands the algebraic properties of functions
25637like @samp{+} and @samp{*}. In particular, pattern matching takes
25638the associativity and commutativity of the following functions into
25639account:
25640
25641@smallexample
25642+ - * = != && || and or xor vint vunion vxor gcd lcm max min beta
25643@end smallexample
25644
25645For example, the rewrite rule:
25646
25647@example
25648a x + b x := (a + b) x
25649@end example
25650
25651@noindent
25652will match formulas of the form,
25653
25654@example
25655a x + b x, x a + x b, a x + x b, x a + b x
25656@end example
25657
25658Rewrites also understand the relationship between the @samp{+} and @samp{-}
25659operators. The above rewrite rule will also match the formulas,
25660
25661@example
25662a x - b x, x a - x b, a x - x b, x a - b x
25663@end example
25664
25665@noindent
25666by matching @samp{b} in the pattern to @samp{-b} from the formula.
25667
25668Applied to a sum of many terms like @samp{r + a x + s + b x + t}, this
25669pattern will check all pairs of terms for possible matches. The rewrite
25670will take whichever suitable pair it discovers first.
25671
25672In general, a pattern using an associative operator like @samp{a + b}
5d67986c 25673will try @var{2 n} different ways to match a sum of @var{n} terms
d7b8e6c6
EZ
25674like @samp{x + y + z - w}. First, @samp{a} is matched against each
25675of @samp{x}, @samp{y}, @samp{z}, and @samp{-w} in turn, with @samp{b}
25676being matched to the remainders @samp{y + z - w}, @samp{x + z - w}, etc.
25677If none of these succeed, then @samp{b} is matched against each of the
25678four terms with @samp{a} matching the remainder. Half-and-half matches,
25679like @samp{(x + y) + (z - w)}, are not tried.
25680
25681Note that @samp{*} is not commutative when applied to matrices, but
25682rewrite rules pretend that it is. If you type @kbd{m v} to enable
25683matrix mode (@pxref{Matrix Mode}), rewrite rules will match @samp{*}
25684literally, ignoring its usual commutativity property. (In the
25685current implementation, the associativity also vanishes---it is as
25686if the pattern had been enclosed in a @code{plain} marker; see below.)
25687If you are applying rewrites to formulas with matrices, it's best to
25688enable matrix mode first to prevent algebraically incorrect rewrites
25689from occurring.
25690
25691The pattern @samp{-x} will actually match any expression. For example,
25692the rule
25693
25694@example
25695f(-x) := -f(x)
25696@end example
25697
25698@noindent
25699will rewrite @samp{f(a)} to @samp{-f(-a)}. To avoid this, either use
25700a @code{plain} marker as described below, or add a @samp{negative(x)}
25701condition. The @code{negative} function is true if its argument
25702``looks'' negative, for example, because it is a negative number or
25703because it is a formula like @samp{-x}. The new rule using this
25704condition is:
25705
25706@example
25707f(x) := -f(-x) :: negative(x) @r{or, equivalently,}
25708f(-x) := -f(x) :: negative(-x)
25709@end example
25710
25711In the same way, the pattern @samp{x - y} will match the sum @samp{a + b}
25712by matching @samp{y} to @samp{-b}.
25713
25714The pattern @samp{a b} will also match the formula @samp{x/y} if
25715@samp{y} is a number. Thus the rule @samp{a x + @w{b x} := (a+b) x}
25716will also convert @samp{a x + x / 2} to @samp{(a + 0.5) x} (or
25717@samp{(a + 1:2) x}, depending on the current fraction mode).
25718
25719Calc will @emph{not} take other liberties with @samp{*}, @samp{/}, and
25720@samp{^}. For example, the pattern @samp{f(a b)} will not match
25721@samp{f(x^2)}, and @samp{f(a + b)} will not match @samp{f(2 x)}, even
25722though conceivably these patterns could match with @samp{a = b = x}.
25723Nor will @samp{f(a b)} match @samp{f(x / y)} if @samp{y} is not a
25724constant, even though it could be considered to match with @samp{a = x}
25725and @samp{b = 1/y}. The reasons are partly for efficiency, and partly
25726because while few mathematical operations are substantively different
25727for addition and subtraction, often it is preferable to treat the cases
25728of multiplication, division, and integer powers separately.
25729
25730Even more subtle is the rule set
25731
25732@example
25733[ f(a) + f(b) := f(a + b), -f(a) := f(-a) ]
25734@end example
25735
25736@noindent
25737attempting to match @samp{f(x) - f(y)}. You might think that Calc
25738will view this subtraction as @samp{f(x) + (-f(y))} and then apply
25739the above two rules in turn, but actually this will not work because
25740Calc only does this when considering rules for @samp{+} (like the
25741first rule in this set). So it will see first that @samp{f(x) + (-f(y))}
25742does not match @samp{f(a) + f(b)} for any assignments of the
25743meta-variables, and then it will see that @samp{f(x) - f(y)} does
25744not match @samp{-f(a)} for any assignment of @samp{a}. Because Calc
25745tries only one rule at a time, it will not be able to rewrite
25746@samp{f(x) - f(y)} with this rule set. An explicit @samp{f(a) - f(b)}
25747rule will have to be added.
25748
25749Another thing patterns will @emph{not} do is break up complex numbers.
25750The pattern @samp{myconj(a + @w{b i)} := a - b i} will work for formulas
25751involving the special constant @samp{i} (such as @samp{3 - 4 i}), but
25752it will not match actual complex numbers like @samp{(3, -4)}. A version
25753of the above rule for complex numbers would be
25754
25755@example
25756myconj(a) := re(a) - im(a) (0,1) :: im(a) != 0
25757@end example
25758
25759@noindent
25760(Because the @code{re} and @code{im} functions understand the properties
25761of the special constant @samp{i}, this rule will also work for
25762@samp{3 - 4 i}. In fact, this particular rule would probably be better
25763without the @samp{im(a) != 0} condition, since if @samp{im(a) = 0} the
25764righthand side of the rule will still give the correct answer for the
25765conjugate of a real number.)
25766
25767It is also possible to specify optional arguments in patterns. The rule
25768
25769@example
25770opt(a) x + opt(b) (x^opt(c) + opt(d)) := f(a, b, c, d)
25771@end example
25772
25773@noindent
25774will match the formula
25775
25776@example
257775 (x^2 - 4) + 3 x
25778@end example
25779
25780@noindent
25781in a fairly straightforward manner, but it will also match reduced
25782formulas like
25783
25784@example
25785x + x^2, 2(x + 1) - x, x + x
25786@end example
25787
25788@noindent
25789producing, respectively,
25790
25791@example
25792f(1, 1, 2, 0), f(-1, 2, 1, 1), f(1, 1, 1, 0)
25793@end example
25794
25795(The latter two formulas can be entered only if default simplifications
25796have been turned off with @kbd{m O}.)
25797
25798The default value for a term of a sum is zero. The default value
25799for a part of a product, for a power, or for the denominator of a
25800quotient, is one. Also, @samp{-x} matches the pattern @samp{opt(a) b}
25801with @samp{a = -1}.
25802
25803In particular, the distributive-law rule can be refined to
25804
25805@example
25806opt(a) x + opt(b) x := (a + b) x
25807@end example
25808
25809@noindent
25810so that it will convert, e.g., @samp{a x - x}, to @samp{(a - 1) x}.
25811
25812The pattern @samp{opt(a) + opt(b) x} matches almost any formulas which
25813are linear in @samp{x}. You can also use the @code{lin} and @code{islin}
25814functions with rewrite conditions to test for this; @pxref{Logical
25815Operations}. These functions are not as convenient to use in rewrite
25816rules, but they recognize more kinds of formulas as linear:
25817@samp{x/z} is considered linear with @cite{b = 1/z} by @code{lin},
25818but it will not match the above pattern because that pattern calls
25819for a multiplication, not a division.
25820
25821As another example, the obvious rule to replace @samp{sin(x)^2 + cos(x)^2}
25822by 1,
25823
25824@example
25825sin(x)^2 + cos(x)^2 := 1
25826@end example
25827
25828@noindent
25829misses many cases because the sine and cosine may both be multiplied by
25830an equal factor. Here's a more successful rule:
25831
25832@example
25833opt(a) sin(x)^2 + opt(a) cos(x)^2 := a
25834@end example
25835
25836Note that this rule will @emph{not} match @samp{sin(x)^2 + 6 cos(x)^2}
25837because one @cite{a} would have ``matched'' 1 while the other matched 6.
25838
25839Calc automatically converts a rule like
25840
25841@example
25842f(x-1, x) := g(x)
25843@end example
25844
25845@noindent
25846into the form
25847
25848@example
25849f(temp, x) := g(x) :: temp = x-1
25850@end example
25851
25852@noindent
25853(where @code{temp} stands for a new, invented meta-variable that
25854doesn't actually have a name). This modified rule will successfully
25855match @samp{f(6, 7)}, binding @samp{temp} and @samp{x} to 6 and 7,
25856respectively, then verifying that they differ by one even though
25857@samp{6} does not superficially look like @samp{x-1}.
25858
25859However, Calc does not solve equations to interpret a rule. The
25860following rule,
25861
25862@example
25863f(x-1, x+1) := g(x)
25864@end example
25865
25866@noindent
25867will not work. That is, it will match @samp{f(a - 1 + b, a + 1 + b)}
25868but not @samp{f(6, 8)}. Calc always interprets at least one occurrence
25869of a variable by literal matching. If the variable appears ``isolated''
25870then Calc is smart enough to use it for literal matching. But in this
25871last example, Calc is forced to rewrite the rule to @samp{f(x-1, temp)
25872:= g(x) :: temp = x+1} where the @samp{x-1} term must correspond to an
25873actual ``something-minus-one'' in the target formula.
25874
25875A successful way to write this would be @samp{f(x, x+2) := g(x+1)}.
25876You could make this resemble the original form more closely by using
25877@code{let} notation, which is described in the next section:
25878
25879@example
25880f(xm1, x+1) := g(x) :: let(x := xm1+1)
25881@end example
25882
25883Calc does this rewriting or ``conditionalizing'' for any sub-pattern
25884which involves only the functions in the following list, operating
25885only on constants and meta-variables which have already been matched
25886elsewhere in the pattern. When matching a function call, Calc is
25887careful to match arguments which are plain variables before arguments
25888which are calls to any of the functions below, so that a pattern like
25889@samp{f(x-1, x)} can be conditionalized even though the isolated
25890@samp{x} comes after the @samp{x-1}.
25891
25892@smallexample
25893+ - * / \ % ^ abs sign round rounde roundu trunc floor ceil
25894max min re im conj arg
25895@end smallexample
25896
25897You can suppress all of the special treatments described in this
25898section by surrounding a function call with a @code{plain} marker.
25899This marker causes the function call which is its argument to be
25900matched literally, without regard to commutativity, associativity,
25901negation, or conditionalization. When you use @code{plain}, the
25902``deep structure'' of the formula being matched can show through.
25903For example,
25904
25905@example
25906plain(a - a b) := f(a, b)
25907@end example
25908
25909@noindent
25910will match only literal subtractions. However, the @code{plain}
25911marker does not affect its arguments' arguments. In this case,
25912commutativity and associativity is still considered while matching
25913the @w{@samp{a b}} sub-pattern, so the whole pattern will match
25914@samp{x - y x} as well as @samp{x - x y}. We could go still
25915further and use
25916
25917@example
25918plain(a - plain(a b)) := f(a, b)
25919@end example
25920
25921@noindent
25922which would do a completely strict match for the pattern.
25923
25924By contrast, the @code{quote} marker means that not only the
25925function name but also the arguments must be literally the same.
25926The above pattern will match @samp{x - x y} but
25927
25928@example
25929quote(a - a b) := f(a, b)
25930@end example
25931
25932@noindent
25933will match only the single formula @samp{a - a b}. Also,
25934
25935@example
25936quote(a - quote(a b)) := f(a, b)
25937@end example
25938
25939@noindent
25940will match only @samp{a - quote(a b)}---probably not the desired
25941effect!
25942
25943A certain amount of algebra is also done when substituting the
25944meta-variables on the righthand side of a rule. For example,
25945in the rule
25946
25947@example
25948a + f(b) := f(a + b)
25949@end example
25950
25951@noindent
25952matching @samp{f(x) - y} would produce @samp{f((-y) + x)} if
25953taken literally, but the rewrite mechanism will simplify the
25954righthand side to @samp{f(x - y)} automatically. (Of course,
25955the default simplifications would do this anyway, so this
25956special simplification is only noticeable if you have turned the
25957default simplifications off.) This rewriting is done only when
25958a meta-variable expands to a ``negative-looking'' expression.
25959If this simplification is not desirable, you can use a @code{plain}
25960marker on the righthand side:
25961
25962@example
25963a + f(b) := f(plain(a + b))
25964@end example
25965
25966@noindent
25967In this example, we are still allowing the pattern-matcher to
25968use all the algebra it can muster, but the righthand side will
25969always simplify to a literal addition like @samp{f((-y) + x)}.
25970
25971@node Other Features of Rewrite Rules, Composing Patterns in Rewrite Rules, Algebraic Properties of Rewrite Rules, Rewrite Rules
25972@subsection Other Features of Rewrite Rules
25973
25974@noindent
25975Certain ``function names'' serve as markers in rewrite rules.
25976Here is a complete list of these markers. First are listed the
25977markers that work inside a pattern; then come the markers that
25978work in the righthand side of a rule.
25979
5d67986c
RS
25980@ignore
25981@starindex
25982@end ignore
d7b8e6c6
EZ
25983@tindex import
25984One kind of marker, @samp{import(x)}, takes the place of a whole
25985rule. Here @cite{x} is the name of a variable containing another
25986rule set; those rules are ``spliced into'' the rule set that
25987imports them. For example, if @samp{[f(a+b) := f(a) + f(b),
25988f(a b) := a f(b) :: real(a)]} is stored in variable @samp{linearF},
25989then the rule set @samp{[f(0) := 0, import(linearF)]} will apply
25990all three rules. It is possible to modify the imported rules
25991slightly: @samp{import(x, v1, x1, v2, x2, @dots{})} imports
25992the rule set @cite{x} with all occurrences of @c{$v_1$}
25993@cite{v1}, as either
25994a variable name or a function name, replaced with @c{$x_1$}
25995@cite{x1} and
25996so on. (If @c{$v_1$}
25997@cite{v1} is used as a function name, then @c{$x_1$}
25998@cite{x1}
25999must be either a function name itself or a @w{@samp{< >}} nameless
26000function; @pxref{Specifying Operators}.) For example, @samp{[g(0) := 0,
26001import(linearF, f, g)]} applies the linearity rules to the function
26002@samp{g} instead of @samp{f}. Imports can be nested, but the
26003import-with-renaming feature may fail to rename sub-imports properly.
26004
26005The special functions allowed in patterns are:
26006
26007@table @samp
26008@item quote(x)
5d67986c
RS
26009@ignore
26010@starindex
26011@end ignore
d7b8e6c6
EZ
26012@tindex quote
26013This pattern matches exactly @cite{x}; variable names in @cite{x} are
26014not interpreted as meta-variables. The only flexibility is that
26015numbers are compared for numeric equality, so that the pattern
26016@samp{f(quote(12))} will match both @samp{f(12)} and @samp{f(12.0)}.
26017(Numbers are always treated this way by the rewrite mechanism:
26018The rule @samp{f(x,x) := g(x)} will match @samp{f(12, 12.0)}.
26019The rewrite may produce either @samp{g(12)} or @samp{g(12.0)}
26020as a result in this case.)
26021
26022@item plain(x)
5d67986c
RS
26023@ignore
26024@starindex
26025@end ignore
d7b8e6c6
EZ
26026@tindex plain
26027Here @cite{x} must be a function call @samp{f(x1,x2,@dots{})}. This
26028pattern matches a call to function @cite{f} with the specified
26029argument patterns. No special knowledge of the properties of the
26030function @cite{f} is used in this case; @samp{+} is not commutative or
26031associative. Unlike @code{quote}, the arguments @samp{x1,x2,@dots{}}
26032are treated as patterns. If you wish them to be treated ``plainly''
26033as well, you must enclose them with more @code{plain} markers:
26034@samp{plain(plain(@w{-a}) + plain(b c))}.
26035
26036@item opt(x,def)
5d67986c
RS
26037@ignore
26038@starindex
26039@end ignore
d7b8e6c6
EZ
26040@tindex opt
26041Here @cite{x} must be a variable name. This must appear as an
26042argument to a function or an element of a vector; it specifies that
26043the argument or element is optional.
26044As an argument to @samp{+}, @samp{-}, @samp{*}, @samp{&&}, or @samp{||},
26045or as the second argument to @samp{/} or @samp{^}, the value @var{def}
26046may be omitted. The pattern @samp{x + opt(y)} matches a sum by
26047binding one summand to @cite{x} and the other to @cite{y}, and it
26048matches anything else by binding the whole expression to @cite{x} and
26049zero to @cite{y}. The other operators above work similarly.@refill
26050
26051For general miscellanous functions, the default value @code{def}
26052must be specified. Optional arguments are dropped starting with
26053the rightmost one during matching. For example, the pattern
26054@samp{f(opt(a,0), b, opt(c,b))} will match @samp{f(b)}, @samp{f(a,b)},
26055or @samp{f(a,b,c)}. Default values of zero and @cite{b} are
26056supplied in this example for the omitted arguments. Note that
26057the literal variable @cite{b} will be the default in the latter
26058case, @emph{not} the value that matched the meta-variable @cite{b}.
26059In other words, the default @var{def} is effectively quoted.
26060
26061@item condition(x,c)
5d67986c
RS
26062@ignore
26063@starindex
26064@end ignore
d7b8e6c6
EZ
26065@tindex condition
26066@tindex ::
26067This matches the pattern @cite{x}, with the attached condition
26068@cite{c}. It is the same as @samp{x :: c}.
26069
26070@item pand(x,y)
5d67986c
RS
26071@ignore
26072@starindex
26073@end ignore
d7b8e6c6
EZ
26074@tindex pand
26075@tindex &&&
26076This matches anything that matches both pattern @cite{x} and
26077pattern @cite{y}. It is the same as @samp{x &&& y}.
26078@pxref{Composing Patterns in Rewrite Rules}.
26079
26080@item por(x,y)
5d67986c
RS
26081@ignore
26082@starindex
26083@end ignore
d7b8e6c6
EZ
26084@tindex por
26085@tindex |||
26086This matches anything that matches either pattern @cite{x} or
26087pattern @cite{y}. It is the same as @w{@samp{x ||| y}}.
26088
26089@item pnot(x)
5d67986c
RS
26090@ignore
26091@starindex
26092@end ignore
d7b8e6c6
EZ
26093@tindex pnot
26094@tindex !!!
26095This matches anything that does not match pattern @cite{x}.
26096It is the same as @samp{!!! x}.
26097
26098@item cons(h,t)
5d67986c
RS
26099@ignore
26100@mindex cons
26101@end ignore
d7b8e6c6
EZ
26102@tindex cons (rewrites)
26103This matches any vector of one or more elements. The first
26104element is matched to @cite{h}; a vector of the remaining
26105elements is matched to @cite{t}. Note that vectors of fixed
26106length can also be matched as actual vectors: The rule
26107@samp{cons(a,cons(b,[])) := cons(a+b,[])} is equivalent
26108to the rule @samp{[a,b] := [a+b]}.
26109
26110@item rcons(t,h)
5d67986c
RS
26111@ignore
26112@mindex rcons
26113@end ignore
d7b8e6c6
EZ
26114@tindex rcons (rewrites)
26115This is like @code{cons}, except that the @emph{last} element
26116is matched to @cite{h}, with the remaining elements matched
26117to @cite{t}.
26118
26119@item apply(f,args)
5d67986c
RS
26120@ignore
26121@mindex apply
26122@end ignore
d7b8e6c6
EZ
26123@tindex apply (rewrites)
26124This matches any function call. The name of the function, in
26125the form of a variable, is matched to @cite{f}. The arguments
26126of the function, as a vector of zero or more objects, are
26127matched to @samp{args}. Constants, variables, and vectors
26128do @emph{not} match an @code{apply} pattern. For example,
26129@samp{apply(f,x)} matches any function call, @samp{apply(quote(f),x)}
26130matches any call to the function @samp{f}, @samp{apply(f,[a,b])}
26131matches any function call with exactly two arguments, and
26132@samp{apply(quote(f), cons(a,cons(b,x)))} matches any call
26133to the function @samp{f} with two or more arguments. Another
26134way to implement the latter, if the rest of the rule does not
26135need to refer to the first two arguments of @samp{f} by name,
26136would be @samp{apply(quote(f), x :: vlen(x) >= 2)}.
26137Here's a more interesting sample use of @code{apply}:
26138
26139@example
26140apply(f,[x+n]) := n + apply(f,[x])
26141 :: in(f, [floor,ceil,round,trunc]) :: integer(n)
26142@end example
26143
26144Note, however, that this will be slower to match than a rule
26145set with four separate rules. The reason is that Calc sorts
26146the rules of a rule set according to top-level function name;
26147if the top-level function is @code{apply}, Calc must try the
26148rule for every single formula and sub-formula. If the top-level
26149function in the pattern is, say, @code{floor}, then Calc invokes
26150the rule only for sub-formulas which are calls to @code{floor}.
26151
26152Formulas normally written with operators like @code{+} are still
26153considered function calls: @code{apply(f,x)} matches @samp{a+b}
26154with @samp{f = add}, @samp{x = [a,b]}.
26155
26156You must use @code{apply} for meta-variables with function names
26157on both sides of a rewrite rule: @samp{apply(f, [x]) := f(x+1)}
26158is @emph{not} correct, because it rewrites @samp{spam(6)} into
26159@samp{f(7)}. The righthand side should be @samp{apply(f, [x+1])}.
26160Also note that you will have to use no-simplify (@kbd{m O})
26161mode when entering this rule so that the @code{apply} isn't
26162evaluated immediately to get the new rule @samp{f(x) := f(x+1)}.
26163Or, use @kbd{s e} to enter the rule without going through the stack,
26164or enter the rule as @samp{apply(f, [x]) := apply(f, [x+1]) @w{:: 1}}.
26165@xref{Conditional Rewrite Rules}.
26166
26167@item select(x)
5d67986c
RS
26168@ignore
26169@starindex
26170@end ignore
d7b8e6c6
EZ
26171@tindex select
26172This is used for applying rules to formulas with selections;
26173@pxref{Selections with Rewrite Rules}.
26174@end table
26175
26176Special functions for the righthand sides of rules are:
26177
26178@table @samp
26179@item quote(x)
26180The notation @samp{quote(x)} is changed to @samp{x} when the
26181righthand side is used. As far as the rewrite rule is concerned,
26182@code{quote} is invisible. However, @code{quote} has the special
26183property in Calc that its argument is not evaluated. Thus,
26184while it will not work to put the rule @samp{t(a) := typeof(a)}
26185on the stack because @samp{typeof(a)} is evaluated immediately
26186to produce @samp{t(a) := 100}, you can use @code{quote} to
26187protect the righthand side: @samp{t(a) := quote(typeof(a))}.
26188(@xref{Conditional Rewrite Rules}, for another trick for
26189protecting rules from evaluation.)
26190
26191@item plain(x)
26192Special properties of and simplifications for the function call
26193@cite{x} are not used. One interesting case where @code{plain}
26194is useful is the rule, @samp{q(x) := quote(x)}, trying to expand a
26195shorthand notation for the @code{quote} function. This rule will
26196not work as shown; instead of replacing @samp{q(foo)} with
26197@samp{quote(foo)}, it will replace it with @samp{foo}! The correct
26198rule would be @samp{q(x) := plain(quote(x))}.
26199
26200@item cons(h,t)
26201Where @cite{t} is a vector, this is converted into an expanded
26202vector during rewrite processing. Note that @code{cons} is a regular
26203Calc function which normally does this anyway; the only way @code{cons}
26204is treated specially by rewrites is that @code{cons} on the righthand
26205side of a rule will be evaluated even if default simplifications
26206have been turned off.
26207
26208@item rcons(t,h)
26209Analogous to @code{cons} except putting @cite{h} at the @emph{end} of
26210the vector @cite{t}.
26211
26212@item apply(f,args)
26213Where @cite{f} is a variable and @var{args} is a vector, this
26214is converted to a function call. Once again, note that @code{apply}
26215is also a regular Calc function.
26216
26217@item eval(x)
5d67986c
RS
26218@ignore
26219@starindex
26220@end ignore
d7b8e6c6
EZ
26221@tindex eval
26222The formula @cite{x} is handled in the usual way, then the
26223default simplifications are applied to it even if they have
26224been turned off normally. This allows you to treat any function
26225similarly to the way @code{cons} and @code{apply} are always
26226treated. However, there is a slight difference: @samp{cons(2+3, [])}
26227with default simplifications off will be converted to @samp{[2+3]},
26228whereas @samp{eval(cons(2+3, []))} will be converted to @samp{[5]}.
26229
26230@item evalsimp(x)
5d67986c
RS
26231@ignore
26232@starindex
26233@end ignore
d7b8e6c6
EZ
26234@tindex evalsimp
26235The formula @cite{x} has meta-variables substituted in the usual
26236way, then algebraically simplified as if by the @kbd{a s} command.
26237
26238@item evalextsimp(x)
5d67986c
RS
26239@ignore
26240@starindex
26241@end ignore
d7b8e6c6
EZ
26242@tindex evalextsimp
26243The formula @cite{x} has meta-variables substituted in the normal
26244way, then ``extendedly'' simplified as if by the @kbd{a e} command.
26245
26246@item select(x)
26247@xref{Selections with Rewrite Rules}.
26248@end table
26249
26250There are also some special functions you can use in conditions.
26251
26252@table @samp
26253@item let(v := x)
5d67986c
RS
26254@ignore
26255@starindex
26256@end ignore
d7b8e6c6
EZ
26257@tindex let
26258The expression @cite{x} is evaluated with meta-variables substituted.
26259The @kbd{a s} command's simplifications are @emph{not} applied by
26260default, but @cite{x} can include calls to @code{evalsimp} or
26261@code{evalextsimp} as described above to invoke higher levels
26262of simplification. The
26263result of @cite{x} is then bound to the meta-variable @cite{v}. As
26264usual, if this meta-variable has already been matched to something
26265else the two values must be equal; if the meta-variable is new then
26266it is bound to the result of the expression. This variable can then
26267appear in later conditions, and on the righthand side of the rule.
26268In fact, @cite{v} may be any pattern in which case the result of
26269evaluating @cite{x} is matched to that pattern, binding any
26270meta-variables that appear in that pattern. Note that @code{let}
26271can only appear by itself as a condition, or as one term of an
26272@samp{&&} which is a whole condition: It cannot be inside
26273an @samp{||} term or otherwise buried.@refill
26274
26275The alternate, equivalent form @samp{let(v, x)} is also recognized.
26276Note that the use of @samp{:=} by @code{let}, while still being
26277assignment-like in character, is unrelated to the use of @samp{:=}
26278in the main part of a rewrite rule.
26279
26280As an example, @samp{f(a) := g(ia) :: let(ia := 1/a) :: constant(ia)}
26281replaces @samp{f(a)} with @samp{g} of the inverse of @samp{a}, if
26282that inverse exists and is constant. For example, if @samp{a} is a
26283singular matrix the operation @samp{1/a} is left unsimplified and
26284@samp{constant(ia)} fails, but if @samp{a} is an invertible matrix
26285then the rule succeeds. Without @code{let} there would be no way
26286to express this rule that didn't have to invert the matrix twice.
26287Note that, because the meta-variable @samp{ia} is otherwise unbound
26288in this rule, the @code{let} condition itself always ``succeeds''
26289because no matter what @samp{1/a} evaluates to, it can successfully
26290be bound to @code{ia}.@refill
26291
26292Here's another example, for integrating cosines of linear
26293terms: @samp{myint(cos(y),x) := sin(y)/b :: let([a,b,x] := lin(y,x))}.
26294The @code{lin} function returns a 3-vector if its argument is linear,
26295or leaves itself unevaluated if not. But an unevaluated @code{lin}
26296call will not match the 3-vector on the lefthand side of the @code{let},
26297so this @code{let} both verifies that @code{y} is linear, and binds
26298the coefficients @code{a} and @code{b} for use elsewhere in the rule.
26299(It would have been possible to use @samp{sin(a x + b)/b} for the
26300righthand side instead, but using @samp{sin(y)/b} avoids gratuitous
26301rearrangement of the argument of the sine.)@refill
26302
5d67986c
RS
26303@ignore
26304@starindex
26305@end ignore
d7b8e6c6
EZ
26306@tindex ierf
26307Similarly, here is a rule that implements an inverse-@code{erf}
26308function. It uses @code{root} to search for a solution. If
26309@code{root} succeeds, it will return a vector of two numbers
26310where the first number is the desired solution. If no solution
26311is found, @code{root} remains in symbolic form. So we use
26312@code{let} to check that the result was indeed a vector.
26313
26314@example
26315ierf(x) := y :: let([y,z] := root(erf(a) = x, a, .5))
26316@end example
26317
26318@item matches(v,p)
26319The meta-variable @var{v}, which must already have been matched
26320to something elsewhere in the rule, is compared against pattern
26321@var{p}. Since @code{matches} is a standard Calc function, it
26322can appear anywhere in a condition. But if it appears alone or
26323as a term of a top-level @samp{&&}, then you get the special
26324extra feature that meta-variables which are bound to things
26325inside @var{p} can be used elsewhere in the surrounding rewrite
26326rule.
26327
26328The only real difference between @samp{let(p := v)} and
26329@samp{matches(v, p)} is that the former evaluates @samp{v} using
26330the default simplifications, while the latter does not.
26331
26332@item remember
26333@vindex remember
26334This is actually a variable, not a function. If @code{remember}
26335appears as a condition in a rule, then when that rule succeeds
26336the original expression and rewritten expression are added to the
26337front of the rule set that contained the rule. If the rule set
26338was not stored in a variable, @code{remember} is ignored. The
26339lefthand side is enclosed in @code{quote} in the added rule if it
26340contains any variables.
26341
26342For example, the rule @samp{f(n) := n f(n-1) :: remember} applied
26343to @samp{f(7)} will add the rule @samp{f(7) := 7 f(6)} to the front
26344of the rule set. The rule set @code{EvalRules} works slightly
26345differently: There, the evaluation of @samp{f(6)} will complete before
26346the result is added to the rule set, in this case as @samp{f(7) := 5040}.
26347Thus @code{remember} is most useful inside @code{EvalRules}.
26348
26349It is up to you to ensure that the optimization performed by
26350@code{remember} is safe. For example, the rule @samp{foo(n) := n
26351:: evalv(eatfoo) > 0 :: remember} is a bad idea (@code{evalv} is
26352the function equivalent of the @kbd{=} command); if the variable
26353@code{eatfoo} ever contains 1, rules like @samp{foo(7) := 7} will
26354be added to the rule set and will continue to operate even if
26355@code{eatfoo} is later changed to 0.
26356
26357@item remember(c)
5d67986c
RS
26358@ignore
26359@starindex
26360@end ignore
d7b8e6c6
EZ
26361@tindex remember
26362Remember the match as described above, but only if condition @cite{c}
26363is true. For example, @samp{remember(n % 4 = 0)} in the above factorial
26364rule remembers only every fourth result. Note that @samp{remember(1)}
26365is equivalent to @samp{remember}, and @samp{remember(0)} has no effect.
26366@end table
26367
26368@node Composing Patterns in Rewrite Rules, Nested Formulas with Rewrite Rules, Other Features of Rewrite Rules, Rewrite Rules
26369@subsection Composing Patterns in Rewrite Rules
26370
26371@noindent
26372There are three operators, @samp{&&&}, @samp{|||}, and @samp{!!!},
26373that combine rewrite patterns to make larger patterns. The
26374combinations are ``and,'' ``or,'' and ``not,'' respectively, and
26375these operators are the pattern equivalents of @samp{&&}, @samp{||}
26376and @samp{!} (which operate on zero-or-nonzero logical values).
26377
26378Note that @samp{&&&}, @samp{|||}, and @samp{!!!} are left in symbolic
26379form by all regular Calc features; they have special meaning only in
26380the context of rewrite rule patterns.
26381
26382The pattern @samp{@var{p1} &&& @var{p2}} matches anything that
26383matches both @var{p1} and @var{p2}. One especially useful case is
26384when one of @var{p1} or @var{p2} is a meta-variable. For example,
26385here is a rule that operates on error forms:
26386
26387@example
26388f(x &&& a +/- b, x) := g(x)
26389@end example
26390
26391This does the same thing, but is arguably simpler than, the rule
26392
26393@example
26394f(a +/- b, a +/- b) := g(a +/- b)
26395@end example
26396
5d67986c
RS
26397@ignore
26398@starindex
26399@end ignore
d7b8e6c6
EZ
26400@tindex ends
26401Here's another interesting example:
26402
26403@example
26404ends(cons(a, x) &&& rcons(y, b)) := [a, b]
26405@end example
26406
26407@noindent
26408which effectively clips out the middle of a vector leaving just
26409the first and last elements. This rule will change a one-element
26410vector @samp{[a]} to @samp{[a, a]}. The similar rule
26411
26412@example
26413ends(cons(a, rcons(y, b))) := [a, b]
26414@end example
26415
26416@noindent
26417would do the same thing except that it would fail to match a
26418one-element vector.
26419
26420@tex
26421\bigskip
26422@end tex
26423
26424The pattern @samp{@var{p1} ||| @var{p2}} matches anything that
26425matches either @var{p1} or @var{p2}. Calc first tries matching
26426against @var{p1}; if that fails, it goes on to try @var{p2}.
26427
5d67986c
RS
26428@ignore
26429@starindex
26430@end ignore
d7b8e6c6
EZ
26431@tindex curve
26432A simple example of @samp{|||} is
26433
26434@example
26435curve(inf ||| -inf) := 0
26436@end example
26437
26438@noindent
26439which converts both @samp{curve(inf)} and @samp{curve(-inf)} to zero.
26440
26441Here is a larger example:
26442
26443@example
26444log(a, b) ||| (ln(a) :: let(b := e)) := mylog(a, b)
26445@end example
26446
26447This matches both generalized and natural logarithms in a single rule.
26448Note that the @samp{::} term must be enclosed in parentheses because
26449that operator has lower precedence than @samp{|||} or @samp{:=}.
26450
26451(In practice this rule would probably include a third alternative,
26452omitted here for brevity, to take care of @code{log10}.)
26453
26454While Calc generally treats interior conditions exactly the same as
26455conditions on the outside of a rule, it does guarantee that if all the
26456variables in the condition are special names like @code{e}, or already
26457bound in the pattern to which the condition is attached (say, if
26458@samp{a} had appeared in this condition), then Calc will process this
26459condition right after matching the pattern to the left of the @samp{::}.
26460Thus, we know that @samp{b} will be bound to @samp{e} only if the
26461@code{ln} branch of the @samp{|||} was taken.
26462
26463Note that this rule was careful to bind the same set of meta-variables
26464on both sides of the @samp{|||}. Calc does not check this, but if
26465you bind a certain meta-variable only in one branch and then use that
26466meta-variable elsewhere in the rule, results are unpredictable:
26467
26468@example
26469f(a,b) ||| g(b) := h(a,b)
26470@end example
26471
26472Here if the pattern matches @samp{g(17)}, Calc makes no promises about
26473the value that will be substituted for @samp{a} on the righthand side.
26474
26475@tex
26476\bigskip
26477@end tex
26478
26479The pattern @samp{!!! @var{pat}} matches anything that does not
26480match @var{pat}. Any meta-variables that are bound while matching
26481@var{pat} remain unbound outside of @var{pat}.
26482
26483For example,
26484
26485@example
26486f(x &&& !!! a +/- b, !!![]) := g(x)
26487@end example
26488
26489@noindent
26490converts @code{f} whose first argument is anything @emph{except} an
26491error form, and whose second argument is not the empty vector, into
26492a similar call to @code{g} (but without the second argument).
26493
26494If we know that the second argument will be a vector (empty or not),
26495then an equivalent rule would be:
26496
26497@example
26498f(x, y) := g(x) :: typeof(x) != 7 :: vlen(y) > 0
26499@end example
26500
26501@noindent
26502where of course 7 is the @code{typeof} code for error forms.
26503Another final condition, that works for any kind of @samp{y},
26504would be @samp{!istrue(y == [])}. (The @code{istrue} function
26505returns an explicit 0 if its argument was left in symbolic form;
26506plain @samp{!(y == [])} or @samp{y != []} would not work to replace
26507@samp{!!![]} since these would be left unsimplified, and thus cause
26508the rule to fail, if @samp{y} was something like a variable name.)
26509
26510It is possible for a @samp{!!!} to refer to meta-variables bound
26511elsewhere in the pattern. For example,
26512
26513@example
26514f(a, !!!a) := g(a)
26515@end example
26516
26517@noindent
26518matches any call to @code{f} with different arguments, changing
26519this to @code{g} with only the first argument.
26520
26521If a function call is to be matched and one of the argument patterns
26522contains a @samp{!!!} somewhere inside it, that argument will be
26523matched last. Thus
26524
26525@example
26526f(!!!a, a) := g(a)
26527@end example
26528
26529@noindent
26530will be careful to bind @samp{a} to the second argument of @code{f}
26531before testing the first argument. If Calc had tried to match the
26532first argument of @code{f} first, the results would have been
26533disasterous: Since @code{a} was unbound so far, the pattern @samp{a}
26534would have matched anything at all, and the pattern @samp{!!!a}
26535therefore would @emph{not} have matched anything at all!
26536
26537@node Nested Formulas with Rewrite Rules, Multi-Phase Rewrite Rules, Composing Patterns in Rewrite Rules, Rewrite Rules
26538@subsection Nested Formulas with Rewrite Rules
26539
26540@noindent
26541When @kbd{a r} (@code{calc-rewrite}) is used, it takes an expression from
26542the top of the stack and attempts to match any of the specified rules
26543to any part of the expression, starting with the whole expression
26544and then, if that fails, trying deeper and deeper sub-expressions.
26545For each part of the expression, the rules are tried in the order
26546they appear in the rules vector. The first rule to match the first
26547sub-expression wins; it replaces the matched sub-expression according
26548to the @var{new} part of the rule.
26549
26550Often, the rule set will match and change the formula several times.
26551The top-level formula is first matched and substituted repeatedly until
26552it no longer matches the pattern; then, sub-formulas are tried, and
26553so on. Once every part of the formula has gotten its chance, the
26554rewrite mechanism starts over again with the top-level formula
26555(in case a substitution of one of its arguments has caused it again
26556to match). This continues until no further matches can be made
26557anywhere in the formula.
26558
26559It is possible for a rule set to get into an infinite loop. The
26560most obvious case, replacing a formula with itself, is not a problem
26561because a rule is not considered to ``succeed'' unless the righthand
26562side actually comes out to something different than the original
26563formula or sub-formula that was matched. But if you accidentally
26564had both @samp{ln(a b) := ln(a) + ln(b)} and the reverse
26565@samp{ln(a) + ln(b) := ln(a b)} in your rule set, Calc would
26566run forever switching a formula back and forth between the two
26567forms.
26568
26569To avoid disaster, Calc normally stops after 100 changes have been
26570made to the formula. This will be enough for most multiple rewrites,
26571but it will keep an endless loop of rewrites from locking up the
26572computer forever. (On most systems, you can also type @kbd{C-g} to
26573halt any Emacs command prematurely.)
26574
26575To change this limit, give a positive numeric prefix argument.
26576In particular, @kbd{M-1 a r} applies only one rewrite at a time,
26577useful when you are first testing your rule (or just if repeated
26578rewriting is not what is called for by your application).
26579
5d67986c
RS
26580@ignore
26581@starindex
26582@end ignore
26583@ignore
26584@mindex iter@idots
26585@end ignore
d7b8e6c6
EZ
26586@tindex iterations
26587You can also put a ``function call'' @samp{iterations(@var{n})}
26588in place of a rule anywhere in your rules vector (but usually at
26589the top). Then, @var{n} will be used instead of 100 as the default
26590number of iterations for this rule set. You can use
26591@samp{iterations(inf)} if you want no iteration limit by default.
26592A prefix argument will override the @code{iterations} limit in the
26593rule set.
26594
26595@example
26596[ iterations(1),
26597 f(x) := f(x+1) ]
26598@end example
26599
26600More precisely, the limit controls the number of ``iterations,''
26601where each iteration is a successful matching of a rule pattern whose
26602righthand side, after substituting meta-variables and applying the
26603default simplifications, is different from the original sub-formula
26604that was matched.
26605
26606A prefix argument of zero sets the limit to infinity. Use with caution!
26607
26608Given a negative numeric prefix argument, @kbd{a r} will match and
26609substitute the top-level expression up to that many times, but
26610will not attempt to match the rules to any sub-expressions.
26611
26612In a formula, @code{rewrite(@var{expr}, @var{rules}, @var{n})}
26613does a rewriting operation. Here @var{expr} is the expression
26614being rewritten, @var{rules} is the rule, vector of rules, or
26615variable containing the rules, and @var{n} is the optional
26616iteration limit, which may be a positive integer, a negative
26617integer, or @samp{inf} or @samp{-inf}. If @var{n} is omitted
26618the @code{iterations} value from the rule set is used; if both
26619are omitted, 100 is used.
26620
26621@node Multi-Phase Rewrite Rules, Selections with Rewrite Rules, Nested Formulas with Rewrite Rules, Rewrite Rules
26622@subsection Multi-Phase Rewrite Rules
26623
26624@noindent
26625It is possible to separate a rewrite rule set into several @dfn{phases}.
26626During each phase, certain rules will be enabled while certain others
26627will be disabled. A @dfn{phase schedule} controls the order in which
26628phases occur during the rewriting process.
26629
5d67986c
RS
26630@ignore
26631@starindex
26632@end ignore
d7b8e6c6
EZ
26633@tindex phase
26634@vindex all
26635If a call to the marker function @code{phase} appears in the rules
26636vector in place of a rule, all rules following that point will be
26637members of the phase(s) identified in the arguments to @code{phase}.
26638Phases are given integer numbers. The markers @samp{phase()} and
26639@samp{phase(all)} both mean the following rules belong to all phases;
26640this is the default at the start of the rule set.
26641
26642If you do not explicitly schedule the phases, Calc sorts all phase
26643numbers that appear in the rule set and executes the phases in
26644ascending order. For example, the rule set
26645
d7b8e6c6 26646@example
5d67986c 26647@group
d7b8e6c6
EZ
26648[ f0(x) := g0(x),
26649 phase(1),
26650 f1(x) := g1(x),
26651 phase(2),
26652 f2(x) := g2(x),
26653 phase(3),
26654 f3(x) := g3(x),
26655 phase(1,2),
26656 f4(x) := g4(x) ]
d7b8e6c6 26657@end group
5d67986c 26658@end example
d7b8e6c6
EZ
26659
26660@noindent
26661has three phases, 1 through 3. Phase 1 consists of the @code{f0},
26662@code{f1}, and @code{f4} rules (in that order). Phase 2 consists of
26663@code{f0}, @code{f2}, and @code{f4}. Phase 3 consists of @code{f0}
26664and @code{f3}.
26665
26666When Calc rewrites a formula using this rule set, it first rewrites
26667the formula using only the phase 1 rules until no further changes are
26668possible. Then it switches to the phase 2 rule set and continues
26669until no further changes occur, then finally rewrites with phase 3.
26670When no more phase 3 rules apply, rewriting finishes. (This is
26671assuming @kbd{a r} with a large enough prefix argument to allow the
26672rewriting to run to completion; the sequence just described stops
26673early if the number of iterations specified in the prefix argument,
26674100 by default, is reached.)
26675
26676During each phase, Calc descends through the nested levels of the
26677formula as described previously. (@xref{Nested Formulas with Rewrite
26678Rules}.) Rewriting starts at the top of the formula, then works its
26679way down to the parts, then goes back to the top and works down again.
26680The phase 2 rules do not begin until no phase 1 rules apply anywhere
26681in the formula.
26682
5d67986c
RS
26683@ignore
26684@starindex
26685@end ignore
d7b8e6c6
EZ
26686@tindex schedule
26687A @code{schedule} marker appearing in the rule set (anywhere, but
26688conventionally at the top) changes the default schedule of phases.
26689In the simplest case, @code{schedule} has a sequence of phase numbers
26690for arguments; each phase number is invoked in turn until the
26691arguments to @code{schedule} are exhausted. Thus adding
26692@samp{schedule(3,2,1)} at the top of the above rule set would
26693reverse the order of the phases; @samp{schedule(1,2,3)} would have
26694no effect since this is the default schedule; and @samp{schedule(1,2,1,3)}
26695would give phase 1 a second chance after phase 2 has completed, before
26696moving on to phase 3.
26697
26698Any argument to @code{schedule} can instead be a vector of phase
26699numbers (or even of sub-vectors). Then the sub-sequence of phases
26700described by the vector are tried repeatedly until no change occurs
26701in any phase in the sequence. For example, @samp{schedule([1, 2], 3)}
26702tries phase 1, then phase 2, then, if either phase made any changes
26703to the formula, repeats these two phases until they can make no
26704further progress. Finally, it goes on to phase 3 for finishing
26705touches.
26706
26707Also, items in @code{schedule} can be variable names as well as
26708numbers. A variable name is interpreted as the name of a function
26709to call on the whole formula. For example, @samp{schedule(1, simplify)}
26710says to apply the phase-1 rules (presumably, all of them), then to
26711call @code{simplify} which is the function name equivalent of @kbd{a s}.
26712Likewise, @samp{schedule([1, simplify])} says to alternate between
26713phase 1 and @kbd{a s} until no further changes occur.
26714
26715Phases can be used purely to improve efficiency; if it is known that
26716a certain group of rules will apply only at the beginning of rewriting,
26717and a certain other group will apply only at the end, then rewriting
26718will be faster if these groups are identified as separate phases.
26719Once the phase 1 rules are done, Calc can put them aside and no longer
26720spend any time on them while it works on phase 2.
26721
26722There are also some problems that can only be solved with several
26723rewrite phases. For a real-world example of a multi-phase rule set,
26724examine the set @code{FitRules}, which is used by the curve-fitting
26725command to convert a model expression to linear form.
26726@xref{Curve Fitting Details}. This set is divided into four phases.
26727The first phase rewrites certain kinds of expressions to be more
26728easily linearizable, but less computationally efficient. After the
26729linear components have been picked out, the final phase includes the
26730opposite rewrites to put each component back into an efficient form.
26731If both sets of rules were included in one big phase, Calc could get
26732into an infinite loop going back and forth between the two forms.
26733
26734Elsewhere in @code{FitRules}, the components are first isolated,
26735then recombined where possible to reduce the complexity of the linear
26736fit, then finally packaged one component at a time into vectors.
26737If the packaging rules were allowed to begin before the recombining
26738rules were finished, some components might be put away into vectors
26739before they had a chance to recombine. By putting these rules in
26740two separate phases, this problem is neatly avoided.
26741
26742@node Selections with Rewrite Rules, Matching Commands, Multi-Phase Rewrite Rules, Rewrite Rules
26743@subsection Selections with Rewrite Rules
26744
26745@noindent
26746If a sub-formula of the current formula is selected (as by @kbd{j s};
26747@pxref{Selecting Subformulas}), the @kbd{a r} (@code{calc-rewrite})
26748command applies only to that sub-formula. Together with a negative
26749prefix argument, you can use this fact to apply a rewrite to one
26750specific part of a formula without affecting any other parts.
26751
26752@kindex j r
26753@pindex calc-rewrite-selection
26754The @kbd{j r} (@code{calc-rewrite-selection}) command allows more
26755sophisticated operations on selections. This command prompts for
26756the rules in the same way as @kbd{a r}, but it then applies those
26757rules to the whole formula in question even though a sub-formula
26758of it has been selected. However, the selected sub-formula will
26759first have been surrounded by a @samp{select( )} function call.
26760(Calc's evaluator does not understand the function name @code{select};
26761this is only a tag used by the @kbd{j r} command.)
26762
26763For example, suppose the formula on the stack is @samp{2 (a + b)^2}
26764and the sub-formula @samp{a + b} is selected. This formula will
26765be rewritten to @samp{2 select(a + b)^2} and then the rewrite
26766rules will be applied in the usual way. The rewrite rules can
26767include references to @code{select} to tell where in the pattern
26768the selected sub-formula should appear.
26769
26770If there is still exactly one @samp{select( )} function call in
26771the formula after rewriting is done, it indicates which part of
26772the formula should be selected afterwards. Otherwise, the
26773formula will be unselected.
26774
26775You can make @kbd{j r} act much like @kbd{a r} by enclosing both parts
26776of the rewrite rule with @samp{select()}. However, @kbd{j r}
26777allows you to use the current selection in more flexible ways.
26778Suppose you wished to make a rule which removed the exponent from
26779the selected term; the rule @samp{select(a)^x := select(a)} would
26780work. In the above example, it would rewrite @samp{2 select(a + b)^2}
26781to @samp{2 select(a + b)}. This would then be returned to the
26782stack as @samp{2 (a + b)} with the @samp{a + b} selected.
26783
26784The @kbd{j r} command uses one iteration by default, unlike
26785@kbd{a r} which defaults to 100 iterations. A numeric prefix
26786argument affects @kbd{j r} in the same way as @kbd{a r}.
26787@xref{Nested Formulas with Rewrite Rules}.
26788
26789As with other selection commands, @kbd{j r} operates on the stack
26790entry that contains the cursor. (If the cursor is on the top-of-stack
26791@samp{.} marker, it works as if the cursor were on the formula
26792at stack level 1.)
26793
26794If you don't specify a set of rules, the rules are taken from the
26795top of the stack, just as with @kbd{a r}. In this case, the
26796cursor must indicate stack entry 2 or above as the formula to be
26797rewritten (otherwise the same formula would be used as both the
26798target and the rewrite rules).
26799
26800If the indicated formula has no selection, the cursor position within
26801the formula temporarily selects a sub-formula for the purposes of this
26802command. If the cursor is not on any sub-formula (e.g., it is in
26803the line-number area to the left of the formula), the @samp{select( )}
26804markers are ignored by the rewrite mechanism and the rules are allowed
26805to apply anywhere in the formula.
26806
26807As a special feature, the normal @kbd{a r} command also ignores
26808@samp{select( )} calls in rewrite rules. For example, if you used the
26809above rule @samp{select(a)^x := select(a)} with @kbd{a r}, it would apply
26810the rule as if it were @samp{a^x := a}. Thus, you can write general
26811purpose rules with @samp{select( )} hints inside them so that they
26812will ``do the right thing'' in both @kbd{a r} and @kbd{j r},
26813both with and without selections.
26814
26815@node Matching Commands, Automatic Rewrites, Selections with Rewrite Rules, Rewrite Rules
26816@subsection Matching Commands
26817
26818@noindent
26819@kindex a m
26820@pindex calc-match
26821@tindex match
26822The @kbd{a m} (@code{calc-match}) [@code{match}] function takes a
26823vector of formulas and a rewrite-rule-style pattern, and produces
26824a vector of all formulas which match the pattern. The command
26825prompts you to enter the pattern; as for @kbd{a r}, you can enter
26826a single pattern (i.e., a formula with meta-variables), or a
26827vector of patterns, or a variable which contains patterns, or
26828you can give a blank response in which case the patterns are taken
26829from the top of the stack. The pattern set will be compiled once
26830and saved if it is stored in a variable. If there are several
26831patterns in the set, vector elements are kept if they match any
26832of the patterns.
26833
26834For example, @samp{match(a+b, [x, x+y, x-y, 7, x+y+z])}
26835will return @samp{[x+y, x-y, x+y+z]}.
26836
26837The @code{import} mechanism is not available for pattern sets.
26838
26839The @kbd{a m} command can also be used to extract all vector elements
26840which satisfy any condition: The pattern @samp{x :: x>0} will select
26841all the positive vector elements.
26842
26843@kindex I a m
26844@tindex matchnot
26845With the Inverse flag [@code{matchnot}], this command extracts all
26846vector elements which do @emph{not} match the given pattern.
26847
5d67986c
RS
26848@ignore
26849@starindex
26850@end ignore
d7b8e6c6
EZ
26851@tindex matches
26852There is also a function @samp{matches(@var{x}, @var{p})} which
26853evaluates to 1 if expression @var{x} matches pattern @var{p}, or
26854to 0 otherwise. This is sometimes useful for including into the
26855conditional clauses of other rewrite rules.
26856
5d67986c
RS
26857@ignore
26858@starindex
26859@end ignore
d7b8e6c6
EZ
26860@tindex vmatches
26861The function @code{vmatches} is just like @code{matches}, except
26862that if the match succeeds it returns a vector of assignments to
26863the meta-variables instead of the number 1. For example,
26864@samp{vmatches(f(1,2), f(a,b))} returns @samp{[a := 1, b := 2]}.
26865If the match fails, the function returns the number 0.
26866
26867@node Automatic Rewrites, Debugging Rewrites, Matching Commands, Rewrite Rules
26868@subsection Automatic Rewrites
26869
26870@noindent
26871@cindex @code{EvalRules} variable
26872@vindex EvalRules
26873It is possible to get Calc to apply a set of rewrite rules on all
26874results, effectively adding to the built-in set of default
26875simplifications. To do this, simply store your rule set in the
26876variable @code{EvalRules}. There is a convenient @kbd{s E} command
26877for editing @code{EvalRules}; @pxref{Operations on Variables}.
26878
26879For example, suppose you want @samp{sin(a + b)} to be expanded out
26880to @samp{sin(b) cos(a) + cos(b) sin(a)} wherever it appears, and
26881similarly for @samp{cos(a + b)}. The corresponding rewrite rule
26882set would be,
26883
d7b8e6c6 26884@smallexample
5d67986c 26885@group
d7b8e6c6
EZ
26886[ sin(a + b) := cos(a) sin(b) + sin(a) cos(b),
26887 cos(a + b) := cos(a) cos(b) - sin(a) sin(b) ]
d7b8e6c6 26888@end group
5d67986c 26889@end smallexample
d7b8e6c6
EZ
26890
26891To apply these manually, you could put them in a variable called
26892@code{trigexp} and then use @kbd{a r trigexp} every time you wanted
26893to expand trig functions. But if instead you store them in the
26894variable @code{EvalRules}, they will automatically be applied to all
26895sines and cosines of sums. Then, with @samp{2 x} and @samp{45} on
26896the stack, typing @kbd{+ S} will (assuming degrees mode) result in
26897@samp{0.7071 sin(2 x) + 0.7071 cos(2 x)} automatically.
26898
26899As each level of a formula is evaluated, the rules from
26900@code{EvalRules} are applied before the default simplifications.
26901Rewriting continues until no further @code{EvalRules} apply.
26902Note that this is different from the usual order of application of
26903rewrite rules: @code{EvalRules} works from the bottom up, simplifying
26904the arguments to a function before the function itself, while @kbd{a r}
26905applies rules from the top down.
26906
26907Because the @code{EvalRules} are tried first, you can use them to
26908override the normal behavior of any built-in Calc function.
26909
26910It is important not to write a rule that will get into an infinite
26911loop. For example, the rule set @samp{[f(0) := 1, f(n) := n f(n-1)]}
26912appears to be a good definition of a factorial function, but it is
26913unsafe. Imagine what happens if @samp{f(2.5)} is simplified. Calc
26914will continue to subtract 1 from this argument forever without reaching
26915zero. A safer second rule would be @samp{f(n) := n f(n-1) :: n>0}.
26916Another dangerous rule is @samp{g(x, y) := g(y, x)}. Rewriting
26917@samp{g(2, 4)}, this would bounce back and forth between that and
26918@samp{g(4, 2)} forever. If an infinite loop in @code{EvalRules}
26919occurs, Emacs will eventually stop with a ``Computation got stuck
26920or ran too long'' message.
26921
26922Another subtle difference between @code{EvalRules} and regular rewrites
26923concerns rules that rewrite a formula into an identical formula. For
26924example, @samp{f(n) := f(floor(n))} ``fails to match'' when @cite{n} is
26925already an integer. But in @code{EvalRules} this case is detected only
26926if the righthand side literally becomes the original formula before any
26927further simplification. This means that @samp{f(n) := f(floor(n))} will
26928get into an infinite loop if it occurs in @code{EvalRules}. Calc will
26929replace @samp{f(6)} with @samp{f(floor(6))}, which is different from
26930@samp{f(6)}, so it will consider the rule to have matched and will
26931continue simplifying that formula; first the argument is simplified
26932to get @samp{f(6)}, then the rule matches again to get @samp{f(floor(6))}
26933again, ad infinitum. A much safer rule would check its argument first,
26934say, with @samp{f(n) := f(floor(n)) :: !dint(n)}.
26935
26936(What really happens is that the rewrite mechanism substitutes the
26937meta-variables in the righthand side of a rule, compares to see if the
26938result is the same as the original formula and fails if so, then uses
26939the default simplifications to simplify the result and compares again
26940(and again fails if the formula has simplified back to its original
26941form). The only special wrinkle for the @code{EvalRules} is that the
26942same rules will come back into play when the default simplifications
26943are used. What Calc wants to do is build @samp{f(floor(6))}, see that
26944this is different from the original formula, simplify to @samp{f(6)},
26945see that this is the same as the original formula, and thus halt the
26946rewriting. But while simplifying, @samp{f(6)} will again trigger
26947the same @code{EvalRules} rule and Calc will get into a loop inside
26948the rewrite mechanism itself.)
26949
26950The @code{phase}, @code{schedule}, and @code{iterations} markers do
26951not work in @code{EvalRules}. If the rule set is divided into phases,
26952only the phase 1 rules are applied, and the schedule is ignored.
26953The rules are always repeated as many times as possible.
26954
26955The @code{EvalRules} are applied to all function calls in a formula,
26956but not to numbers (and other number-like objects like error forms),
26957nor to vectors or individual variable names. (Though they will apply
26958to @emph{components} of vectors and error forms when appropriate.) You
26959might try to make a variable @code{phihat} which automatically expands
26960to its definition without the need to press @kbd{=} by writing the
26961rule @samp{quote(phihat) := (1-sqrt(5))/2}, but unfortunately this rule
26962will not work as part of @code{EvalRules}.
26963
26964Finally, another limitation is that Calc sometimes calls its built-in
26965functions directly rather than going through the default simplifications.
26966When it does this, @code{EvalRules} will not be able to override those
26967functions. For example, when you take the absolute value of the complex
26968number @cite{(2, 3)}, Calc computes @samp{sqrt(2*2 + 3*3)} by calling
26969the multiplication, addition, and square root functions directly rather
26970than applying the default simplifications to this formula. So an
26971@code{EvalRules} rule that (perversely) rewrites @samp{sqrt(13) := 6}
26972would not apply. (However, if you put Calc into symbolic mode so that
26973@samp{sqrt(13)} will be left in symbolic form by the built-in square
26974root function, your rule will be able to apply. But if the complex
26975number were @cite{(3,4)}, so that @samp{sqrt(25)} must be calculated,
26976then symbolic mode will not help because @samp{sqrt(25)} can be
26977evaluated exactly to 5.)
26978
26979One subtle restriction that normally only manifests itself with
26980@code{EvalRules} is that while a given rewrite rule is in the process
26981of being checked, that same rule cannot be recursively applied. Calc
26982effectively removes the rule from its rule set while checking the rule,
26983then puts it back once the match succeeds or fails. (The technical
26984reason for this is that compiled pattern programs are not reentrant.)
26985For example, consider the rule @samp{foo(x) := x :: foo(x/2) > 0}
26986attempting to match @samp{foo(8)}. This rule will be inactive while
26987the condition @samp{foo(4) > 0} is checked, even though it might be
26988an integral part of evaluating that condition. Note that this is not
26989a problem for the more usual recursive type of rule, such as
26990@samp{foo(x) := foo(x/2)}, because there the rule has succeeded and
26991been reactivated by the time the righthand side is evaluated.
26992
26993If @code{EvalRules} has no stored value (its default state), or if
26994anything but a vector is stored in it, then it is ignored.
26995
26996Even though Calc's rewrite mechanism is designed to compare rewrite
26997rules to formulas as quickly as possible, storing rules in
26998@code{EvalRules} may make Calc run substantially slower. This is
26999particularly true of rules where the top-level call is a commonly used
27000function, or is not fixed. The rule @samp{f(n) := n f(n-1) :: n>0} will
27001only activate the rewrite mechanism for calls to the function @code{f},
27002but @samp{lg(n) + lg(m) := lg(n m)} will check every @samp{+} operator.
5d67986c
RS
27003
27004@smallexample
27005apply(f, [a*b]) := apply(f, [a]) + apply(f, [b]) :: in(f, [ln, log10])
27006@end smallexample
27007
27008@noindent
27009may seem more ``efficient'' than two separate rules for @code{ln} and
27010@code{log10}, but actually it is vastly less efficient because rules
27011with @code{apply} as the top-level pattern must be tested against
27012@emph{every} function call that is simplified.
d7b8e6c6
EZ
27013
27014@cindex @code{AlgSimpRules} variable
27015@vindex AlgSimpRules
27016Suppose you want @samp{sin(a + b)} to be expanded out not all the time,
27017but only when @kbd{a s} is used to simplify the formula. The variable
27018@code{AlgSimpRules} holds rules for this purpose. The @kbd{a s} command
27019will apply @code{EvalRules} and @code{AlgSimpRules} to the formula, as
27020well as all of its built-in simplifications.
27021
27022Most of the special limitations for @code{EvalRules} don't apply to
27023@code{AlgSimpRules}. Calc simply does an @kbd{a r AlgSimpRules}
27024command with an infinite repeat count as the first step of @kbd{a s}.
27025It then applies its own built-in simplifications throughout the
27026formula, and then repeats these two steps (along with applying the
27027default simplifications) until no further changes are possible.
27028
27029@cindex @code{ExtSimpRules} variable
27030@cindex @code{UnitSimpRules} variable
27031@vindex ExtSimpRules
27032@vindex UnitSimpRules
27033There are also @code{ExtSimpRules} and @code{UnitSimpRules} variables
27034that are used by @kbd{a e} and @kbd{u s}, respectively; these commands
27035also apply @code{EvalRules} and @code{AlgSimpRules}. The variable
27036@code{IntegSimpRules} contains simplification rules that are used
27037only during integration by @kbd{a i}.
27038
27039@node Debugging Rewrites, Examples of Rewrite Rules, Automatic Rewrites, Rewrite Rules
27040@subsection Debugging Rewrites
27041
27042@noindent
27043If a buffer named @samp{*Trace*} exists, the rewrite mechanism will
27044record some useful information there as it operates. The original
27045formula is written there, as is the result of each successful rewrite,
27046and the final result of the rewriting. All phase changes are also
27047noted.
27048
27049Calc always appends to @samp{*Trace*}. You must empty this buffer
27050yourself periodically if it is in danger of growing unwieldy.
27051
27052Note that the rewriting mechanism is substantially slower when the
27053@samp{*Trace*} buffer exists, even if the buffer is not visible on
27054the screen. Once you are done, you will probably want to kill this
27055buffer (with @kbd{C-x k *Trace* @key{RET}}). If you leave it in
27056existence and forget about it, all your future rewrite commands will
27057be needlessly slow.
27058
27059@node Examples of Rewrite Rules, , Debugging Rewrites, Rewrite Rules
27060@subsection Examples of Rewrite Rules
27061
27062@noindent
27063Returning to the example of substituting the pattern
27064@samp{sin(x)^2 + cos(x)^2} with 1, we saw that the rule
27065@samp{opt(a) sin(x)^2 + opt(a) cos(x)^2 := a} does a good job of
27066finding suitable cases. Another solution would be to use the rule
27067@samp{cos(x)^2 := 1 - sin(x)^2}, followed by algebraic simplification
27068if necessary. This rule will be the most effective way to do the job,
27069but at the expense of making some changes that you might not desire.@refill
27070
27071Another algebraic rewrite rule is @samp{exp(x+y) := exp(x) exp(y)}.
27072To make this work with the @w{@kbd{j r}} command so that it can be
27073easily targeted to a particular exponential in a large formula,
27074you might wish to write the rule as @samp{select(exp(x+y)) :=
27075select(exp(x) exp(y))}. The @samp{select} markers will be
27076ignored by the regular @kbd{a r} command
27077(@pxref{Selections with Rewrite Rules}).@refill
27078
27079A surprisingly useful rewrite rule is @samp{a/(b-c) := a*(b+c)/(b^2-c^2)}.
27080This will simplify the formula whenever @cite{b} and/or @cite{c} can
27081be made simpler by squaring. For example, applying this rule to
27082@samp{2 / (sqrt(2) + 3)} yields @samp{6:7 - 2:7 sqrt(2)} (assuming
27083Symbolic Mode has been enabled to keep the square root from being
27084evaulated to a floating-point approximation). This rule is also
27085useful when working with symbolic complex numbers, e.g.,
27086@samp{(a + b i) / (c + d i)}.
27087
27088As another example, we could define our own ``triangular numbers'' function
27089with the rules @samp{[tri(0) := 0, tri(n) := n + tri(n-1) :: n>0]}. Enter
27090this vector and store it in a variable: @kbd{@w{s t} trirules}. Now, given
27091a suitable formula like @samp{tri(5)} on the stack, type @samp{a r trirules}
27092to apply these rules repeatedly. After six applications, @kbd{a r} will
27093stop with 15 on the stack. Once these rules are debugged, it would probably
27094be most useful to add them to @code{EvalRules} so that Calc will evaluate
27095the new @code{tri} function automatically. We could then use @kbd{Z K} on
5d67986c 27096the keyboard macro @kbd{' tri($) @key{RET}} to make a command that applies
d7b8e6c6
EZ
27097@code{tri} to the value on the top of the stack. @xref{Programming}.
27098
27099@cindex Quaternions
27100The following rule set, contributed by @c{Fran\c cois}
27101@asis{Francois} Pinard, implements
27102@dfn{quaternions}, a generalization of the concept of complex numbers.
27103Quaternions have four components, and are here represented by function
27104calls @samp{quat(@var{w}, [@var{x}, @var{y}, @var{z}])} with ``real
27105part'' @var{w} and the three ``imaginary'' parts collected into a
27106vector. Various arithmetical operations on quaternions are supported.
27107To use these rules, either add them to @code{EvalRules}, or create a
27108command based on @kbd{a r} for simplifying quaternion formulas.
27109A convenient way to enter quaternions would be a command defined by
27110a keyboard macro containing: @kbd{' quat($$$$, [$$$, $$, $]) @key{RET}}.
27111
27112@smallexample
27113[ quat(w, x, y, z) := quat(w, [x, y, z]),
27114 quat(w, [0, 0, 0]) := w,
27115 abs(quat(w, v)) := hypot(w, v),
27116 -quat(w, v) := quat(-w, -v),
27117 r + quat(w, v) := quat(r + w, v) :: real(r),
27118 r - quat(w, v) := quat(r - w, -v) :: real(r),
27119 quat(w1, v1) + quat(w2, v2) := quat(w1 + w2, v1 + v2),
27120 r * quat(w, v) := quat(r * w, r * v) :: real(r),
27121 plain(quat(w1, v1) * quat(w2, v2))
27122 := quat(w1 * w2 - v1 * v2, w1 * v2 + w2 * v1 + cross(v1, v2)),
27123 quat(w1, v1) / r := quat(w1 / r, v1 / r) :: real(r),
27124 z / quat(w, v) := z * quatinv(quat(w, v)),
27125 quatinv(quat(w, v)) := quat(w, -v) / (w^2 + v^2),
27126 quatsqr(quat(w, v)) := quat(w^2 - v^2, 2 * w * v),
27127 quat(w, v)^k := quatsqr(quat(w, v)^(k / 2))
27128 :: integer(k) :: k > 0 :: k % 2 = 0,
27129 quat(w, v)^k := quatsqr(quat(w, v)^((k - 1) / 2)) * quat(w, v)
27130 :: integer(k) :: k > 2,
27131 quat(w, v)^-k := quatinv(quat(w, v)^k) :: integer(k) :: k > 0 ]
27132@end smallexample
27133
27134Quaternions, like matrices, have non-commutative multiplication.
27135In other words, @cite{q1 * q2 = q2 * q1} is not necessarily true if
27136@cite{q1} and @cite{q2} are @code{quat} forms. The @samp{quat*quat}
27137rule above uses @code{plain} to prevent Calc from rearranging the
27138product. It may also be wise to add the line @samp{[quat(), matrix]}
27139to the @code{Decls} matrix, to ensure that Calc's other algebraic
27140operations will not rearrange a quaternion product. @xref{Declarations}.
27141
27142These rules also accept a four-argument @code{quat} form, converting
27143it to the preferred form in the first rule. If you would rather see
27144results in the four-argument form, just append the two items
27145@samp{phase(2), quat(w, [x, y, z]) := quat(w, x, y, z)} to the end
27146of the rule set. (But remember that multi-phase rule sets don't work
27147in @code{EvalRules}.)
27148
27149@node Units, Store and Recall, Algebra, Top
27150@chapter Operating on Units
27151
27152@noindent
27153One special interpretation of algebraic formulas is as numbers with units.
27154For example, the formula @samp{5 m / s^2} can be read ``five meters
27155per second squared.'' The commands in this chapter help you
27156manipulate units expressions in this form. Units-related commands
27157begin with the @kbd{u} prefix key.
27158
27159@menu
27160* Basic Operations on Units::
27161* The Units Table::
27162* Predefined Units::
27163* User-Defined Units::
27164@end menu
27165
27166@node Basic Operations on Units, The Units Table, Units, Units
27167@section Basic Operations on Units
27168
27169@noindent
27170A @dfn{units expression} is a formula which is basically a number
27171multiplied and/or divided by one or more @dfn{unit names}, which may
27172optionally be raised to integer powers. Actually, the value part need not
27173be a number; any product or quotient involving unit names is a units
27174expression. Many of the units commands will also accept any formula,
27175where the command applies to all units expressions which appear in the
27176formula.
27177
27178A unit name is a variable whose name appears in the @dfn{unit table},
27179or a variable whose name is a prefix character like @samp{k} (for ``kilo'')
27180or @samp{u} (for ``micro'') followed by a name in the unit table.
27181A substantial table of built-in units is provided with Calc;
27182@pxref{Predefined Units}. You can also define your own unit names;
27183@pxref{User-Defined Units}.@refill
27184
27185Note that if the value part of a units expression is exactly @samp{1},
27186it will be removed by the Calculator's automatic algebra routines: The
27187formula @samp{1 mm} is ``simplified'' to @samp{mm}. This is only a
27188display anomaly, however; @samp{mm} will work just fine as a
27189representation of one millimeter.@refill
27190
27191You may find that Algebraic Mode (@pxref{Algebraic Entry}) makes working
27192with units expressions easier. Otherwise, you will have to remember
27193to hit the apostrophe key every time you wish to enter units.
27194
27195@kindex u s
27196@pindex calc-simplify-units
5d67986c
RS
27197@ignore
27198@mindex usimpl@idots
27199@end ignore
d7b8e6c6
EZ
27200@tindex usimplify
27201The @kbd{u s} (@code{calc-simplify-units}) [@code{usimplify}] command
27202simplifies a units
27203expression. It uses @kbd{a s} (@code{calc-simplify}) to simplify the
27204expression first as a regular algebraic formula; it then looks for
27205features that can be further simplified by converting one object's units
27206to be compatible with another's. For example, @samp{5 m + 23 mm} will
27207simplify to @samp{5.023 m}. When different but compatible units are
27208added, the righthand term's units are converted to match those of the
27209lefthand term. @xref{Simplification Modes}, for a way to have this done
27210automatically at all times.@refill
27211
27212Units simplification also handles quotients of two units with the same
27213dimensionality, as in @w{@samp{2 in s/L cm}} to @samp{5.08 s/L}; fractional
27214powers of unit expressions, as in @samp{sqrt(9 mm^2)} to @samp{3 mm} and
27215@samp{sqrt(9 acre)} to a quantity in meters; and @code{floor},
27216@code{ceil}, @code{round}, @code{rounde}, @code{roundu}, @code{trunc},
27217@code{float}, @code{frac}, @code{abs}, and @code{clean}
27218applied to units expressions, in which case
27219the operation in question is applied only to the numeric part of the
27220expression. Finally, trigonometric functions of quantities with units
27221of angle are evaluated, regardless of the current angular mode.@refill
27222
27223@kindex u c
27224@pindex calc-convert-units
27225The @kbd{u c} (@code{calc-convert-units}) command converts a units
27226expression to new, compatible units. For example, given the units
27227expression @samp{55 mph}, typing @kbd{u c m/s @key{RET}} produces
27228@samp{24.5872 m/s}. If the units you request are inconsistent with
27229the original units, the number will be converted into your units
27230times whatever ``remainder'' units are left over. For example,
27231converting @samp{55 mph} into acres produces @samp{6.08e-3 acre / m s}.
27232(Recall that multiplication binds more strongly than division in Calc
27233formulas, so the units here are acres per meter-second.) Remainder
27234units are expressed in terms of ``fundamental'' units like @samp{m} and
27235@samp{s}, regardless of the input units.
27236
27237One special exception is that if you specify a single unit name, and
27238a compatible unit appears somewhere in the units expression, then
27239that compatible unit will be converted to the new unit and the
27240remaining units in the expression will be left alone. For example,
27241given the input @samp{980 cm/s^2}, the command @kbd{u c ms} will
27242change the @samp{s} to @samp{ms} to get @samp{9.8e-4 cm/ms^2}.
27243The ``remainder unit'' @samp{cm} is left alone rather than being
27244changed to the base unit @samp{m}.
27245
27246You can use explicit unit conversion instead of the @kbd{u s} command
27247to gain more control over the units of the result of an expression.
27248For example, given @samp{5 m + 23 mm}, you can type @kbd{u c m} or
27249@kbd{u c mm} to express the result in either meters or millimeters.
27250(For that matter, you could type @kbd{u c fath} to express the result
27251in fathoms, if you preferred!)
27252
27253In place of a specific set of units, you can also enter one of the
27254units system names @code{si}, @code{mks} (equivalent), or @code{cgs}.
27255For example, @kbd{u c si @key{RET}} converts the expression into
27256International System of Units (SI) base units. Also, @kbd{u c base}
27257converts to Calc's base units, which are the same as @code{si} units
27258except that @code{base} uses @samp{g} as the fundamental unit of mass
27259whereas @code{si} uses @samp{kg}.
27260
27261@cindex Composite units
27262The @kbd{u c} command also accepts @dfn{composite units}, which
27263are expressed as the sum of several compatible unit names. For
27264example, converting @samp{30.5 in} to units @samp{mi+ft+in} (miles,
27265feet, and inches) produces @samp{2 ft + 6.5 in}. Calc first
27266sorts the unit names into order of decreasing relative size.
27267It then accounts for as much of the input quantity as it can
27268using an integer number times the largest unit, then moves on
27269to the next smaller unit, and so on. Only the smallest unit
27270may have a non-integer amount attached in the result. A few
27271standard unit names exist for common combinations, such as
27272@code{mfi} for @samp{mi+ft+in}, and @code{tpo} for @samp{ton+lb+oz}.
27273Composite units are expanded as if by @kbd{a x}, so that
27274@samp{(ft+in)/hr} is first converted to @samp{ft/hr+in/hr}.
27275
27276If the value on the stack does not contain any units, @kbd{u c} will
27277prompt first for the old units which this value should be considered
27278to have, then for the new units. Assuming the old and new units you
27279give are consistent with each other, the result also will not contain
5d67986c 27280any units. For example, @kbd{@w{u c} cm @key{RET} in @key{RET}} converts the number
d7b8e6c6
EZ
272812 on the stack to 5.08.
27282
27283@kindex u b
27284@pindex calc-base-units
27285The @kbd{u b} (@code{calc-base-units}) command is shorthand for
27286@kbd{u c base}; it converts the units expression on the top of the
27287stack into @code{base} units. If @kbd{u s} does not simplify a
27288units expression as far as you would like, try @kbd{u b}.
27289
27290The @kbd{u c} and @kbd{u b} commands treat temperature units (like
27291@samp{degC} and @samp{K}) as relative temperatures. For example,
27292@kbd{u c} converts @samp{10 degC} to @samp{18 degF}: A change of 10
27293degrees Celsius corresponds to a change of 18 degrees Fahrenheit.
27294
27295@kindex u t
27296@pindex calc-convert-temperature
27297@cindex Temperature conversion
27298The @kbd{u t} (@code{calc-convert-temperature}) command converts
27299absolute temperatures. The value on the stack must be a simple units
27300expression with units of temperature only. This command would convert
27301@samp{10 degC} to @samp{50 degF}, the equivalent temperature on the
27302Fahrenheit scale.@refill
27303
27304@kindex u r
27305@pindex calc-remove-units
27306@kindex u x
27307@pindex calc-extract-units
27308The @kbd{u r} (@code{calc-remove-units}) command removes units from the
27309formula at the top of the stack. The @kbd{u x}
27310(@code{calc-extract-units}) command extracts only the units portion of a
27311formula. These commands essentially replace every term of the formula
27312that does or doesn't (respectively) look like a unit name by the
27313constant 1, then resimplify the formula.@refill
27314
27315@kindex u a
27316@pindex calc-autorange-units
27317The @kbd{u a} (@code{calc-autorange-units}) command turns on and off a
27318mode in which unit prefixes like @code{k} (``kilo'') are automatically
27319applied to keep the numeric part of a units expression in a reasonable
27320range. This mode affects @kbd{u s} and all units conversion commands
27321except @kbd{u b}. For example, with autoranging on, @samp{12345 Hz}
27322will be simplified to @samp{12.345 kHz}. Autoranging is useful for
27323some kinds of units (like @code{Hz} and @code{m}), but is probably
27324undesirable for non-metric units like @code{ft} and @code{tbsp}.
27325(Composite units are more appropriate for those; see above.)
27326
27327Autoranging always applies the prefix to the leftmost unit name.
27328Calc chooses the largest prefix that causes the number to be greater
27329than or equal to 1.0. Thus an increasing sequence of adjusted times
27330would be @samp{1 ms, 10 ms, 100 ms, 1 s, 10 s, 100 s, 1 ks}.
27331Generally the rule of thumb is that the number will be adjusted
27332to be in the interval @samp{[1 .. 1000)}, although there are several
27333exceptions to this rule. First, if the unit has a power then this
27334is not possible; @samp{0.1 s^2} simplifies to @samp{100000 ms^2}.
27335Second, the ``centi-'' prefix is allowed to form @code{cm} (centimeters),
27336but will not apply to other units. The ``deci-,'' ``deka-,'' and
27337``hecto-'' prefixes are never used. Thus the allowable interval is
27338@samp{[1 .. 10)} for millimeters and @samp{[1 .. 100)} for centimeters.
27339Finally, a prefix will not be added to a unit if the resulting name
27340is also the actual name of another unit; @samp{1e-15 t} would normally
27341be considered a ``femto-ton,'' but it is written as @samp{1000 at}
27342(1000 atto-tons) instead because @code{ft} would be confused with feet.
27343
27344@node The Units Table, Predefined Units, Basic Operations on Units, Units
27345@section The Units Table
27346
27347@noindent
27348@kindex u v
27349@pindex calc-enter-units-table
27350The @kbd{u v} (@code{calc-enter-units-table}) command displays the units table
27351in another buffer called @code{*Units Table*}. Each entry in this table
27352gives the unit name as it would appear in an expression, the definition
27353of the unit in terms of simpler units, and a full name or description of
27354the unit. Fundamental units are defined as themselves; these are the
27355units produced by the @kbd{u b} command. The fundamental units are
27356meters, seconds, grams, kelvins, amperes, candelas, moles, radians,
27357and steradians.
27358
27359The Units Table buffer also displays the Unit Prefix Table. Note that
27360two prefixes, ``kilo'' and ``hecto,'' accept either upper- or lower-case
27361prefix letters. @samp{Meg} is also accepted as a synonym for the @samp{M}
27362prefix. Whenever a unit name can be interpreted as either a built-in name
27363or a prefix followed by another built-in name, the former interpretation
27364wins. For example, @samp{2 pt} means two pints, not two pico-tons.
27365
27366The Units Table buffer, once created, is not rebuilt unless you define
27367new units. To force the buffer to be rebuilt, give any numeric prefix
27368argument to @kbd{u v}.
27369
27370@kindex u V
27371@pindex calc-view-units-table
27372The @kbd{u V} (@code{calc-view-units-table}) command is like @kbd{u v} except
27373that the cursor is not moved into the Units Table buffer. You can
27374type @kbd{u V} again to remove the Units Table from the display. To
27375return from the Units Table buffer after a @kbd{u v}, type @kbd{M-# c}
27376again or use the regular Emacs @w{@kbd{C-x o}} (@code{other-window})
27377command. You can also kill the buffer with @kbd{C-x k} if you wish;
27378the actual units table is safely stored inside the Calculator.
27379
27380@kindex u g
27381@pindex calc-get-unit-definition
27382The @kbd{u g} (@code{calc-get-unit-definition}) command retrieves a unit's
27383defining expression and pushes it onto the Calculator stack. For example,
27384@kbd{u g in} will produce the expression @samp{2.54 cm}. This is the
27385same definition for the unit that would appear in the Units Table buffer.
27386Note that this command works only for actual unit names; @kbd{u g km}
27387will report that no such unit exists, for example, because @code{km} is
27388really the unit @code{m} with a @code{k} (``kilo'') prefix. To see a
27389definition of a unit in terms of base units, it is easier to push the
27390unit name on the stack and then reduce it to base units with @kbd{u b}.
27391
27392@kindex u e
27393@pindex calc-explain-units
27394The @kbd{u e} (@code{calc-explain-units}) command displays an English
27395description of the units of the expression on the stack. For example,
27396for the expression @samp{62 km^2 g / s^2 mol K}, the description is
27397``Square-Kilometer Gram per (Second-squared Mole Degree-Kelvin).'' This
27398command uses the English descriptions that appear in the righthand
27399column of the Units Table.
27400
27401@node Predefined Units, User-Defined Units, The Units Table, Units
27402@section Predefined Units
27403
27404@noindent
27405Since the exact definitions of many kinds of units have evolved over the
27406years, and since certain countries sometimes have local differences in
27407their definitions, it is a good idea to examine Calc's definition of a
27408unit before depending on its exact value. For example, there are three
27409different units for gallons, corresponding to the US (@code{gal}),
27410Canadian (@code{galC}), and British (@code{galUK}) definitions. Also,
27411note that @code{oz} is a standard ounce of mass, @code{ozt} is a Troy
27412ounce, and @code{ozfl} is a fluid ounce.
27413
27414The temperature units corresponding to degrees Kelvin and Centigrade
27415(Celsius) are the same in this table, since most units commands treat
27416temperatures as being relative. The @code{calc-convert-temperature}
27417command has special rules for handling the different absolute magnitudes
27418of the various temperature scales.
27419
27420The unit of volume ``liters'' can be referred to by either the lower-case
27421@code{l} or the upper-case @code{L}.
27422
27423The unit @code{A} stands for Amperes; the name @code{Ang} is used
27424@tex
27425for \AA ngstroms.
27426@end tex
27427@ifinfo
27428for Angstroms.
27429@end ifinfo
27430
27431The unit @code{pt} stands for pints; the name @code{point} stands for
27432a typographical point, defined by @samp{72 point = 1 in}. There is
27433also @code{tpt}, which stands for a printer's point as defined by the
27434@TeX{} typesetting system: @samp{72.27 tpt = 1 in}.
27435
27436The unit @code{e} stands for the elementary (electron) unit of charge;
27437because algebra command could mistake this for the special constant
27438@cite{e}, Calc provides the alternate unit name @code{ech} which is
27439preferable to @code{e}.
27440
27441The name @code{g} stands for one gram of mass; there is also @code{gf},
27442one gram of force. (Likewise for @kbd{lb}, pounds, and @kbd{lbf}.)
27443Meanwhile, one ``@cite{g}'' of acceleration is denoted @code{ga}.
27444
27445The unit @code{ton} is a U.S. ton of @samp{2000 lb}, and @code{t} is
27446a metric ton of @samp{1000 kg}.
27447
27448The names @code{s} (or @code{sec}) and @code{min} refer to units of
27449time; @code{arcsec} and @code{arcmin} are units of angle.
27450
27451Some ``units'' are really physical constants; for example, @code{c}
27452represents the speed of light, and @code{h} represents Planck's
27453constant. You can use these just like other units: converting
27454@samp{.5 c} to @samp{m/s} expresses one-half the speed of light in
27455meters per second. You can also use this merely as a handy reference;
27456the @kbd{u g} command gets the definition of one of these constants
27457in its normal terms, and @kbd{u b} expresses the definition in base
27458units.
27459
27460Two units, @code{pi} and @code{fsc} (the fine structure constant,
27461approximately @i{1/137}) are dimensionless. The units simplification
27462commands simply treat these names as equivalent to their corresponding
27463values. However you can, for example, use @kbd{u c} to convert a pure
27464number into multiples of the fine structure constant, or @kbd{u b} to
27465convert this back into a pure number. (When @kbd{u c} prompts for the
27466``old units,'' just enter a blank line to signify that the value
27467really is unitless.)
27468
27469@c Describe angular units, luminosity vs. steradians problem.
27470
27471@node User-Defined Units, , Predefined Units, Units
27472@section User-Defined Units
27473
27474@noindent
27475Calc provides ways to get quick access to your selected ``favorite''
27476units, as well as ways to define your own new units.
27477
27478@kindex u 0-9
27479@pindex calc-quick-units
27480@vindex Units
27481@cindex @code{Units} variable
27482@cindex Quick units
27483To select your favorite units, store a vector of unit names or
27484expressions in the Calc variable @code{Units}. The @kbd{u 1}
27485through @kbd{u 9} commands (@code{calc-quick-units}) provide access
27486to these units. If the value on the top of the stack is a plain
27487number (with no units attached), then @kbd{u 1} gives it the
27488specified units. (Basically, it multiplies the number by the
27489first item in the @code{Units} vector.) If the number on the
27490stack @emph{does} have units, then @kbd{u 1} converts that number
27491to the new units. For example, suppose the vector @samp{[in, ft]}
27492is stored in @code{Units}. Then @kbd{30 u 1} will create the
27493expression @samp{30 in}, and @kbd{u 2} will convert that expression
27494to @samp{2.5 ft}.
27495
27496The @kbd{u 0} command accesses the tenth element of @code{Units}.
27497Only ten quick units may be defined at a time. If the @code{Units}
27498variable has no stored value (the default), or if its value is not
27499a vector, then the quick-units commands will not function. The
27500@kbd{s U} command is a convenient way to edit the @code{Units}
27501variable; @pxref{Operations on Variables}.
27502
27503@kindex u d
27504@pindex calc-define-unit
27505@cindex User-defined units
27506The @kbd{u d} (@code{calc-define-unit}) command records the units
27507expression on the top of the stack as the definition for a new,
27508user-defined unit. For example, putting @samp{16.5 ft} on the stack and
27509typing @kbd{u d rod} defines the new unit @samp{rod} to be equivalent to
2751016.5 feet. The unit conversion and simplification commands will now
27511treat @code{rod} just like any other unit of length. You will also be
27512prompted for an optional English description of the unit, which will
27513appear in the Units Table.
27514
27515@kindex u u
27516@pindex calc-undefine-unit
27517The @kbd{u u} (@code{calc-undefine-unit}) command removes a user-defined
27518unit. It is not possible to remove one of the predefined units,
27519however.
27520
27521If you define a unit with an existing unit name, your new definition
27522will replace the original definition of that unit. If the unit was a
27523predefined unit, the old definition will not be replaced, only
27524``shadowed.'' The built-in definition will reappear if you later use
27525@kbd{u u} to remove the shadowing definition.
27526
27527To create a new fundamental unit, use either 1 or the unit name itself
27528as the defining expression. Otherwise the expression can involve any
27529other units that you like (except for composite units like @samp{mfi}).
27530You can create a new composite unit with a sum of other units as the
27531defining expression. The next unit operation like @kbd{u c} or @kbd{u v}
27532will rebuild the internal unit table incorporating your modifications.
27533Note that erroneous definitions (such as two units defined in terms of
27534each other) will not be detected until the unit table is next rebuilt;
27535@kbd{u v} is a convenient way to force this to happen.
27536
27537Temperature units are treated specially inside the Calculator; it is not
27538possible to create user-defined temperature units.
27539
27540@kindex u p
27541@pindex calc-permanent-units
27542@cindex @file{.emacs} file, user-defined units
27543The @kbd{u p} (@code{calc-permanent-units}) command stores the user-defined
27544units in your @file{.emacs} file, so that the units will still be
27545available in subsequent Emacs sessions. If there was already a set of
27546user-defined units in your @file{.emacs} file, it is replaced by the
27547new set. (@xref{General Mode Commands}, for a way to tell Calc to use
27548a different file instead of @file{.emacs}.)
27549
27550@node Store and Recall, Graphics, Units, Top
27551@chapter Storing and Recalling
27552
27553@noindent
27554Calculator variables are really just Lisp variables that contain numbers
27555or formulas in a form that Calc can understand. The commands in this
27556section allow you to manipulate variables conveniently. Commands related
27557to variables use the @kbd{s} prefix key.
27558
27559@menu
27560* Storing Variables::
27561* Recalling Variables::
27562* Operations on Variables::
27563* Let Command::
27564* Evaluates-To Operator::
27565@end menu
27566
27567@node Storing Variables, Recalling Variables, Store and Recall, Store and Recall
27568@section Storing Variables
27569
27570@noindent
27571@kindex s s
27572@pindex calc-store
27573@cindex Storing variables
27574@cindex Quick variables
27575@vindex q0
27576@vindex q9
27577The @kbd{s s} (@code{calc-store}) command stores the value at the top of
27578the stack into a specified variable. It prompts you to enter the
27579name of the variable. If you press a single digit, the value is stored
27580immediately in one of the ``quick'' variables @code{var-q0} through
27581@code{var-q9}. Or you can enter any variable name. The prefix @samp{var-}
27582is supplied for you; when a name appears in a formula (as in @samp{a+q2})
27583the prefix @samp{var-} is also supplied there, so normally you can simply
27584forget about @samp{var-} everywhere. Its only purpose is to enable you to
27585use Calc variables without fear of accidentally clobbering some variable in
27586another Emacs package. If you really want to store in an arbitrary Lisp
27587variable, just backspace over the @samp{var-}.
27588
27589@kindex s t
27590@pindex calc-store-into
27591The @kbd{s s} command leaves the stored value on the stack. There is
27592also an @kbd{s t} (@code{calc-store-into}) command, which removes a
27593value from the stack and stores it in a variable.
27594
27595If the top of stack value is an equation @samp{a = 7} or assignment
27596@samp{a := 7} with a variable on the lefthand side, then Calc will
27597assign that variable with that value by default, i.e., if you type
27598@kbd{s s @key{RET}} or @kbd{s t @key{RET}}. In this example, the
27599value 7 would be stored in the variable @samp{a}. (If you do type
27600a variable name at the prompt, the top-of-stack value is stored in
27601its entirety, even if it is an equation: @samp{s s b @key{RET}}
27602with @samp{a := 7} on the stack stores @samp{a := 7} in @code{b}.)
27603
27604In fact, the top of stack value can be a vector of equations or
27605assignments with different variables on their lefthand sides; the
27606default will be to store all the variables with their corresponding
27607righthand sides simultaneously.
27608
27609It is also possible to type an equation or assignment directly at
27610the prompt for the @kbd{s s} or @kbd{s t} command: @kbd{s s foo = 7}.
27611In this case the expression to the right of the @kbd{=} or @kbd{:=}
27612symbol is evaluated as if by the @kbd{=} command, and that value is
27613stored in the variable. No value is taken from the stack; @kbd{s s}
27614and @kbd{s t} are equivalent when used in this way.
27615
27616@kindex s 0-9
27617@kindex t 0-9
27618The prefix keys @kbd{s} and @kbd{t} may be followed immediately by a
27619digit; @kbd{s 9} is equivalent to @kbd{s s 9}, and @kbd{t 9} is
27620equivalent to @kbd{s t 9}. (The @kbd{t} prefix is otherwise used
27621for trail and time/date commands.)
27622
27623@kindex s +
27624@kindex s -
5d67986c
RS
27625@ignore
27626@mindex @idots
27627@end ignore
d7b8e6c6 27628@kindex s *
5d67986c
RS
27629@ignore
27630@mindex @null
27631@end ignore
d7b8e6c6 27632@kindex s /
5d67986c
RS
27633@ignore
27634@mindex @null
27635@end ignore
d7b8e6c6 27636@kindex s ^
5d67986c
RS
27637@ignore
27638@mindex @null
27639@end ignore
d7b8e6c6 27640@kindex s |
5d67986c
RS
27641@ignore
27642@mindex @null
27643@end ignore
d7b8e6c6 27644@kindex s n
5d67986c
RS
27645@ignore
27646@mindex @null
27647@end ignore
d7b8e6c6 27648@kindex s &
5d67986c
RS
27649@ignore
27650@mindex @null
27651@end ignore
d7b8e6c6 27652@kindex s [
5d67986c
RS
27653@ignore
27654@mindex @null
27655@end ignore
d7b8e6c6
EZ
27656@kindex s ]
27657@pindex calc-store-plus
27658@pindex calc-store-minus
27659@pindex calc-store-times
27660@pindex calc-store-div
27661@pindex calc-store-power
27662@pindex calc-store-concat
27663@pindex calc-store-neg
27664@pindex calc-store-inv
27665@pindex calc-store-decr
27666@pindex calc-store-incr
27667There are also several ``arithmetic store'' commands. For example,
27668@kbd{s +} removes a value from the stack and adds it to the specified
27669variable. The other arithmetic stores are @kbd{s -}, @kbd{s *}, @kbd{s /},
27670@kbd{s ^}, and @w{@kbd{s |}} (vector concatenation), plus @kbd{s n} and
27671@kbd{s &} which negate or invert the value in a variable, and @w{@kbd{s [}}
27672and @kbd{s ]} which decrease or increase a variable by one.
27673
27674All the arithmetic stores accept the Inverse prefix to reverse the
27675order of the operands. If @cite{v} represents the contents of the
27676variable, and @cite{a} is the value drawn from the stack, then regular
27677@w{@kbd{s -}} assigns @c{$v \coloneq v - a$}
27678@cite{v := v - a}, but @kbd{I s -} assigns
27679@c{$v \coloneq a - v$}
27680@cite{v := a - v}. While @kbd{I s *} might seem pointless, it is
27681useful if matrix multiplication is involved. Actually, all the
27682arithmetic stores use formulas designed to behave usefully both
27683forwards and backwards:
27684
d7b8e6c6 27685@example
5d67986c 27686@group
d7b8e6c6
EZ
27687s + v := v + a v := a + v
27688s - v := v - a v := a - v
27689s * v := v * a v := a * v
27690s / v := v / a v := a / v
27691s ^ v := v ^ a v := a ^ v
27692s | v := v | a v := a | v
27693s n v := v / (-1) v := (-1) / v
27694s & v := v ^ (-1) v := (-1) ^ v
27695s [ v := v - 1 v := 1 - v
27696s ] v := v - (-1) v := (-1) - v
d7b8e6c6 27697@end group
5d67986c 27698@end example
d7b8e6c6
EZ
27699
27700In the last four cases, a numeric prefix argument will be used in
27701place of the number one. (For example, @kbd{M-2 s ]} increases
27702a variable by 2, and @kbd{M-2 I s ]} replaces a variable by
27703minus-two minus the variable.
27704
27705The first six arithmetic stores can also be typed @kbd{s t +}, @kbd{s t -},
27706etc. The commands @kbd{s s +}, @kbd{s s -}, and so on are analogous
27707arithmetic stores that don't remove the value @cite{a} from the stack.
27708
27709All arithmetic stores report the new value of the variable in the
27710Trail for your information. They signal an error if the variable
27711previously had no stored value. If default simplifications have been
27712turned off, the arithmetic stores temporarily turn them on for numeric
27713arguments only (i.e., they temporarily do an @kbd{m N} command).
27714@xref{Simplification Modes}. Large vectors put in the trail by
27715these commands always use abbreviated (@kbd{t .}) mode.
27716
27717@kindex s m
27718@pindex calc-store-map
27719The @kbd{s m} command is a general way to adjust a variable's value
27720using any Calc function. It is a ``mapping'' command analogous to
27721@kbd{V M}, @kbd{V R}, etc. @xref{Reducing and Mapping}, to see
27722how to specify a function for a mapping command. Basically,
27723all you do is type the Calc command key that would invoke that
27724function normally. For example, @kbd{s m n} applies the @kbd{n}
27725key to negate the contents of the variable, so @kbd{s m n} is
27726equivalent to @kbd{s n}. Also, @kbd{s m Q} takes the square root
27727of the value stored in a variable, @kbd{s m v v} uses @kbd{v v} to
27728reverse the vector stored in the variable, and @kbd{s m H I S}
27729takes the hyperbolic arcsine of the variable contents.
27730
27731If the mapping function takes two or more arguments, the additional
27732arguments are taken from the stack; the old value of the variable
27733is provided as the first argument. Thus @kbd{s m -} with @cite{a}
27734on the stack computes @cite{v - a}, just like @kbd{s -}. With the
27735Inverse prefix, the variable's original value becomes the @emph{last}
27736argument instead of the first. Thus @kbd{I s m -} is also
27737equivalent to @kbd{I s -}.
27738
27739@kindex s x
27740@pindex calc-store-exchange
27741The @kbd{s x} (@code{calc-store-exchange}) command exchanges the value
27742of a variable with the value on the top of the stack. Naturally, the
27743variable must already have a stored value for this to work.
27744
27745You can type an equation or assignment at the @kbd{s x} prompt. The
27746command @kbd{s x a=6} takes no values from the stack; instead, it
27747pushes the old value of @samp{a} on the stack and stores @samp{a = 6}.
27748
27749@kindex s u
27750@pindex calc-unstore
27751@cindex Void variables
27752@cindex Un-storing variables
27753Until you store something in them, variables are ``void,'' that is, they
27754contain no value at all. If they appear in an algebraic formula they
27755will be left alone even if you press @kbd{=} (@code{calc-evaluate}).
27756The @kbd{s u} (@code{calc-unstore}) command returns a variable to the
27757void state.@refill
27758
27759The only variables with predefined values are the ``special constants''
27760@code{pi}, @code{e}, @code{i}, @code{phi}, and @code{gamma}. You are free
27761to unstore these variables or to store new values into them if you like,
27762although some of the algebraic-manipulation functions may assume these
27763variables represent their standard values. Calc displays a warning if
27764you change the value of one of these variables, or of one of the other
27765special variables @code{inf}, @code{uinf}, and @code{nan} (which are
27766normally void).
27767
27768Note that @code{var-pi} doesn't actually have 3.14159265359 stored
27769in it, but rather a special magic value that evaluates to @c{$\pi$}
27770@cite{pi}
27771at the current precision. Likewise @code{var-e}, @code{var-i}, and
27772@code{var-phi} evaluate according to the current precision or polar mode.
27773If you recall a value from @code{pi} and store it back, this magic
27774property will be lost.
27775
27776@kindex s c
27777@pindex calc-copy-variable
27778The @kbd{s c} (@code{calc-copy-variable}) command copies the stored
27779value of one variable to another. It differs from a simple @kbd{s r}
27780followed by an @kbd{s t} in two important ways. First, the value never
27781goes on the stack and thus is never rounded, evaluated, or simplified
27782in any way; it is not even rounded down to the current precision.
27783Second, the ``magic'' contents of a variable like @code{var-e} can
27784be copied into another variable with this command, perhaps because
27785you need to unstore @code{var-e} right now but you wish to put it
27786back when you're done. The @kbd{s c} command is the only way to
27787manipulate these magic values intact.
27788
27789@node Recalling Variables, Operations on Variables, Storing Variables, Store and Recall
27790@section Recalling Variables
27791
27792@noindent
27793@kindex s r
27794@pindex calc-recall
27795@cindex Recalling variables
27796The most straightforward way to extract the stored value from a variable
27797is to use the @kbd{s r} (@code{calc-recall}) command. This command prompts
27798for a variable name (similarly to @code{calc-store}), looks up the value
27799of the specified variable, and pushes that value onto the stack. It is
27800an error to try to recall a void variable.
27801
27802It is also possible to recall the value from a variable by evaluating a
27803formula containing that variable. For example, @kbd{' a @key{RET} =} is
27804the same as @kbd{s r a @key{RET}} except that if the variable is void, the
27805former will simply leave the formula @samp{a} on the stack whereas the
27806latter will produce an error message.
27807
27808@kindex r 0-9
27809The @kbd{r} prefix may be followed by a digit, so that @kbd{r 9} is
27810equivalent to @kbd{s r 9}. (The @kbd{r} prefix is otherwise unused
27811in the current version of Calc.)
27812
27813@node Operations on Variables, Let Command, Recalling Variables, Store and Recall
27814@section Other Operations on Variables
27815
27816@noindent
27817@kindex s e
27818@pindex calc-edit-variable
27819The @kbd{s e} (@code{calc-edit-variable}) command edits the stored
27820value of a variable without ever putting that value on the stack
27821or simplifying or evaluating the value. It prompts for the name of
27822the variable to edit. If the variable has no stored value, the
27823editing buffer will start out empty. If the editing buffer is
0d48e8aa 27824empty when you press @kbd{M-# M-#} to finish, the variable will
d7b8e6c6
EZ
27825be made void. @xref{Editing Stack Entries}, for a general
27826description of editing.
27827
27828The @kbd{s e} command is especially useful for creating and editing
27829rewrite rules which are stored in variables. Sometimes these rules
27830contain formulas which must not be evaluated until the rules are
27831actually used. (For example, they may refer to @samp{deriv(x,y)},
27832where @code{x} will someday become some expression involving @code{y};
27833if you let Calc evaluate the rule while you are defining it, Calc will
27834replace @samp{deriv(x,y)} with 0 because the formula @code{x} does
27835not itself refer to @code{y}.) By contrast, recalling the variable,
27836editing with @kbd{`}, and storing will evaluate the variable's value
27837as a side effect of putting the value on the stack.
27838
27839@kindex s A
27840@kindex s D
5d67986c
RS
27841@ignore
27842@mindex @idots
27843@end ignore
d7b8e6c6 27844@kindex s E
5d67986c
RS
27845@ignore
27846@mindex @null
27847@end ignore
d7b8e6c6 27848@kindex s F
5d67986c
RS
27849@ignore
27850@mindex @null
27851@end ignore
d7b8e6c6 27852@kindex s G
5d67986c
RS
27853@ignore
27854@mindex @null
27855@end ignore
d7b8e6c6 27856@kindex s H
5d67986c
RS
27857@ignore
27858@mindex @null
27859@end ignore
d7b8e6c6 27860@kindex s I
5d67986c
RS
27861@ignore
27862@mindex @null
27863@end ignore
d7b8e6c6 27864@kindex s L
5d67986c
RS
27865@ignore
27866@mindex @null
27867@end ignore
d7b8e6c6 27868@kindex s P
5d67986c
RS
27869@ignore
27870@mindex @null
27871@end ignore
d7b8e6c6 27872@kindex s R
5d67986c
RS
27873@ignore
27874@mindex @null
27875@end ignore
d7b8e6c6 27876@kindex s T
5d67986c
RS
27877@ignore
27878@mindex @null
27879@end ignore
d7b8e6c6 27880@kindex s U
5d67986c
RS
27881@ignore
27882@mindex @null
27883@end ignore
d7b8e6c6
EZ
27884@kindex s X
27885@pindex calc-store-AlgSimpRules
27886@pindex calc-store-Decls
27887@pindex calc-store-EvalRules
27888@pindex calc-store-FitRules
27889@pindex calc-store-GenCount
27890@pindex calc-store-Holidays
27891@pindex calc-store-IntegLimit
27892@pindex calc-store-LineStyles
27893@pindex calc-store-PointStyles
27894@pindex calc-store-PlotRejects
27895@pindex calc-store-TimeZone
27896@pindex calc-store-Units
27897@pindex calc-store-ExtSimpRules
27898There are several special-purpose variable-editing commands that
27899use the @kbd{s} prefix followed by a shifted letter:
27900
27901@table @kbd
27902@item s A
27903Edit @code{AlgSimpRules}. @xref{Algebraic Simplifications}.
27904@item s D
27905Edit @code{Decls}. @xref{Declarations}.
27906@item s E
27907Edit @code{EvalRules}. @xref{Default Simplifications}.
27908@item s F
27909Edit @code{FitRules}. @xref{Curve Fitting}.
27910@item s G
27911Edit @code{GenCount}. @xref{Solving Equations}.
27912@item s H
27913Edit @code{Holidays}. @xref{Business Days}.
27914@item s I
27915Edit @code{IntegLimit}. @xref{Calculus}.
27916@item s L
27917Edit @code{LineStyles}. @xref{Graphics}.
27918@item s P
27919Edit @code{PointStyles}. @xref{Graphics}.
27920@item s R
27921Edit @code{PlotRejects}. @xref{Graphics}.
27922@item s T
27923Edit @code{TimeZone}. @xref{Time Zones}.
27924@item s U
27925Edit @code{Units}. @xref{User-Defined Units}.
27926@item s X
27927Edit @code{ExtSimpRules}. @xref{Unsafe Simplifications}.
27928@end table
27929
27930These commands are just versions of @kbd{s e} that use fixed variable
27931names rather than prompting for the variable name.
27932
27933@kindex s p
27934@pindex calc-permanent-variable
27935@cindex Storing variables
27936@cindex Permanent variables
27937@cindex @file{.emacs} file, veriables
27938The @kbd{s p} (@code{calc-permanent-variable}) command saves a
27939variable's value permanently in your @file{.emacs} file, so that its
27940value will still be available in future Emacs sessions. You can
27941re-execute @w{@kbd{s p}} later on to update the saved value, but the
27942only way to remove a saved variable is to edit your @file{.emacs} file
27943by hand. (@xref{General Mode Commands}, for a way to tell Calc to
27944use a different file instead of @file{.emacs}.)
27945
27946If you do not specify the name of a variable to save (i.e.,
27947@kbd{s p @key{RET}}), all @samp{var-} variables with defined values
27948are saved except for the special constants @code{pi}, @code{e},
27949@code{i}, @code{phi}, and @code{gamma}; the variables @code{TimeZone}
27950and @code{PlotRejects};
27951@code{FitRules}, @code{DistribRules}, and other built-in rewrite
27952rules; and @code{PlotData@var{n}} variables generated
27953by the graphics commands. (You can still save these variables by
27954explicitly naming them in an @kbd{s p} command.)@refill
27955
27956@kindex s i
27957@pindex calc-insert-variables
27958The @kbd{s i} (@code{calc-insert-variables}) command writes
27959the values of all @samp{var-} variables into a specified buffer.
27960The variables are written in the form of Lisp @code{setq} commands
27961which store the values in string form. You can place these commands
27962in your @file{.emacs} buffer if you wish, though in this case it
27963would be easier to use @kbd{s p @key{RET}}. (Note that @kbd{s i}
27964omits the same set of variables as @w{@kbd{s p @key{RET}}}; the difference
27965is that @kbd{s i} will store the variables in any buffer, and it also
27966stores in a more human-readable format.)
27967
27968@node Let Command, Evaluates-To Operator, Operations on Variables, Store and Recall
27969@section The Let Command
27970
27971@noindent
27972@kindex s l
27973@pindex calc-let
27974@cindex Variables, temporary assignment
27975@cindex Temporary assignment to variables
27976If you have an expression like @samp{a+b^2} on the stack and you wish to
27977compute its value where @cite{b=3}, you can simply store 3 in @cite{b} and
27978then press @kbd{=} to reevaluate the formula. This has the side-effect
27979of leaving the stored value of 3 in @cite{b} for future operations.
27980
27981The @kbd{s l} (@code{calc-let}) command evaluates a formula under a
27982@emph{temporary} assignment of a variable. It stores the value on the
27983top of the stack into the specified variable, then evaluates the
27984second-to-top stack entry, then restores the original value (or lack of one)
27985in the variable. Thus after @kbd{'@w{ }a+b^2 @key{RET} 3 s l b @key{RET}},
27986the stack will contain the formula @samp{a + 9}. The subsequent command
27987@kbd{@w{5 s l a} @key{RET}} will replace this formula with the number 14.
27988The variables @samp{a} and @samp{b} are not permanently affected in any way
27989by these commands.
27990
27991The value on the top of the stack may be an equation or assignment, or
27992a vector of equations or assignments, in which case the default will be
27993analogous to the case of @kbd{s t @key{RET}}. @xref{Storing Variables}.
27994
27995Also, you can answer the variable-name prompt with an equation or
5d67986c
RS
27996assignment: @kbd{s l b=3 @key{RET}} is the same as storing 3 on the stack
27997and typing @kbd{s l b @key{RET}}.
d7b8e6c6
EZ
27998
27999The @kbd{a b} (@code{calc-substitute}) command is another way to substitute
28000a variable with a value in a formula. It does an actual substitution
28001rather than temporarily assigning the variable and evaluating. For
28002example, letting @cite{n=2} in @samp{f(n pi)} with @kbd{a b} will
28003produce @samp{f(2 pi)}, whereas @kbd{s l} would give @samp{f(6.28)}
28004since the evaluation step will also evaluate @code{pi}.
28005
28006@node Evaluates-To Operator, , Let Command, Store and Recall
28007@section The Evaluates-To Operator
28008
28009@noindent
28010@tindex evalto
28011@tindex =>
28012@cindex Evaluates-to operator
28013@cindex @samp{=>} operator
28014The special algebraic symbol @samp{=>} is known as the @dfn{evaluates-to
28015operator}. (It will show up as an @code{evalto} function call in
28016other language modes like Pascal and @TeX{}.) This is a binary
28017operator, that is, it has a lefthand and a righthand argument,
28018although it can be entered with the righthand argument omitted.
28019
28020A formula like @samp{@var{a} => @var{b}} is evaluated by Calc as
28021follows: First, @var{a} is not simplified or modified in any
28022way. The previous value of argument @var{b} is thrown away; the
28023formula @var{a} is then copied and evaluated as if by the @kbd{=}
28024command according to all current modes and stored variable values,
28025and the result is installed as the new value of @var{b}.
28026
28027For example, suppose you enter the algebraic formula @samp{2 + 3 => 17}.
28028The number 17 is ignored, and the lefthand argument is left in its
28029unevaluated form; the result is the formula @samp{2 + 3 => 5}.
28030
28031@kindex s =
28032@pindex calc-evalto
28033You can enter an @samp{=>} formula either directly using algebraic
28034entry (in which case the righthand side may be omitted since it is
28035going to be replaced right away anyhow), or by using the @kbd{s =}
28036(@code{calc-evalto}) command, which takes @var{a} from the stack
28037and replaces it with @samp{@var{a} => @var{b}}.
28038
28039Calc keeps track of all @samp{=>} operators on the stack, and
28040recomputes them whenever anything changes that might affect their
28041values, i.e., a mode setting or variable value. This occurs only
28042if the @samp{=>} operator is at the top level of the formula, or
28043if it is part of a top-level vector. In other words, pushing
28044@samp{2 + (a => 17)} will change the 17 to the actual value of
28045@samp{a} when you enter the formula, but the result will not be
28046dynamically updated when @samp{a} is changed later because the
28047@samp{=>} operator is buried inside a sum. However, a vector
28048of @samp{=>} operators will be recomputed, since it is convenient
28049to push a vector like @samp{[a =>, b =>, c =>]} on the stack to
28050make a concise display of all the variables in your problem.
28051(Another way to do this would be to use @samp{[a, b, c] =>},
28052which provides a slightly different format of display. You
28053can use whichever you find easiest to read.)
28054
28055@kindex m C
28056@pindex calc-auto-recompute
28057The @kbd{m C} (@code{calc-auto-recompute}) command allows you to
28058turn this automatic recomputation on or off. If you turn
28059recomputation off, you must explicitly recompute an @samp{=>}
28060operator on the stack in one of the usual ways, such as by
28061pressing @kbd{=}. Turning recomputation off temporarily can save
28062a lot of time if you will be changing several modes or variables
28063before you look at the @samp{=>} entries again.
28064
28065Most commands are not especially useful with @samp{=>} operators
28066as arguments. For example, given @samp{x + 2 => 17}, it won't
28067work to type @kbd{1 +} to get @samp{x + 3 => 18}. If you want
28068to operate on the lefthand side of the @samp{=>} operator on
28069the top of the stack, type @kbd{j 1} (that's the digit ``one'')
28070to select the lefthand side, execute your commands, then type
28071@kbd{j u} to unselect.
28072
28073All current modes apply when an @samp{=>} operator is computed,
28074including the current simplification mode. Recall that the
28075formula @samp{x + y + x} is not handled by Calc's default
28076simplifications, but the @kbd{a s} command will reduce it to
28077the simpler form @samp{y + 2 x}. You can also type @kbd{m A}
28078to enable an algebraic-simplification mode in which the
28079equivalent of @kbd{a s} is used on all of Calc's results.
28080If you enter @samp{x + y + x =>} normally, the result will
28081be @samp{x + y + x => x + y + x}. If you change to
28082algebraic-simplification mode, the result will be
28083@samp{x + y + x => y + 2 x}. However, just pressing @kbd{a s}
28084once will have no effect on @samp{x + y + x => x + y + x},
28085because the righthand side depends only on the lefthand side
28086and the current mode settings, and the lefthand side is not
28087affected by commands like @kbd{a s}.
28088
28089The ``let'' command (@kbd{s l}) has an interesting interaction
28090with the @samp{=>} operator. The @kbd{s l} command evaluates the
28091second-to-top stack entry with the top stack entry supplying
28092a temporary value for a given variable. As you might expect,
28093if that stack entry is an @samp{=>} operator its righthand
28094side will temporarily show this value for the variable. In
28095fact, all @samp{=>}s on the stack will be updated if they refer
28096to that variable. But this change is temporary in the sense
28097that the next command that causes Calc to look at those stack
28098entries will make them revert to the old variable value.
28099
d7b8e6c6 28100@smallexample
5d67986c 28101@group
d7b8e6c6
EZ
281022: a => a 2: a => 17 2: a => a
281031: a + 1 => a + 1 1: a + 1 => 18 1: a + 1 => a + 1
28104 . . .
28105
5d67986c 28106 17 s l a @key{RET} p 8 @key{RET}
d7b8e6c6 28107@end group
5d67986c 28108@end smallexample
d7b8e6c6
EZ
28109
28110Here the @kbd{p 8} command changes the current precision,
28111thus causing the @samp{=>} forms to be recomputed after the
5d67986c 28112influence of the ``let'' is gone. The @kbd{d @key{SPC}} command
d7b8e6c6
EZ
28113(@code{calc-refresh}) is a handy way to force the @samp{=>}
28114operators on the stack to be recomputed without any other
28115side effects.
28116
28117@kindex s :
28118@pindex calc-assign
28119@tindex assign
28120@tindex :=
28121Embedded Mode also uses @samp{=>} operators. In embedded mode,
28122the lefthand side of an @samp{=>} operator can refer to variables
28123assigned elsewhere in the file by @samp{:=} operators. The
28124assignment operator @samp{a := 17} does not actually do anything
28125by itself. But Embedded Mode recognizes it and marks it as a sort
28126of file-local definition of the variable. You can enter @samp{:=}
28127operators in algebraic mode, or by using the @kbd{s :}
28128(@code{calc-assign}) [@code{assign}] command which takes a variable
28129and value from the stack and replaces them with an assignment.
28130
28131@xref{TeX Language Mode}, for the way @samp{=>} appears in
28132@TeX{} language output. The @dfn{eqn} mode gives similar
28133treatment to @samp{=>}.
28134
28135@node Graphics, Kill and Yank, Store and Recall, Top
28136@chapter Graphics
28137
28138@noindent
28139The commands for graphing data begin with the @kbd{g} prefix key. Calc
28140uses GNUPLOT 2.0 or 3.0 to do graphics. These commands will only work
28141if GNUPLOT is available on your system. (While GNUPLOT sounds like
28142a relative of GNU Emacs, it is actually completely unrelated.
28143However, it is free software and can be obtained from the Free
28144Software Foundation's machine @samp{prep.ai.mit.edu}.)
28145
28146@vindex calc-gnuplot-name
28147If you have GNUPLOT installed on your system but Calc is unable to
28148find it, you may need to set the @code{calc-gnuplot-name} variable
28149in your @file{.emacs} file. You may also need to set some Lisp
28150variables to show Calc how to run GNUPLOT on your system; these
28151are described under @kbd{g D} and @kbd{g O} below. If you are
28152using the X window system, Calc will configure GNUPLOT for you
28153automatically. If you have GNUPLOT 3.0 and you are not using X,
28154Calc will configure GNUPLOT to display graphs using simple character
28155graphics that will work on any terminal.
28156
28157@menu
28158* Basic Graphics::
28159* Three Dimensional Graphics::
28160* Managing Curves::
28161* Graphics Options::
28162* Devices::
28163@end menu
28164
28165@node Basic Graphics, Three Dimensional Graphics, Graphics, Graphics
28166@section Basic Graphics
28167
28168@noindent
28169@kindex g f
28170@pindex calc-graph-fast
28171The easiest graphics command is @kbd{g f} (@code{calc-graph-fast}).
28172This command takes two vectors of equal length from the stack.
28173The vector at the top of the stack represents the ``y'' values of
28174the various data points. The vector in the second-to-top position
28175represents the corresponding ``x'' values. This command runs
28176GNUPLOT (if it has not already been started by previous graphing
28177commands) and displays the set of data points. The points will
28178be connected by lines, and there will also be some kind of symbol
28179to indicate the points themselves.
28180
28181The ``x'' entry may instead be an interval form, in which case suitable
28182``x'' values are interpolated between the minimum and maximum values of
28183the interval (whether the interval is open or closed is ignored).
28184
28185The ``x'' entry may also be a number, in which case Calc uses the
28186sequence of ``x'' values @cite{x}, @cite{x+1}, @cite{x+2}, etc.
28187(Generally the number 0 or 1 would be used for @cite{x} in this case.)
28188
28189The ``y'' entry may be any formula instead of a vector. Calc effectively
28190uses @kbd{N} (@code{calc-eval-num}) to evaluate variables in the formula;
28191the result of this must be a formula in a single (unassigned) variable.
28192The formula is plotted with this variable taking on the various ``x''
28193values. Graphs of formulas by default use lines without symbols at the
28194computed data points. Note that if neither ``x'' nor ``y'' is a vector,
28195Calc guesses at a reasonable number of data points to use. See the
28196@kbd{g N} command below. (The ``x'' values must be either a vector
28197or an interval if ``y'' is a formula.)
28198
5d67986c
RS
28199@ignore
28200@starindex
28201@end ignore
d7b8e6c6
EZ
28202@tindex xy
28203If ``y'' is (or evaluates to) a formula of the form
28204@samp{xy(@var{x}, @var{y})} then the result is a
28205parametric plot. The two arguments of the fictitious @code{xy} function
28206are used as the ``x'' and ``y'' coordinates of the curve, respectively.
28207In this case the ``x'' vector or interval you specified is not directly
28208visible in the graph. For example, if ``x'' is the interval @samp{[0..360]}
28209and ``y'' is the formula @samp{xy(sin(t), cos(t))}, the resulting graph
28210will be a circle.@refill
28211
28212Also, ``x'' and ``y'' may each be variable names, in which case Calc
28213looks for suitable vectors, intervals, or formulas stored in those
28214variables.
28215
28216The ``x'' and ``y'' values for the data points (as pulled from the vectors,
28217calculated from the formulas, or interpolated from the intervals) should
28218be real numbers (integers, fractions, or floats). If either the ``x''
28219value or the ``y'' value of a given data point is not a real number, that
28220data point will be omitted from the graph. The points on either side
28221of the invalid point will @emph{not} be connected by a line.
28222
28223See the documentation for @kbd{g a} below for a description of the way
28224numeric prefix arguments affect @kbd{g f}.
28225
28226@cindex @code{PlotRejects} variable
28227@vindex PlotRejects
28228If you store an empty vector in the variable @code{PlotRejects}
28229(i.e., @kbd{[ ] s t PlotRejects}), Calc will append information to
28230this vector for every data point which was rejected because its
28231``x'' or ``y'' values were not real numbers. The result will be
28232a matrix where each row holds the curve number, data point number,
28233``x'' value, and ``y'' value for a rejected data point.
28234@xref{Evaluates-To Operator}, for a handy way to keep tabs on the
28235current value of @code{PlotRejects}. @xref{Operations on Variables},
28236for the @kbd{s R} command which is another easy way to examine
28237@code{PlotRejects}.
28238
28239@kindex g c
28240@pindex calc-graph-clear
28241To clear the graphics display, type @kbd{g c} (@code{calc-graph-clear}).
28242If the GNUPLOT output device is an X window, the window will go away.
28243Effects on other kinds of output devices will vary. You don't need
28244to use @kbd{g c} if you don't want to---if you give another @kbd{g f}
28245or @kbd{g p} command later on, it will reuse the existing graphics
28246window if there is one.
28247
28248@node Three Dimensional Graphics, Managing Curves, Basic Graphics, Graphics
28249@section Three-Dimensional Graphics
28250
28251@kindex g F
28252@pindex calc-graph-fast-3d
28253The @kbd{g F} (@code{calc-graph-fast-3d}) command makes a three-dimensional
28254graph. It works only if you have GNUPLOT 3.0 or later; with GNUPLOT 2.0,
28255you will see a GNUPLOT error message if you try this command.
28256
28257The @kbd{g F} command takes three values from the stack, called ``x'',
28258``y'', and ``z'', respectively. As was the case for 2D graphs, there
28259are several options for these values.
28260
28261In the first case, ``x'' and ``y'' are each vectors (not necessarily of
28262the same length); either or both may instead be interval forms. The
28263``z'' value must be a matrix with the same number of rows as elements
28264in ``x'', and the same number of columns as elements in ``y''. The
28265result is a surface plot where @c{$z_{ij}$}
28266@cite{z_ij} is the height of the point
28267at coordinate @cite{(x_i, y_j)} on the surface. The 3D graph will
28268be displayed from a certain default viewpoint; you can change this
28269viewpoint by adding a @samp{set view} to the @samp{*Gnuplot Commands*}
28270buffer as described later. See the GNUPLOT 3.0 documentation for a
28271description of the @samp{set view} command.
28272
28273Each point in the matrix will be displayed as a dot in the graph,
28274and these points will be connected by a grid of lines (@dfn{isolines}).
28275
28276In the second case, ``x'', ``y'', and ``z'' are all vectors of equal
28277length. The resulting graph displays a 3D line instead of a surface,
28278where the coordinates of points along the line are successive triplets
28279of values from the input vectors.
28280
28281In the third case, ``x'' and ``y'' are vectors or interval forms, and
28282``z'' is any formula involving two variables (not counting variables
28283with assigned values). These variables are sorted into alphabetical
28284order; the first takes on values from ``x'' and the second takes on
28285values from ``y'' to form a matrix of results that are graphed as a
282863D surface.
28287
5d67986c
RS
28288@ignore
28289@starindex
28290@end ignore
d7b8e6c6
EZ
28291@tindex xyz
28292If the ``z'' formula evaluates to a call to the fictitious function
28293@samp{xyz(@var{x}, @var{y}, @var{z})}, then the result is a
28294``parametric surface.'' In this case, the axes of the graph are
28295taken from the @var{x} and @var{y} values in these calls, and the
28296``x'' and ``y'' values from the input vectors or intervals are used only
28297to specify the range of inputs to the formula. For example, plotting
28298@samp{[0..360], [0..180], xyz(sin(x)*sin(y), cos(x)*sin(y), cos(y))}
28299will draw a sphere. (Since the default resolution for 3D plots is
283005 steps in each of ``x'' and ``y'', this will draw a very crude
28301sphere. You could use the @kbd{g N} command, described below, to
28302increase this resolution, or specify the ``x'' and ``y'' values as
28303vectors with more than 5 elements.
28304
28305It is also possible to have a function in a regular @kbd{g f} plot
28306evaluate to an @code{xyz} call. Since @kbd{g f} plots a line, not
28307a surface, the result will be a 3D parametric line. For example,
28308@samp{[[0..720], xyz(sin(x), cos(x), x)]} will plot two turns of a
28309helix (a three-dimensional spiral).
28310
28311As for @kbd{g f}, each of ``x'', ``y'', and ``z'' may instead be
28312variables containing the relevant data.
28313
28314@node Managing Curves, Graphics Options, Three Dimensional Graphics, Graphics
28315@section Managing Curves
28316
28317@noindent
28318The @kbd{g f} command is really shorthand for the following commands:
28319@kbd{C-u g d g a g p}. Likewise, @w{@kbd{g F}} is shorthand for
28320@kbd{C-u g d g A g p}. You can gain more control over your graph
28321by using these commands directly.
28322
28323@kindex g a
28324@pindex calc-graph-add
28325The @kbd{g a} (@code{calc-graph-add}) command adds the ``curve''
28326represented by the two values on the top of the stack to the current
28327graph. You can have any number of curves in the same graph. When
28328you give the @kbd{g p} command, all the curves will be drawn superimposed
28329on the same axes.
28330
28331The @kbd{g a} command (and many others that affect the current graph)
28332will cause a special buffer, @samp{*Gnuplot Commands*}, to be displayed
28333in another window. This buffer is a template of the commands that will
28334be sent to GNUPLOT when it is time to draw the graph. The first
28335@kbd{g a} command adds a @code{plot} command to this buffer. Succeeding
28336@kbd{g a} commands add extra curves onto that @code{plot} command.
28337Other graph-related commands put other GNUPLOT commands into this
28338buffer. In normal usage you never need to work with this buffer
28339directly, but you can if you wish. The only constraint is that there
28340must be only one @code{plot} command, and it must be the last command
28341in the buffer. If you want to save and later restore a complete graph
28342configuration, you can use regular Emacs commands to save and restore
28343the contents of the @samp{*Gnuplot Commands*} buffer.
28344
28345@vindex PlotData1
28346@vindex PlotData2
28347If the values on the stack are not variable names, @kbd{g a} will invent
28348variable names for them (of the form @samp{PlotData@var{n}}) and store
28349the values in those variables. The ``x'' and ``y'' variables are what
28350go into the @code{plot} command in the template. If you add a curve
28351that uses a certain variable and then later change that variable, you
28352can replot the graph without having to delete and re-add the curve.
28353That's because the variable name, not the vector, interval or formula
28354itself, is what was added by @kbd{g a}.
28355
28356A numeric prefix argument on @kbd{g a} or @kbd{g f} changes the way
28357stack entries are interpreted as curves. With a positive prefix
28358argument @cite{n}, the top @cite{n} stack entries are ``y'' values
28359for @cite{n} different curves which share a common ``x'' value in
28360the @cite{n+1}st stack entry. (Thus @kbd{g a} with no prefix
28361argument is equivalent to @kbd{C-u 1 g a}.)
28362
28363A prefix of zero or plain @kbd{C-u} means to take two stack entries,
28364``x'' and ``y'' as usual, but to interpret ``y'' as a vector of
28365``y'' values for several curves that share a common ``x''.
28366
28367A negative prefix argument tells Calc to read @cite{n} vectors from
28368the stack; each vector @cite{[x, y]} describes an independent curve.
28369This is the only form of @kbd{g a} that creates several curves at once
28370that don't have common ``x'' values. (Of course, the range of ``x''
28371values covered by all the curves ought to be roughly the same if
28372they are to look nice on the same graph.)
28373
28374For example, to plot @c{$\sin n x$}
28375@cite{sin(n x)} for integers @cite{n}
28376from 1 to 5, you could use @kbd{v x} to create a vector of integers
28377(@cite{n}), then @kbd{V M '} or @kbd{V M $} to map @samp{sin(n x)}
28378across this vector. The resulting vector of formulas is suitable
28379for use as the ``y'' argument to a @kbd{C-u g a} or @kbd{C-u g f}
28380command.
28381
28382@kindex g A
28383@pindex calc-graph-add-3d
28384The @kbd{g A} (@code{calc-graph-add-3d}) command adds a 3D curve
28385to the graph. It is not legal to intermix 2D and 3D curves in a
28386single graph. This command takes three arguments, ``x'', ``y'',
28387and ``z'', from the stack. With a positive prefix @cite{n}, it
28388takes @cite{n+2} arguments (common ``x'' and ``y'', plus @cite{n}
28389separate ``z''s). With a zero prefix, it takes three stack entries
28390but the ``z'' entry is a vector of curve values. With a negative
28391prefix @cite{-n}, it takes @cite{n} vectors of the form @cite{[x, y, z]}.
28392The @kbd{g A} command works by adding a @code{splot} (surface-plot)
28393command to the @samp{*Gnuplot Commands*} buffer.
28394
28395(Although @kbd{g a} adds a 2D @code{plot} command to the
28396@samp{*Gnuplot Commands*} buffer, Calc changes this to @code{splot}
28397before sending it to GNUPLOT if it notices that the data points are
28398evaluating to @code{xyz} calls. It will not work to mix 2D and 3D
28399@kbd{g a} curves in a single graph, although Calc does not currently
28400check for this.)
28401
28402@kindex g d
28403@pindex calc-graph-delete
28404The @kbd{g d} (@code{calc-graph-delete}) command deletes the most
28405recently added curve from the graph. It has no effect if there are
28406no curves in the graph. With a numeric prefix argument of any kind,
28407it deletes all of the curves from the graph.
28408
28409@kindex g H
28410@pindex calc-graph-hide
28411The @kbd{g H} (@code{calc-graph-hide}) command ``hides'' or ``unhides''
28412the most recently added curve. A hidden curve will not appear in
28413the actual plot, but information about it such as its name and line and
28414point styles will be retained.
28415
28416@kindex g j
28417@pindex calc-graph-juggle
28418The @kbd{g j} (@code{calc-graph-juggle}) command moves the curve
28419at the end of the list (the ``most recently added curve'') to the
28420front of the list. The next-most-recent curve is thus exposed for
28421@w{@kbd{g d}} or similar commands to use. With @kbd{g j} you can work
28422with any curve in the graph even though curve-related commands only
28423affect the last curve in the list.
28424
28425@kindex g p
28426@pindex calc-graph-plot
28427The @kbd{g p} (@code{calc-graph-plot}) command uses GNUPLOT to draw
28428the graph described in the @samp{*Gnuplot Commands*} buffer. Any
28429GNUPLOT parameters which are not defined by commands in this buffer
28430are reset to their default values. The variables named in the @code{plot}
28431command are written to a temporary data file and the variable names
28432are then replaced by the file name in the template. The resulting
28433plotting commands are fed to the GNUPLOT program. See the documentation
28434for the GNUPLOT program for more specific information. All temporary
28435files are removed when Emacs or GNUPLOT exits.
28436
28437If you give a formula for ``y'', Calc will remember all the values that
28438it calculates for the formula so that later plots can reuse these values.
28439Calc throws out these saved values when you change any circumstances
28440that may affect the data, such as switching from Degrees to Radians
28441mode, or changing the value of a parameter in the formula. You can
28442force Calc to recompute the data from scratch by giving a negative
28443numeric prefix argument to @kbd{g p}.
28444
28445Calc uses a fairly rough step size when graphing formulas over intervals.
28446This is to ensure quick response. You can ``refine'' a plot by giving
28447a positive numeric prefix argument to @kbd{g p}. Calc goes through
28448the data points it has computed and saved from previous plots of the
28449function, and computes and inserts a new data point midway between
28450each of the existing points. You can refine a plot any number of times,
28451but beware that the amount of calculation involved doubles each time.
28452
28453Calc does not remember computed values for 3D graphs. This means the
28454numerix prefix argument, if any, to @kbd{g p} is effectively ignored if
28455the current graph is three-dimensional.
28456
28457@kindex g P
28458@pindex calc-graph-print
28459The @kbd{g P} (@code{calc-graph-print}) command is like @kbd{g p},
28460except that it sends the output to a printer instead of to the
28461screen. More precisely, @kbd{g p} looks for @samp{set terminal}
28462or @samp{set output} commands in the @samp{*Gnuplot Commands*} buffer;
28463lacking these it uses the default settings. However, @kbd{g P}
28464ignores @samp{set terminal} and @samp{set output} commands and
28465uses a different set of default values. All of these values are
28466controlled by the @kbd{g D} and @kbd{g O} commands discussed below.
28467Provided everything is set up properly, @kbd{g p} will plot to
28468the screen unless you have specified otherwise and @kbd{g P} will
28469always plot to the printer.
28470
28471@node Graphics Options, Devices, Managing Curves, Graphics
28472@section Graphics Options
28473
28474@noindent
28475@kindex g g
28476@pindex calc-graph-grid
28477The @kbd{g g} (@code{calc-graph-grid}) command turns the ``grid''
28478on and off. It is off by default; tick marks appear only at the
28479edges of the graph. With the grid turned on, dotted lines appear
28480across the graph at each tick mark. Note that this command only
28481changes the setting in @samp{*Gnuplot Commands*}; to see the effects
28482of the change you must give another @kbd{g p} command.
28483
28484@kindex g b
28485@pindex calc-graph-border
28486The @kbd{g b} (@code{calc-graph-border}) command turns the border
28487(the box that surrounds the graph) on and off. It is on by default.
28488This command will only work with GNUPLOT 3.0 and later versions.
28489
28490@kindex g k
28491@pindex calc-graph-key
28492The @kbd{g k} (@code{calc-graph-key}) command turns the ``key''
28493on and off. The key is a chart in the corner of the graph that
28494shows the correspondence between curves and line styles. It is
28495off by default, and is only really useful if you have several
28496curves on the same graph.
28497
28498@kindex g N
28499@pindex calc-graph-num-points
28500The @kbd{g N} (@code{calc-graph-num-points}) command allows you
28501to select the number of data points in the graph. This only affects
28502curves where neither ``x'' nor ``y'' is specified as a vector.
28503Enter a blank line to revert to the default value (initially 15).
28504With no prefix argument, this command affects only the current graph.
28505With a positive prefix argument this command changes or, if you enter
28506a blank line, displays the default number of points used for all
28507graphs created by @kbd{g a} that don't specify the resolution explicitly.
28508With a negative prefix argument, this command changes or displays
28509the default value (initially 5) used for 3D graphs created by @kbd{g A}.
28510Note that a 3D setting of 5 means that a total of @cite{5^2 = 25} points
28511will be computed for the surface.
28512
28513Data values in the graph of a function are normally computed to a
28514precision of five digits, regardless of the current precision at the
28515time. This is usually more than adequate, but there are cases where
28516it will not be. For example, plotting @cite{1 + x} with @cite{x} in the
28517interval @samp{[0 ..@: 1e-6]} will round all the data points down
28518to 1.0! Putting the command @samp{set precision @var{n}} in the
28519@samp{*Gnuplot Commands*} buffer will cause the data to be computed
28520at precision @var{n} instead of 5. Since this is such a rare case,
28521there is no keystroke-based command to set the precision.
28522
28523@kindex g h
28524@pindex calc-graph-header
28525The @kbd{g h} (@code{calc-graph-header}) command sets the title
28526for the graph. This will show up centered above the graph.
28527The default title is blank (no title).
28528
28529@kindex g n
28530@pindex calc-graph-name
28531The @kbd{g n} (@code{calc-graph-name}) command sets the title of an
28532individual curve. Like the other curve-manipulating commands, it
28533affects the most recently added curve, i.e., the last curve on the
28534list in the @samp{*Gnuplot Commands*} buffer. To set the title of
28535the other curves you must first juggle them to the end of the list
28536with @kbd{g j}, or edit the @samp{*Gnuplot Commands*} buffer by hand.
28537Curve titles appear in the key; if the key is turned off they are
28538not used.
28539
28540@kindex g t
28541@kindex g T
28542@pindex calc-graph-title-x
28543@pindex calc-graph-title-y
28544The @kbd{g t} (@code{calc-graph-title-x}) and @kbd{g T}
28545(@code{calc-graph-title-y}) commands set the titles on the ``x''
28546and ``y'' axes, respectively. These titles appear next to the
28547tick marks on the left and bottom edges of the graph, respectively.
28548Calc does not have commands to control the tick marks themselves,
28549but you can edit them into the @samp{*Gnuplot Commands*} buffer if
28550you wish. See the GNUPLOT documentation for details.
28551
28552@kindex g r
28553@kindex g R
28554@pindex calc-graph-range-x
28555@pindex calc-graph-range-y
28556The @kbd{g r} (@code{calc-graph-range-x}) and @kbd{g R}
28557(@code{calc-graph-range-y}) commands set the range of values on the
28558``x'' and ``y'' axes, respectively. You are prompted to enter a
28559suitable range. This should be either a pair of numbers of the
28560form, @samp{@var{min}:@var{max}}, or a blank line to revert to the
28561default behavior of setting the range based on the range of values
28562in the data, or @samp{$} to take the range from the top of the stack.
28563Ranges on the stack can be represented as either interval forms or
28564vectors: @samp{[@var{min} ..@: @var{max}]} or @samp{[@var{min}, @var{max}]}.
28565
28566@kindex g l
28567@kindex g L
28568@pindex calc-graph-log-x
28569@pindex calc-graph-log-y
28570The @kbd{g l} (@code{calc-graph-log-x}) and @kbd{g L} (@code{calc-graph-log-y})
28571commands allow you to set either or both of the axes of the graph to
28572be logarithmic instead of linear.
28573
28574@kindex g C-l
28575@kindex g C-r
28576@kindex g C-t
28577@pindex calc-graph-log-z
28578@pindex calc-graph-range-z
28579@pindex calc-graph-title-z
28580For 3D plots, @kbd{g C-t}, @kbd{g C-r}, and @kbd{g C-l} (those are
28581letters with the Control key held down) are the corresponding commands
28582for the ``z'' axis.
28583
28584@kindex g z
28585@kindex g Z
28586@pindex calc-graph-zero-x
28587@pindex calc-graph-zero-y
28588The @kbd{g z} (@code{calc-graph-zero-x}) and @kbd{g Z}
28589(@code{calc-graph-zero-y}) commands control whether a dotted line is
28590drawn to indicate the ``x'' and/or ``y'' zero axes. (These are the same
28591dotted lines that would be drawn there anyway if you used @kbd{g g} to
28592turn the ``grid'' feature on.) Zero-axis lines are on by default, and
28593may be turned off only in GNUPLOT 3.0 and later versions. They are
28594not available for 3D plots.
28595
28596@kindex g s
28597@pindex calc-graph-line-style
28598The @kbd{g s} (@code{calc-graph-line-style}) command turns the connecting
28599lines on or off for the most recently added curve, and optionally selects
28600the style of lines to be used for that curve. Plain @kbd{g s} simply
28601toggles the lines on and off. With a numeric prefix argument, @kbd{g s}
28602turns lines on and sets a particular line style. Line style numbers
28603start at one and their meanings vary depending on the output device.
28604GNUPLOT guarantees that there will be at least six different line styles
28605available for any device.
28606
28607@kindex g S
28608@pindex calc-graph-point-style
28609The @kbd{g S} (@code{calc-graph-point-style}) command similarly turns
28610the symbols at the data points on or off, or sets the point style.
28611If you turn both lines and points off, the data points will show as
28612tiny dots.
28613
28614@cindex @code{LineStyles} variable
28615@cindex @code{PointStyles} variable
28616@vindex LineStyles
28617@vindex PointStyles
28618Another way to specify curve styles is with the @code{LineStyles} and
28619@code{PointStyles} variables. These variables initially have no stored
28620values, but if you store a vector of integers in one of these variables,
28621the @kbd{g a} and @kbd{g f} commands will use those style numbers
28622instead of the defaults for new curves that are added to the graph.
28623An entry should be a positive integer for a specific style, or 0 to let
28624the style be chosen automatically, or @i{-1} to turn off lines or points
28625altogether. If there are more curves than elements in the vector, the
28626last few curves will continue to have the default styles. Of course,
28627you can later use @kbd{g s} and @kbd{g S} to change any of these styles.
28628
5d67986c 28629For example, @kbd{'[2 -1 3] @key{RET} s t LineStyles} causes the first curve
d7b8e6c6
EZ
28630to have lines in style number 2, the second curve to have no connecting
28631lines, and the third curve to have lines in style 3. Point styles will
28632still be assigned automatically, but you could store another vector in
28633@code{PointStyles} to define them, too.
28634
28635@node Devices, , Graphics Options, Graphics
28636@section Graphical Devices
28637
28638@noindent
28639@kindex g D
28640@pindex calc-graph-device
28641The @kbd{g D} (@code{calc-graph-device}) command sets the device name
28642(or ``terminal name'' in GNUPLOT lingo) to be used by @kbd{g p} commands
28643on this graph. It does not affect the permanent default device name.
28644If you enter a blank name, the device name reverts to the default.
28645Enter @samp{?} to see a list of supported devices.
28646
28647With a positive numeric prefix argument, @kbd{g D} instead sets
28648the default device name, used by all plots in the future which do
28649not override it with a plain @kbd{g D} command. If you enter a
28650blank line this command shows you the current default. The special
28651name @code{default} signifies that Calc should choose @code{x11} if
28652the X window system is in use (as indicated by the presence of a
28653@code{DISPLAY} environment variable), or otherwise @code{dumb} under
28654GNUPLOT 3.0 and later, or @code{postscript} under GNUPLOT 2.0.
28655This is the initial default value.
28656
28657The @code{dumb} device is an interface to ``dumb terminals,'' i.e.,
28658terminals with no special graphics facilities. It writes a crude
28659picture of the graph composed of characters like @code{-} and @code{|}
28660to a buffer called @samp{*Gnuplot Trail*}, which Calc then displays.
28661The graph is made the same size as the Emacs screen, which on most
28662dumb terminals will be @c{$80\times24$}
28663@asis{80x24} characters. The graph is displayed in
28664an Emacs ``recursive edit''; type @kbd{q} or @kbd{M-# M-#} to exit
28665the recursive edit and return to Calc. Note that the @code{dumb}
28666device is present only in GNUPLOT 3.0 and later versions.
28667
28668The word @code{dumb} may be followed by two numbers separated by
28669spaces. These are the desired width and height of the graph in
28670characters. Also, the device name @code{big} is like @code{dumb}
28671but creates a graph four times the width and height of the Emacs
28672screen. You will then have to scroll around to view the entire
28673graph. In the @samp{*Gnuplot Trail*} buffer, @key{SPC}, @key{DEL},
28674@kbd{<}, and @kbd{>} are defined to scroll by one screenful in each
28675of the four directions.
28676
28677With a negative numeric prefix argument, @kbd{g D} sets or displays
28678the device name used by @kbd{g P} (@code{calc-graph-print}). This
28679is initially @code{postscript}. If you don't have a PostScript
28680printer, you may decide once again to use @code{dumb} to create a
28681plot on any text-only printer.
28682
28683@kindex g O
28684@pindex calc-graph-output
28685The @kbd{g O} (@code{calc-graph-output}) command sets the name of
28686the output file used by GNUPLOT. For some devices, notably @code{x11},
28687there is no output file and this information is not used. Many other
28688``devices'' are really file formats like @code{postscript}; in these
28689cases the output in the desired format goes into the file you name
5d67986c 28690with @kbd{g O}. Type @kbd{g O stdout @key{RET}} to set GNUPLOT to write
d7b8e6c6
EZ
28691to its standard output stream, i.e., to @samp{*Gnuplot Trail*}.
28692This is the default setting.
28693
28694Another special output name is @code{tty}, which means that GNUPLOT
28695is going to write graphics commands directly to its standard output,
28696which you wish Emacs to pass through to your terminal. Tektronix
28697graphics terminals, among other devices, operate this way. Calc does
28698this by telling GNUPLOT to write to a temporary file, then running a
28699sub-shell executing the command @samp{cat tempfile >/dev/tty}. On
28700typical Unix systems, this will copy the temporary file directly to
28701the terminal, bypassing Emacs entirely. You will have to type @kbd{C-l}
28702to Emacs afterwards to refresh the screen.
28703
28704Once again, @kbd{g O} with a positive or negative prefix argument
28705sets the default or printer output file names, respectively. In each
28706case you can specify @code{auto}, which causes Calc to invent a temporary
28707file name for each @kbd{g p} (or @kbd{g P}) command. This temporary file
28708will be deleted once it has been displayed or printed. If the output file
28709name is not @code{auto}, the file is not automatically deleted.
28710
28711The default and printer devices and output files can be saved
28712permanently by the @kbd{m m} (@code{calc-save-modes}) command. The
28713default number of data points (see @kbd{g N}) and the X geometry
28714(see @kbd{g X}) are also saved. Other graph information is @emph{not}
28715saved; you can save a graph's configuration simply by saving the contents
28716of the @samp{*Gnuplot Commands*} buffer.
28717
28718@vindex calc-gnuplot-plot-command
28719@vindex calc-gnuplot-default-device
28720@vindex calc-gnuplot-default-output
28721@vindex calc-gnuplot-print-command
28722@vindex calc-gnuplot-print-device
28723@vindex calc-gnuplot-print-output
28724If you are installing Calc you may wish to configure the default and
28725printer devices and output files for the whole system. The relevant
28726Lisp variables are @code{calc-gnuplot-default-device} and @code{-output},
28727and @code{calc-gnuplot-print-device} and @code{-output}. The output
28728file names must be either strings as described above, or Lisp
28729expressions which are evaluated on the fly to get the output file names.
28730
28731Other important Lisp variables are @code{calc-gnuplot-plot-command} and
28732@code{calc-gnuplot-print-command}, which give the system commands to
28733display or print the output of GNUPLOT, respectively. These may be
28734@code{nil} if no command is necessary, or strings which can include
28735@samp{%s} to signify the name of the file to be displayed or printed.
28736Or, these variables may contain Lisp expressions which are evaluated
28737to display or print the output.
28738
28739@kindex g x
28740@pindex calc-graph-display
28741The @kbd{g x} (@code{calc-graph-display}) command lets you specify
28742on which X window system display your graphs should be drawn. Enter
28743a blank line to see the current display name. This command has no
28744effect unless the current device is @code{x11}.
28745
28746@kindex g X
28747@pindex calc-graph-geometry
28748The @kbd{g X} (@code{calc-graph-geometry}) command is a similar
28749command for specifying the position and size of the X window.
28750The normal value is @code{default}, which generally means your
28751window manager will let you place the window interactively.
28752Entering @samp{800x500+0+0} would create an 800-by-500 pixel
28753window in the upper-left corner of the screen.
28754
28755The buffer called @samp{*Gnuplot Trail*} holds a transcript of the
28756session with GNUPLOT. This shows the commands Calc has ``typed'' to
28757GNUPLOT and the responses it has received. Calc tries to notice when an
28758error message has appeared here and display the buffer for you when
28759this happens. You can check this buffer yourself if you suspect
28760something has gone wrong.
28761
28762@kindex g C
28763@pindex calc-graph-command
28764The @kbd{g C} (@code{calc-graph-command}) command prompts you to
28765enter any line of text, then simply sends that line to the current
28766GNUPLOT process. The @samp{*Gnuplot Trail*} buffer looks deceptively
28767like a Shell buffer but you can't type commands in it yourself.
28768Instead, you must use @kbd{g C} for this purpose.
28769
28770@kindex g v
28771@kindex g V
28772@pindex calc-graph-view-commands
28773@pindex calc-graph-view-trail
28774The @kbd{g v} (@code{calc-graph-view-commands}) and @kbd{g V}
28775(@code{calc-graph-view-trail}) commands display the @samp{*Gnuplot Commands*}
28776and @samp{*Gnuplot Trail*} buffers, respectively, in another window.
28777This happens automatically when Calc thinks there is something you
28778will want to see in either of these buffers. If you type @kbd{g v}
28779or @kbd{g V} when the relevant buffer is already displayed, the
28780buffer is hidden again.
28781
28782One reason to use @kbd{g v} is to add your own commands to the
28783@samp{*Gnuplot Commands*} buffer. Press @kbd{g v}, then use
28784@kbd{C-x o} to switch into that window. For example, GNUPLOT has
28785@samp{set label} and @samp{set arrow} commands that allow you to
28786annotate your plots. Since Calc doesn't understand these commands,
28787you have to add them to the @samp{*Gnuplot Commands*} buffer
28788yourself, then use @w{@kbd{g p}} to replot using these new commands. Note
28789that your commands must appear @emph{before} the @code{plot} command.
28790To get help on any GNUPLOT feature, type, e.g., @kbd{g C help set label}.
5d67986c 28791You may have to type @kbd{g C @key{RET}} a few times to clear the
d7b8e6c6
EZ
28792``press return for more'' or ``subtopic of @dots{}'' requests.
28793Note that Calc always sends commands (like @samp{set nolabel}) to
28794reset all plotting parameters to the defaults before each plot, so
28795to delete a label all you need to do is delete the @samp{set label}
28796line you added (or comment it out with @samp{#}) and then replot
28797with @kbd{g p}.
28798
28799@kindex g q
28800@pindex calc-graph-quit
28801You can use @kbd{g q} (@code{calc-graph-quit}) to kill the GNUPLOT
28802process that is running. The next graphing command you give will
28803start a fresh GNUPLOT process. The word @samp{Graph} appears in
28804the Calc window's mode line whenever a GNUPLOT process is currently
28805running. The GNUPLOT process is automatically killed when you
28806exit Emacs if you haven't killed it manually by then.
28807
28808@kindex g K
28809@pindex calc-graph-kill
28810The @kbd{g K} (@code{calc-graph-kill}) command is like @kbd{g q}
28811except that it also views the @samp{*Gnuplot Trail*} buffer so that
28812you can see the process being killed. This is better if you are
28813killing GNUPLOT because you think it has gotten stuck.
28814
28815@node Kill and Yank, Keypad Mode, Graphics, Top
28816@chapter Kill and Yank Functions
28817
28818@noindent
28819The commands in this chapter move information between the Calculator and
28820other Emacs editing buffers.
28821
28822In many cases Embedded Mode is an easier and more natural way to
28823work with Calc from a regular editing buffer. @xref{Embedded Mode}.
28824
28825@menu
28826* Killing From Stack::
28827* Yanking Into Stack::
28828* Grabbing From Buffers::
28829* Yanking Into Buffers::
28830* X Cut and Paste::
28831@end menu
28832
28833@node Killing From Stack, Yanking Into Stack, Kill and Yank, Kill and Yank
28834@section Killing from the Stack
28835
28836@noindent
28837@kindex C-k
28838@pindex calc-kill
28839@kindex M-k
28840@pindex calc-copy-as-kill
28841@kindex C-w
28842@pindex calc-kill-region
28843@kindex M-w
28844@pindex calc-copy-region-as-kill
28845@cindex Kill ring
28846@dfn{Kill} commands are Emacs commands that insert text into the
28847``kill ring,'' from which it can later be ``yanked'' by a @kbd{C-y}
28848command. Three common kill commands in normal Emacs are @kbd{C-k}, which
28849kills one line, @kbd{C-w}, which kills the region between mark and point,
28850and @kbd{M-w}, which puts the region into the kill ring without actually
28851deleting it. All of these commands work in the Calculator, too. Also,
28852@kbd{M-k} has been provided to complete the set; it puts the current line
28853into the kill ring without deleting anything.
28854
28855The kill commands are unusual in that they pay attention to the location
28856of the cursor in the Calculator buffer. If the cursor is on or below the
28857bottom line, the kill commands operate on the top of the stack. Otherwise,
28858they operate on whatever stack element the cursor is on. Calc's kill
28859commands always operate on whole stack entries. (They act the same as their
28860standard Emacs cousins except they ``round up'' the specified region to
28861encompass full lines.) The text is copied into the kill ring exactly as
28862it appears on the screen, including line numbers if they are enabled.
28863
28864A numeric prefix argument to @kbd{C-k} or @kbd{M-k} affects the number
28865of lines killed. A positive argument kills the current line and @cite{n-1}
28866lines below it. A negative argument kills the @cite{-n} lines above the
28867current line. Again this mirrors the behavior of the standard Emacs
28868@kbd{C-k} command. Although a whole line is always deleted, @kbd{C-k}
28869with no argument copies only the number itself into the kill ring, whereas
28870@kbd{C-k} with a prefix argument of 1 copies the number with its trailing
28871newline.
28872
28873@node Yanking Into Stack, Grabbing From Buffers, Killing From Stack, Kill and Yank
28874@section Yanking into the Stack
28875
28876@noindent
28877@kindex C-y
28878@pindex calc-yank
28879The @kbd{C-y} command yanks the most recently killed text back into the
28880Calculator. It pushes this value onto the top of the stack regardless of
28881the cursor position. In general it re-parses the killed text as a number
28882or formula (or a list of these separated by commas or newlines). However if
28883the thing being yanked is something that was just killed from the Calculator
28884itself, its full internal structure is yanked. For example, if you have
28885set the floating-point display mode to show only four significant digits,
28886then killing and re-yanking 3.14159 (which displays as 3.142) will yank the
28887full 3.14159, even though yanking it into any other buffer would yank the
28888number in its displayed form, 3.142. (Since the default display modes
28889show all objects to their full precision, this feature normally makes no
28890difference.)
28891
28892@node Grabbing From Buffers, Yanking Into Buffers, Yanking Into Stack, Kill and Yank
28893@section Grabbing from Other Buffers
28894
28895@noindent
28896@kindex M-# g
28897@pindex calc-grab-region
28898The @kbd{M-# g} (@code{calc-grab-region}) command takes the text between
28899point and mark in the current buffer and attempts to parse it as a
28900vector of values. Basically, it wraps the text in vector brackets
28901@samp{[ ]} unless the text already is enclosed in vector brackets,
28902then reads the text as if it were an algebraic entry. The contents
28903of the vector may be numbers, formulas, or any other Calc objects.
28904If the @kbd{M-# g} command works successfully, it does an automatic
28905@kbd{M-# c} to enter the Calculator buffer.
28906
28907A numeric prefix argument grabs the specified number of lines around
28908point, ignoring the mark. A positive prefix grabs from point to the
28909@cite{n}th following newline (so that @kbd{M-1 M-# g} grabs from point
28910to the end of the current line); a negative prefix grabs from point
28911back to the @cite{n+1}st preceding newline. In these cases the text
28912that is grabbed is exactly the same as the text that @kbd{C-k} would
28913delete given that prefix argument.
28914
28915A prefix of zero grabs the current line; point may be anywhere on the
28916line.
28917
28918A plain @kbd{C-u} prefix interprets the region between point and mark
28919as a single number or formula rather than a vector. For example,
28920@kbd{M-# g} on the text @samp{2 a b} produces the vector of three
28921values @samp{[2, a, b]}, but @kbd{C-u M-# g} on the same region
28922reads a formula which is a product of three things: @samp{2 a b}.
28923(The text @samp{a + b}, on the other hand, will be grabbed as a
28924vector of one element by plain @kbd{M-# g} because the interpretation
28925@samp{[a, +, b]} would be a syntax error.)
28926
28927If a different language has been specified (@pxref{Language Modes}),
28928the grabbed text will be interpreted according to that language.
28929
28930@kindex M-# r
28931@pindex calc-grab-rectangle
28932The @kbd{M-# r} (@code{calc-grab-rectangle}) command takes the text between
28933point and mark and attempts to parse it as a matrix. If point and mark
28934are both in the leftmost column, the lines in between are parsed in their
28935entirety. Otherwise, point and mark define the corners of a rectangle
28936whose contents are parsed.
28937
28938Each line of the grabbed area becomes a row of the matrix. The result
28939will actually be a vector of vectors, which Calc will treat as a matrix
28940only if every row contains the same number of values.
28941
28942If a line contains a portion surrounded by square brackets (or curly
28943braces), that portion is interpreted as a vector which becomes a row
28944of the matrix. Any text surrounding the bracketed portion on the line
28945is ignored.
28946
28947Otherwise, the entire line is interpreted as a row vector as if it
28948were surrounded by square brackets. Leading line numbers (in the
28949format used in the Calc stack buffer) are ignored. If you wish to
28950force this interpretation (even if the line contains bracketed
28951portions), give a negative numeric prefix argument to the
28952@kbd{M-# r} command.
28953
28954If you give a numeric prefix argument of zero or plain @kbd{C-u}, each
28955line is instead interpreted as a single formula which is converted into
28956a one-element vector. Thus the result of @kbd{C-u M-# r} will be a
28957one-column matrix. For example, suppose one line of the data is the
28958expression @samp{2 a}. A plain @w{@kbd{M-# r}} will interpret this as
28959@samp{[2 a]}, which in turn is read as a two-element vector that forms
28960one row of the matrix. But a @kbd{C-u M-# r} will interpret this row
28961as @samp{[2*a]}.
28962
28963If you give a positive numeric prefix argument @var{n}, then each line
28964will be split up into columns of width @var{n}; each column is parsed
28965separately as a matrix element. If a line contained
28966@w{@samp{2 +/- 3 4 +/- 5}}, then grabbing with a prefix argument of 8
28967would correctly split the line into two error forms.@refill
28968
28969@xref{Matrix Functions}, to see how to pull the matrix apart into its
28970constituent rows and columns. (If it is a @c{$1\times1$}
28971@asis{1x1} matrix, just hit @kbd{v u}
28972(@code{calc-unpack}) twice.)
28973
28974@kindex M-# :
28975@kindex M-# _
28976@pindex calc-grab-sum-across
28977@pindex calc-grab-sum-down
28978@cindex Summing rows and columns of data
28979The @kbd{M-# :} (@code{calc-grab-sum-down}) command is a handy way to
28980grab a rectangle of data and sum its columns. It is equivalent to
28981typing @kbd{M-# r}, followed by @kbd{V R : +} (the vector reduction
28982command that sums the columns of a matrix; @pxref{Reducing}). The
28983result of the command will be a vector of numbers, one for each column
28984in the input data. The @kbd{M-# _} (@code{calc-grab-sum-across}) command
28985similarly grabs a rectangle and sums its rows by executing @w{@kbd{V R _ +}}.
28986
28987As well as being more convenient, @kbd{M-# :} and @kbd{M-# _} are also
28988much faster because they don't actually place the grabbed vector on
28989the stack. In a @kbd{M-# r V R : +} sequence, formatting the vector
28990for display on the stack takes a large fraction of the total time
28991(unless you have planned ahead and used @kbd{v .} and @kbd{t .} modes).
28992
28993For example, suppose we have a column of numbers in a file which we
28994wish to sum. Go to one corner of the column and press @kbd{C-@@} to
28995set the mark; go to the other corner and type @kbd{M-# :}. Since there
28996is only one column, the result will be a vector of one number, the sum.
28997(You can type @kbd{v u} to unpack this vector into a plain number if
28998you want to do further arithmetic with it.)
28999
29000To compute the product of the column of numbers, we would have to do
29001it ``by hand'' since there's no special grab-and-multiply command.
29002Use @kbd{M-# r} to grab the column of numbers into the calculator in
29003the form of a column matrix. The statistics command @kbd{u *} is a
29004handy way to find the product of a vector or matrix of numbers.
29005@xref{Statistical Operations}. Another approach would be to use
29006an explicit column reduction command, @kbd{V R : *}.
29007
29008@node Yanking Into Buffers, X Cut and Paste, Grabbing From Buffers, Kill and Yank
29009@section Yanking into Other Buffers
29010
29011@noindent
29012@kindex y
29013@pindex calc-copy-to-buffer
29014The plain @kbd{y} (@code{calc-copy-to-buffer}) command inserts the number
29015at the top of the stack into the most recently used normal editing buffer.
29016(More specifically, this is the most recently used buffer which is displayed
29017in a window and whose name does not begin with @samp{*}. If there is no
29018such buffer, this is the most recently used buffer except for Calculator
29019and Calc Trail buffers.) The number is inserted exactly as it appears and
29020without a newline. (If line-numbering is enabled, the line number is
29021normally not included.) The number is @emph{not} removed from the stack.
29022
29023With a prefix argument, @kbd{y} inserts several numbers, one per line.
29024A positive argument inserts the specified number of values from the top
29025of the stack. A negative argument inserts the @cite{n}th value from the
29026top of the stack. An argument of zero inserts the entire stack. Note
29027that @kbd{y} with an argument of 1 is slightly different from @kbd{y}
29028with no argument; the former always copies full lines, whereas the
29029latter strips off the trailing newline.
29030
29031With a lone @kbd{C-u} as a prefix argument, @kbd{y} @emph{replaces} the
29032region in the other buffer with the yanked text, then quits the
29033Calculator, leaving you in that buffer. A typical use would be to use
29034@kbd{M-# g} to read a region of data into the Calculator, operate on the
29035data to produce a new matrix, then type @kbd{C-u y} to replace the
29036original data with the new data. One might wish to alter the matrix
29037display style (@pxref{Vector and Matrix Formats}) or change the current
29038display language (@pxref{Language Modes}) before doing this. Also, note
29039that this command replaces a linear region of text (as grabbed by
29040@kbd{M-# g}), not a rectangle (as grabbed by @kbd{M-# r}).@refill
29041
29042If the editing buffer is in overwrite (as opposed to insert) mode,
29043and the @kbd{C-u} prefix was not used, then the yanked number will
29044overwrite the characters following point rather than being inserted
29045before those characters. The usual conventions of overwrite mode
29046are observed; for example, characters will be inserted at the end of
29047a line rather than overflowing onto the next line. Yanking a multi-line
29048object such as a matrix in overwrite mode overwrites the next @var{n}
29049lines in the buffer, lengthening or shortening each line as necessary.
29050Finally, if the thing being yanked is a simple integer or floating-point
29051number (like @samp{-1.2345e-3}) and the characters following point also
29052make up such a number, then Calc will replace that number with the new
29053number, lengthening or shortening as necessary. The concept of
29054``overwrite mode'' has thus been generalized from overwriting characters
29055to overwriting one complete number with another.
29056
29057@kindex M-# y
29058The @kbd{M-# y} key sequence is equivalent to @kbd{y} except that
29059it can be typed anywhere, not just in Calc. This provides an easy
29060way to guarantee that Calc knows which editing buffer you want to use!
29061
29062@node X Cut and Paste, , Yanking Into Buffers, Kill and Yank
29063@section X Cut and Paste
29064
29065@noindent
29066If you are using Emacs with the X window system, there is an easier
29067way to move small amounts of data into and out of the calculator:
29068Use the mouse-oriented cut and paste facilities of X.
29069
29070The default bindings for a three-button mouse cause the left button
29071to move the Emacs cursor to the given place, the right button to
29072select the text between the cursor and the clicked location, and
29073the middle button to yank the selection into the buffer at the
29074clicked location. So, if you have a Calc window and an editing
29075window on your Emacs screen, you can use left-click/right-click
29076to select a number, vector, or formula from one window, then
29077middle-click to paste that value into the other window. When you
29078paste text into the Calc window, Calc interprets it as an algebraic
29079entry. It doesn't matter where you click in the Calc window; the
29080new value is always pushed onto the top of the stack.
29081
29082The @code{xterm} program that is typically used for general-purpose
29083shell windows in X interprets the mouse buttons in the same way.
29084So you can use the mouse to move data between Calc and any other
29085Unix program. One nice feature of @code{xterm} is that a double
29086left-click selects one word, and a triple left-click selects a
29087whole line. So you can usually transfer a single number into Calc
29088just by double-clicking on it in the shell, then middle-clicking
29089in the Calc window.
29090
29091@node Keypad Mode, Embedded Mode, Kill and Yank, Introduction
29092@chapter ``Keypad'' Mode
29093
29094@noindent
29095@kindex M-# k
29096@pindex calc-keypad
29097The @kbd{M-# k} (@code{calc-keypad}) command starts the Calculator
29098and displays a picture of a calculator-style keypad. If you are using
29099the X window system, you can click on any of the ``keys'' in the
29100keypad using the left mouse button to operate the calculator.
29101The original window remains the selected window; in keypad mode
29102you can type in your file while simultaneously performing
29103calculations with the mouse.
29104
29105@pindex full-calc-keypad
29106If you have used @kbd{M-# b} first, @kbd{M-# k} instead invokes
29107the @code{full-calc-keypad} command, which takes over the whole
29108Emacs screen and displays the keypad, the Calc stack, and the Calc
29109trail all at once. This mode would normally be used when running
29110Calc standalone (@pxref{Standalone Operation}).
29111
29112If you aren't using the X window system, you must switch into
29113the @samp{*Calc Keypad*} window, place the cursor on the desired
29114``key,'' and type @key{SPC} or @key{RET}. If you think this
29115is easier than using Calc normally, go right ahead.
29116
29117Calc commands are more or less the same in keypad mode. Certain
29118keypad keys differ slightly from the corresponding normal Calc
29119keystrokes; all such deviations are described below.
29120
29121Keypad Mode includes many more commands than will fit on the keypad
29122at once. Click the right mouse button [@code{calc-keypad-menu}]
29123to switch to the next menu. The bottom five rows of the keypad
29124stay the same; the top three rows change to a new set of commands.
29125To return to earlier menus, click the middle mouse button
29126[@code{calc-keypad-menu-back}] or simply advance through the menus
29127until you wrap around. Typing @key{TAB} inside the keypad window
29128is equivalent to clicking the right mouse button there.
29129
29130You can always click the @key{EXEC} button and type any normal
29131Calc key sequence. This is equivalent to switching into the
29132Calc buffer, typing the keys, then switching back to your
29133original buffer.
29134
29135@menu
29136* Keypad Main Menu::
29137* Keypad Functions Menu::
29138* Keypad Binary Menu::
29139* Keypad Vectors Menu::
29140* Keypad Modes Menu::
29141@end menu
29142
29143@node Keypad Main Menu, Keypad Functions Menu, Keypad Mode, Keypad Mode
29144@section Main Menu
29145
d7b8e6c6 29146@smallexample
5d67986c 29147@group
d7b8e6c6
EZ
29148|----+-----Calc 2.00-----+----1
29149|FLR |CEIL|RND |TRNC|CLN2|FLT |
29150|----+----+----+----+----+----|
29151| LN |EXP | |ABS |IDIV|MOD |
29152|----+----+----+----+----+----|
29153|SIN |COS |TAN |SQRT|y^x |1/x |
29154|----+----+----+----+----+----|
29155| ENTER |+/- |EEX |UNDO| <- |
29156|-----+---+-+--+--+-+---++----|
29157| INV | 7 | 8 | 9 | / |
29158|-----+-----+-----+-----+-----|
29159| HYP | 4 | 5 | 6 | * |
29160|-----+-----+-----+-----+-----|
29161|EXEC | 1 | 2 | 3 | - |
29162|-----+-----+-----+-----+-----|
29163| OFF | 0 | . | PI | + |
29164|-----+-----+-----+-----+-----+
d7b8e6c6 29165@end group
5d67986c 29166@end smallexample
d7b8e6c6
EZ
29167
29168@noindent
29169This is the menu that appears the first time you start Keypad Mode.
29170It will show up in a vertical window on the right side of your screen.
29171Above this menu is the traditional Calc stack display. On a 24-line
29172screen you will be able to see the top three stack entries.
29173
29174The ten digit keys, decimal point, and @key{EEX} key are used for
29175entering numbers in the obvious way. @key{EEX} begins entry of an
29176exponent in scientific notation. Just as with regular Calc, the
29177number is pushed onto the stack as soon as you press @key{ENTER}
29178or any other function key.
29179
29180The @key{+/-} key corresponds to normal Calc's @kbd{n} key. During
29181numeric entry it changes the sign of the number or of the exponent.
29182At other times it changes the sign of the number on the top of the
29183stack.
29184
29185The @key{INV} and @key{HYP} keys modify other keys. As well as
29186having the effects described elsewhere in this manual, Keypad Mode
29187defines several other ``inverse'' operations. These are described
29188below and in the following sections.
29189
29190The @key{ENTER} key finishes the current numeric entry, or otherwise
29191duplicates the top entry on the stack.
29192
29193The @key{UNDO} key undoes the most recent Calc operation.
29194@kbd{INV UNDO} is the ``redo'' command, and @kbd{HYP UNDO} is
5d67986c 29195``last arguments'' (@kbd{M-@key{RET}}).
d7b8e6c6
EZ
29196
29197The @key{<-} key acts as a ``backspace'' during numeric entry.
29198At other times it removes the top stack entry. @kbd{INV <-}
29199clears the entire stack. @kbd{HYP <-} takes an integer from
29200the stack, then removes that many additional stack elements.
29201
29202The @key{EXEC} key prompts you to enter any keystroke sequence
29203that would normally work in Calc mode. This can include a
29204numeric prefix if you wish. It is also possible simply to
29205switch into the Calc window and type commands in it; there is
29206nothing ``magic'' about this window when Keypad Mode is active.
29207
29208The other keys in this display perform their obvious calculator
29209functions. @key{CLN2} rounds the top-of-stack by temporarily
29210reducing the precision by 2 digits. @key{FLT} converts an
29211integer or fraction on the top of the stack to floating-point.
29212
29213The @key{INV} and @key{HYP} keys combined with several of these keys
29214give you access to some common functions even if the appropriate menu
29215is not displayed. Obviously you don't need to learn these keys
29216unless you find yourself wasting time switching among the menus.
29217
29218@table @kbd
29219@item INV +/-
29220is the same as @key{1/x}.
29221@item INV +
29222is the same as @key{SQRT}.
29223@item INV -
29224is the same as @key{CONJ}.
29225@item INV *
29226is the same as @key{y^x}.
29227@item INV /
29228is the same as @key{INV y^x} (the @cite{x}th root of @cite{y}).
29229@item HYP/INV 1
29230are the same as @key{SIN} / @kbd{INV SIN}.
29231@item HYP/INV 2
29232are the same as @key{COS} / @kbd{INV COS}.
29233@item HYP/INV 3
29234are the same as @key{TAN} / @kbd{INV TAN}.
29235@item INV/HYP 4
29236are the same as @key{LN} / @kbd{HYP LN}.
29237@item INV/HYP 5
29238are the same as @key{EXP} / @kbd{HYP EXP}.
29239@item INV 6
29240is the same as @key{ABS}.
29241@item INV 7
29242is the same as @key{RND} (@code{calc-round}).
29243@item INV 8
29244is the same as @key{CLN2}.
29245@item INV 9
29246is the same as @key{FLT} (@code{calc-float}).
29247@item INV 0
29248is the same as @key{IMAG}.
29249@item INV .
29250is the same as @key{PREC}.
29251@item INV ENTER
29252is the same as @key{SWAP}.
29253@item HYP ENTER
29254is the same as @key{RLL3}.
29255@item INV HYP ENTER
29256is the same as @key{OVER}.
29257@item HYP +/-
29258packs the top two stack entries as an error form.
29259@item HYP EEX
29260packs the top two stack entries as a modulo form.
29261@item INV EEX
29262creates an interval form; this removes an integer which is one
29263of 0 @samp{[]}, 1 @samp{[)}, 2 @samp{(]} or 3 @samp{()}, followed
29264by the two limits of the interval.
29265@end table
29266
29267The @kbd{OFF} key turns Calc off; typing @kbd{M-# k} or @kbd{M-# M-#}
29268again has the same effect. This is analogous to typing @kbd{q} or
29269hitting @kbd{M-# c} again in the normal calculator. If Calc is
29270running standalone (the @code{full-calc-keypad} command appeared in the
29271command line that started Emacs), then @kbd{OFF} is replaced with
29272@kbd{EXIT}; clicking on this actually exits Emacs itself.
29273
29274@node Keypad Functions Menu, Keypad Binary Menu, Keypad Main Menu, Keypad Mode
29275@section Functions Menu
29276
d7b8e6c6 29277@smallexample
5d67986c 29278@group
d7b8e6c6
EZ
29279|----+----+----+----+----+----2
29280|IGAM|BETA|IBET|ERF |BESJ|BESY|
29281|----+----+----+----+----+----|
29282|IMAG|CONJ| RE |ATN2|RAND|RAGN|
29283|----+----+----+----+----+----|
29284|GCD |FACT|DFCT|BNOM|PERM|NXTP|
29285|----+----+----+----+----+----|
d7b8e6c6 29286@end group
5d67986c 29287@end smallexample
d7b8e6c6
EZ
29288
29289@noindent
29290This menu provides various operations from the @kbd{f} and @kbd{k}
29291prefix keys.
29292
29293@key{IMAG} multiplies the number on the stack by the imaginary
29294number @cite{i = (0, 1)}.
29295
29296@key{RE} extracts the real part a complex number. @kbd{INV RE}
29297extracts the imaginary part.
29298
29299@key{RAND} takes a number from the top of the stack and computes
29300a random number greater than or equal to zero but less than that
29301number. (@xref{Random Numbers}.) @key{RAGN} is the ``random
29302again'' command; it computes another random number using the
29303same limit as last time.
29304
29305@key{INV GCD} computes the LCM (least common multiple) function.
29306
29307@key{INV FACT} is the gamma function. @c{$\Gamma(x) = (x-1)!$}
29308@cite{gamma(x) = (x-1)!}.
29309
29310@key{PERM} is the number-of-permutations function, which is on the
29311@kbd{H k c} key in normal Calc.
29312
29313@key{NXTP} finds the next prime after a number. @kbd{INV NXTP}
29314finds the previous prime.
29315
29316@node Keypad Binary Menu, Keypad Vectors Menu, Keypad Functions Menu, Keypad Mode
29317@section Binary Menu
29318
d7b8e6c6 29319@smallexample
5d67986c 29320@group
d7b8e6c6
EZ
29321|----+----+----+----+----+----3
29322|AND | OR |XOR |NOT |LSH |RSH |
29323|----+----+----+----+----+----|
29324|DEC |HEX |OCT |BIN |WSIZ|ARSH|
29325|----+----+----+----+----+----|
29326| A | B | C | D | E | F |
29327|----+----+----+----+----+----|
d7b8e6c6 29328@end group
5d67986c 29329@end smallexample
d7b8e6c6
EZ
29330
29331@noindent
29332The keys in this menu perform operations on binary integers.
29333Note that both logical and arithmetic right-shifts are provided.
29334@key{INV LSH} rotates one bit to the left.
29335
29336The ``difference'' function (normally on @kbd{b d}) is on @key{INV AND}.
29337The ``clip'' function (normally on @w{@kbd{b c}}) is on @key{INV NOT}.
29338
29339The @key{DEC}, @key{HEX}, @key{OCT}, and @key{BIN} keys select the
29340current radix for display and entry of numbers: Decimal, hexadecimal,
29341octal, or binary. The six letter keys @key{A} through @key{F} are used
29342for entering hexadecimal numbers.
29343
29344The @key{WSIZ} key displays the current word size for binary operations
29345and allows you to enter a new word size. You can respond to the prompt
29346using either the keyboard or the digits and @key{ENTER} from the keypad.
29347The initial word size is 32 bits.
29348
29349@node Keypad Vectors Menu, Keypad Modes Menu, Keypad Binary Menu, Keypad Mode
29350@section Vectors Menu
29351
d7b8e6c6 29352@smallexample
5d67986c 29353@group
d7b8e6c6
EZ
29354|----+----+----+----+----+----4
29355|SUM |PROD|MAX |MAP*|MAP^|MAP$|
29356|----+----+----+----+----+----|
29357|MINV|MDET|MTRN|IDNT|CRSS|"x" |
29358|----+----+----+----+----+----|
29359|PACK|UNPK|INDX|BLD |LEN |... |
29360|----+----+----+----+----+----|
d7b8e6c6 29361@end group
5d67986c 29362@end smallexample
d7b8e6c6
EZ
29363
29364@noindent
29365The keys in this menu operate on vectors and matrices.
29366
29367@key{PACK} removes an integer @var{n} from the top of the stack;
29368the next @var{n} stack elements are removed and packed into a vector,
29369which is replaced onto the stack. Thus the sequence
29370@kbd{1 ENTER 3 ENTER 5 ENTER 3 PACK} enters the vector
29371@samp{[1, 3, 5]} onto the stack. To enter a matrix, build each row
29372on the stack as a vector, then use a final @key{PACK} to collect the
29373rows into a matrix.
29374
29375@key{UNPK} unpacks the vector on the stack, pushing each of its
29376components separately.
29377
29378@key{INDX} removes an integer @var{n}, then builds a vector of
29379integers from 1 to @var{n}. @kbd{INV INDX} takes three numbers
29380from the stack: The vector size @var{n}, the starting number,
29381and the increment. @kbd{BLD} takes an integer @var{n} and any
29382value @var{x} and builds a vector of @var{n} copies of @var{x}.
29383
29384@key{IDNT} removes an integer @var{n}, then builds an @var{n}-by-@var{n}
29385identity matrix.
29386
29387@key{LEN} replaces a vector by its length, an integer.
29388
29389@key{...} turns on or off ``abbreviated'' display mode for large vectors.
29390
29391@key{MINV}, @key{MDET}, @key{MTRN}, and @key{CROSS} are the matrix
29392inverse, determinant, and transpose, and vector cross product.
29393
29394@key{SUM} replaces a vector by the sum of its elements. It is
29395equivalent to @kbd{u +} in normal Calc (@pxref{Statistical Operations}).
29396@key{PROD} computes the product of the elements of a vector, and
29397@key{MAX} computes the maximum of all the elements of a vector.
29398
29399@key{INV SUM} computes the alternating sum of the first element
29400minus the second, plus the third, minus the fourth, and so on.
29401@key{INV MAX} computes the minimum of the vector elements.
29402
29403@key{HYP SUM} computes the mean of the vector elements.
29404@key{HYP PROD} computes the sample standard deviation.
29405@key{HYP MAX} computes the median.
29406
29407@key{MAP*} multiplies two vectors elementwise. It is equivalent
29408to the @kbd{V M *} command. @key{MAP^} computes powers elementwise.
29409The arguments must be vectors of equal length, or one must be a vector
29410and the other must be a plain number. For example, @kbd{2 MAP^} squares
29411all the elements of a vector.
29412
29413@key{MAP$} maps the formula on the top of the stack across the
29414vector in the second-to-top position. If the formula contains
29415several variables, Calc takes that many vectors starting at the
29416second-to-top position and matches them to the variables in
29417alphabetical order. The result is a vector of the same size as
29418the input vectors, whose elements are the formula evaluated with
29419the variables set to the various sets of numbers in those vectors.
29420For example, you could simulate @key{MAP^} using @key{MAP$} with
29421the formula @samp{x^y}.
29422
29423The @kbd{"x"} key pushes the variable name @cite{x} onto the
29424stack. To build the formula @cite{x^2 + 6}, you would use the
29425key sequence @kbd{"x" 2 y^x 6 +}. This formula would then be
29426suitable for use with the @key{MAP$} key described above.
29427With @key{INV}, @key{HYP}, or @key{INV} and @key{HYP}, the
29428@kbd{"x"} key pushes the variable names @cite{y}, @cite{z}, and
29429@cite{t}, respectively.
29430
29431@node Keypad Modes Menu, , Keypad Vectors Menu, Keypad Mode
29432@section Modes Menu
29433
d7b8e6c6 29434@smallexample
5d67986c 29435@group
d7b8e6c6
EZ
29436|----+----+----+----+----+----5
29437|FLT |FIX |SCI |ENG |GRP | |
29438|----+----+----+----+----+----|
29439|RAD |DEG |FRAC|POLR|SYMB|PREC|
29440|----+----+----+----+----+----|
29441|SWAP|RLL3|RLL4|OVER|STO |RCL |
29442|----+----+----+----+----+----|
d7b8e6c6 29443@end group
5d67986c 29444@end smallexample
d7b8e6c6
EZ
29445
29446@noindent
29447The keys in this menu manipulate modes, variables, and the stack.
29448
29449The @key{FLT}, @key{FIX}, @key{SCI}, and @key{ENG} keys select
29450floating-point, fixed-point, scientific, or engineering notation.
29451@key{FIX} displays two digits after the decimal by default; the
29452others display full precision. With the @key{INV} prefix, these
29453keys pop a number-of-digits argument from the stack.
29454
29455The @key{GRP} key turns grouping of digits with commas on or off.
29456@kbd{INV GRP} enables grouping to the right of the decimal point as
29457well as to the left.
29458
29459The @key{RAD} and @key{DEG} keys switch between radians and degrees
29460for trigonometric functions.
29461
29462The @key{FRAC} key turns Fraction mode on or off. This affects
29463whether commands like @kbd{/} with integer arguments produce
29464fractional or floating-point results.
29465
29466The @key{POLR} key turns Polar mode on or off, determining whether
29467polar or rectangular complex numbers are used by default.
29468
29469The @key{SYMB} key turns Symbolic mode on or off, in which
29470operations that would produce inexact floating-point results
29471are left unevaluated as algebraic formulas.
29472
29473The @key{PREC} key selects the current precision. Answer with
29474the keyboard or with the keypad digit and @key{ENTER} keys.
29475
29476The @key{SWAP} key exchanges the top two stack elements.
29477The @key{RLL3} key rotates the top three stack elements upwards.
29478The @key{RLL4} key rotates the top four stack elements upwards.
29479The @key{OVER} key duplicates the second-to-top stack element.
29480
29481The @key{STO} and @key{RCL} keys are analogous to @kbd{s t} and
29482@kbd{s r} in regular Calc. @xref{Store and Recall}. Click the
29483@key{STO} or @key{RCL} key, then one of the ten digits. (Named
29484variables are not available in Keypad Mode.) You can also use,
29485for example, @kbd{STO + 3} to add to register 3.
29486
29487@node Embedded Mode, Programming, Keypad Mode, Top
29488@chapter Embedded Mode
29489
29490@noindent
29491Embedded Mode in Calc provides an alternative to copying numbers
29492and formulas back and forth between editing buffers and the Calc
29493stack. In Embedded Mode, your editing buffer becomes temporarily
29494linked to the stack and this copying is taken care of automatically.
29495
29496@menu
29497* Basic Embedded Mode::
29498* More About Embedded Mode::
29499* Assignments in Embedded Mode::
29500* Mode Settings in Embedded Mode::
29501* Customizing Embedded Mode::
29502@end menu
29503
29504@node Basic Embedded Mode, More About Embedded Mode, Embedded Mode, Embedded Mode
29505@section Basic Embedded Mode
29506
29507@noindent
29508@kindex M-# e
29509@pindex calc-embedded
29510To enter Embedded mode, position the Emacs point (cursor) on a
29511formula in any buffer and press @kbd{M-# e} (@code{calc-embedded}).
29512Note that @kbd{M-# e} is not to be used in the Calc stack buffer
29513like most Calc commands, but rather in regular editing buffers that
29514are visiting your own files.
29515
29516Calc normally scans backward and forward in the buffer for the
29517nearest opening and closing @dfn{formula delimiters}. The simplest
29518delimiters are blank lines. Other delimiters that Embedded Mode
29519understands are:
29520
29521@enumerate
29522@item
29523The @TeX{} and La@TeX{} math delimiters @samp{$ $}, @samp{$$ $$},
29524@samp{\[ \]}, and @samp{\( \)};
29525@item
29526Lines beginning with @samp{\begin} and @samp{\end};
29527@item
29528Lines beginning with @samp{@@} (Texinfo delimiters).
29529@item
29530Lines beginning with @samp{.EQ} and @samp{.EN} (@dfn{eqn} delimiters);
29531@item
29532Lines containing a single @samp{%} or @samp{.\"} symbol and nothing else.
29533@end enumerate
29534
29535@xref{Customizing Embedded Mode}, to see how to make Calc recognize
29536your own favorite delimiters. Delimiters like @samp{$ $} can appear
29537on their own separate lines or in-line with the formula.
29538
29539If you give a positive or negative numeric prefix argument, Calc
29540instead uses the current point as one end of the formula, and moves
29541forward or backward (respectively) by that many lines to find the
29542other end. Explicit delimiters are not necessary in this case.
29543
29544With a prefix argument of zero, Calc uses the current region
29545(delimited by point and mark) instead of formula delimiters.
29546
29547@kindex M-# w
29548@pindex calc-embedded-word
29549With a prefix argument of @kbd{C-u} only, Calc scans for the first
29550non-numeric character (i.e., the first character that is not a
29551digit, sign, decimal point, or upper- or lower-case @samp{e})
29552forward and backward to delimit the formula. @kbd{M-# w}
29553(@code{calc-embedded-word}) is equivalent to @kbd{C-u M-# e}.
29554
29555When you enable Embedded mode for a formula, Calc reads the text
29556between the delimiters and tries to interpret it as a Calc formula.
29557It's best if the current Calc language mode is correct for the
29558formula, but Calc can generally identify @TeX{} formulas and
29559Big-style formulas even if the language mode is wrong. If Calc
29560can't make sense of the formula, it beeps and refuses to enter
29561Embedded mode. But if the current language is wrong, Calc can
29562sometimes parse the formula successfully (but incorrectly);
29563for example, the C expression @samp{atan(a[1])} can be parsed
29564in Normal language mode, but the @code{atan} won't correspond to
29565the built-in @code{arctan} function, and the @samp{a[1]} will be
29566interpreted as @samp{a} times the vector @samp{[1]}!
29567
29568If you press @kbd{M-# e} or @kbd{M-# w} to activate an embedded
29569formula which is blank, say with the cursor on the space between
29570the two delimiters @samp{$ $}, Calc will immediately prompt for
29571an algebraic entry.
29572
29573Only one formula in one buffer can be enabled at a time. If you
29574move to another area of the current buffer and give Calc commands,
29575Calc turns Embedded mode off for the old formula and then tries
29576to restart Embedded mode at the new position. Other buffers are
29577not affected by Embedded mode.
29578
29579When Embedded mode begins, Calc pushes the current formula onto
29580the stack. No Calc stack window is created; however, Calc copies
29581the top-of-stack position into the original buffer at all times.
29582You can create a Calc window by hand with @kbd{M-# o} if you
29583find you need to see the entire stack.
29584
29585For example, typing @kbd{M-# e} while somewhere in the formula
29586@samp{n>2} in the following line enables Embedded mode on that
29587inequality:
29588
29589@example
29590We define $F_n = F_(n-1)+F_(n-2)$ for all $n>2$.
29591@end example
29592
29593@noindent
29594The formula @cite{n>2} will be pushed onto the Calc stack, and
29595the top of stack will be copied back into the editing buffer.
29596This means that spaces will appear around the @samp{>} symbol
29597to match Calc's usual display style:
29598
29599@example
29600We define $F_n = F_(n-1)+F_(n-2)$ for all $n > 2$.
29601@end example
29602
29603@noindent
29604No spaces have appeared around the @samp{+} sign because it's
29605in a different formula, one which we have not yet touched with
29606Embedded mode.
29607
29608Now that Embedded mode is enabled, keys you type in this buffer
29609are interpreted as Calc commands. At this point we might use
29610the ``commute'' command @kbd{j C} to reverse the inequality.
29611This is a selection-based command for which we first need to
29612move the cursor onto the operator (@samp{>} in this case) that
29613needs to be commuted.
29614
29615@example
29616We define $F_n = F_(n-1)+F_(n-2)$ for all $2 < n$.
29617@end example
29618
29619The @kbd{M-# o} command is a useful way to open a Calc window
29620without actually selecting that window. Giving this command
29621verifies that @samp{2 < n} is also on the Calc stack. Typing
5d67986c 29622@kbd{17 @key{RET}} would produce:
d7b8e6c6
EZ
29623
29624@example
29625We define $F_n = F_(n-1)+F_(n-2)$ for all $17$.
29626@end example
29627
29628@noindent
29629with @samp{2 < n} and @samp{17} on the stack; typing @key{TAB}
29630at this point will exchange the two stack values and restore
29631@samp{2 < n} to the embedded formula. Even though you can't
29632normally see the stack in Embedded mode, it is still there and
29633it still operates in the same way. But, as with old-fashioned
29634RPN calculators, you can only see the value at the top of the
29635stack at any given time (unless you use @kbd{M-# o}).
29636
29637Typing @kbd{M-# e} again turns Embedded mode off. The Calc
29638window reveals that the formula @w{@samp{2 < n}} is automatically
29639removed from the stack, but the @samp{17} is not. Entering
29640Embedded mode always pushes one thing onto the stack, and
29641leaving Embedded mode always removes one thing. Anything else
29642that happens on the stack is entirely your business as far as
29643Embedded mode is concerned.
29644
29645If you press @kbd{M-# e} in the wrong place by accident, it is
29646possible that Calc will be able to parse the nearby text as a
29647formula and will mangle that text in an attempt to redisplay it
29648``properly'' in the current language mode. If this happens,
29649press @kbd{M-# e} again to exit Embedded mode, then give the
29650regular Emacs ``undo'' command (@kbd{C-_} or @kbd{C-x u}) to put
29651the text back the way it was before Calc edited it. Note that Calc's
29652own Undo command (typed before you turn Embedded mode back off)
29653will not do you any good, because as far as Calc is concerned
29654you haven't done anything with this formula yet.
29655
29656@node More About Embedded Mode, Assignments in Embedded Mode, Basic Embedded Mode, Embedded Mode
29657@section More About Embedded Mode
29658
29659@noindent
29660When Embedded mode ``activates'' a formula, i.e., when it examines
29661the formula for the first time since the buffer was created or
29662loaded, Calc tries to sense the language in which the formula was
29663written. If the formula contains any @TeX{}-like @samp{\} sequences,
29664it is parsed (i.e., read) in @TeX{} mode. If the formula appears to
29665be written in multi-line Big mode, it is parsed in Big mode. Otherwise,
29666it is parsed according to the current language mode.
29667
29668Note that Calc does not change the current language mode according
29669to what it finds. Even though it can read a @TeX{} formula when
29670not in @TeX{} mode, it will immediately rewrite this formula using
29671whatever language mode is in effect. You must then type @kbd{d T}
29672to switch Calc permanently into @TeX{} mode if that is what you
29673desire.
29674
29675@tex
29676\bigskip
29677@end tex
29678
29679@kindex d p
29680@pindex calc-show-plain
29681Calc's parser is unable to read certain kinds of formulas. For
29682example, with @kbd{v ]} (@code{calc-matrix-brackets}) you can
29683specify matrix display styles which the parser is unable to
29684recognize as matrices. The @kbd{d p} (@code{calc-show-plain})
29685command turns on a mode in which a ``plain'' version of a
29686formula is placed in front of the fully-formatted version.
29687When Calc reads a formula that has such a plain version in
29688front, it reads the plain version and ignores the formatted
29689version.
29690
29691Plain formulas are preceded and followed by @samp{%%%} signs
29692by default. This notation has the advantage that the @samp{%}
29693character begins a comment in @TeX{}, so if your formula is
29694embedded in a @TeX{} document its plain version will be
29695invisible in the final printed copy. @xref{Customizing
29696Embedded Mode}, to see how to change the ``plain'' formula
29697delimiters, say to something that @dfn{eqn} or some other
29698formatter will treat as a comment.
29699
29700There are several notations which Calc's parser for ``big''
29701formatted formulas can't yet recognize. In particular, it can't
29702read the large symbols for @code{sum}, @code{prod}, and @code{integ},
29703and it can't handle @samp{=>} with the righthand argument omitted.
29704Also, Calc won't recognize special formats you have defined with
29705the @kbd{Z C} command (@pxref{User-Defined Compositions}). In
29706these cases it is important to use ``plain'' mode to make sure
29707Calc will be able to read your formula later.
29708
29709Another example where ``plain'' mode is important is if you have
29710specified a float mode with few digits of precision. Normally
29711any digits that are computed but not displayed will simply be
29712lost when you save and re-load your embedded buffer, but ``plain''
29713mode allows you to make sure that the complete number is present
29714in the file as well as the rounded-down number.
29715
29716@tex
29717\bigskip
29718@end tex
29719
29720Embedded buffers remember active formulas for as long as they
29721exist in Emacs memory. Suppose you have an embedded formula
29722which is @c{$\pi$}
29723@cite{pi} to the normal 12 decimal places, and then
29724type @w{@kbd{C-u 5 d n}} to display only five decimal places.
29725If you then type @kbd{d n}, all 12 places reappear because the
29726full number is still there on the Calc stack. More surprisingly,
29727even if you exit Embedded mode and later re-enter it for that
29728formula, typing @kbd{d n} will restore all 12 places because
29729each buffer remembers all its active formulas. However, if you
29730save the buffer in a file and reload it in a new Emacs session,
29731all non-displayed digits will have been lost unless you used
29732``plain'' mode.
29733
29734@tex
29735\bigskip
29736@end tex
29737
29738In some applications of Embedded mode, you will want to have a
29739sequence of copies of a formula that show its evolution as you
29740work on it. For example, you might want to have a sequence
29741like this in your file (elaborating here on the example from
29742the ``Getting Started'' chapter):
29743
29744@smallexample
29745The derivative of
29746
29747 ln(ln(x))
29748
29749is
29750
29751 @r{(the derivative of }ln(ln(x))@r{)}
29752
29753whose value at x = 2 is
29754
29755 @r{(the value)}
29756
29757and at x = 3 is
29758
29759 @r{(the value)}
29760@end smallexample
29761
29762@kindex M-# d
29763@pindex calc-embedded-duplicate
29764The @kbd{M-# d} (@code{calc-embedded-duplicate}) command is a
29765handy way to make sequences like this. If you type @kbd{M-# d},
29766the formula under the cursor (which may or may not have Embedded
29767mode enabled for it at the time) is copied immediately below and
29768Embedded mode is then enabled for that copy.
29769
29770For this example, you would start with just
29771
29772@smallexample
29773The derivative of
29774
29775 ln(ln(x))
29776@end smallexample
29777
29778@noindent
29779and press @kbd{M-# d} with the cursor on this formula. The result
29780is
29781
29782@smallexample
29783The derivative of
29784
29785 ln(ln(x))
29786
29787
29788 ln(ln(x))
29789@end smallexample
29790
29791@noindent
29792with the second copy of the formula enabled in Embedded mode.
5d67986c 29793You can now press @kbd{a d x @key{RET}} to take the derivative, and
d7b8e6c6 29794@kbd{M-# d M-# d} to make two more copies of the derivative.
5d67986c 29795To complete the computations, type @kbd{3 s l x @key{RET}} to evaluate
d7b8e6c6 29796the last formula, then move up to the second-to-last formula
5d67986c 29797and type @kbd{2 s l x @key{RET}}.
d7b8e6c6
EZ
29798
29799Finally, you would want to press @kbd{M-# e} to exit Embedded
29800mode, then go up and insert the necessary text in between the
29801various formulas and numbers.
29802
29803@tex
29804\bigskip
29805@end tex
29806
29807@kindex M-# f
29808@kindex M-# '
29809@pindex calc-embedded-new-formula
29810The @kbd{M-# f} (@code{calc-embedded-new-formula}) command
29811creates a new embedded formula at the current point. It inserts
29812some default delimiters, which are usually just blank lines,
29813and then does an algebraic entry to get the formula (which is
29814then enabled for Embedded mode). This is just shorthand for
29815typing the delimiters yourself, positioning the cursor between
29816the new delimiters, and pressing @kbd{M-# e}. The key sequence
29817@kbd{M-# '} is equivalent to @kbd{M-# f}.
29818
29819@kindex M-# n
29820@kindex M-# p
29821@pindex calc-embedded-next
29822@pindex calc-embedded-previous
29823The @kbd{M-# n} (@code{calc-embedded-next}) and @kbd{M-# p}
29824(@code{calc-embedded-previous}) commands move the cursor to the
29825next or previous active embedded formula in the buffer. They
29826can take positive or negative prefix arguments to move by several
29827formulas. Note that these commands do not actually examine the
29828text of the buffer looking for formulas; they only see formulas
29829which have previously been activated in Embedded mode. In fact,
29830@kbd{M-# n} and @kbd{M-# p} are a useful way to tell which
29831embedded formulas are currently active. Also, note that these
29832commands do not enable Embedded mode on the next or previous
29833formula, they just move the cursor. (By the way, @kbd{M-# n} is
29834not as awkward to type as it may seem, because @kbd{M-#} ignores
29835Shift and Meta on the second keystroke: @kbd{M-# M-N} can be typed
29836by holding down Shift and Meta and alternately typing two keys.)
29837
29838@kindex M-# `
29839@pindex calc-embedded-edit
29840The @kbd{M-# `} (@code{calc-embedded-edit}) command edits the
29841embedded formula at the current point as if by @kbd{`} (@code{calc-edit}).
29842Embedded mode does not have to be enabled for this to work. Press
29843@kbd{M-# M-#} to finish the edit, or @kbd{M-# x} to cancel.
29844
29845@node Assignments in Embedded Mode, Mode Settings in Embedded Mode, More About Embedded Mode, Embedded Mode
29846@section Assignments in Embedded Mode
29847
29848@noindent
29849The @samp{:=} (assignment) and @samp{=>} (``evaluates-to'') operators
29850are especially useful in Embedded mode. They allow you to make
29851a definition in one formula, then refer to that definition in
29852other formulas embedded in the same buffer.
29853
29854An embedded formula which is an assignment to a variable, as in
29855
29856@example
29857foo := 5
29858@end example
29859
29860@noindent
29861records @cite{5} as the stored value of @code{foo} for the
29862purposes of Embedded mode operations in the current buffer. It
29863does @emph{not} actually store @cite{5} as the ``global'' value
29864of @code{foo}, however. Regular Calc operations, and Embedded
29865formulas in other buffers, will not see this assignment.
29866
29867One way to use this assigned value is simply to create an
29868Embedded formula elsewhere that refers to @code{foo}, and to press
29869@kbd{=} in that formula. However, this permanently replaces the
29870@code{foo} in the formula with its current value. More interesting
29871is to use @samp{=>} elsewhere:
29872
29873@example
29874foo + 7 => 12
29875@end example
29876
29877@xref{Evaluates-To Operator}, for a general discussion of @samp{=>}.
29878
29879If you move back and change the assignment to @code{foo}, any
29880@samp{=>} formulas which refer to it are automatically updated.
29881
29882@example
29883foo := 17
29884
29885foo + 7 => 24
29886@end example
29887
29888The obvious question then is, @emph{how} can one easily change the
29889assignment to @code{foo}? If you simply select the formula in
29890Embedded mode and type 17, the assignment itself will be replaced
29891by the 17. The effect on the other formula will be that the
29892variable @code{foo} becomes unassigned:
29893
29894@example
2989517
29896
29897foo + 7 => foo + 7
29898@end example
29899
29900The right thing to do is first to use a selection command (@kbd{j 2}
29901will do the trick) to select the righthand side of the assignment.
5d67986c 29902Then, @kbd{17 @key{TAB} @key{DEL}} will swap the 17 into place (@pxref{Selecting
d7b8e6c6
EZ
29903Subformulas}, to see how this works).
29904
29905@kindex M-# j
29906@pindex calc-embedded-select
29907The @kbd{M-# j} (@code{calc-embedded-select}) command provides an
29908easy way to operate on assigments. It is just like @kbd{M-# e},
29909except that if the enabled formula is an assignment, it uses
29910@kbd{j 2} to select the righthand side. If the enabled formula
29911is an evaluates-to, it uses @kbd{j 1} to select the lefthand side.
29912A formula can also be a combination of both:
29913
29914@example
29915bar := foo + 3 => 20
29916@end example
29917
29918@noindent
29919in which case @kbd{M-# j} will select the middle part (@samp{foo + 3}).
29920
29921The formula is automatically deselected when you leave Embedded
29922mode.
29923
29924@kindex M-# u
29925@kindex M-# =
29926@pindex calc-embedded-update
29927Another way to change the assignment to @code{foo} would simply be
29928to edit the number using regular Emacs editing rather than Embedded
29929mode. Then, we have to find a way to get Embedded mode to notice
29930the change. The @kbd{M-# u} or @kbd{M-# =}
29931(@code{calc-embedded-update-formula}) command is a convenient way
29932to do this.@refill
29933
29934@example
29935foo := 6
29936
29937foo + 7 => 13
29938@end example
29939
29940Pressing @kbd{M-# u} is much like pressing @kbd{M-# e = M-# e}, that
29941is, temporarily enabling Embedded mode for the formula under the
29942cursor and then evaluating it with @kbd{=}. But @kbd{M-# u} does
29943not actually use @kbd{M-# e}, and in fact another formula somewhere
29944else can be enabled in Embedded mode while you use @kbd{M-# u} and
29945that formula will not be disturbed.
29946
29947With a numeric prefix argument, @kbd{M-# u} updates all active
29948@samp{=>} formulas in the buffer. Formulas which have not yet
29949been activated in Embedded mode, and formulas which do not have
29950@samp{=>} as their top-level operator, are not affected by this.
29951(This is useful only if you have used @kbd{m C}; see below.)
29952
29953With a plain @kbd{C-u} prefix, @kbd{C-u M-# u} updates only in the
29954region between mark and point rather than in the whole buffer.
29955
29956@kbd{M-# u} is also a handy way to activate a formula, such as an
29957@samp{=>} formula that has freshly been typed in or loaded from a
29958file.
29959
29960@kindex M-# a
29961@pindex calc-embedded-activate
29962The @kbd{M-# a} (@code{calc-embedded-activate}) command scans
29963through the current buffer and activates all embedded formulas
29964that contain @samp{:=} or @samp{=>} symbols. This does not mean
29965that Embedded mode is actually turned on, but only that the
29966formulas' positions are registered with Embedded mode so that
29967the @samp{=>} values can be properly updated as assignments are
29968changed.
29969
29970It is a good idea to type @kbd{M-# a} right after loading a file
29971that uses embedded @samp{=>} operators. Emacs includes a nifty
29972``buffer-local variables'' feature that you can use to do this
29973automatically. The idea is to place near the end of your file
29974a few lines that look like this:
29975
29976@example
29977--- Local Variables: ---
29978--- eval:(calc-embedded-activate) ---
29979--- End: ---
29980@end example
29981
29982@noindent
29983where the leading and trailing @samp{---} can be replaced by
29984any suitable strings (which must be the same on all three lines)
29985or omitted altogether; in a @TeX{} file, @samp{%} would be a good
29986leading string and no trailing string would be necessary. In a
29987C program, @samp{/*} and @samp{*/} would be good leading and
29988trailing strings.
29989
29990When Emacs loads a file into memory, it checks for a Local Variables
29991section like this one at the end of the file. If it finds this
29992section, it does the specified things (in this case, running
29993@kbd{M-# a} automatically) before editing of the file begins.
29994The Local Variables section must be within 3000 characters of the
29995end of the file for Emacs to find it, and it must be in the last
29996page of the file if the file has any page separators.
29997@xref{File Variables, , Local Variables in Files, emacs, the
29998Emacs manual}.
29999
30000Note that @kbd{M-# a} does not update the formulas it finds.
30001To do this, type, say, @kbd{M-1 M-# u} after @w{@kbd{M-# a}}.
30002Generally this should not be a problem, though, because the
30003formulas will have been up-to-date already when the file was
30004saved.
30005
30006Normally, @kbd{M-# a} activates all the formulas it finds, but
30007any previous active formulas remain active as well. With a
30008positive numeric prefix argument, @kbd{M-# a} first deactivates
30009all current active formulas, then actives the ones it finds in
30010its scan of the buffer. With a negative prefix argument,
30011@kbd{M-# a} simply deactivates all formulas.
30012
30013Embedded mode has two symbols, @samp{Active} and @samp{~Active},
30014which it puts next to the major mode name in a buffer's mode line.
30015It puts @samp{Active} if it has reason to believe that all
30016formulas in the buffer are active, because you have typed @kbd{M-# a}
30017and Calc has not since had to deactivate any formulas (which can
30018happen if Calc goes to update an @samp{=>} formula somewhere because
30019a variable changed, and finds that the formula is no longer there
30020due to some kind of editing outside of Embedded mode). Calc puts
30021@samp{~Active} in the mode line if some, but probably not all,
30022formulas in the buffer are active. This happens if you activate
30023a few formulas one at a time but never use @kbd{M-# a}, or if you
30024used @kbd{M-# a} but then Calc had to deactivate a formula
30025because it lost track of it. If neither of these symbols appears
30026in the mode line, no embedded formulas are active in the buffer
30027(e.g., before Embedded mode has been used, or after a @kbd{M-- M-# a}).
30028
30029Embedded formulas can refer to assignments both before and after them
30030in the buffer. If there are several assignments to a variable, the
30031nearest preceding assignment is used if there is one, otherwise the
30032following assignment is used.
30033
30034@example
30035x => 1
30036
30037x := 1
30038
30039x => 1
30040
30041x := 2
30042
30043x => 2
30044@end example
30045
30046As well as simple variables, you can also assign to subscript
30047expressions of the form @samp{@var{var}_@var{number}} (as in
30048@code{x_0}), or @samp{@var{var}_@var{var}} (as in @code{x_max}).
30049Assignments to other kinds of objects can be represented by Calc,
30050but the automatic linkage between assignments and references works
30051only for plain variables and these two kinds of subscript expressions.
30052
30053If there are no assignments to a given variable, the global
30054stored value for the variable is used (@pxref{Storing Variables}),
30055or, if no value is stored, the variable is left in symbolic form.
30056Note that global stored values will be lost when the file is saved
30057and loaded in a later Emacs session, unless you have used the
30058@kbd{s p} (@code{calc-permanent-variable}) command to save them;
30059@pxref{Operations on Variables}.
30060
30061The @kbd{m C} (@code{calc-auto-recompute}) command turns automatic
30062recomputation of @samp{=>} forms on and off. If you turn automatic
30063recomputation off, you will have to use @kbd{M-# u} to update these
30064formulas manually after an assignment has been changed. If you
30065plan to change several assignments at once, it may be more efficient
30066to type @kbd{m C}, change all the assignments, then use @kbd{M-1 M-# u}
30067to update the entire buffer afterwards. The @kbd{m C} command also
30068controls @samp{=>} formulas on the stack; @pxref{Evaluates-To
30069Operator}. When you turn automatic recomputation back on, the
30070stack will be updated but the Embedded buffer will not; you must
30071use @kbd{M-# u} to update the buffer by hand.
30072
30073@node Mode Settings in Embedded Mode, Customizing Embedded Mode, Assignments in Embedded Mode, Embedded Mode
30074@section Mode Settings in Embedded Mode
30075
30076@noindent
30077Embedded Mode has a rather complicated mechanism for handling mode
30078settings in Embedded formulas. It is possible to put annotations
30079in the file that specify mode settings either global to the entire
30080file or local to a particular formula or formulas. In the latter
30081case, different modes can be specified for use when a formula
30082is the enabled Embedded Mode formula.
30083
30084When you give any mode-setting command, like @kbd{m f} (for fraction
30085mode) or @kbd{d s} (for scientific notation), Embedded Mode adds
30086a line like the following one to the file just before the opening
30087delimiter of the formula.
30088
30089@example
30090% [calc-mode: fractions: t]
30091% [calc-mode: float-format: (sci 0)]
30092@end example
30093
30094When Calc interprets an embedded formula, it scans the text before
30095the formula for mode-setting annotations like these and sets the
30096Calc buffer to match these modes. Modes not explicitly described
30097in the file are not changed. Calc scans all the way to the top of
30098the file, or up to a line of the form
30099
30100@example
30101% [calc-defaults]
30102@end example
30103
30104@noindent
30105which you can insert at strategic places in the file if this backward
30106scan is getting too slow, or just to provide a barrier between one
30107``zone'' of mode settings and another.
30108
30109If the file contains several annotations for the same mode, the
30110closest one before the formula is used. Annotations after the
30111formula are never used (except for global annotations, described
30112below).
30113
30114The scan does not look for the leading @samp{% }, only for the
30115square brackets and the text they enclose. You can edit the mode
30116annotations to a style that works better in context if you wish.
30117@xref{Customizing Embedded Mode}, to see how to change the style
30118that Calc uses when it generates the annotations. You can write
30119mode annotations into the file yourself if you know the syntax;
30120the easiest way to find the syntax for a given mode is to let
30121Calc write the annotation for it once and see what it does.
30122
30123If you give a mode-changing command for a mode that already has
30124a suitable annotation just above the current formula, Calc will
30125modify that annotation rather than generating a new, conflicting
30126one.
30127
30128Mode annotations have three parts, separated by colons. (Spaces
30129after the colons are optional.) The first identifies the kind
30130of mode setting, the second is a name for the mode itself, and
30131the third is the value in the form of a Lisp symbol, number,
30132or list. Annotations with unrecognizable text in the first or
30133second parts are ignored. The third part is not checked to make
30134sure the value is of a legal type or range; if you write an
30135annotation by hand, be sure to give a proper value or results
30136will be unpredictable. Mode-setting annotations are case-sensitive.
30137
30138While Embedded Mode is enabled, the word @code{Local} appears in
30139the mode line. This is to show that mode setting commands generate
30140annotations that are ``local'' to the current formula or set of
30141formulas. The @kbd{m R} (@code{calc-mode-record-mode}) command
30142causes Calc to generate different kinds of annotations. Pressing
30143@kbd{m R} repeatedly cycles through the possible modes.
30144
30145@code{LocEdit} and @code{LocPerm} modes generate annotations
30146that look like this, respectively:
30147
30148@example
30149% [calc-edit-mode: float-format: (sci 0)]
30150% [calc-perm-mode: float-format: (sci 5)]
30151@end example
30152
30153The first kind of annotation will be used only while a formula
30154is enabled in Embedded Mode. The second kind will be used only
30155when the formula is @emph{not} enabled. (Whether the formula
30156is ``active'' or not, i.e., whether Calc has seen this formula
30157yet, is not relevant here.)
30158
30159@code{Global} mode generates an annotation like this at the end
30160of the file:
30161
30162@example
30163% [calc-global-mode: fractions t]
30164@end example
30165
30166Global mode annotations affect all formulas throughout the file,
30167and may appear anywhere in the file. This allows you to tuck your
30168mode annotations somewhere out of the way, say, on a new page of
30169the file, as long as those mode settings are suitable for all
30170formulas in the file.
30171
30172Enabling a formula with @kbd{M-# e} causes a fresh scan for local
30173mode annotations; you will have to use this after adding annotations
30174above a formula by hand to get the formula to notice them. Updating
30175a formula with @kbd{M-# u} will also re-scan the local modes, but
30176global modes are only re-scanned by @kbd{M-# a}.
30177
30178Another way that modes can get out of date is if you add a local
30179mode annotation to a formula that has another formula after it.
30180In this example, we have used the @kbd{d s} command while the
30181first of the two embedded formulas is active. But the second
30182formula has not changed its style to match, even though by the
30183rules of reading annotations the @samp{(sci 0)} applies to it, too.
30184
30185@example
30186% [calc-mode: float-format: (sci 0)]
301871.23e2
30188
30189456.
30190@end example
30191
30192We would have to go down to the other formula and press @kbd{M-# u}
30193on it in order to get it to notice the new annotation.
30194
30195Two more mode-recording modes selectable by @kbd{m R} are @code{Save}
30196(which works even outside of Embedded Mode), in which mode settings
30197are recorded permanently in your Emacs startup file @file{~/.emacs}
30198rather than by annotating the current document, and no-recording
30199mode (where there is no symbol like @code{Save} or @code{Local} in
30200the mode line), in which mode-changing commands do not leave any
30201annotations at all.
30202
30203When Embedded Mode is not enabled, mode-recording modes except
30204for @code{Save} have no effect.
30205
30206@node Customizing Embedded Mode, , Mode Settings in Embedded Mode, Embedded Mode
30207@section Customizing Embedded Mode
30208
30209@noindent
30210You can modify Embedded Mode's behavior by setting various Lisp
30211variables described here. Use @kbd{M-x set-variable} or
30212@kbd{M-x edit-options} to adjust a variable on the fly, or
30213put a suitable @code{setq} statement in your @file{~/.emacs}
30214file to set a variable permanently. (Another possibility would
30215be to use a file-local variable annotation at the end of the
30216file; @pxref{File Variables, , Local Variables in Files, emacs, the
30217Emacs manual}.)
30218
30219While none of these variables will be buffer-local by default, you
30220can make any of them local to any embedded-mode buffer. (Their
30221values in the @samp{*Calculator*} buffer are never used.)
30222
30223@vindex calc-embedded-open-formula
30224The @code{calc-embedded-open-formula} variable holds a regular
30225expression for the opening delimiter of a formula. @xref{Regexp Search,
30226, Regular Expression Search, emacs, the Emacs manual}, to see
30227how regular expressions work. Basically, a regular expression is a
30228pattern that Calc can search for. A regular expression that considers
30229blank lines, @samp{$}, and @samp{$$} to be opening delimiters is
30230@code{"\\`\\|^\n\\|\\$\\$?"}. Just in case the meaning of this
30231regular expression is not completely plain, let's go through it
30232in detail.
30233
30234The surrounding @samp{" "} marks quote the text between them as a
30235Lisp string. If you left them off, @code{set-variable} or
30236@code{edit-options} would try to read the regular expression as a
30237Lisp program.
30238
30239The most obvious property of this regular expression is that it
30240contains indecently many backslashes. There are actually two levels
30241of backslash usage going on here. First, when Lisp reads a quoted
30242string, all pairs of characters beginning with a backslash are
30243interpreted as special characters. Here, @code{\n} changes to a
30244new-line character, and @code{\\} changes to a single backslash.
30245So the actual regular expression seen by Calc is
30246@samp{\`\|^ @r{(newline)} \|\$\$?}.
30247
30248Regular expressions also consider pairs beginning with backslash
30249to have special meanings. Sometimes the backslash is used to quote
30250a character that otherwise would have a special meaning in a regular
30251expression, like @samp{$}, which normally means ``end-of-line,''
30252or @samp{?}, which means that the preceding item is optional. So
30253@samp{\$\$?} matches either one or two dollar signs.
30254
30255The other codes in this regular expression are @samp{^}, which matches
30256``beginning-of-line,'' @samp{\|}, which means ``or,'' and @samp{\`},
30257which matches ``beginning-of-buffer.'' So the whole pattern means
30258that a formula begins at the beginning of the buffer, or on a newline
30259that occurs at the beginning of a line (i.e., a blank line), or at
30260one or two dollar signs.
30261
30262The default value of @code{calc-embedded-open-formula} looks just
30263like this example, with several more alternatives added on to
30264recognize various other common kinds of delimiters.
30265
30266By the way, the reason to use @samp{^\n} rather than @samp{^$}
30267or @samp{\n\n}, which also would appear to match blank lines,
30268is that the former expression actually ``consumes'' only one
30269newline character as @emph{part of} the delimiter, whereas the
30270latter expressions consume zero or two newlines, respectively.
30271The former choice gives the most natural behavior when Calc
30272must operate on a whole formula including its delimiters.
30273
30274See the Emacs manual for complete details on regular expressions.
30275But just for your convenience, here is a list of all characters
30276which must be quoted with backslash (like @samp{\$}) to avoid
30277some special interpretation: @samp{. * + ? [ ] ^ $ \}. (Note
30278the backslash in this list; for example, to match @samp{\[} you
30279must use @code{"\\\\\\["}. An exercise for the reader is to
30280account for each of these six backslashes!)
30281
30282@vindex calc-embedded-close-formula
30283The @code{calc-embedded-close-formula} variable holds a regular
30284expression for the closing delimiter of a formula. A closing
30285regular expression to match the above example would be
30286@code{"\\'\\|\n$\\|\\$\\$?"}. This is almost the same as the
30287other one, except it now uses @samp{\'} (``end-of-buffer'') and
30288@samp{\n$} (newline occurring at end of line, yet another way
30289of describing a blank line that is more appropriate for this
30290case).
30291
30292@vindex calc-embedded-open-word
30293@vindex calc-embedded-close-word
30294The @code{calc-embedded-open-word} and @code{calc-embedded-close-word}
30295variables are similar expressions used when you type @kbd{M-# w}
30296instead of @kbd{M-# e} to enable Embedded mode.
30297
30298@vindex calc-embedded-open-plain
30299The @code{calc-embedded-open-plain} variable is a string which
30300begins a ``plain'' formula written in front of the formatted
30301formula when @kbd{d p} mode is turned on. Note that this is an
30302actual string, not a regular expression, because Calc must be able
30303to write this string into a buffer as well as to recognize it.
30304The default string is @code{"%%% "} (note the trailing space).
30305
30306@vindex calc-embedded-close-plain
30307The @code{calc-embedded-close-plain} variable is a string which
30308ends a ``plain'' formula. The default is @code{" %%%\n"}. Without
30309the trailing newline here, the first line of a ``big'' mode formula
30310that followed might be shifted over with respect to the other lines.
30311
30312@vindex calc-embedded-open-new-formula
30313The @code{calc-embedded-open-new-formula} variable is a string
30314which is inserted at the front of a new formula when you type
30315@kbd{M-# f}. Its default value is @code{"\n\n"}. If this
30316string begins with a newline character and the @kbd{M-# f} is
30317typed at the beginning of a line, @kbd{M-# f} will skip this
30318first newline to avoid introducing unnecessary blank lines in
30319the file.
30320
30321@vindex calc-embedded-close-new-formula
30322The @code{calc-embedded-close-new-formula} variable is the corresponding
30323string which is inserted at the end of a new formula. Its default
30324value is also @code{"\n\n"}. The final newline is omitted by
30325@w{@kbd{M-# f}} if typed at the end of a line. (It follows that if
30326@kbd{M-# f} is typed on a blank line, both a leading opening
30327newline and a trailing closing newline are omitted.)
30328
30329@vindex calc-embedded-announce-formula
30330The @code{calc-embedded-announce-formula} variable is a regular
30331expression which is sure to be followed by an embedded formula.
30332The @kbd{M-# a} command searches for this pattern as well as for
30333@samp{=>} and @samp{:=} operators. Note that @kbd{M-# a} will
30334not activate just anything surrounded by formula delimiters; after
30335all, blank lines are considered formula delimiters by default!
30336But if your language includes a delimiter which can only occur
30337actually in front of a formula, you can take advantage of it here.
30338The default pattern is @code{"%Embed\n\\(% .*\n\\)*"}, which
30339checks for @samp{%Embed} followed by any number of lines beginning
30340with @samp{%} and a space. This last is important to make Calc
30341consider mode annotations part of the pattern, so that the formula's
30342opening delimiter really is sure to follow the pattern.
30343
30344@vindex calc-embedded-open-mode
30345The @code{calc-embedded-open-mode} variable is a string (not a
30346regular expression) which should precede a mode annotation.
30347Calc never scans for this string; Calc always looks for the
30348annotation itself. But this is the string that is inserted before
30349the opening bracket when Calc adds an annotation on its own.
30350The default is @code{"% "}.
30351
30352@vindex calc-embedded-close-mode
30353The @code{calc-embedded-close-mode} variable is a string which
30354follows a mode annotation written by Calc. Its default value
30355is simply a newline, @code{"\n"}. If you change this, it is a
30356good idea still to end with a newline so that mode annotations
30357will appear on lines by themselves.
30358
30359@node Programming, Installation, Embedded Mode, Top
30360@chapter Programming
30361
30362@noindent
30363There are several ways to ``program'' the Emacs Calculator, depending
30364on the nature of the problem you need to solve.
30365
30366@enumerate
30367@item
30368@dfn{Keyboard macros} allow you to record a sequence of keystrokes
30369and play them back at a later time. This is just the standard Emacs
30370keyboard macro mechanism, dressed up with a few more features such
30371as loops and conditionals.
30372
30373@item
30374@dfn{Algebraic definitions} allow you to use any formula to define a
30375new function. This function can then be used in algebraic formulas or
30376as an interactive command.
30377
30378@item
30379@dfn{Rewrite rules} are discussed in the section on algebra commands.
30380@xref{Rewrite Rules}. If you put your rewrite rules in the variable
30381@code{EvalRules}, they will be applied automatically to all Calc
30382results in just the same way as an internal ``rule'' is applied to
30383evaluate @samp{sqrt(9)} to 3 and so on. @xref{Automatic Rewrites}.
30384
30385@item
30386@dfn{Lisp} is the programming language that Calc (and most of Emacs)
30387is written in. If the above techniques aren't powerful enough, you
30388can write Lisp functions to do anything that built-in Calc commands
30389can do. Lisp code is also somewhat faster than keyboard macros or
30390rewrite rules.
30391@end enumerate
30392
30393@kindex z
30394Programming features are available through the @kbd{z} and @kbd{Z}
30395prefix keys. New commands that you define are two-key sequences
30396beginning with @kbd{z}. Commands for managing these definitions
30397use the shift-@kbd{Z} prefix. (The @kbd{Z T} (@code{calc-timing})
30398command is described elsewhere; @pxref{Troubleshooting Commands}.
30399The @kbd{Z C} (@code{calc-user-define-composition}) command is also
30400described elsewhere; @pxref{User-Defined Compositions}.)
30401
30402@menu
30403* Creating User Keys::
30404* Keyboard Macros::
30405* Invocation Macros::
30406* Algebraic Definitions::
30407* Lisp Definitions::
30408@end menu
30409
30410@node Creating User Keys, Keyboard Macros, Programming, Programming
30411@section Creating User Keys
30412
30413@noindent
30414@kindex Z D
30415@pindex calc-user-define
30416Any Calculator command may be bound to a key using the @kbd{Z D}
30417(@code{calc-user-define}) command. Actually, it is bound to a two-key
30418sequence beginning with the lower-case @kbd{z} prefix.
30419
30420The @kbd{Z D} command first prompts for the key to define. For example,
30421press @kbd{Z D a} to define the new key sequence @kbd{z a}. You are then
30422prompted for the name of the Calculator command that this key should
30423run. For example, the @code{calc-sincos} command is not normally
30424available on a key. Typing @kbd{Z D s sincos @key{RET}} programs the
30425@kbd{z s} key sequence to run @code{calc-sincos}. This definition will remain
30426in effect for the rest of this Emacs session, or until you redefine
30427@kbd{z s} to be something else.
30428
30429You can actually bind any Emacs command to a @kbd{z} key sequence by
30430backspacing over the @samp{calc-} when you are prompted for the command name.
30431
30432As with any other prefix key, you can type @kbd{z ?} to see a list of
30433all the two-key sequences you have defined that start with @kbd{z}.
30434Initially, no @kbd{z} sequences (except @kbd{z ?} itself) are defined.
30435
30436User keys are typically letters, but may in fact be any key.
30437(@key{META}-keys are not permitted, nor are a terminal's special
30438function keys which generate multi-character sequences when pressed.)
30439You can define different commands on the shifted and unshifted versions
30440of a letter if you wish.
30441
30442@kindex Z U
30443@pindex calc-user-undefine
30444The @kbd{Z U} (@code{calc-user-undefine}) command unbinds a user key.
30445For example, the key sequence @kbd{Z U s} will undefine the @code{sincos}
30446key we defined above.
30447
30448@kindex Z P
30449@pindex calc-user-define-permanent
30450@cindex Storing user definitions
30451@cindex Permanent user definitions
30452@cindex @file{.emacs} file, user-defined commands
30453The @kbd{Z P} (@code{calc-user-define-permanent}) command makes a key
30454binding permanent so that it will remain in effect even in future Emacs
30455sessions. (It does this by adding a suitable bit of Lisp code into
30456your @file{.emacs} file.) For example, @kbd{Z P s} would register
30457our @code{sincos} command permanently. If you later wish to unregister
30458this command you must edit your @file{.emacs} file by hand.
30459(@xref{General Mode Commands}, for a way to tell Calc to use a
30460different file instead of @file{.emacs}.)
30461
30462The @kbd{Z P} command also saves the user definition, if any, for the
30463command bound to the key. After @kbd{Z F} and @kbd{Z C}, a given user
30464key could invoke a command, which in turn calls an algebraic function,
30465which might have one or more special display formats. A single @kbd{Z P}
30466command will save all of these definitions.
30467
30468To save a command or function without its key binding (or if there is
30469no key binding for the command or function), type @kbd{'} (the apostrophe)
30470when prompted for a key. Then, type the function name, or backspace
30471to change the @samp{calcFunc-} prefix to @samp{calc-} and enter a
30472command name. (If the command you give implies a function, the function
30473will be saved, and if the function has any display formats, those will
30474be saved, but not the other way around: Saving a function will not save
30475any commands or key bindings associated with the function.)
30476
30477@kindex Z E
30478@pindex calc-user-define-edit
30479@cindex Editing user definitions
30480The @kbd{Z E} (@code{calc-user-define-edit}) command edits the definition
30481of a user key. This works for keys that have been defined by either
30482keyboard macros or formulas; further details are contained in the relevant
30483following sections.
30484
30485@node Keyboard Macros, Invocation Macros, Creating User Keys, Programming
30486@section Programming with Keyboard Macros
30487
30488@noindent
30489@kindex X
30490@cindex Programming with keyboard macros
30491@cindex Keyboard macros
30492The easiest way to ``program'' the Emacs Calculator is to use standard
30493keyboard macros. Press @w{@kbd{C-x (}} to begin recording a macro. From
30494this point on, keystrokes you type will be saved away as well as
30495performing their usual functions. Press @kbd{C-x )} to end recording.
30496Press shift-@kbd{X} (or the standard Emacs key sequence @kbd{C-x e}) to
30497execute your keyboard macro by replaying the recorded keystrokes.
30498@xref{Keyboard Macros, , , emacs, the Emacs Manual}, for further
30499information.@refill
30500
30501When you use @kbd{X} to invoke a keyboard macro, the entire macro is
30502treated as a single command by the undo and trail features. The stack
30503display buffer is not updated during macro execution, but is instead
30504fixed up once the macro completes. Thus, commands defined with keyboard
30505macros are convenient and efficient. The @kbd{C-x e} command, on the
30506other hand, invokes the keyboard macro with no special treatment: Each
30507command in the macro will record its own undo information and trail entry,
30508and update the stack buffer accordingly. If your macro uses features
30509outside of Calc's control to operate on the contents of the Calc stack
30510buffer, or if it includes Undo, Redo, or last-arguments commands, you
30511must use @kbd{C-x e} to make sure the buffer and undo list are up-to-date
30512at all times. You could also consider using @kbd{K} (@code{calc-keep-args})
30513instead of @kbd{M-@key{RET}} (@code{calc-last-args}).
30514
30515Calc extends the standard Emacs keyboard macros in several ways.
30516Keyboard macros can be used to create user-defined commands. Keyboard
30517macros can include conditional and iteration structures, somewhat
30518analogous to those provided by a traditional programmable calculator.
30519
30520@menu
30521* Naming Keyboard Macros::
30522* Conditionals in Macros::
30523* Loops in Macros::
30524* Local Values in Macros::
30525* Queries in Macros::
30526@end menu
30527
30528@node Naming Keyboard Macros, Conditionals in Macros, Keyboard Macros, Keyboard Macros
30529@subsection Naming Keyboard Macros
30530
30531@noindent
30532@kindex Z K
30533@pindex calc-user-define-kbd-macro
30534Once you have defined a keyboard macro, you can bind it to a @kbd{z}
30535key sequence with the @kbd{Z K} (@code{calc-user-define-kbd-macro}) command.
30536This command prompts first for a key, then for a command name. For
30537example, if you type @kbd{C-x ( n @key{TAB} n @key{TAB} C-x )} you will
30538define a keyboard macro which negates the top two numbers on the stack
30539(@key{TAB} swaps the top two stack elements). Now you can type
30540@kbd{Z K n @key{RET}} to define this keyboard macro onto the @kbd{z n} key
30541sequence. The default command name (if you answer the second prompt with
30542just the @key{RET} key as in this example) will be something like
30543@samp{calc-User-n}. The keyboard macro will now be available as both
30544@kbd{z n} and @kbd{M-x calc-User-n}. You can backspace and enter a more
30545descriptive command name if you wish.@refill
30546
30547Macros defined by @kbd{Z K} act like single commands; they are executed
30548in the same way as by the @kbd{X} key. If you wish to define the macro
30549as a standard no-frills Emacs macro (to be executed as if by @kbd{C-x e}),
30550give a negative prefix argument to @kbd{Z K}.
30551
30552Once you have bound your keyboard macro to a key, you can use
30553@kbd{Z P} to register it permanently with Emacs. @xref{Creating User Keys}.
30554
30555@cindex Keyboard macros, editing
30556The @kbd{Z E} (@code{calc-user-define-edit}) command on a key that has
30557been defined by a keyboard macro tries to use the @code{edit-kbd-macro}
30558command to edit the macro. This command may be found in the
30559@file{macedit} package, a copy of which comes with Calc. It decomposes
30560the macro definition into full Emacs command names, like @code{calc-pop}
30561and @code{calc-add}. Type @kbd{M-# M-#} to finish editing and update
30562the definition stored on the key, or, to cancel the edit, type
30563@kbd{M-# x}.@refill
30564
30565If you give a negative numeric prefix argument to @kbd{Z E}, the keyboard
30566macro is edited in spelled-out keystroke form. For example, the editing
5d67986c 30567buffer might contain the nine characters @w{@samp{1 @key{RET} 2 +}}. When you press
d7b8e6c6
EZ
30568@kbd{M-# M-#}, the @code{read-kbd-macro} feature of the @file{macedit}
30569package is used to reinterpret these key names. The
30570notations @code{RET}, @code{LFD}, @code{TAB}, @code{SPC}, @code{DEL}, and
30571@code{NUL} must be written in all uppercase, as must the prefixes @code{C-}
30572and @code{M-}. Spaces and line breaks are ignored. Other characters are
30573copied verbatim into the keyboard macro. Basically, the notation is the
30574same as is used in all of this manual's examples, except that the manual
5d67986c
RS
30575takes some liberties with spaces: When we say @kbd{' [1 2 3] @key{RET}}, we take
30576it for granted that it is clear we really mean @kbd{' [1 @key{SPC} 2 @key{SPC} 3] @key{RET}},
d7b8e6c6
EZ
30577which is what @code{read-kbd-macro} wants to see.@refill
30578
30579If @file{macedit} is not available, @kbd{Z E} edits the keyboard macro
30580in ``raw'' form; the editing buffer simply contains characters like
30581@samp{1^M2+} (here @samp{^M} represents the carriage-return character).
30582Editing in this mode, you will have to use @kbd{C-q} to enter new
30583control characters into the buffer.@refill
30584
30585@kindex M-# m
30586@pindex read-kbd-macro
30587The @kbd{M-# m} (@code{read-kbd-macro}) command reads an Emacs ``region''
30588of spelled-out keystrokes and defines it as the current keyboard macro.
30589It is a convenient way to define a keyboard macro that has been stored
30590in a file, or to define a macro without executing it at the same time.
30591The @kbd{M-# m} command works only if @file{macedit} is present.
30592
30593@node Conditionals in Macros, Loops in Macros, Naming Keyboard Macros, Keyboard Macros
30594@subsection Conditionals in Keyboard Macros
30595
30596@noindent
30597@kindex Z [
30598@kindex Z ]
30599@pindex calc-kbd-if
30600@pindex calc-kbd-else
30601@pindex calc-kbd-else-if
30602@pindex calc-kbd-end-if
30603@cindex Conditional structures
30604The @kbd{Z [} (@code{calc-kbd-if}) and @kbd{Z ]} (@code{calc-kbd-end-if})
30605commands allow you to put simple tests in a keyboard macro. When Calc
30606sees the @kbd{Z [}, it pops an object from the stack and, if the object is
30607a non-zero value, continues executing keystrokes. But if the object is
30608zero, or if it is not provably nonzero, Calc skips ahead to the matching
30609@kbd{Z ]} keystroke. @xref{Logical Operations}, for a set of commands for
30610performing tests which conveniently produce 1 for true and 0 for false.
30611
30612For example, @kbd{@key{RET} 0 a < Z [ n Z ]} implements an absolute-value
30613function in the form of a keyboard macro. This macro duplicates the
30614number on the top of the stack, pushes zero and compares using @kbd{a <}
30615(@code{calc-less-than}), then, if the number was less than zero,
30616executes @kbd{n} (@code{calc-change-sign}). Otherwise, the change-sign
30617command is skipped.
30618
30619To program this macro, type @kbd{C-x (}, type the above sequence of
30620keystrokes, then type @kbd{C-x )}. Note that the keystrokes will be
30621executed while you are making the definition as well as when you later
30622re-execute the macro by typing @kbd{X}. Thus you should make sure a
30623suitable number is on the stack before defining the macro so that you
30624don't get a stack-underflow error during the definition process.
30625
30626Conditionals can be nested arbitrarily. However, there should be exactly
30627one @kbd{Z ]} for each @kbd{Z [} in a keyboard macro.
30628
30629@kindex Z :
30630The @kbd{Z :} (@code{calc-kbd-else}) command allows you to choose between
30631two keystroke sequences. The general format is @kbd{@var{cond} Z [
30632@var{then-part} Z : @var{else-part} Z ]}. If @var{cond} is true
30633(i.e., if the top of stack contains a non-zero number after @var{cond}
30634has been executed), the @var{then-part} will be executed and the
30635@var{else-part} will be skipped. Otherwise, the @var{then-part} will
30636be skipped and the @var{else-part} will be executed.
30637
30638@kindex Z |
30639The @kbd{Z |} (@code{calc-kbd-else-if}) command allows you to choose
30640between any number of alternatives. For example,
30641@kbd{@var{cond1} Z [ @var{part1} Z : @var{cond2} Z | @var{part2} Z :
30642@var{part3} Z ]} will execute @var{part1} if @var{cond1} is true,
30643otherwise it will execute @var{part2} if @var{cond2} is true, otherwise
30644it will execute @var{part3}.
30645
30646More precisely, @kbd{Z [} pops a number and conditionally skips to the
30647next matching @kbd{Z :} or @kbd{Z ]} key. @w{@kbd{Z ]}} has no effect when
30648actually executed. @kbd{Z :} skips to the next matching @kbd{Z ]}.
30649@kbd{Z |} pops a number and conditionally skips to the next matching
30650@kbd{Z :} or @kbd{Z ]}; thus, @kbd{Z [} and @kbd{Z |} are functionally
30651equivalent except that @kbd{Z [} participates in nesting but @kbd{Z |}
30652does not.
30653
30654Calc's conditional and looping constructs work by scanning the
30655keyboard macro for occurrences of character sequences like @samp{Z:}
30656and @samp{Z]}. One side-effect of this is that if you use these
30657constructs you must be careful that these character pairs do not
30658occur by accident in other parts of the macros. Since Calc rarely
30659uses shift-@kbd{Z} for any purpose except as a prefix character, this
30660is not likely to be a problem. Another side-effect is that it will
30661not work to define your own custom key bindings for these commands.
30662Only the standard shift-@kbd{Z} bindings will work correctly.
30663
30664@kindex Z C-g
30665If Calc gets stuck while skipping characters during the definition of a
30666macro, type @kbd{Z C-g} to cancel the definition. (Typing plain @kbd{C-g}
30667actually adds a @kbd{C-g} keystroke to the macro.)
30668
30669@node Loops in Macros, Local Values in Macros, Conditionals in Macros, Keyboard Macros
30670@subsection Loops in Keyboard Macros
30671
30672@noindent
30673@kindex Z <
30674@kindex Z >
30675@pindex calc-kbd-repeat
30676@pindex calc-kbd-end-repeat
30677@cindex Looping structures
30678@cindex Iterative structures
30679The @kbd{Z <} (@code{calc-kbd-repeat}) and @kbd{Z >}
30680(@code{calc-kbd-end-repeat}) commands pop a number from the stack,
30681which must be an integer, then repeat the keystrokes between the brackets
30682the specified number of times. If the integer is zero or negative, the
30683body is skipped altogether. For example, @kbd{1 @key{TAB} Z < 2 * Z >}
30684computes two to a nonnegative integer power. First, we push 1 on the
30685stack and then swap the integer argument back to the top. The @kbd{Z <}
30686pops that argument leaving the 1 back on top of the stack. Then, we
30687repeat a multiply-by-two step however many times.@refill
30688
30689Once again, the keyboard macro is executed as it is being entered.
30690In this case it is especially important to set up reasonable initial
30691conditions before making the definition: Suppose the integer 1000 just
30692happened to be sitting on the stack before we typed the above definition!
30693Another approach is to enter a harmless dummy definition for the macro,
30694then go back and edit in the real one with a @kbd{Z E} command. Yet
30695another approach is to type the macro as written-out keystroke names
30696in a buffer, then use @kbd{M-# m} (@code{read-kbd-macro}) to read the
30697macro.
30698
30699@kindex Z /
30700@pindex calc-break
30701The @kbd{Z /} (@code{calc-kbd-break}) command allows you to break out
30702of a keyboard macro loop prematurely. It pops an object from the stack;
30703if that object is true (a non-zero number), control jumps out of the
30704innermost enclosing @kbd{Z <} @dots{} @kbd{Z >} loop and continues
30705after the @kbd{Z >}. If the object is false, the @kbd{Z /} has no
30706effect. Thus @kbd{@var{cond} Z /} is similar to @samp{if (@var{cond}) break;}
30707in the C language.@refill
30708
30709@kindex Z (
30710@kindex Z )
30711@pindex calc-kbd-for
30712@pindex calc-kbd-end-for
30713The @kbd{Z (} (@code{calc-kbd-for}) and @kbd{Z )} (@code{calc-kbd-end-for})
30714commands are similar to @kbd{Z <} and @kbd{Z >}, except that they make the
30715value of the counter available inside the loop. The general layout is
30716@kbd{@var{init} @var{final} Z ( @var{body} @var{step} Z )}. The @kbd{Z (}
30717command pops initial and final values from the stack. It then creates
30718a temporary internal counter and initializes it with the value @var{init}.
30719The @kbd{Z (} command then repeatedly pushes the counter value onto the
30720stack and executes @var{body} and @var{step}, adding @var{step} to the
30721counter each time until the loop finishes.@refill
30722
30723@cindex Summations (by keyboard macros)
30724By default, the loop finishes when the counter becomes greater than (or
30725less than) @var{final}, assuming @var{initial} is less than (greater
30726than) @var{final}. If @var{initial} is equal to @var{final}, the body
30727executes exactly once. The body of the loop always executes at least
30728once. For example, @kbd{0 1 10 Z ( 2 ^ + 1 Z )} computes the sum of the
30729squares of the integers from 1 to 10, in steps of 1.
30730
30731If you give a numeric prefix argument of 1 to @kbd{Z (}, the loop is
30732forced to use upward-counting conventions. In this case, if @var{initial}
30733is greater than @var{final} the body will not be executed at all.
30734Note that @var{step} may still be negative in this loop; the prefix
30735argument merely constrains the loop-finished test. Likewise, a prefix
30736argument of @i{-1} forces downward-counting conventions.
30737
30738@kindex Z @{
30739@kindex Z @}
30740@pindex calc-kbd-loop
30741@pindex calc-kbd-end-loop
30742The @kbd{Z @{} (@code{calc-kbd-loop}) and @kbd{Z @}}
30743(@code{calc-kbd-end-loop}) commands are similar to @kbd{Z <} and
30744@kbd{Z >}, except that they do not pop a count from the stack---they
30745effectively create an infinite loop. Every @kbd{Z @{} @dots{} @kbd{Z @}}
30746loop ought to include at least one @kbd{Z /} to make sure the loop
30747doesn't run forever. (If any error message occurs which causes Emacs
30748to beep, the keyboard macro will also be halted; this is a standard
30749feature of Emacs. You can also generally press @kbd{C-g} to halt a
30750running keyboard macro, although not all versions of Unix support
30751this feature.)
30752
30753The conditional and looping constructs are not actually tied to
30754keyboard macros, but they are most often used in that context.
30755For example, the keystrokes @kbd{10 Z < 23 @key{RET} Z >} push
30756ten copies of 23 onto the stack. This can be typed ``live'' just
30757as easily as in a macro definition.
30758
30759@xref{Conditionals in Macros}, for some additional notes about
30760conditional and looping commands.
30761
30762@node Local Values in Macros, Queries in Macros, Loops in Macros, Keyboard Macros
30763@subsection Local Values in Macros
30764
30765@noindent
30766@cindex Local variables
30767@cindex Restoring saved modes
30768Keyboard macros sometimes want to operate under known conditions
30769without affecting surrounding conditions. For example, a keyboard
30770macro may wish to turn on Fraction Mode, or set a particular
30771precision, independent of the user's normal setting for those
30772modes.
30773
30774@kindex Z `
30775@kindex Z '
30776@pindex calc-kbd-push
30777@pindex calc-kbd-pop
30778Macros also sometimes need to use local variables. Assignments to
30779local variables inside the macro should not affect any variables
30780outside the macro. The @kbd{Z `} (@code{calc-kbd-push}) and @kbd{Z '}
30781(@code{calc-kbd-pop}) commands give you both of these capabilities.
30782
30783When you type @kbd{Z `} (with a backquote or accent grave character),
30784the values of various mode settings are saved away. The ten ``quick''
30785variables @code{q0} through @code{q9} are also saved. When
30786you type @w{@kbd{Z '}} (with an apostrophe), these values are restored.
30787Pairs of @kbd{Z `} and @kbd{Z '} commands may be nested.
30788
30789If a keyboard macro halts due to an error in between a @kbd{Z `} and
30790a @kbd{Z '}, the saved values will be restored correctly even though
30791the macro never reaches the @kbd{Z '} command. Thus you can use
30792@kbd{Z `} and @kbd{Z '} without having to worry about what happens
30793in exceptional conditions.
30794
30795If you type @kbd{Z `} ``live'' (not in a keyboard macro), Calc puts
30796you into a ``recursive edit.'' You can tell you are in a recursive
30797edit because there will be extra square brackets in the mode line,
30798as in @samp{[(Calculator)]}. These brackets will go away when you
30799type the matching @kbd{Z '} command. The modes and quick variables
30800will be saved and restored in just the same way as if actual keyboard
30801macros were involved.
30802
30803The modes saved by @kbd{Z `} and @kbd{Z '} are the current precision
30804and binary word size, the angular mode (Deg, Rad, or HMS), the
30805simplification mode, Algebraic mode, Symbolic mode, Infinite mode,
30806Matrix or Scalar mode, Fraction mode, and the current complex mode
30807(Polar or Rectangular). The ten ``quick'' variables' values (or lack
30808thereof) are also saved.
30809
30810Most mode-setting commands act as toggles, but with a numeric prefix
30811they force the mode either on (positive prefix) or off (negative
30812or zero prefix). Since you don't know what the environment might
30813be when you invoke your macro, it's best to use prefix arguments
30814for all mode-setting commands inside the macro.
30815
30816In fact, @kbd{C-u Z `} is like @kbd{Z `} except that it sets the modes
30817listed above to their default values. As usual, the matching @kbd{Z '}
30818will restore the modes to their settings from before the @kbd{C-u Z `}.
30819Also, @w{@kbd{Z `}} with a negative prefix argument resets algebraic mode
30820to its default (off) but leaves the other modes the same as they were
30821outside the construct.
30822
30823The contents of the stack and trail, values of non-quick variables, and
30824other settings such as the language mode and the various display modes,
30825are @emph{not} affected by @kbd{Z `} and @kbd{Z '}.
30826
30827@node Queries in Macros, , Local Values in Macros, Keyboard Macros
30828@subsection Queries in Keyboard Macros
30829
30830@noindent
30831@kindex Z =
30832@pindex calc-kbd-report
30833The @kbd{Z =} (@code{calc-kbd-report}) command displays an informative
30834message including the value on the top of the stack. You are prompted
30835to enter a string. That string, along with the top-of-stack value,
30836is displayed unless @kbd{m w} (@code{calc-working}) has been used
30837to turn such messages off.
30838
30839@kindex Z #
30840@pindex calc-kbd-query
30841The @kbd{Z #} (@code{calc-kbd-query}) command displays a prompt message
30842(which you enter during macro definition), then does an algebraic entry
30843which takes its input from the keyboard, even during macro execution.
30844This command allows your keyboard macros to accept numbers or formulas
30845as interactive input. All the normal conventions of algebraic input,
30846including the use of @kbd{$} characters, are supported.
30847
30848@xref{Kbd Macro Query, , , emacs, the Emacs Manual}, for a description of
30849@kbd{C-x q} (@code{kbd-macro-query}), the standard Emacs way to accept
30850keyboard input during a keyboard macro. In particular, you can use
30851@kbd{C-x q} to enter a recursive edit, which allows the user to perform
30852any Calculator operations interactively before pressing @kbd{C-M-c} to
30853return control to the keyboard macro.
30854
30855@node Invocation Macros, Algebraic Definitions, Keyboard Macros, Programming
30856@section Invocation Macros
30857
30858@kindex M-# z
30859@kindex Z I
30860@pindex calc-user-invocation
30861@pindex calc-user-define-invocation
30862Calc provides one special keyboard macro, called up by @kbd{M-# z}
30863(@code{calc-user-invocation}), that is intended to allow you to define
30864your own special way of starting Calc. To define this ``invocation
30865macro,'' create the macro in the usual way with @kbd{C-x (} and
30866@kbd{C-x )}, then type @kbd{Z I} (@code{calc-user-define-invocation}).
30867There is only one invocation macro, so you don't need to type any
30868additional letters after @kbd{Z I}. From now on, you can type
30869@kbd{M-# z} at any time to execute your invocation macro.
30870
30871For example, suppose you find yourself often grabbing rectangles of
30872numbers into Calc and multiplying their columns. You can do this
30873by typing @kbd{M-# r} to grab, and @kbd{V R : *} to multiply columns.
30874To make this into an invocation macro, just type @kbd{C-x ( M-# r
30875V R : * C-x )}, then @kbd{Z I}. Then, to multiply a rectangle of data,
30876just mark the data in its buffer in the usual way and type @kbd{M-# z}.
30877
30878Invocation macros are treated like regular Emacs keyboard macros;
30879all the special features described above for @kbd{Z K}-style macros
30880do not apply. @kbd{M-# z} is just like @kbd{C-x e}, except that it
30881uses the macro that was last stored by @kbd{Z I}. (In fact, the
30882macro does not even have to have anything to do with Calc!)
30883
30884The @kbd{m m} command saves the last invocation macro defined by
30885@kbd{Z I} along with all the other Calc mode settings.
30886@xref{General Mode Commands}.
30887
30888@node Algebraic Definitions, Lisp Definitions, Invocation Macros, Programming
30889@section Programming with Formulas
30890
30891@noindent
30892@kindex Z F
30893@pindex calc-user-define-formula
30894@cindex Programming with algebraic formulas
30895Another way to create a new Calculator command uses algebraic formulas.
30896The @kbd{Z F} (@code{calc-user-define-formula}) command stores the
30897formula at the top of the stack as the definition for a key. This
30898command prompts for five things: The key, the command name, the function
30899name, the argument list, and the behavior of the command when given
30900non-numeric arguments.
30901
30902For example, suppose we type @kbd{' a+2b @key{RET}} to push the formula
30903@samp{a + 2*b} onto the stack. We now type @kbd{Z F m} to define this
30904formula on the @kbd{z m} key sequence. The next prompt is for a command
30905name, beginning with @samp{calc-}, which should be the long (@kbd{M-x}) form
30906for the new command. If you simply press @key{RET}, a default name like
30907@code{calc-User-m} will be constructed. In our example, suppose we enter
30908@kbd{spam @key{RET}} to define the new command as @code{calc-spam}.
30909
30910If you want to give the formula a long-style name only, you can press
30911@key{SPC} or @key{RET} when asked which single key to use. For example
30912@kbd{Z F @key{RET} spam @key{RET}} defines the new command as
30913@kbd{M-x calc-spam}, with no keyboard equivalent.
30914
30915The third prompt is for a function name. The default is to use the same
30916name as the command name but with @samp{calcFunc-} in place of
30917@samp{calc-}. This is the name you will use if you want to enter your
30918new function in an algebraic formula. Suppose we enter @kbd{yow @key{RET}}.
30919Then the new function can be invoked by pushing two numbers on the
30920stack and typing @kbd{z m} or @kbd{x spam}, or by entering the algebraic
30921formula @samp{yow(x,y)}.@refill
30922
30923The fourth prompt is for the function's argument list. This is used to
30924associate values on the stack with the variables that appear in the formula.
30925The default is a list of all variables which appear in the formula, sorted
30926into alphabetical order. In our case, the default would be @samp{(a b)}.
30927This means that, when the user types @kbd{z m}, the Calculator will remove
30928two numbers from the stack, substitute these numbers for @samp{a} and
30929@samp{b} (respectively) in the formula, then simplify the formula and
30930push the result on the stack. In other words, @kbd{10 @key{RET} 100 z m}
30931would replace the 10 and 100 on the stack with the number 210, which is
30932@cite{a + 2 b} with @cite{a=10} and @cite{b=100}. Likewise, the formula
30933@samp{yow(10, 100)} will be evaluated by substituting @cite{a=10} and
30934@cite{b=100} in the definition.
30935
30936You can rearrange the order of the names before pressing @key{RET} to
30937control which stack positions go to which variables in the formula. If
30938you remove a variable from the argument list, that variable will be left
30939in symbolic form by the command. Thus using an argument list of @samp{(b)}
30940for our function would cause @kbd{10 z m} to replace the 10 on the stack
30941with the formula @samp{a + 20}. If we had used an argument list of
30942@samp{(b a)}, the result with inputs 10 and 100 would have been 120.
30943
30944You can also put a nameless function on the stack instead of just a
30945formula, as in @samp{<a, b : a + 2 b>}. @xref{Specifying Operators}.
30946In this example, the command will be defined by the formula @samp{a + 2 b}
30947using the argument list @samp{(a b)}.
30948
30949The final prompt is a y-or-n question concerning what to do if symbolic
30950arguments are given to your function. If you answer @kbd{y}, then
30951executing @kbd{z m} (using the original argument list @samp{(a b)}) with
30952arguments @cite{10} and @cite{x} will leave the function in symbolic
30953form, i.e., @samp{yow(10,x)}. On the other hand, if you answer @kbd{n},
30954then the formula will always be expanded, even for non-constant
30955arguments: @samp{10 + 2 x}. If you never plan to feed algebraic
30956formulas to your new function, it doesn't matter how you answer this
30957question.@refill
30958
30959If you answered @kbd{y} to this question you can still cause a function
30960call to be expanded by typing @kbd{a "} (@code{calc-expand-formula}).
30961Also, Calc will expand the function if necessary when you take a
30962derivative or integral or solve an equation involving the function.
30963
30964@kindex Z G
30965@pindex calc-get-user-defn
30966Once you have defined a formula on a key, you can retrieve this formula
30967with the @kbd{Z G} (@code{calc-user-define-get-defn}) command. Press a
30968key, and this command pushes the formula that was used to define that
30969key onto the stack. Actually, it pushes a nameless function that
30970specifies both the argument list and the defining formula. You will get
30971an error message if the key is undefined, or if the key was not defined
30972by a @kbd{Z F} command.@refill
30973
30974The @kbd{Z E} (@code{calc-user-define-edit}) command on a key that has
30975been defined by a formula uses a variant of the @code{calc-edit} command
30976to edit the defining formula. Press @kbd{M-# M-#} to finish editing and
30977store the new formula back in the definition, or @kbd{M-# x} to
30978cancel the edit. (The argument list and other properties of the
30979definition are unchanged; to adjust the argument list, you can use
30980@kbd{Z G} to grab the function onto the stack, edit with @kbd{`}, and
30981then re-execute the @kbd{Z F} command.)
30982
30983As usual, the @kbd{Z P} command records your definition permanently.
30984In this case it will permanently record all three of the relevant
30985definitions: the key, the command, and the function.
30986
30987You may find it useful to turn off the default simplifications with
30988@kbd{m O} (@code{calc-no-simplify-mode}) when entering a formula to be
30989used as a function definition. For example, the formula @samp{deriv(a^2,v)}
30990which might be used to define a new function @samp{dsqr(a,v)} will be
30991``simplified'' to 0 immediately upon entry since @code{deriv} considers
30992@cite{a} to be constant with respect to @cite{v}. Turning off
30993default simplifications cures this problem: The definition will be stored
30994in symbolic form without ever activating the @code{deriv} function. Press
30995@kbd{m D} to turn the default simplifications back on afterwards.
30996
30997@node Lisp Definitions, , Algebraic Definitions, Programming
30998@section Programming with Lisp
30999
31000@noindent
31001The Calculator can be programmed quite extensively in Lisp. All you
31002do is write a normal Lisp function definition, but with @code{defmath}
31003in place of @code{defun}. This has the same form as @code{defun}, but it
31004automagically replaces calls to standard Lisp functions like @code{+} and
31005@code{zerop} with calls to the corresponding functions in Calc's own library.
31006Thus you can write natural-looking Lisp code which operates on all of the
31007standard Calculator data types. You can then use @kbd{Z D} if you wish to
31008bind your new command to a @kbd{z}-prefix key sequence. The @kbd{Z E} command
31009will not edit a Lisp-based definition.
31010
31011Emacs Lisp is described in the GNU Emacs Lisp Reference Manual. This section
31012assumes a familiarity with Lisp programming concepts; if you do not know
31013Lisp, you may find keyboard macros or rewrite rules to be an easier way
31014to program the Calculator.
31015
31016This section first discusses ways to write commands, functions, or
31017small programs to be executed inside of Calc. Then it discusses how
31018your own separate programs are able to call Calc from the outside.
31019Finally, there is a list of internal Calc functions and data structures
31020for the true Lisp enthusiast.
31021
31022@menu
31023* Defining Functions::
31024* Defining Simple Commands::
31025* Defining Stack Commands::
31026* Argument Qualifiers::
31027* Example Definitions::
31028
31029* Calling Calc from Your Programs::
31030* Internals::
31031@end menu
31032
31033@node Defining Functions, Defining Simple Commands, Lisp Definitions, Lisp Definitions
31034@subsection Defining New Functions
31035
31036@noindent
31037@findex defmath
31038The @code{defmath} function (actually a Lisp macro) is like @code{defun}
31039except that code in the body of the definition can make use of the full
31040range of Calculator data types. The prefix @samp{calcFunc-} is added
31041to the specified name to get the actual Lisp function name. As a simple
31042example,
31043
31044@example
31045(defmath myfact (n)
31046 (if (> n 0)
31047 (* n (myfact (1- n)))
31048 1))
31049@end example
31050
31051@noindent
31052This actually expands to the code,
31053
31054@example
31055(defun calcFunc-myfact (n)
31056 (if (math-posp n)
31057 (math-mul n (calcFunc-myfact (math-add n -1)))
31058 1))
31059@end example
31060
31061@noindent
31062This function can be used in algebraic expressions, e.g., @samp{myfact(5)}.
31063
31064The @samp{myfact} function as it is defined above has the bug that an
31065expression @samp{myfact(a+b)} will be simplified to 1 because the
31066formula @samp{a+b} is not considered to be @code{posp}. A robust
31067factorial function would be written along the following lines:
31068
31069@smallexample
31070(defmath myfact (n)
31071 (if (> n 0)
31072 (* n (myfact (1- n)))
31073 (if (= n 0)
31074 1
31075 nil))) ; this could be simplified as: (and (= n 0) 1)
31076@end smallexample
31077
31078If a function returns @code{nil}, it is left unsimplified by the Calculator
31079(except that its arguments will be simplified). Thus, @samp{myfact(a+1+2)}
31080will be simplified to @samp{myfact(a+3)} but no further. Beware that every
31081time the Calculator reexamines this formula it will attempt to resimplify
31082it, so your function ought to detect the returning-@code{nil} case as
31083efficiently as possible.
31084
31085The following standard Lisp functions are treated by @code{defmath}:
31086@code{+}, @code{-}, @code{*}, @code{/}, @code{%}, @code{^} or
31087@code{expt}, @code{=}, @code{<}, @code{>}, @code{<=}, @code{>=},
31088@code{/=}, @code{1+}, @code{1-}, @code{logand}, @code{logior}, @code{logxor},
31089@code{logandc2}, @code{lognot}. Also, @code{~=} is an abbreviation for
31090@code{math-nearly-equal}, which is useful in implementing Taylor series.@refill
31091
31092For other functions @var{func}, if a function by the name
31093@samp{calcFunc-@var{func}} exists it is used, otherwise if a function by the
31094name @samp{math-@var{func}} exists it is used, otherwise if @var{func} itself
31095is defined as a function it is used, otherwise @samp{calcFunc-@var{func}} is
31096used on the assumption that this is a to-be-defined math function. Also, if
31097the function name is quoted as in @samp{('integerp a)} the function name is
31098always used exactly as written (but not quoted).@refill
31099
31100Variable names have @samp{var-} prepended to them unless they appear in
31101the function's argument list or in an enclosing @code{let}, @code{let*},
31102@code{for}, or @code{foreach} form,
31103or their names already contain a @samp{-} character. Thus a reference to
31104@samp{foo} is the same as a reference to @samp{var-foo}.@refill
31105
31106A few other Lisp extensions are available in @code{defmath} definitions:
31107
31108@itemize @bullet
31109@item
31110The @code{elt} function accepts any number of index variables.
31111Note that Calc vectors are stored as Lisp lists whose first
31112element is the symbol @code{vec}; thus, @samp{(elt v 2)} yields
31113the second element of vector @code{v}, and @samp{(elt m i j)}
31114yields one element of a Calc matrix.
31115
31116@item
31117The @code{setq} function has been extended to act like the Common
31118Lisp @code{setf} function. (The name @code{setf} is recognized as
31119a synonym of @code{setq}.) Specifically, the first argument of
31120@code{setq} can be an @code{nth}, @code{elt}, @code{car}, or @code{cdr} form,
31121in which case the effect is to store into the specified
31122element of a list. Thus, @samp{(setq (elt m i j) x)} stores @cite{x}
31123into one element of a matrix.
31124
31125@item
31126A @code{for} looping construct is available. For example,
31127@samp{(for ((i 0 10)) body)} executes @code{body} once for each
31128binding of @cite{i} from zero to 10. This is like a @code{let}
31129form in that @cite{i} is temporarily bound to the loop count
31130without disturbing its value outside the @code{for} construct.
31131Nested loops, as in @samp{(for ((i 0 10) (j 0 (1- i) 2)) body)},
31132are also available. For each value of @cite{i} from zero to 10,
31133@cite{j} counts from 0 to @cite{i-1} in steps of two. Note that
31134@code{for} has the same general outline as @code{let*}, except
31135that each element of the header is a list of three or four
31136things, not just two.
31137
31138@item
31139The @code{foreach} construct loops over elements of a list.
31140For example, @samp{(foreach ((x (cdr v))) body)} executes
31141@code{body} with @cite{x} bound to each element of Calc vector
31142@cite{v} in turn. The purpose of @code{cdr} here is to skip over
31143the initial @code{vec} symbol in the vector.
31144
31145@item
31146The @code{break} function breaks out of the innermost enclosing
31147@code{while}, @code{for}, or @code{foreach} loop. If given a
31148value, as in @samp{(break x)}, this value is returned by the
31149loop. (Lisp loops otherwise always return @code{nil}.)
31150
31151@item
31152The @code{return} function prematurely returns from the enclosing
31153function. For example, @samp{(return (+ x y))} returns @cite{x+y}
31154as the value of a function. You can use @code{return} anywhere
31155inside the body of the function.
31156@end itemize
31157
31158Non-integer numbers (and extremely large integers) cannot be included
31159directly into a @code{defmath} definition. This is because the Lisp
31160reader will fail to parse them long before @code{defmath} ever gets control.
31161Instead, use the notation, @samp{:"3.1415"}. In fact, any algebraic
31162formula can go between the quotes. For example,
31163
31164@smallexample
31165(defmath sqexp (x) ; sqexp(x) == sqrt(exp(x)) == exp(x*0.5)
31166 (and (numberp x)
31167 (exp :"x * 0.5")))
31168@end smallexample
31169
31170expands to
31171
31172@smallexample
31173(defun calcFunc-sqexp (x)
31174 (and (math-numberp x)
31175 (calcFunc-exp (math-mul x '(float 5 -1)))))
31176@end smallexample
31177
31178Note the use of @code{numberp} as a guard to ensure that the argument is
31179a number first, returning @code{nil} if not. The exponential function
31180could itself have been included in the expression, if we had preferred:
31181@samp{:"exp(x * 0.5)"}. As another example, the multiplication-and-recursion
31182step of @code{myfact} could have been written
31183
31184@example
31185:"n * myfact(n-1)"
31186@end example
31187
31188If a file named @file{.emacs} exists in your home directory, Emacs reads
31189and executes the Lisp forms in this file as it starts up. While it may
31190seem like a good idea to put your favorite @code{defmath} commands here,
31191this has the unfortunate side-effect that parts of the Calculator must be
31192loaded in to process the @code{defmath} commands whether or not you will
31193actually use the Calculator! A better effect can be had by writing
31194
31195@example
31196(put 'calc-define 'thing '(progn
31197 (defmath ... )
31198 (defmath ... )
31199))
31200@end example
31201
31202@noindent
31203@vindex calc-define
31204The @code{put} function adds a @dfn{property} to a symbol. Each Lisp
31205symbol has a list of properties associated with it. Here we add a
31206property with a name of @code{thing} and a @samp{(progn ...)} form as
31207its value. When Calc starts up, and at the start of every Calc command,
31208the property list for the symbol @code{calc-define} is checked and the
31209values of any properties found are evaluated as Lisp forms. The
31210properties are removed as they are evaluated. The property names
31211(like @code{thing}) are not used; you should choose something like the
31212name of your project so as not to conflict with other properties.
31213
31214The net effect is that you can put the above code in your @file{.emacs}
31215file and it will not be executed until Calc is loaded. Or, you can put
31216that same code in another file which you load by hand either before or
31217after Calc itself is loaded.
31218
31219The properties of @code{calc-define} are evaluated in the same order
31220that they were added. They can assume that the Calc modules @file{calc.el},
31221@file{calc-ext.el}, and @file{calc-macs.el} have been fully loaded, and
31222that the @samp{*Calculator*} buffer will be the current buffer.
31223
31224If your @code{calc-define} property only defines algebraic functions,
31225you can be sure that it will have been evaluated before Calc tries to
31226call your function, even if the file defining the property is loaded
31227after Calc is loaded. But if the property defines commands or key
31228sequences, it may not be evaluated soon enough. (Suppose it defines the
31229new command @code{tweak-calc}; the user can load your file, then type
31230@kbd{M-x tweak-calc} before Calc has had chance to do anything.) To
31231protect against this situation, you can put
31232
31233@example
31234(run-hooks 'calc-check-defines)
31235@end example
31236
31237@findex calc-check-defines
31238@noindent
31239at the end of your file. The @code{calc-check-defines} function is what
31240looks for and evaluates properties on @code{calc-define}; @code{run-hooks}
31241has the advantage that it is quietly ignored if @code{calc-check-defines}
31242is not yet defined because Calc has not yet been loaded.
31243
31244Examples of things that ought to be enclosed in a @code{calc-define}
31245property are @code{defmath} calls, @code{define-key} calls that modify
31246the Calc key map, and any calls that redefine things defined inside Calc.
31247Ordinary @code{defun}s need not be enclosed with @code{calc-define}.
31248
31249@node Defining Simple Commands, Defining Stack Commands, Defining Functions, Lisp Definitions
31250@subsection Defining New Simple Commands
31251
31252@noindent
31253@findex interactive
31254If a @code{defmath} form contains an @code{interactive} clause, it defines
31255a Calculator command. Actually such a @code{defmath} results in @emph{two}
31256function definitions: One, a @samp{calcFunc-} function as was just described,
31257with the @code{interactive} clause removed. Two, a @samp{calc-} function
31258with a suitable @code{interactive} clause and some sort of wrapper to make
31259the command work in the Calc environment.
31260
31261In the simple case, the @code{interactive} clause has the same form as
31262for normal Emacs Lisp commands:
31263
31264@smallexample
31265(defmath increase-precision (delta)
31266 "Increase precision by DELTA." ; This is the "documentation string"
31267 (interactive "p") ; Register this as a M-x-able command
31268 (setq calc-internal-prec (+ calc-internal-prec delta)))
31269@end smallexample
31270
31271This expands to the pair of definitions,
31272
31273@smallexample
31274(defun calc-increase-precision (delta)
31275 "Increase precision by DELTA."
31276 (interactive "p")
31277 (calc-wrapper
31278 (setq calc-internal-prec (math-add calc-internal-prec delta))))
31279
31280(defun calcFunc-increase-precision (delta)
31281 "Increase precision by DELTA."
31282 (setq calc-internal-prec (math-add calc-internal-prec delta)))
31283@end smallexample
31284
31285@noindent
31286where in this case the latter function would never really be used! Note
31287that since the Calculator stores small integers as plain Lisp integers,
31288the @code{math-add} function will work just as well as the native
31289@code{+} even when the intent is to operate on native Lisp integers.
31290
31291@findex calc-wrapper
31292The @samp{calc-wrapper} call invokes a macro which surrounds the body of
31293the function with code that looks roughly like this:
31294
31295@smallexample
31296(let ((calc-command-flags nil))
31297 (unwind-protect
31298 (save-excursion
31299 (calc-select-buffer)
31300 @emph{body of function}
31301 @emph{renumber stack}
31302 @emph{clear} Working @emph{message})
31303 @emph{realign cursor and window}
31304 @emph{clear Inverse, Hyperbolic, and Keep Args flags}
31305 @emph{update Emacs mode line}))
31306@end smallexample
31307
31308@findex calc-select-buffer
31309The @code{calc-select-buffer} function selects the @samp{*Calculator*}
31310buffer if necessary, say, because the command was invoked from inside
31311the @samp{*Calc Trail*} window.
31312
31313@findex calc-set-command-flag
5d67986c
RS
31314You can call, for example, @code{(calc-set-command-flag 'no-align)} to
31315set the above-mentioned command flags. Calc routines recognize the
31316following command flags:
d7b8e6c6
EZ
31317
31318@table @code
31319@item renum-stack
31320Stack line numbers @samp{1:}, @samp{2:}, and so on must be renumbered
31321after this command completes. This is set by routines like
31322@code{calc-push}.
31323
31324@item clear-message
31325Calc should call @samp{(message "")} if this command completes normally
31326(to clear a ``Working@dots{}'' message out of the echo area).
31327
31328@item no-align
31329Do not move the cursor back to the @samp{.} top-of-stack marker.
31330
31331@item position-point
31332Use the variables @code{calc-position-point-line} and
31333@code{calc-position-point-column} to position the cursor after
31334this command finishes.
31335
31336@item keep-flags
31337Do not clear @code{calc-inverse-flag}, @code{calc-hyperbolic-flag},
31338and @code{calc-keep-args-flag} at the end of this command.
31339
31340@item do-edit
31341Switch to buffer @samp{*Calc Edit*} after this command.
31342
31343@item hold-trail
31344Do not move trail pointer to end of trail when something is recorded
31345there.
31346@end table
31347
31348@kindex Y
31349@kindex Y ?
31350@vindex calc-Y-help-msgs
31351Calc reserves a special prefix key, shift-@kbd{Y}, for user-written
31352extensions to Calc. There are no built-in commands that work with
31353this prefix key; you must call @code{define-key} from Lisp (probably
31354from inside a @code{calc-define} property) to add to it. Initially only
31355@kbd{Y ?} is defined; it takes help messages from a list of strings
31356(initially @code{nil}) in the variable @code{calc-Y-help-msgs}. All
31357other undefined keys except for @kbd{Y} are reserved for use by
31358future versions of Calc.
31359
31360If you are writing a Calc enhancement which you expect to give to
31361others, it is best to minimize the number of @kbd{Y}-key sequences
31362you use. In fact, if you have more than one key sequence you should
31363consider defining three-key sequences with a @kbd{Y}, then a key that
31364stands for your package, then a third key for the particular command
31365within your package.
31366
31367Users may wish to install several Calc enhancements, and it is possible
31368that several enhancements will choose to use the same key. In the
31369example below, a variable @code{inc-prec-base-key} has been defined
31370to contain the key that identifies the @code{inc-prec} package. Its
31371value is initially @code{"P"}, but a user can change this variable
31372if necessary without having to modify the file.
31373
31374Here is a complete file, @file{inc-prec.el}, which makes a @kbd{Y P I}
31375command that increases the precision, and a @kbd{Y P D} command that
31376decreases the precision.
31377
31378@smallexample
31379;;; Increase and decrease Calc precision. Dave Gillespie, 5/31/91.
31380;;; (Include copyright or copyleft stuff here.)
31381
31382(defvar inc-prec-base-key "P"
31383 "Base key for inc-prec.el commands.")
31384
31385(put 'calc-define 'inc-prec '(progn
31386
31387(define-key calc-mode-map (format "Y%sI" inc-prec-base-key)
31388 'increase-precision)
31389(define-key calc-mode-map (format "Y%sD" inc-prec-base-key)
31390 'decrease-precision)
31391
31392(setq calc-Y-help-msgs
31393 (cons (format "%s + Inc-prec, Dec-prec" inc-prec-base-key)
31394 calc-Y-help-msgs))
31395
31396(defmath increase-precision (delta)
31397 "Increase precision by DELTA."
31398 (interactive "p")
31399 (setq calc-internal-prec (+ calc-internal-prec delta)))
31400
31401(defmath decrease-precision (delta)
31402 "Decrease precision by DELTA."
31403 (interactive "p")
31404 (setq calc-internal-prec (- calc-internal-prec delta)))
31405
31406)) ; end of calc-define property
31407
31408(run-hooks 'calc-check-defines)
31409@end smallexample
31410
31411@node Defining Stack Commands, Argument Qualifiers, Defining Simple Commands, Lisp Definitions
31412@subsection Defining New Stack-Based Commands
31413
31414@noindent
31415To define a new computational command which takes and/or leaves arguments
31416on the stack, a special form of @code{interactive} clause is used.
31417
31418@example
31419(interactive @var{num} @var{tag})
31420@end example
31421
31422@noindent
31423where @var{num} is an integer, and @var{tag} is a string. The effect is
31424to pop @var{num} values off the stack, resimplify them by calling
31425@code{calc-normalize}, and hand them to your function according to the
31426function's argument list. Your function may include @code{&optional} and
31427@code{&rest} parameters, so long as calling the function with @var{num}
31428parameters is legal.
31429
31430Your function must return either a number or a formula in a form
31431acceptable to Calc, or a list of such numbers or formulas. These value(s)
31432are pushed onto the stack when the function completes. They are also
31433recorded in the Calc Trail buffer on a line beginning with @var{tag},
31434a string of (normally) four characters or less. If you omit @var{tag}
31435or use @code{nil} as a tag, the result is not recorded in the trail.
31436
31437As an example, the definition
31438
31439@smallexample
31440(defmath myfact (n)
31441 "Compute the factorial of the integer at the top of the stack."
31442 (interactive 1 "fact")
31443 (if (> n 0)
31444 (* n (myfact (1- n)))
31445 (and (= n 0) 1)))
31446@end smallexample
31447
31448@noindent
31449is a version of the factorial function shown previously which can be used
31450as a command as well as an algebraic function. It expands to
31451
31452@smallexample
31453(defun calc-myfact ()
31454 "Compute the factorial of the integer at the top of the stack."
31455 (interactive)
31456 (calc-slow-wrapper
31457 (calc-enter-result 1 "fact"
31458 (cons 'calcFunc-myfact (calc-top-list-n 1)))))
31459
31460(defun calcFunc-myfact (n)
31461 "Compute the factorial of the integer at the top of the stack."
31462 (if (math-posp n)
31463 (math-mul n (calcFunc-myfact (math-add n -1)))
31464 (and (math-zerop n) 1)))
31465@end smallexample
31466
31467@findex calc-slow-wrapper
31468The @code{calc-slow-wrapper} function is a version of @code{calc-wrapper}
31469that automatically puts up a @samp{Working...} message before the
31470computation begins. (This message can be turned off by the user
31471with an @kbd{m w} (@code{calc-working}) command.)
31472
31473@findex calc-top-list-n
31474The @code{calc-top-list-n} function returns a list of the specified number
31475of values from the top of the stack. It resimplifies each value by
31476calling @code{calc-normalize}. If its argument is zero it returns an
31477empty list. It does not actually remove these values from the stack.
31478
31479@findex calc-enter-result
31480The @code{calc-enter-result} function takes an integer @var{num} and string
31481@var{tag} as described above, plus a third argument which is either a
31482Calculator data object or a list of such objects. These objects are
31483resimplified and pushed onto the stack after popping the specified number
31484of values from the stack. If @var{tag} is non-@code{nil}, the values
31485being pushed are also recorded in the trail.
31486
31487Note that if @code{calcFunc-myfact} returns @code{nil} this represents
31488``leave the function in symbolic form.'' To return an actual empty list,
31489in the sense that @code{calc-enter-result} will push zero elements back
31490onto the stack, you should return the special value @samp{'(nil)}, a list
31491containing the single symbol @code{nil}.
31492
31493The @code{interactive} declaration can actually contain a limited
31494Emacs-style code string as well which comes just before @var{num} and
31495@var{tag}. Currently the only Emacs code supported is @samp{"p"}, as in
31496
31497@example
31498(defmath foo (a b &optional c)
31499 (interactive "p" 2 "foo")
31500 @var{body})
31501@end example
31502
31503In this example, the command @code{calc-foo} will evaluate the expression
31504@samp{foo(a,b)} if executed with no argument, or @samp{foo(a,b,n)} if
31505executed with a numeric prefix argument of @cite{n}.
31506
31507The other code string allowed is @samp{"m"} (unrelated to the usual @samp{"m"}
31508code as used with @code{defun}). It uses the numeric prefix argument as the
31509number of objects to remove from the stack and pass to the function.
31510In this case, the integer @var{num} serves as a default number of
31511arguments to be used when no prefix is supplied.
31512
31513@node Argument Qualifiers, Example Definitions, Defining Stack Commands, Lisp Definitions
31514@subsection Argument Qualifiers
31515
31516@noindent
31517Anywhere a parameter name can appear in the parameter list you can also use
31518an @dfn{argument qualifier}. Thus the general form of a definition is:
31519
31520@example
31521(defmath @var{name} (@var{param} @var{param...}
31522 &optional @var{param} @var{param...}
31523 &rest @var{param})
31524 @var{body})
31525@end example
31526
31527@noindent
31528where each @var{param} is either a symbol or a list of the form
31529
31530@example
31531(@var{qual} @var{param})
31532@end example
31533
31534The following qualifiers are recognized:
31535
31536@table @samp
31537@item complete
31538@findex complete
31539The argument must not be an incomplete vector, interval, or complex number.
31540(This is rarely needed since the Calculator itself will never call your
31541function with an incomplete argument. But there is nothing stopping your
31542own Lisp code from calling your function with an incomplete argument.)@refill
31543
31544@item integer
31545@findex integer
31546The argument must be an integer. If it is an integer-valued float
31547it will be accepted but converted to integer form. Non-integers and
31548formulas are rejected.
31549
31550@item natnum
31551@findex natnum
31552Like @samp{integer}, but the argument must be non-negative.
31553
31554@item fixnum
31555@findex fixnum
31556Like @samp{integer}, but the argument must fit into a native Lisp integer,
31557which on most systems means less than 2^23 in absolute value. The
31558argument is converted into Lisp-integer form if necessary.
31559
31560@item float
31561@findex float
31562The argument is converted to floating-point format if it is a number or
31563vector. If it is a formula it is left alone. (The argument is never
31564actually rejected by this qualifier.)
31565
31566@item @var{pred}
31567The argument must satisfy predicate @var{pred}, which is one of the
31568standard Calculator predicates. @xref{Predicates}.
31569
31570@item not-@var{pred}
31571The argument must @emph{not} satisfy predicate @var{pred}.
31572@end table
31573
31574For example,
31575
31576@example
31577(defmath foo (a (constp (not-matrixp b)) &optional (float c)
31578 &rest (integer d))
31579 @var{body})
31580@end example
31581
31582@noindent
31583expands to
31584
31585@example
31586(defun calcFunc-foo (a b &optional c &rest d)
31587 (and (math-matrixp b)
31588 (math-reject-arg b 'not-matrixp))
31589 (or (math-constp b)
31590 (math-reject-arg b 'constp))
31591 (and c (setq c (math-check-float c)))
31592 (setq d (mapcar 'math-check-integer d))
31593 @var{body})
31594@end example
31595
31596@noindent
31597which performs the necessary checks and conversions before executing the
31598body of the function.
31599
31600@node Example Definitions, Calling Calc from Your Programs, Argument Qualifiers, Lisp Definitions
31601@subsection Example Definitions
31602
31603@noindent
31604This section includes some Lisp programming examples on a larger scale.
31605These programs make use of some of the Calculator's internal functions;
31606@pxref{Internals}.
31607
31608@menu
31609* Bit Counting Example::
31610* Sine Example::
31611@end menu
31612
31613@node Bit Counting Example, Sine Example, Example Definitions, Example Definitions
31614@subsubsection Bit-Counting
31615
31616@noindent
5d67986c
RS
31617@ignore
31618@starindex
31619@end ignore
d7b8e6c6
EZ
31620@tindex bcount
31621Calc does not include a built-in function for counting the number of
31622``one'' bits in a binary integer. It's easy to invent one using @kbd{b u}
31623to convert the integer to a set, and @kbd{V #} to count the elements of
31624that set; let's write a function that counts the bits without having to
31625create an intermediate set.
31626
31627@smallexample
31628(defmath bcount ((natnum n))
31629 (interactive 1 "bcnt")
31630 (let ((count 0))
31631 (while (> n 0)
31632 (if (oddp n)
31633 (setq count (1+ count)))
31634 (setq n (lsh n -1)))
31635 count))
31636@end smallexample
31637
31638@noindent
31639When this is expanded by @code{defmath}, it will become the following
31640Emacs Lisp function:
31641
31642@smallexample
31643(defun calcFunc-bcount (n)
31644 (setq n (math-check-natnum n))
31645 (let ((count 0))
31646 (while (math-posp n)
31647 (if (math-oddp n)
31648 (setq count (math-add count 1)))
31649 (setq n (calcFunc-lsh n -1)))
31650 count))
31651@end smallexample
31652
31653If the input numbers are large, this function involves a fair amount
31654of arithmetic. A binary right shift is essentially a division by two;
31655recall that Calc stores integers in decimal form so bit shifts must
31656involve actual division.
31657
31658To gain a bit more efficiency, we could divide the integer into
5d67986c 31659@var{n}-bit chunks, each of which can be handled quickly because
d7b8e6c6
EZ
31660they fit into Lisp integers. It turns out that Calc's arithmetic
31661routines are especially fast when dividing by an integer less than
5d67986c 316621000, so we can set @var{n = 9} bits and use repeated division by 512:
d7b8e6c6
EZ
31663
31664@smallexample
31665(defmath bcount ((natnum n))
31666 (interactive 1 "bcnt")
31667 (let ((count 0))
31668 (while (not (fixnump n))
31669 (let ((qr (idivmod n 512)))
31670 (setq count (+ count (bcount-fixnum (cdr qr)))
31671 n (car qr))))
31672 (+ count (bcount-fixnum n))))
31673
31674(defun bcount-fixnum (n)
31675 (let ((count 0))
31676 (while (> n 0)
31677 (setq count (+ count (logand n 1))
31678 n (lsh n -1)))
31679 count))
31680@end smallexample
31681
31682@noindent
31683Note that the second function uses @code{defun}, not @code{defmath}.
31684Because this function deals only with native Lisp integers (``fixnums''),
31685it can use the actual Emacs @code{+} and related functions rather
31686than the slower but more general Calc equivalents which @code{defmath}
31687uses.
31688
31689The @code{idivmod} function does an integer division, returning both
31690the quotient and the remainder at once. Again, note that while it
31691might seem that @samp{(logand n 511)} and @samp{(lsh n -9)} are
31692more efficient ways to split off the bottom nine bits of @code{n},
31693actually they are less efficient because each operation is really
31694a division by 512 in disguise; @code{idivmod} allows us to do the
31695same thing with a single division by 512.
31696
31697@node Sine Example, , Bit Counting Example, Example Definitions
31698@subsubsection The Sine Function
31699
31700@noindent
5d67986c
RS
31701@ignore
31702@starindex
31703@end ignore
d7b8e6c6
EZ
31704@tindex mysin
31705A somewhat limited sine function could be defined as follows, using the
31706well-known Taylor series expansion for @c{$\sin x$}
31707@samp{sin(x)}:
31708
31709@smallexample
31710(defmath mysin ((float (anglep x)))
31711 (interactive 1 "mysn")
31712 (setq x (to-radians x)) ; Convert from current angular mode.
31713 (let ((sum x) ; Initial term of Taylor expansion of sin.
31714 newsum
31715 (nfact 1) ; "nfact" equals "n" factorial at all times.
31716 (xnegsqr :"-(x^2)")) ; "xnegsqr" equals -x^2.
31717 (for ((n 3 100 2)) ; Upper limit of 100 is a good precaution.
31718 (working "mysin" sum) ; Display "Working" message, if enabled.
31719 (setq nfact (* nfact (1- n) n)
31720 x (* x xnegsqr)
31721 newsum (+ sum (/ x nfact)))
31722 (if (~= newsum sum) ; If newsum is "nearly equal to" sum,
31723 (break)) ; then we are done.
31724 (setq sum newsum))
31725 sum))
31726@end smallexample
31727
31728The actual @code{sin} function in Calc works by first reducing the problem
31729to a sine or cosine of a nonnegative number less than @c{$\pi \over 4$}
31730@cite{pi/4}. This
31731ensures that the Taylor series will converge quickly. Also, the calculation
31732is carried out with two extra digits of precision to guard against cumulative
31733round-off in @samp{sum}. Finally, complex arguments are allowed and handled
31734by a separate algorithm.
31735
31736@smallexample
31737(defmath mysin ((float (scalarp x)))
31738 (interactive 1 "mysn")
31739 (setq x (to-radians x)) ; Convert from current angular mode.
31740 (with-extra-prec 2 ; Evaluate with extra precision.
31741 (cond ((complexp x)
31742 (mysin-complex x))
31743 ((< x 0)
31744 (- (mysin-raw (- x))) ; Always call mysin-raw with x >= 0.
31745 (t (mysin-raw x))))))
31746
31747(defmath mysin-raw (x)
31748 (cond ((>= x 7)
31749 (mysin-raw (% x (two-pi)))) ; Now x < 7.
31750 ((> x (pi-over-2))
31751 (- (mysin-raw (- x (pi))))) ; Now -pi/2 <= x <= pi/2.
31752 ((> x (pi-over-4))
31753 (mycos-raw (- x (pi-over-2)))) ; Now -pi/2 <= x <= pi/4.
31754 ((< x (- (pi-over-4)))
31755 (- (mycos-raw (+ x (pi-over-2))))) ; Now -pi/4 <= x <= pi/4,
31756 (t (mysin-series x)))) ; so the series will be efficient.
31757@end smallexample
31758
31759@noindent
31760where @code{mysin-complex} is an appropriate function to handle complex
31761numbers, @code{mysin-series} is the routine to compute the sine Taylor
31762series as before, and @code{mycos-raw} is a function analogous to
31763@code{mysin-raw} for cosines.
31764
31765The strategy is to ensure that @cite{x} is nonnegative before calling
31766@code{mysin-raw}. This function then recursively reduces its argument
31767to a suitable range, namely, plus-or-minus @c{$\pi \over 4$}
31768@cite{pi/4}. Note that each
31769test, and particularly the first comparison against 7, is designed so
31770that small roundoff errors cannnot produce an infinite loop. (Suppose
31771we compared with @samp{(two-pi)} instead; if due to roundoff problems
31772the modulo operator ever returned @samp{(two-pi)} exactly, an infinite
31773recursion could result!) We use modulo only for arguments that will
31774clearly get reduced, knowing that the next rule will catch any reductions
31775that this rule misses.
31776
31777If a program is being written for general use, it is important to code
31778it carefully as shown in this second example. For quick-and-dirty programs,
31779when you know that your own use of the sine function will never encounter
31780a large argument, a simpler program like the first one shown is fine.
31781
31782@node Calling Calc from Your Programs, Internals, Example Definitions, Lisp Definitions
31783@subsection Calling Calc from Your Lisp Programs
31784
31785@noindent
31786A later section (@pxref{Internals}) gives a full description of
31787Calc's internal Lisp functions. It's not hard to call Calc from
31788inside your programs, but the number of these functions can be daunting.
31789So Calc provides one special ``programmer-friendly'' function called
31790@code{calc-eval} that can be made to do just about everything you
31791need. It's not as fast as the low-level Calc functions, but it's
31792much simpler to use!
31793
31794It may seem that @code{calc-eval} itself has a daunting number of
31795options, but they all stem from one simple operation.
31796
31797In its simplest manifestation, @samp{(calc-eval "1+2")} parses the
31798string @code{"1+2"} as if it were a Calc algebraic entry and returns
31799the result formatted as a string: @code{"3"}.
31800
31801Since @code{calc-eval} is on the list of recommended @code{autoload}
31802functions, you don't need to make any special preparations to load
31803Calc before calling @code{calc-eval} the first time. Calc will be
31804loaded and initialized for you.
31805
31806All the Calc modes that are currently in effect will be used when
31807evaluating the expression and formatting the result.
31808
31809@ifinfo
31810@example
31811
31812@end example
31813@end ifinfo
31814@subsubsection Additional Arguments to @code{calc-eval}
31815
31816@noindent
31817If the input string parses to a list of expressions, Calc returns
31818the results separated by @code{", "}. You can specify a different
31819separator by giving a second string argument to @code{calc-eval}:
31820@samp{(calc-eval "1+2,3+4" ";")} returns @code{"3;7"}.
31821
31822The ``separator'' can also be any of several Lisp symbols which
31823request other behaviors from @code{calc-eval}. These are discussed
31824one by one below.
31825
31826You can give additional arguments to be substituted for
31827@samp{$}, @samp{$$}, and so on in the main expression. For
31828example, @samp{(calc-eval "$/$$" nil "7" "1+1")} evaluates the
31829expression @code{"7/(1+1)"} to yield the result @code{"3.5"}
31830(assuming Fraction mode is not in effect). Note the @code{nil}
31831used as a placeholder for the item-separator argument.
31832
31833@ifinfo
31834@example
31835
31836@end example
31837@end ifinfo
31838@subsubsection Error Handling
31839
31840@noindent
31841If @code{calc-eval} encounters an error, it returns a list containing
31842the character position of the error, plus a suitable message as a
31843string. Note that @samp{1 / 0} is @emph{not} an error by Calc's
31844standards; it simply returns the string @code{"1 / 0"} which is the
31845division left in symbolic form. But @samp{(calc-eval "1/")} will
31846return the list @samp{(2 "Expected a number")}.
31847
31848If you bind the variable @code{calc-eval-error} to @code{t}
31849using a @code{let} form surrounding the call to @code{calc-eval},
31850errors instead call the Emacs @code{error} function which aborts
31851to the Emacs command loop with a beep and an error message.
31852
31853If you bind this variable to the symbol @code{string}, error messages
31854are returned as strings instead of lists. The character position is
31855ignored.
31856
31857As a courtesy to other Lisp code which may be using Calc, be sure
31858to bind @code{calc-eval-error} using @code{let} rather than changing
31859it permanently with @code{setq}.
31860
31861@ifinfo
31862@example
31863
31864@end example
31865@end ifinfo
31866@subsubsection Numbers Only
31867
31868@noindent
31869Sometimes it is preferable to treat @samp{1 / 0} as an error
31870rather than returning a symbolic result. If you pass the symbol
31871@code{num} as the second argument to @code{calc-eval}, results
31872that are not constants are treated as errors. The error message
31873reported is the first @code{calc-why} message if there is one,
31874or otherwise ``Number expected.''
31875
31876A result is ``constant'' if it is a number, vector, or other
31877object that does not include variables or function calls. If it
31878is a vector, the components must themselves be constants.
31879
31880@ifinfo
31881@example
31882
31883@end example
31884@end ifinfo
31885@subsubsection Default Modes
31886
31887@noindent
31888If the first argument to @code{calc-eval} is a list whose first
31889element is a formula string, then @code{calc-eval} sets all the
31890various Calc modes to their default values while the formula is
31891evaluated and formatted. For example, the precision is set to 12
31892digits, digit grouping is turned off, and the normal language
31893mode is used.
31894
31895This same principle applies to the other options discussed below.
31896If the first argument would normally be @var{x}, then it can also
31897be the list @samp{(@var{x})} to use the default mode settings.
31898
31899If there are other elements in the list, they are taken as
31900variable-name/value pairs which override the default mode
31901settings. Look at the documentation at the front of the
31902@file{calc.el} file to find the names of the Lisp variables for
31903the various modes. The mode settings are restored to their
31904original values when @code{calc-eval} is done.
31905
31906For example, @samp{(calc-eval '("$+$$" calc-internal-prec 8) 'num a b)}
31907computes the sum of two numbers, requiring a numeric result, and
31908using default mode settings except that the precision is 8 instead
31909of the default of 12.
31910
31911It's usually best to use this form of @code{calc-eval} unless your
31912program actually considers the interaction with Calc's mode settings
31913to be a feature. This will avoid all sorts of potential ``gotchas'';
31914consider what happens with @samp{(calc-eval "sqrt(2)" 'num)}
31915when the user has left Calc in symbolic mode or no-simplify mode.
31916
31917As another example, @samp{(equal (calc-eval '("$<$$") nil a b) "1")}
31918checks if the number in string @cite{a} is less than the one in
31919string @cite{b}. Without using a list, the integer 1 might
31920come out in a variety of formats which would be hard to test for
31921conveniently: @code{"1"}, @code{"8#1"}, @code{"00001"}. (But
31922see ``Predicates'' mode, below.)
31923
31924@ifinfo
31925@example
31926
31927@end example
31928@end ifinfo
31929@subsubsection Raw Numbers
31930
31931@noindent
31932Normally all input and output for @code{calc-eval} is done with strings.
31933You can do arithmetic with, say, @samp{(calc-eval "$+$$" nil a b)}
31934in place of @samp{(+ a b)}, but this is very inefficient since the
31935numbers must be converted to and from string format as they are passed
31936from one @code{calc-eval} to the next.
31937
31938If the separator is the symbol @code{raw}, the result will be returned
31939as a raw Calc data structure rather than a string. You can read about
31940how these objects look in the following sections, but usually you can
31941treat them as ``black box'' objects with no important internal
31942structure.
31943
31944There is also a @code{rawnum} symbol, which is a combination of
31945@code{raw} (returning a raw Calc object) and @code{num} (signalling
31946an error if that object is not a constant).
31947
31948You can pass a raw Calc object to @code{calc-eval} in place of a
31949string, either as the formula itself or as one of the @samp{$}
31950arguments. Thus @samp{(calc-eval "$+$$" 'raw a b)} is an
31951addition function that operates on raw Calc objects. Of course
31952in this case it would be easier to call the low-level @code{math-add}
31953function in Calc, if you can remember its name.
31954
31955In particular, note that a plain Lisp integer is acceptable to Calc
31956as a raw object. (All Lisp integers are accepted on input, but
31957integers of more than six decimal digits are converted to ``big-integer''
31958form for output. @xref{Data Type Formats}.)
31959
31960When it comes time to display the object, just use @samp{(calc-eval a)}
31961to format it as a string.
31962
31963It is an error if the input expression evaluates to a list of
31964values. The separator symbol @code{list} is like @code{raw}
31965except that it returns a list of one or more raw Calc objects.
31966
31967Note that a Lisp string is not a valid Calc object, nor is a list
31968containing a string. Thus you can still safely distinguish all the
31969various kinds of error returns discussed above.
31970
31971@ifinfo
31972@example
31973
31974@end example
31975@end ifinfo
31976@subsubsection Predicates
31977
31978@noindent
31979If the separator symbol is @code{pred}, the result of the formula is
31980treated as a true/false value; @code{calc-eval} returns @code{t} or
31981@code{nil}, respectively. A value is considered ``true'' if it is a
31982non-zero number, or false if it is zero or if it is not a number.
31983
31984For example, @samp{(calc-eval "$<$$" 'pred a b)} tests whether
31985one value is less than another.
31986
31987As usual, it is also possible for @code{calc-eval} to return one of
31988the error indicators described above. Lisp will interpret such an
31989indicator as ``true'' if you don't check for it explicitly. If you
31990wish to have an error register as ``false'', use something like
31991@samp{(eq (calc-eval ...) t)}.
31992
31993@ifinfo
31994@example
31995
31996@end example
31997@end ifinfo
31998@subsubsection Variable Values
31999
32000@noindent
32001Variables in the formula passed to @code{calc-eval} are not normally
32002replaced by their values. If you wish this, you can use the
32003@code{evalv} function (@pxref{Algebraic Manipulation}). For example,
32004if 4 is stored in Calc variable @code{a} (i.e., in Lisp variable
32005@code{var-a}), then @samp{(calc-eval "a+pi")} will return the
32006formula @code{"a + pi"}, but @samp{(calc-eval "evalv(a+pi)")}
32007will return @code{"7.14159265359"}.
32008
32009To store in a Calc variable, just use @code{setq} to store in the
32010corresponding Lisp variable. (This is obtained by prepending
32011@samp{var-} to the Calc variable name.) Calc routines will
32012understand either string or raw form values stored in variables,
32013although raw data objects are much more efficient. For example,
32014to increment the Calc variable @code{a}:
32015
32016@example
32017(setq var-a (calc-eval "evalv(a+1)" 'raw))
32018@end example
32019
32020@ifinfo
32021@example
32022
32023@end example
32024@end ifinfo
32025@subsubsection Stack Access
32026
32027@noindent
32028If the separator symbol is @code{push}, the formula argument is
32029evaluated (with possible @samp{$} expansions, as usual). The
32030result is pushed onto the Calc stack. The return value is @code{nil}
32031(unless there is an error from evaluating the formula, in which
32032case the return value depends on @code{calc-eval-error} in the
32033usual way).
32034
32035If the separator symbol is @code{pop}, the first argument to
32036@code{calc-eval} must be an integer instead of a string. That
32037many values are popped from the stack and thrown away. A negative
32038argument deletes the entry at that stack level. The return value
32039is the number of elements remaining in the stack after popping;
32040@samp{(calc-eval 0 'pop)} is a good way to measure the size of
32041the stack.
32042
32043If the separator symbol is @code{top}, the first argument to
32044@code{calc-eval} must again be an integer. The value at that
32045stack level is formatted as a string and returned. Thus
32046@samp{(calc-eval 1 'top)} returns the top-of-stack value. If the
32047integer is out of range, @code{nil} is returned.
32048
32049The separator symbol @code{rawtop} is just like @code{top} except
32050that the stack entry is returned as a raw Calc object instead of
32051as a string.
32052
32053In all of these cases the first argument can be made a list in
32054order to force the default mode settings, as described above.
32055Thus @samp{(calc-eval '(2 calc-number-radix 16) 'top)} returns the
32056second-to-top stack entry, formatted as a string using the default
32057instead of current display modes, except that the radix is
32058hexadecimal instead of decimal.
32059
32060It is, of course, polite to put the Calc stack back the way you
32061found it when you are done, unless the user of your program is
32062actually expecting it to affect the stack.
32063
32064Note that you do not actually have to switch into the @samp{*Calculator*}
32065buffer in order to use @code{calc-eval}; it temporarily switches into
32066the stack buffer if necessary.
32067
32068@ifinfo
32069@example
32070
32071@end example
32072@end ifinfo
32073@subsubsection Keyboard Macros
32074
32075@noindent
32076If the separator symbol is @code{macro}, the first argument must be a
32077string of characters which Calc can execute as a sequence of keystrokes.
32078This switches into the Calc buffer for the duration of the macro.
32079For example, @samp{(calc-eval "vx5\rVR+" 'macro)} pushes the
32080vector @samp{[1,2,3,4,5]} on the stack and then replaces it
32081with the sum of those numbers. Note that @samp{\r} is the Lisp
32082notation for the carriage-return, @key{RET}, character.
32083
32084If your keyboard macro wishes to pop the stack, @samp{\C-d} is
32085safer than @samp{\177} (the @key{DEL} character) because some
32086installations may have switched the meanings of @key{DEL} and
32087@kbd{C-h}. Calc always interprets @kbd{C-d} as a synonym for
32088``pop-stack'' regardless of key mapping.
32089
32090If you provide a third argument to @code{calc-eval}, evaluation
32091of the keyboard macro will leave a record in the Trail using
32092that argument as a tag string. Normally the Trail is unaffected.
32093
32094The return value in this case is always @code{nil}.
32095
32096@ifinfo
32097@example
32098
32099@end example
32100@end ifinfo
32101@subsubsection Lisp Evaluation
32102
32103@noindent
32104Finally, if the separator symbol is @code{eval}, then the Lisp
32105@code{eval} function is called on the first argument, which must
32106be a Lisp expression rather than a Calc formula. Remember to
32107quote the expression so that it is not evaluated until inside
32108@code{calc-eval}.
32109
32110The difference from plain @code{eval} is that @code{calc-eval}
32111switches to the Calc buffer before evaluating the expression.
32112For example, @samp{(calc-eval '(setq calc-internal-prec 17) 'eval)}
32113will correctly affect the buffer-local Calc precision variable.
32114
32115An alternative would be @samp{(calc-eval '(calc-precision 17) 'eval)}.
32116This is evaluating a call to the function that is normally invoked
32117by the @kbd{p} key, giving it 17 as its ``numeric prefix argument.''
32118Note that this function will leave a message in the echo area as
32119a side effect. Also, all Calc functions switch to the Calc buffer
32120automatically if not invoked from there, so the above call is
32121also equivalent to @samp{(calc-precision 17)} by itself.
32122In all cases, Calc uses @code{save-excursion} to switch back to
32123your original buffer when it is done.
32124
32125As usual the first argument can be a list that begins with a Lisp
32126expression to use default instead of current mode settings.
32127
32128The result of @code{calc-eval} in this usage is just the result
32129returned by the evaluated Lisp expression.
32130
32131@ifinfo
32132@example
32133
32134@end example
32135@end ifinfo
32136@subsubsection Example
32137
32138@noindent
32139@findex convert-temp
32140Here is a sample Emacs command that uses @code{calc-eval}. Suppose
32141you have a document with lots of references to temperatures on the
32142Fahrenheit scale, say ``98.6 F'', and you wish to convert these
32143references to Centigrade. The following command does this conversion.
32144Place the Emacs cursor right after the letter ``F'' and invoke the
32145command to change ``98.6 F'' to ``37 C''. Or, if the temperature is
32146already in Centigrade form, the command changes it back to Fahrenheit.
32147
32148@example
32149(defun convert-temp ()
32150 (interactive)
32151 (save-excursion
32152 (re-search-backward "[^-.0-9]\\([-.0-9]+\\) *\\([FC]\\)")
32153 (let* ((top1 (match-beginning 1))
32154 (bot1 (match-end 1))
32155 (number (buffer-substring top1 bot1))
32156 (top2 (match-beginning 2))
32157 (bot2 (match-end 2))
32158 (type (buffer-substring top2 bot2)))
32159 (if (equal type "F")
32160 (setq type "C"
32161 number (calc-eval "($ - 32)*5/9" nil number))
32162 (setq type "F"
32163 number (calc-eval "$*9/5 + 32" nil number)))
32164 (goto-char top2)
32165 (delete-region top2 bot2)
32166 (insert-before-markers type)
32167 (goto-char top1)
32168 (delete-region top1 bot1)
32169 (if (string-match "\\.$" number) ; change "37." to "37"
32170 (setq number (substring number 0 -1)))
32171 (insert number))))
32172@end example
32173
32174Note the use of @code{insert-before-markers} when changing between
32175``F'' and ``C'', so that the character winds up before the cursor
32176instead of after it.
32177
32178@node Internals, , Calling Calc from Your Programs, Lisp Definitions
32179@subsection Calculator Internals
32180
32181@noindent
32182This section describes the Lisp functions defined by the Calculator that
32183may be of use to user-written Calculator programs (as described in the
32184rest of this chapter). These functions are shown by their names as they
32185conventionally appear in @code{defmath}. Their full Lisp names are
32186generally gotten by prepending @samp{calcFunc-} or @samp{math-} to their
32187apparent names. (Names that begin with @samp{calc-} are already in
32188their full Lisp form.) You can use the actual full names instead if you
32189prefer them, or if you are calling these functions from regular Lisp.
32190
32191The functions described here are scattered throughout the various
32192Calc component files. Note that @file{calc.el} includes @code{autoload}s
32193for only a few component files; when Calc wants to call an advanced
32194function it calls @samp{(calc-extensions)} first; this function
32195autoloads @file{calc-ext.el}, which in turn autoloads all the functions
32196in the remaining component files.
32197
32198Because @code{defmath} itself uses the extensions, user-written code
32199generally always executes with the extensions already loaded, so
32200normally you can use any Calc function and be confident that it will
32201be autoloaded for you when necessary. If you are doing something
32202special, check carefully to make sure each function you are using is
32203from @file{calc.el} or its components, and call @samp{(calc-extensions)}
32204before using any function based in @file{calc-ext.el} if you can't
32205prove this file will already be loaded.
32206
32207@menu
32208* Data Type Formats::
32209* Interactive Lisp Functions::
32210* Stack Lisp Functions::
32211* Predicates::
32212* Computational Lisp Functions::
32213* Vector Lisp Functions::
32214* Symbolic Lisp Functions::
32215* Formatting Lisp Functions::
32216* Hooks::
32217@end menu
32218
32219@node Data Type Formats, Interactive Lisp Functions, Internals, Internals
32220@subsubsection Data Type Formats
32221
32222@noindent
32223Integers are stored in either of two ways, depending on their magnitude.
32224Integers less than one million in absolute value are stored as standard
32225Lisp integers. This is the only storage format for Calc data objects
32226which is not a Lisp list.
32227
32228Large integers are stored as lists of the form @samp{(bigpos @var{d0}
32229@var{d1} @var{d2} @dots{})} for positive integers 1000000 or more, or
32230@samp{(bigneg @var{d0} @var{d1} @var{d2} @dots{})} for negative integers
32231@i{-1000000} or less. Each @var{d} is a base-1000 ``digit,'' a Lisp integer
32232from 0 to 999. The least significant digit is @var{d0}; the last digit,
32233@var{dn}, which is always nonzero, is the most significant digit. For
32234example, the integer @i{-12345678} is stored as @samp{(bigneg 678 345 12)}.
32235
32236The distinction between small and large integers is entirely hidden from
32237the user. In @code{defmath} definitions, the Lisp predicate @code{integerp}
32238returns true for either kind of integer, and in general both big and small
32239integers are accepted anywhere the word ``integer'' is used in this manual.
32240If the distinction must be made, native Lisp integers are called @dfn{fixnums}
32241and large integers are called @dfn{bignums}.
32242
32243Fractions are stored as a list of the form, @samp{(frac @var{n} @var{d})}
32244where @var{n} is an integer (big or small) numerator, @var{d} is an
32245integer denominator greater than one, and @var{n} and @var{d} are relatively
32246prime. Note that fractions where @var{d} is one are automatically converted
32247to plain integers by all math routines; fractions where @var{d} is negative
32248are normalized by negating the numerator and denominator.
32249
32250Floating-point numbers are stored in the form, @samp{(float @var{mant}
32251@var{exp})}, where @var{mant} (the ``mantissa'') is an integer less than
32252@samp{10^@var{p}} in absolute value (@var{p} represents the current
32253precision), and @var{exp} (the ``exponent'') is a fixnum. The value of
32254the float is @samp{@var{mant} * 10^@var{exp}}. For example, the number
32255@i{-3.14} is stored as @samp{(float -314 -2) = -314*10^-2}. Other constraints
32256are that the number 0.0 is always stored as @samp{(float 0 0)}, and,
32257except for the 0.0 case, the rightmost base-10 digit of @var{mant} is
32258always nonzero. (If the rightmost digit is zero, the number is
32259rearranged by dividing @var{mant} by ten and incrementing @var{exp}.)@refill
32260
32261Rectangular complex numbers are stored in the form @samp{(cplx @var{re}
32262@var{im})}, where @var{re} and @var{im} are each real numbers, either
32263integers, fractions, or floats. The value is @samp{@var{re} + @var{im}i}.
32264The @var{im} part is nonzero; complex numbers with zero imaginary
32265components are converted to real numbers automatically.@refill
32266
32267Polar complex numbers are stored in the form @samp{(polar @var{r}
32268@var{theta})}, where @var{r} is a positive real value and @var{theta}
32269is a real value or HMS form representing an angle. This angle is
32270usually normalized to lie in the interval @samp{(-180 ..@: 180)} degrees,
32271or @samp{(-pi ..@: pi)} radians, according to the current angular mode.
32272If the angle is 0 the value is converted to a real number automatically.
32273(If the angle is 180 degrees, the value is usually also converted to a
32274negative real number.)@refill
32275
32276Hours-minutes-seconds forms are stored as @samp{(hms @var{h} @var{m}
32277@var{s})}, where @var{h} is an integer or an integer-valued float (i.e.,
32278a float with @samp{@var{exp} >= 0}), @var{m} is an integer or integer-valued
32279float in the range @w{@samp{[0 ..@: 60)}}, and @var{s} is any real number
32280in the range @samp{[0 ..@: 60)}.@refill
32281
32282Date forms are stored as @samp{(date @var{n})}, where @var{n} is
32283a real number that counts days since midnight on the morning of
32284January 1, 1 AD. If @var{n} is an integer, this is a pure date
32285form. If @var{n} is a fraction or float, this is a date/time form.
32286
32287Modulo forms are stored as @samp{(mod @var{n} @var{m})}, where @var{m} is a
32288positive real number or HMS form, and @var{n} is a real number or HMS
32289form in the range @samp{[0 ..@: @var{m})}.
32290
32291Error forms are stored as @samp{(sdev @var{x} @var{sigma})}, where @var{x}
32292is the mean value and @var{sigma} is the standard deviation. Each
32293component is either a number, an HMS form, or a symbolic object
32294(a variable or function call). If @var{sigma} is zero, the value is
32295converted to a plain real number. If @var{sigma} is negative or
32296complex, it is automatically normalized to be a positive real.
32297
32298Interval forms are stored as @samp{(intv @var{mask} @var{lo} @var{hi})},
32299where @var{mask} is one of the integers 0, 1, 2, or 3, and @var{lo} and
32300@var{hi} are real numbers, HMS forms, or symbolic objects. The @var{mask}
32301is a binary integer where 1 represents the fact that the interval is
32302closed on the high end, and 2 represents the fact that it is closed on
32303the low end. (Thus 3 represents a fully closed interval.) The interval
32304@w{@samp{(intv 3 @var{x} @var{x})}} is converted to the plain number @var{x};
32305intervals @samp{(intv @var{mask} @var{x} @var{x})} for any other @var{mask}
32306represent empty intervals. If @var{hi} is less than @var{lo}, the interval
32307is converted to a standard empty interval by replacing @var{hi} with @var{lo}.
32308
32309Vectors are stored as @samp{(vec @var{v1} @var{v2} @dots{})}, where @var{v1}
32310is the first element of the vector, @var{v2} is the second, and so on.
32311An empty vector is stored as @samp{(vec)}. A matrix is simply a vector
32312where all @var{v}'s are themselves vectors of equal lengths. Note that
32313Calc vectors are unrelated to the Emacs Lisp ``vector'' type, which is
32314generally unused by Calc data structures.
32315
32316Variables are stored as @samp{(var @var{name} @var{sym})}, where
32317@var{name} is a Lisp symbol whose print name is used as the visible name
32318of the variable, and @var{sym} is a Lisp symbol in which the variable's
32319value is actually stored. Thus, @samp{(var pi var-pi)} represents the
32320special constant @samp{pi}. Almost always, the form is @samp{(var
32321@var{v} var-@var{v})}. If the variable name was entered with @code{#}
32322signs (which are converted to hyphens internally), the form is
32323@samp{(var @var{u} @var{v})}, where @var{u} is a symbol whose name
32324contains @code{#} characters, and @var{v} is a symbol that contains
32325@code{-} characters instead. The value of a variable is the Calc
32326object stored in its @var{sym} symbol's value cell. If the symbol's
32327value cell is void or if it contains @code{nil}, the variable has no
32328value. Special constants have the form @samp{(special-const
32329@var{value})} stored in their value cell, where @var{value} is a formula
32330which is evaluated when the constant's value is requested. Variables
32331which represent units are not stored in any special way; they are units
32332only because their names appear in the units table. If the value
32333cell contains a string, it is parsed to get the variable's value when
32334the variable is used.@refill
32335
32336A Lisp list with any other symbol as the first element is a function call.
32337The symbols @code{+}, @code{-}, @code{*}, @code{/}, @code{%}, @code{^},
32338and @code{|} represent special binary operators; these lists are always
32339of the form @samp{(@var{op} @var{lhs} @var{rhs})} where @var{lhs} is the
32340sub-formula on the lefthand side and @var{rhs} is the sub-formula on the
32341right. The symbol @code{neg} represents unary negation; this list is always
32342of the form @samp{(neg @var{arg})}. Any other symbol @var{func} represents a
32343function that would be displayed in function-call notation; the symbol
32344@var{func} is in general always of the form @samp{calcFunc-@var{name}}.
32345The function cell of the symbol @var{func} should contain a Lisp function
32346for evaluating a call to @var{func}. This function is passed the remaining
32347elements of the list (themselves already evaluated) as arguments; such
32348functions should return @code{nil} or call @code{reject-arg} to signify
32349that they should be left in symbolic form, or they should return a Calc
32350object which represents their value, or a list of such objects if they
32351wish to return multiple values. (The latter case is allowed only for
32352functions which are the outer-level call in an expression whose value is
32353about to be pushed on the stack; this feature is considered obsolete
32354and is not used by any built-in Calc functions.)@refill
32355
32356@node Interactive Lisp Functions, Stack Lisp Functions, Data Type Formats, Internals
32357@subsubsection Interactive Functions
32358
32359@noindent
32360The functions described here are used in implementing interactive Calc
32361commands. Note that this list is not exhaustive! If there is an
32362existing command that behaves similarly to the one you want to define,
32363you may find helpful tricks by checking the source code for that command.
32364
32365@defun calc-set-command-flag flag
32366Set the command flag @var{flag}. This is generally a Lisp symbol, but
32367may in fact be anything. The effect is to add @var{flag} to the list
32368stored in the variable @code{calc-command-flags}, unless it is already
32369there. @xref{Defining Simple Commands}.
32370@end defun
32371
32372@defun calc-clear-command-flag flag
32373If @var{flag} appears among the list of currently-set command flags,
32374remove it from that list.
32375@end defun
32376
32377@defun calc-record-undo rec
32378Add the ``undo record'' @var{rec} to the list of steps to take if the
32379current operation should need to be undone. Stack push and pop functions
32380automatically call @code{calc-record-undo}, so the kinds of undo records
32381you might need to create take the form @samp{(set @var{sym} @var{value})},
32382which says that the Lisp variable @var{sym} was changed and had previously
32383contained @var{value}; @samp{(store @var{var} @var{value})} which says that
32384the Calc variable @var{var} (a string which is the name of the symbol that
32385contains the variable's value) was stored and its previous value was
32386@var{value} (either a Calc data object, or @code{nil} if the variable was
32387previously void); or @samp{(eval @var{undo} @var{redo} @var{args} @dots{})},
32388which means that to undo requires calling the function @samp{(@var{undo}
32389@var{args} @dots{})} and, if the undo is later redone, calling
32390@samp{(@var{redo} @var{args} @dots{})}.@refill
32391@end defun
32392
32393@defun calc-record-why msg args
32394Record the error or warning message @var{msg}, which is normally a string.
32395This message will be replayed if the user types @kbd{w} (@code{calc-why});
32396if the message string begins with a @samp{*}, it is considered important
32397enough to display even if the user doesn't type @kbd{w}. If one or more
32398@var{args} are present, the displayed message will be of the form,
32399@samp{@var{msg}: @var{arg1}, @var{arg2}, @dots{}}, where the arguments are
32400formatted on the assumption that they are either strings or Calc objects of
32401some sort. If @var{msg} is a symbol, it is the name of a Calc predicate
32402(such as @code{integerp} or @code{numvecp}) which the arguments did not
32403satisfy; it is expanded to a suitable string such as ``Expected an
32404integer.'' The @code{reject-arg} function calls @code{calc-record-why}
32405automatically; @pxref{Predicates}.@refill
32406@end defun
32407
32408@defun calc-is-inverse
32409This predicate returns true if the current command is inverse,
32410i.e., if the Inverse (@kbd{I} key) flag was set.
32411@end defun
32412
32413@defun calc-is-hyperbolic
32414This predicate is the analogous function for the @kbd{H} key.
32415@end defun
32416
32417@node Stack Lisp Functions, Predicates, Interactive Lisp Functions, Internals
32418@subsubsection Stack-Oriented Functions
32419
32420@noindent
32421The functions described here perform various operations on the Calc
32422stack and trail. They are to be used in interactive Calc commands.
32423
32424@defun calc-push-list vals n
32425Push the Calc objects in list @var{vals} onto the stack at stack level
32426@var{n}. If @var{n} is omitted it defaults to 1, so that the elements
32427are pushed at the top of the stack. If @var{n} is greater than 1, the
32428elements will be inserted into the stack so that the last element will
32429end up at level @var{n}, the next-to-last at level @var{n}+1, etc.
32430The elements of @var{vals} are assumed to be valid Calc objects, and
32431are not evaluated, rounded, or renormalized in any way. If @var{vals}
32432is an empty list, nothing happens.@refill
32433
32434The stack elements are pushed without any sub-formula selections.
32435You can give an optional third argument to this function, which must
32436be a list the same size as @var{vals} of selections. Each selection
32437must be @code{eq} to some sub-formula of the corresponding formula
32438in @var{vals}, or @code{nil} if that formula should have no selection.
32439@end defun
32440
32441@defun calc-top-list n m
32442Return a list of the @var{n} objects starting at level @var{m} of the
32443stack. If @var{m} is omitted it defaults to 1, so that the elements are
32444taken from the top of the stack. If @var{n} is omitted, it also
32445defaults to 1, so that the top stack element (in the form of a
32446one-element list) is returned. If @var{m} is greater than 1, the
32447@var{m}th stack element will be at the end of the list, the @var{m}+1st
32448element will be next-to-last, etc. If @var{n} or @var{m} are out of
32449range, the command is aborted with a suitable error message. If @var{n}
32450is zero, the function returns an empty list. The stack elements are not
32451evaluated, rounded, or renormalized.@refill
32452
32453If any stack elements contain selections, and selections have not
32454been disabled by the @kbd{j e} (@code{calc-enable-selections}) command,
32455this function returns the selected portions rather than the entire
32456stack elements. It can be given a third ``selection-mode'' argument
32457which selects other behaviors. If it is the symbol @code{t}, then
32458a selection in any of the requested stack elements produces an
32459``illegal operation on selections'' error. If it is the symbol @code{full},
32460the whole stack entry is always returned regardless of selections.
32461If it is the symbol @code{sel}, the selected portion is always returned,
32462or @code{nil} if there is no selection. (This mode ignores the @kbd{j e}
32463command.) If the symbol is @code{entry}, the complete stack entry in
32464list form is returned; the first element of this list will be the whole
32465formula, and the third element will be the selection (or @code{nil}).
32466@end defun
32467
32468@defun calc-pop-stack n m
32469Remove the specified elements from the stack. The parameters @var{n}
32470and @var{m} are defined the same as for @code{calc-top-list}. The return
32471value of @code{calc-pop-stack} is uninteresting.
32472
32473If there are any selected sub-formulas among the popped elements, and
32474@kbd{j e} has not been used to disable selections, this produces an
32475error without changing the stack. If you supply an optional third
32476argument of @code{t}, the stack elements are popped even if they
32477contain selections.
32478@end defun
32479
32480@defun calc-record-list vals tag
32481This function records one or more results in the trail. The @var{vals}
32482are a list of strings or Calc objects. The @var{tag} is the four-character
32483tag string to identify the values. If @var{tag} is omitted, a blank tag
32484will be used.
32485@end defun
32486
32487@defun calc-normalize n
32488This function takes a Calc object and ``normalizes'' it. At the very
32489least this involves re-rounding floating-point values according to the
32490current precision and other similar jobs. Also, unless the user has
32491selected no-simplify mode (@pxref{Simplification Modes}), this involves
32492actually evaluating a formula object by executing the function calls
32493it contains, and possibly also doing algebraic simplification, etc.
32494@end defun
32495
32496@defun calc-top-list-n n m
32497This function is identical to @code{calc-top-list}, except that it calls
32498@code{calc-normalize} on the values that it takes from the stack. They
32499are also passed through @code{check-complete}, so that incomplete
32500objects will be rejected with an error message. All computational
32501commands should use this in preference to @code{calc-top-list}; the only
32502standard Calc commands that operate on the stack without normalizing
32503are stack management commands like @code{calc-enter} and @code{calc-roll-up}.
32504This function accepts the same optional selection-mode argument as
32505@code{calc-top-list}.
32506@end defun
32507
32508@defun calc-top-n m
32509This function is a convenient form of @code{calc-top-list-n} in which only
32510a single element of the stack is taken and returned, rather than a list
32511of elements. This also accepts an optional selection-mode argument.
32512@end defun
32513
32514@defun calc-enter-result n tag vals
32515This function is a convenient interface to most of the above functions.
32516The @var{vals} argument should be either a single Calc object, or a list
32517of Calc objects; the object or objects are normalized, and the top @var{n}
32518stack entries are replaced by the normalized objects. If @var{tag} is
32519non-@code{nil}, the normalized objects are also recorded in the trail.
32520A typical stack-based computational command would take the form,
32521
32522@smallexample
32523(calc-enter-result @var{n} @var{tag} (cons 'calcFunc-@var{func}
32524 (calc-top-list-n @var{n})))
32525@end smallexample
32526
32527If any of the @var{n} stack elements replaced contain sub-formula
32528selections, and selections have not been disabled by @kbd{j e},
32529this function takes one of two courses of action. If @var{n} is
32530equal to the number of elements in @var{vals}, then each element of
32531@var{vals} is spliced into the corresponding selection; this is what
32532happens when you use the @key{TAB} key, or when you use a unary
32533arithmetic operation like @code{sqrt}. If @var{vals} has only one
32534element but @var{n} is greater than one, there must be only one
32535selection among the top @var{n} stack elements; the element from
32536@var{vals} is spliced into that selection. This is what happens when
32537you use a binary arithmetic operation like @kbd{+}. Any other
32538combination of @var{n} and @var{vals} is an error when selections
32539are present.
32540@end defun
32541
32542@defun calc-unary-op tag func arg
32543This function implements a unary operator that allows a numeric prefix
32544argument to apply the operator over many stack entries. If the prefix
32545argument @var{arg} is @code{nil}, this uses @code{calc-enter-result}
32546as outlined above. Otherwise, it maps the function over several stack
32547elements; @pxref{Prefix Arguments}. For example,@refill
32548
32549@smallexample
32550(defun calc-zeta (arg)
32551 (interactive "P")
32552 (calc-unary-op "zeta" 'calcFunc-zeta arg))
32553@end smallexample
32554@end defun
32555
32556@defun calc-binary-op tag func arg ident unary
32557This function implements a binary operator, analogously to
32558@code{calc-unary-op}. The optional @var{ident} and @var{unary}
32559arguments specify the behavior when the prefix argument is zero or
32560one, respectively. If the prefix is zero, the value @var{ident}
32561is pushed onto the stack, if specified, otherwise an error message
32562is displayed. If the prefix is one, the unary function @var{unary}
32563is applied to the top stack element, or, if @var{unary} is not
32564specified, nothing happens. When the argument is two or more,
32565the binary function @var{func} is reduced across the top @var{arg}
32566stack elements; when the argument is negative, the function is
32567mapped between the next-to-top @i{-@var{arg}} stack elements and the
32568top element.@refill
32569@end defun
32570
32571@defun calc-stack-size
32572Return the number of elements on the stack as an integer. This count
32573does not include elements that have been temporarily hidden by stack
32574truncation; @pxref{Truncating the Stack}.
32575@end defun
32576
32577@defun calc-cursor-stack-index n
32578Move the point to the @var{n}th stack entry. If @var{n} is zero, this
32579will be the @samp{.} line. If @var{n} is from 1 to the current stack size,
32580this will be the beginning of the first line of that stack entry's display.
32581If line numbers are enabled, this will move to the first character of the
32582line number, not the stack entry itself.@refill
32583@end defun
32584
32585@defun calc-substack-height n
32586Return the number of lines between the beginning of the @var{n}th stack
32587entry and the bottom of the buffer. If @var{n} is zero, this
32588will be one (assuming no stack truncation). If all stack entries are
32589one line long (i.e., no matrices are displayed), the return value will
32590be equal @var{n}+1 as long as @var{n} is in range. (Note that in Big
32591mode, the return value includes the blank lines that separate stack
32592entries.)@refill
32593@end defun
32594
32595@defun calc-refresh
32596Erase the @code{*Calculator*} buffer and reformat its contents from memory.
32597This must be called after changing any parameter, such as the current
32598display radix, which might change the appearance of existing stack
32599entries. (During a keyboard macro invoked by the @kbd{X} key, refreshing
32600is suppressed, but a flag is set so that the entire stack will be refreshed
32601rather than just the top few elements when the macro finishes.)@refill
32602@end defun
32603
32604@node Predicates, Computational Lisp Functions, Stack Lisp Functions, Internals
32605@subsubsection Predicates
32606
32607@noindent
32608The functions described here are predicates, that is, they return a
32609true/false value where @code{nil} means false and anything else means
32610true. These predicates are expanded by @code{defmath}, for example,
32611from @code{zerop} to @code{math-zerop}. In many cases they correspond
32612to native Lisp functions by the same name, but are extended to cover
32613the full range of Calc data types.
32614
32615@defun zerop x
32616Returns true if @var{x} is numerically zero, in any of the Calc data
32617types. (Note that for some types, such as error forms and intervals,
32618it never makes sense to return true.) In @code{defmath}, the expression
32619@samp{(= x 0)} will automatically be converted to @samp{(math-zerop x)},
32620and @samp{(/= x 0)} will be converted to @samp{(not (math-zerop x))}.
32621@end defun
32622
32623@defun negp x
32624Returns true if @var{x} is negative. This accepts negative real numbers
32625of various types, negative HMS and date forms, and intervals in which
32626all included values are negative. In @code{defmath}, the expression
32627@samp{(< x 0)} will automatically be converted to @samp{(math-negp x)},
32628and @samp{(>= x 0)} will be converted to @samp{(not (math-negp x))}.
32629@end defun
32630
32631@defun posp x
32632Returns true if @var{x} is positive (and non-zero). For complex
32633numbers, none of these three predicates will return true.
32634@end defun
32635
32636@defun looks-negp x
32637Returns true if @var{x} is ``negative-looking.'' This returns true if
32638@var{x} is a negative number, or a formula with a leading minus sign
32639such as @samp{-a/b}. In other words, this is an object which can be
32640made simpler by calling @code{(- @var{x})}.
32641@end defun
32642
32643@defun integerp x
32644Returns true if @var{x} is an integer of any size.
32645@end defun
32646
32647@defun fixnump x
32648Returns true if @var{x} is a native Lisp integer.
32649@end defun
32650
32651@defun natnump x
32652Returns true if @var{x} is a nonnegative integer of any size.
32653@end defun
32654
32655@defun fixnatnump x
32656Returns true if @var{x} is a nonnegative Lisp integer.
32657@end defun
32658
32659@defun num-integerp x
32660Returns true if @var{x} is numerically an integer, i.e., either a
32661true integer or a float with no significant digits to the right of
32662the decimal point.
32663@end defun
32664
32665@defun messy-integerp x
32666Returns true if @var{x} is numerically, but not literally, an integer.
32667A value is @code{num-integerp} if it is @code{integerp} or
32668@code{messy-integerp} (but it is never both at once).
32669@end defun
32670
32671@defun num-natnump x
32672Returns true if @var{x} is numerically a nonnegative integer.
32673@end defun
32674
32675@defun evenp x
32676Returns true if @var{x} is an even integer.
32677@end defun
32678
32679@defun looks-evenp x
32680Returns true if @var{x} is an even integer, or a formula with a leading
32681multiplicative coefficient which is an even integer.
32682@end defun
32683
32684@defun oddp x
32685Returns true if @var{x} is an odd integer.
32686@end defun
32687
32688@defun ratp x
32689Returns true if @var{x} is a rational number, i.e., an integer or a
32690fraction.
32691@end defun
32692
32693@defun realp x
32694Returns true if @var{x} is a real number, i.e., an integer, fraction,
32695or floating-point number.
32696@end defun
32697
32698@defun anglep x
32699Returns true if @var{x} is a real number or HMS form.
32700@end defun
32701
32702@defun floatp x
32703Returns true if @var{x} is a float, or a complex number, error form,
32704interval, date form, or modulo form in which at least one component
32705is a float.
32706@end defun
32707
32708@defun complexp x
32709Returns true if @var{x} is a rectangular or polar complex number
32710(but not a real number).
32711@end defun
32712
32713@defun rect-complexp x
32714Returns true if @var{x} is a rectangular complex number.
32715@end defun
32716
32717@defun polar-complexp x
32718Returns true if @var{x} is a polar complex number.
32719@end defun
32720
32721@defun numberp x
32722Returns true if @var{x} is a real number or a complex number.
32723@end defun
32724
32725@defun scalarp x
32726Returns true if @var{x} is a real or complex number or an HMS form.
32727@end defun
32728
32729@defun vectorp x
32730Returns true if @var{x} is a vector (this simply checks if its argument
32731is a list whose first element is the symbol @code{vec}).
32732@end defun
32733
32734@defun numvecp x
32735Returns true if @var{x} is a number or vector.
32736@end defun
32737
32738@defun matrixp x
32739Returns true if @var{x} is a matrix, i.e., a vector of one or more vectors,
32740all of the same size.
32741@end defun
32742
32743@defun square-matrixp x
32744Returns true if @var{x} is a square matrix.
32745@end defun
32746
32747@defun objectp x
32748Returns true if @var{x} is any numeric Calc object, including real and
32749complex numbers, HMS forms, date forms, error forms, intervals, and
32750modulo forms. (Note that error forms and intervals may include formulas
32751as their components; see @code{constp} below.)
32752@end defun
32753
32754@defun objvecp x
32755Returns true if @var{x} is an object or a vector. This also accepts
32756incomplete objects, but it rejects variables and formulas (except as
32757mentioned above for @code{objectp}).
32758@end defun
32759
32760@defun primp x
32761Returns true if @var{x} is a ``primitive'' or ``atomic'' Calc object,
32762i.e., one whose components cannot be regarded as sub-formulas. This
32763includes variables, and all @code{objectp} types except error forms
32764and intervals.
32765@end defun
32766
32767@defun constp x
32768Returns true if @var{x} is constant, i.e., a real or complex number,
32769HMS form, date form, or error form, interval, or vector all of whose
32770components are @code{constp}.
32771@end defun
32772
32773@defun lessp x y
32774Returns true if @var{x} is numerically less than @var{y}. Returns false
32775if @var{x} is greater than or equal to @var{y}, or if the order is
32776undefined or cannot be determined. Generally speaking, this works
32777by checking whether @samp{@var{x} - @var{y}} is @code{negp}. In
32778@code{defmath}, the expression @samp{(< x y)} will automatically be
32779converted to @samp{(lessp x y)}; expressions involving @code{>}, @code{<=},
32780and @code{>=} are similarly converted in terms of @code{lessp}.@refill
32781@end defun
32782
32783@defun beforep x y
32784Returns true if @var{x} comes before @var{y} in a canonical ordering
32785of Calc objects. If @var{x} and @var{y} are both real numbers, this
32786will be the same as @code{lessp}. But whereas @code{lessp} considers
32787other types of objects to be unordered, @code{beforep} puts any two
32788objects into a definite, consistent order. The @code{beforep}
32789function is used by the @kbd{V S} vector-sorting command, and also
32790by @kbd{a s} to put the terms of a product into canonical order:
32791This allows @samp{x y + y x} to be simplified easily to @samp{2 x y}.
32792@end defun
32793
32794@defun equal x y
32795This is the standard Lisp @code{equal} predicate; it returns true if
32796@var{x} and @var{y} are structurally identical. This is the usual way
32797to compare numbers for equality, but note that @code{equal} will treat
327980 and 0.0 as different.
32799@end defun
32800
32801@defun math-equal x y
32802Returns true if @var{x} and @var{y} are numerically equal, either because
32803they are @code{equal}, or because their difference is @code{zerop}. In
32804@code{defmath}, the expression @samp{(= x y)} will automatically be
32805converted to @samp{(math-equal x y)}.
32806@end defun
32807
32808@defun equal-int x n
32809Returns true if @var{x} and @var{n} are numerically equal, where @var{n}
32810is a fixnum which is not a multiple of 10. This will automatically be
32811used by @code{defmath} in place of the more general @code{math-equal}
32812whenever possible.@refill
32813@end defun
32814
32815@defun nearly-equal x y
32816Returns true if @var{x} and @var{y}, as floating-point numbers, are
32817equal except possibly in the last decimal place. For example,
32818314.159 and 314.166 are considered nearly equal if the current
32819precision is 6 (since they differ by 7 units), but not if the current
32820precision is 7 (since they differ by 70 units). Most functions which
32821use series expansions use @code{with-extra-prec} to evaluate the
32822series with 2 extra digits of precision, then use @code{nearly-equal}
32823to decide when the series has converged; this guards against cumulative
32824error in the series evaluation without doing extra work which would be
32825lost when the result is rounded back down to the current precision.
32826In @code{defmath}, this can be written @samp{(~= @var{x} @var{y})}.
32827The @var{x} and @var{y} can be numbers of any kind, including complex.
32828@end defun
32829
32830@defun nearly-zerop x y
32831Returns true if @var{x} is nearly zero, compared to @var{y}. This
32832checks whether @var{x} plus @var{y} would by be @code{nearly-equal}
32833to @var{y} itself, to within the current precision, in other words,
32834if adding @var{x} to @var{y} would have a negligible effect on @var{y}
32835due to roundoff error. @var{X} may be a real or complex number, but
32836@var{y} must be real.
32837@end defun
32838
32839@defun is-true x
32840Return true if the formula @var{x} represents a true value in
32841Calc, not Lisp, terms. It tests if @var{x} is a non-zero number
32842or a provably non-zero formula.
32843@end defun
32844
32845@defun reject-arg val pred
32846Abort the current function evaluation due to unacceptable argument values.
32847This calls @samp{(calc-record-why @var{pred} @var{val})}, then signals a
32848Lisp error which @code{normalize} will trap. The net effect is that the
32849function call which led here will be left in symbolic form.@refill
32850@end defun
32851
32852@defun inexact-value
32853If Symbolic Mode is enabled, this will signal an error that causes
32854@code{normalize} to leave the formula in symbolic form, with the message
32855``Inexact result.'' (This function has no effect when not in Symbolic Mode.)
32856Note that if your function calls @samp{(sin 5)} in Symbolic Mode, the
32857@code{sin} function will call @code{inexact-value}, which will cause your
32858function to be left unsimplified. You may instead wish to call
32859@samp{(normalize (list 'calcFunc-sin 5))}, which in Symbolic Mode will
32860return the formula @samp{sin(5)} to your function.@refill
32861@end defun
32862
32863@defun overflow
32864This signals an error that will be reported as a floating-point overflow.
32865@end defun
32866
32867@defun underflow
32868This signals a floating-point underflow.
32869@end defun
32870
32871@node Computational Lisp Functions, Vector Lisp Functions, Predicates, Internals
32872@subsubsection Computational Functions
32873
32874@noindent
32875The functions described here do the actual computational work of the
32876Calculator. In addition to these, note that any function described in
32877the main body of this manual may be called from Lisp; for example, if
32878the documentation refers to the @code{calc-sqrt} [@code{sqrt}] command,
32879this means @code{calc-sqrt} is an interactive stack-based square-root
32880command and @code{sqrt} (which @code{defmath} expands to @code{calcFunc-sqrt})
32881is the actual Lisp function for taking square roots.@refill
32882
32883The functions @code{math-add}, @code{math-sub}, @code{math-mul},
32884@code{math-div}, @code{math-mod}, and @code{math-neg} are not included
32885in this list, since @code{defmath} allows you to write native Lisp
32886@code{+}, @code{-}, @code{*}, @code{/}, @code{%}, and unary @code{-},
32887respectively, instead.@refill
32888
32889@defun normalize val
32890(Full form: @code{math-normalize}.)
32891Reduce the value @var{val} to standard form. For example, if @var{val}
32892is a fixnum, it will be converted to a bignum if it is too large, and
32893if @var{val} is a bignum it will be normalized by clipping off trailing
32894(i.e., most-significant) zero digits and converting to a fixnum if it is
32895small. All the various data types are similarly converted to their standard
32896forms. Variables are left alone, but function calls are actually evaluated
32897in formulas. For example, normalizing @samp{(+ 2 (calcFunc-abs -4))} will
32898return 6.@refill
32899
32900If a function call fails, because the function is void or has the wrong
32901number of parameters, or because it returns @code{nil} or calls
32902@code{reject-arg} or @code{inexact-result}, @code{normalize} returns
32903the formula still in symbolic form.@refill
32904
32905If the current Simplification Mode is ``none'' or ``numeric arguments
32906only,'' @code{normalize} will act appropriately. However, the more
32907powerful simplification modes (like algebraic simplification) are
32908not handled by @code{normalize}. They are handled by @code{calc-normalize},
32909which calls @code{normalize} and possibly some other routines, such
32910as @code{simplify} or @code{simplify-units}. Programs generally will
32911never call @code{calc-normalize} except when popping or pushing values
32912on the stack.@refill
32913@end defun
32914
32915@defun evaluate-expr expr
32916Replace all variables in @var{expr} that have values with their values,
32917then use @code{normalize} to simplify the result. This is what happens
32918when you press the @kbd{=} key interactively.@refill
32919@end defun
32920
32921@defmac with-extra-prec n body
32922Evaluate the Lisp forms in @var{body} with precision increased by @var{n}
32923digits. This is a macro which expands to
32924
32925@smallexample
32926(math-normalize
32927 (let ((calc-internal-prec (+ calc-internal-prec @var{n})))
32928 @var{body}))
32929@end smallexample
32930
32931The surrounding call to @code{math-normalize} causes a floating-point
32932result to be rounded down to the original precision afterwards. This
32933is important because some arithmetic operations assume a number's
32934mantissa contains no more digits than the current precision allows.
32935@end defmac
32936
32937@defun make-frac n d
32938Build a fraction @samp{@var{n}:@var{d}}. This is equivalent to calling
32939@samp{(normalize (list 'frac @var{n} @var{d}))}, but more efficient.
32940@end defun
32941
32942@defun make-float mant exp
32943Build a floating-point value out of @var{mant} and @var{exp}, both
32944of which are arbitrary integers. This function will return a
32945properly normalized float value, or signal an overflow or underflow
32946if @var{exp} is out of range.
32947@end defun
32948
32949@defun make-sdev x sigma
32950Build an error form out of @var{x} and the absolute value of @var{sigma}.
32951If @var{sigma} is zero, the result is the number @var{x} directly.
32952If @var{sigma} is negative or complex, its absolute value is used.
32953If @var{x} or @var{sigma} is not a valid type of object for use in
32954error forms, this calls @code{reject-arg}.
32955@end defun
32956
32957@defun make-intv mask lo hi
32958Build an interval form out of @var{mask} (which is assumed to be an
32959integer from 0 to 3), and the limits @var{lo} and @var{hi}. If
32960@var{lo} is greater than @var{hi}, an empty interval form is returned.
32961This calls @code{reject-arg} if @var{lo} or @var{hi} is unsuitable.
32962@end defun
32963
32964@defun sort-intv mask lo hi
32965Build an interval form, similar to @code{make-intv}, except that if
32966@var{lo} is less than @var{hi} they are simply exchanged, and the
32967bits of @var{mask} are swapped accordingly.
32968@end defun
32969
32970@defun make-mod n m
32971Build a modulo form out of @var{n} and the modulus @var{m}. Since modulo
32972forms do not allow formulas as their components, if @var{n} or @var{m}
32973is not a real number or HMS form the result will be a formula which
32974is a call to @code{makemod}, the algebraic version of this function.
32975@end defun
32976
32977@defun float x
32978Convert @var{x} to floating-point form. Integers and fractions are
32979converted to numerically equivalent floats; components of complex
32980numbers, vectors, HMS forms, date forms, error forms, intervals, and
32981modulo forms are recursively floated. If the argument is a variable
32982or formula, this calls @code{reject-arg}.
32983@end defun
32984
32985@defun compare x y
32986Compare the numbers @var{x} and @var{y}, and return @i{-1} if
32987@samp{(lessp @var{x} @var{y})}, 1 if @samp{(lessp @var{y} @var{x})},
329880 if @samp{(math-equal @var{x} @var{y})}, or 2 if the order is
32989undefined or cannot be determined.@refill
32990@end defun
32991
32992@defun numdigs n
32993Return the number of digits of integer @var{n}, effectively
32994@samp{ceil(log10(@var{n}))}, but much more efficient. Zero is
32995considered to have zero digits.
32996@end defun
32997
32998@defun scale-int x n
32999Shift integer @var{x} left @var{n} decimal digits, or right @i{-@var{n}}
33000digits with truncation toward zero.
33001@end defun
33002
33003@defun scale-rounding x n
33004Like @code{scale-int}, except that a right shift rounds to the nearest
33005integer rather than truncating.
33006@end defun
33007
33008@defun fixnum n
33009Return the integer @var{n} as a fixnum, i.e., a native Lisp integer.
33010If @var{n} is outside the permissible range for Lisp integers (usually
3301124 binary bits) the result is undefined.
33012@end defun
33013
33014@defun sqr x
33015Compute the square of @var{x}; short for @samp{(* @var{x} @var{x})}.
33016@end defun
33017
33018@defun quotient x y
33019Divide integer @var{x} by integer @var{y}; return an integer quotient
33020and discard the remainder. If @var{x} or @var{y} is negative, the
33021direction of rounding is undefined.
33022@end defun
33023
33024@defun idiv x y
33025Perform an integer division; if @var{x} and @var{y} are both nonnegative
33026integers, this uses the @code{quotient} function, otherwise it computes
33027@samp{floor(@var{x}/@var{y})}. Thus the result is well-defined but
33028slower than for @code{quotient}.
33029@end defun
33030
33031@defun imod x y
33032Divide integer @var{x} by integer @var{y}; return the integer remainder
33033and discard the quotient. Like @code{quotient}, this works only for
33034integer arguments and is not well-defined for negative arguments.
33035For a more well-defined result, use @samp{(% @var{x} @var{y})}.
33036@end defun
33037
33038@defun idivmod x y
33039Divide integer @var{x} by integer @var{y}; return a cons cell whose
33040@code{car} is @samp{(quotient @var{x} @var{y})} and whose @code{cdr}
33041is @samp{(imod @var{x} @var{y})}.@refill
33042@end defun
33043
33044@defun pow x y
33045Compute @var{x} to the power @var{y}. In @code{defmath} code, this can
33046also be written @samp{(^ @var{x} @var{y})} or
33047@w{@samp{(expt @var{x} @var{y})}}.@refill
33048@end defun
33049
33050@defun abs-approx x
33051Compute a fast approximation to the absolute value of @var{x}. For
33052example, for a rectangular complex number the result is the sum of
33053the absolute values of the components.
33054@end defun
33055
33056@findex two-pi
33057@findex pi-over-2
33058@findex pi-over-4
33059@findex pi-over-180
33060@findex sqrt-two-pi
33061@findex sqrt-e
33062@findex e
33063@findex ln-2
33064@findex ln-10
33065@defun pi
33066The function @samp{(pi)} computes @samp{pi} to the current precision.
33067Other related constant-generating functions are @code{two-pi},
33068@code{pi-over-2}, @code{pi-over-4}, @code{pi-over-180}, @code{sqrt-two-pi},
33069@code{e}, @code{sqrt-e}, @code{ln-2}, and @code{ln-10}. Each function
33070returns a floating-point value in the current precision, and each uses
33071caching so that all calls after the first are essentially free.@refill
33072@end defun
33073
33074@defmac math-defcache @var{func} @var{initial} @var{form}
33075This macro, usually used as a top-level call like @code{defun} or
33076@code{defvar}, defines a new cached constant analogous to @code{pi}, etc.
33077It defines a function @code{func} which returns the requested value;
33078if @var{initial} is non-@code{nil} it must be a @samp{(float @dots{})}
33079form which serves as an initial value for the cache. If @var{func}
33080is called when the cache is empty or does not have enough digits to
33081satisfy the current precision, the Lisp expression @var{form} is evaluated
33082with the current precision increased by four, and the result minus its
33083two least significant digits is stored in the cache. For example,
33084calling @samp{(pi)} with a precision of 30 computes @samp{pi} to 34
33085digits, rounds it down to 32 digits for future use, then rounds it
33086again to 30 digits for use in the present request.@refill
33087@end defmac
33088
33089@findex half-circle
33090@findex quarter-circle
33091@defun full-circle symb
33092If the current angular mode is Degrees or HMS, this function returns the
33093integer 360. In Radians mode, this function returns either the
33094corresponding value in radians to the current precision, or the formula
33095@samp{2*pi}, depending on the Symbolic Mode. There are also similar
33096function @code{half-circle} and @code{quarter-circle}.
33097@end defun
33098
33099@defun power-of-2 n
33100Compute two to the integer power @var{n}, as a (potentially very large)
33101integer. Powers of two are cached, so only the first call for a
33102particular @var{n} is expensive.
33103@end defun
33104
33105@defun integer-log2 n
33106Compute the base-2 logarithm of @var{n}, which must be an integer which
33107is a power of two. If @var{n} is not a power of two, this function will
33108return @code{nil}.
33109@end defun
33110
33111@defun div-mod a b m
33112Divide @var{a} by @var{b}, modulo @var{m}. This returns @code{nil} if
33113there is no solution, or if any of the arguments are not integers.@refill
33114@end defun
33115
33116@defun pow-mod a b m
33117Compute @var{a} to the power @var{b}, modulo @var{m}. If @var{a},
33118@var{b}, and @var{m} are integers, this uses an especially efficient
33119algorithm. Otherwise, it simply computes @samp{(% (^ a b) m)}.
33120@end defun
33121
33122@defun isqrt n
33123Compute the integer square root of @var{n}. This is the square root
33124of @var{n} rounded down toward zero, i.e., @samp{floor(sqrt(@var{n}))}.
33125If @var{n} is itself an integer, the computation is especially efficient.
33126@end defun
33127
33128@defun to-hms a ang
33129Convert the argument @var{a} into an HMS form. If @var{ang} is specified,
33130it is the angular mode in which to interpret @var{a}, either @code{deg}
33131or @code{rad}. Otherwise, the current angular mode is used. If @var{a}
33132is already an HMS form it is returned as-is.
33133@end defun
33134
33135@defun from-hms a ang
33136Convert the HMS form @var{a} into a real number. If @var{ang} is specified,
33137it is the angular mode in which to express the result, otherwise the
33138current angular mode is used. If @var{a} is already a real number, it
33139is returned as-is.
33140@end defun
33141
33142@defun to-radians a
33143Convert the number or HMS form @var{a} to radians from the current
33144angular mode.
33145@end defun
33146
33147@defun from-radians a
33148Convert the number @var{a} from radians to the current angular mode.
33149If @var{a} is a formula, this returns the formula @samp{deg(@var{a})}.
33150@end defun
33151
33152@defun to-radians-2 a
33153Like @code{to-radians}, except that in Symbolic Mode a degrees to
33154radians conversion yields a formula like @samp{@var{a}*pi/180}.
33155@end defun
33156
33157@defun from-radians-2 a
33158Like @code{from-radians}, except that in Symbolic Mode a radians to
33159degrees conversion yields a formula like @samp{@var{a}*180/pi}.
33160@end defun
33161
33162@defun random-digit
33163Produce a random base-1000 digit in the range 0 to 999.
33164@end defun
33165
33166@defun random-digits n
33167Produce a random @var{n}-digit integer; this will be an integer
33168in the interval @samp{[0, 10^@var{n})}.
33169@end defun
33170
33171@defun random-float
33172Produce a random float in the interval @samp{[0, 1)}.
33173@end defun
33174
33175@defun prime-test n iters
33176Determine whether the integer @var{n} is prime. Return a list which has
33177one of these forms: @samp{(nil @var{f})} means the number is non-prime
33178because it was found to be divisible by @var{f}; @samp{(nil)} means it
33179was found to be non-prime by table look-up (so no factors are known);
33180@samp{(nil unknown)} means it is definitely non-prime but no factors
33181are known because @var{n} was large enough that Fermat's probabilistic
33182test had to be used; @samp{(t)} means the number is definitely prime;
33183and @samp{(maybe @var{i} @var{p})} means that Fermat's test, after @var{i}
33184iterations, is @var{p} percent sure that the number is prime. The
33185@var{iters} parameter is the number of Fermat iterations to use, in the
33186case that this is necessary. If @code{prime-test} returns ``maybe,''
33187you can call it again with the same @var{n} to get a greater certainty;
33188@code{prime-test} remembers where it left off.@refill
33189@end defun
33190
33191@defun to-simple-fraction f
33192If @var{f} is a floating-point number which can be represented exactly
33193as a small rational number. return that number, else return @var{f}.
33194For example, 0.75 would be converted to 3:4. This function is very
33195fast.
33196@end defun
33197
33198@defun to-fraction f tol
33199Find a rational approximation to floating-point number @var{f} to within
33200a specified tolerance @var{tol}; this corresponds to the algebraic
33201function @code{frac}, and can be rather slow.
33202@end defun
33203
33204@defun quarter-integer n
33205If @var{n} is an integer or integer-valued float, this function
33206returns zero. If @var{n} is a half-integer (i.e., an integer plus
33207@i{1:2} or 0.5), it returns 2. If @var{n} is a quarter-integer,
33208it returns 1 or 3. If @var{n} is anything else, this function
33209returns @code{nil}.
33210@end defun
33211
33212@node Vector Lisp Functions, Symbolic Lisp Functions, Computational Lisp Functions, Internals
33213@subsubsection Vector Functions
33214
33215@noindent
33216The functions described here perform various operations on vectors and
33217matrices.
33218
33219@defun math-concat x y
33220Do a vector concatenation; this operation is written @samp{@var{x} | @var{y}}
33221in a symbolic formula. @xref{Building Vectors}.
33222@end defun
33223
33224@defun vec-length v
33225Return the length of vector @var{v}. If @var{v} is not a vector, the
33226result is zero. If @var{v} is a matrix, this returns the number of
33227rows in the matrix.
33228@end defun
33229
33230@defun mat-dimens m
33231Determine the dimensions of vector or matrix @var{m}. If @var{m} is not
33232a vector, the result is an empty list. If @var{m} is a plain vector
33233but not a matrix, the result is a one-element list containing the length
33234of the vector. If @var{m} is a matrix with @var{r} rows and @var{c} columns,
33235the result is the list @samp{(@var{r} @var{c})}. Higher-order tensors
33236produce lists of more than two dimensions. Note that the object
33237@samp{[[1, 2, 3], [4, 5]]} is a vector of vectors not all the same size,
33238and is treated by this and other Calc routines as a plain vector of two
33239elements.@refill
33240@end defun
33241
33242@defun dimension-error
33243Abort the current function with a message of ``Dimension error.''
33244The Calculator will leave the function being evaluated in symbolic
33245form; this is really just a special case of @code{reject-arg}.
33246@end defun
33247
33248@defun build-vector args
5d67986c 33249Return a Calc vector with @var{args} as elements.
d7b8e6c6
EZ
33250For example, @samp{(build-vector 1 2 3)} returns the Calc vector
33251@samp{[1, 2, 3]}, stored internally as the list @samp{(vec 1 2 3)}.
33252@end defun
33253
33254@defun make-vec obj dims
33255Return a Calc vector or matrix all of whose elements are equal to
33256@var{obj}. For example, @samp{(make-vec 27 3 4)} returns a 3x4 matrix
33257filled with 27's.
33258@end defun
33259
33260@defun row-matrix v
33261If @var{v} is a plain vector, convert it into a row matrix, i.e.,
33262a matrix whose single row is @var{v}. If @var{v} is already a matrix,
33263leave it alone.
33264@end defun
33265
33266@defun col-matrix v
33267If @var{v} is a plain vector, convert it into a column matrix, i.e., a
33268matrix with each element of @var{v} as a separate row. If @var{v} is
33269already a matrix, leave it alone.
33270@end defun
33271
33272@defun map-vec f v
33273Map the Lisp function @var{f} over the Calc vector @var{v}. For example,
33274@samp{(map-vec 'math-floor v)} returns a vector of the floored components
33275of vector @var{v}.
33276@end defun
33277
33278@defun map-vec-2 f a b
33279Map the Lisp function @var{f} over the two vectors @var{a} and @var{b}.
33280If @var{a} and @var{b} are vectors of equal length, the result is a
33281vector of the results of calling @samp{(@var{f} @var{ai} @var{bi})}
33282for each pair of elements @var{ai} and @var{bi}. If either @var{a} or
33283@var{b} is a scalar, it is matched with each value of the other vector.
33284For example, @samp{(map-vec-2 'math-add v 1)} returns the vector @var{v}
33285with each element increased by one. Note that using @samp{'+} would not
33286work here, since @code{defmath} does not expand function names everywhere,
33287just where they are in the function position of a Lisp expression.@refill
33288@end defun
33289
33290@defun reduce-vec f v
33291Reduce the function @var{f} over the vector @var{v}. For example, if
33292@var{v} is @samp{[10, 20, 30, 40]}, this calls @samp{(f (f (f 10 20) 30) 40)}.
33293If @var{v} is a matrix, this reduces over the rows of @var{v}.
33294@end defun
33295
33296@defun reduce-cols f m
33297Reduce the function @var{f} over the columns of matrix @var{m}. For
33298example, if @var{m} is @samp{[[1, 2], [3, 4], [5, 6]]}, the result
33299is a vector of the two elements @samp{(f (f 1 3) 5)} and @samp{(f (f 2 4) 6)}.
33300@end defun
33301
33302@defun mat-row m n
33303Return the @var{n}th row of matrix @var{m}. This is equivalent to
33304@samp{(elt m n)}. For a slower but safer version, use @code{mrow}.
33305(@xref{Extracting Elements}.)
33306@end defun
33307
33308@defun mat-col m n
33309Return the @var{n}th column of matrix @var{m}, in the form of a vector.
33310The arguments are not checked for correctness.
33311@end defun
33312
33313@defun mat-less-row m n
33314Return a copy of matrix @var{m} with its @var{n}th row deleted. The
33315number @var{n} must be in range from 1 to the number of rows in @var{m}.
33316@end defun
33317
33318@defun mat-less-col m n
33319Return a copy of matrix @var{m} with its @var{n}th column deleted.
33320@end defun
33321
33322@defun transpose m
33323Return the transpose of matrix @var{m}.
33324@end defun
33325
33326@defun flatten-vector v
33327Flatten nested vector @var{v} into a vector of scalars. For example,
33328if @var{v} is @samp{[[1, 2, 3], [4, 5]]} the result is @samp{[1, 2, 3, 4, 5]}.
33329@end defun
33330
33331@defun copy-matrix m
33332If @var{m} is a matrix, return a copy of @var{m}. This maps
33333@code{copy-sequence} over the rows of @var{m}; in Lisp terms, each
33334element of the result matrix will be @code{eq} to the corresponding
33335element of @var{m}, but none of the @code{cons} cells that make up
33336the structure of the matrix will be @code{eq}. If @var{m} is a plain
33337vector, this is the same as @code{copy-sequence}.@refill
33338@end defun
33339
33340@defun swap-rows m r1 r2
33341Exchange rows @var{r1} and @var{r2} of matrix @var{m} in-place. In
33342other words, unlike most of the other functions described here, this
33343function changes @var{m} itself rather than building up a new result
33344matrix. The return value is @var{m}, i.e., @samp{(eq (swap-rows m 1 2) m)}
33345is true, with the side effect of exchanging the first two rows of
33346@var{m}.@refill
33347@end defun
33348
33349@node Symbolic Lisp Functions, Formatting Lisp Functions, Vector Lisp Functions, Internals
33350@subsubsection Symbolic Functions
33351
33352@noindent
33353The functions described here operate on symbolic formulas in the
33354Calculator.
33355
33356@defun calc-prepare-selection num
33357Prepare a stack entry for selection operations. If @var{num} is
33358omitted, the stack entry containing the cursor is used; otherwise,
33359it is the number of the stack entry to use. This function stores
33360useful information about the current stack entry into a set of
33361variables. @code{calc-selection-cache-num} contains the number of
33362the stack entry involved (equal to @var{num} if you specified it);
33363@code{calc-selection-cache-entry} contains the stack entry as a
33364list (such as @code{calc-top-list} would return with @code{entry}
33365as the selection mode); and @code{calc-selection-cache-comp} contains
33366a special ``tagged'' composition (@pxref{Formatting Lisp Functions})
33367which allows Calc to relate cursor positions in the buffer with
33368their corresponding sub-formulas.
33369
33370A slight complication arises in the selection mechanism because
33371formulas may contain small integers. For example, in the vector
33372@samp{[1, 2, 1]} the first and last elements are @code{eq} to each
33373other; selections are recorded as the actual Lisp object that
33374appears somewhere in the tree of the whole formula, but storing
33375@code{1} would falsely select both @code{1}'s in the vector. So
33376@code{calc-prepare-selection} also checks the stack entry and
33377replaces any plain integers with ``complex number'' lists of the form
33378@samp{(cplx @var{n} 0)}. This list will be displayed the same as a
33379plain @var{n} and the change will be completely invisible to the
33380user, but it will guarantee that no two sub-formulas of the stack
33381entry will be @code{eq} to each other. Next time the stack entry
33382is involved in a computation, @code{calc-normalize} will replace
33383these lists with plain numbers again, again invisibly to the user.
33384@end defun
33385
33386@defun calc-encase-atoms x
33387This modifies the formula @var{x} to ensure that each part of the
33388formula is a unique atom, using the @samp{(cplx @var{n} 0)} trick
33389described above. This function may use @code{setcar} to modify
33390the formula in-place.
33391@end defun
33392
33393@defun calc-find-selected-part
33394Find the smallest sub-formula of the current formula that contains
33395the cursor. This assumes @code{calc-prepare-selection} has been
33396called already. If the cursor is not actually on any part of the
33397formula, this returns @code{nil}.
33398@end defun
33399
33400@defun calc-change-current-selection selection
33401Change the currently prepared stack element's selection to
33402@var{selection}, which should be @code{eq} to some sub-formula
33403of the stack element, or @code{nil} to unselect the formula.
33404The stack element's appearance in the Calc buffer is adjusted
33405to reflect the new selection.
33406@end defun
33407
33408@defun calc-find-nth-part expr n
33409Return the @var{n}th sub-formula of @var{expr}. This function is used
33410by the selection commands, and (unless @kbd{j b} has been used) treats
33411sums and products as flat many-element formulas. Thus if @var{expr}
33412is @samp{((a + b) - c) + d}, calling @code{calc-find-nth-part} with
33413@var{n} equal to four will return @samp{d}.
33414@end defun
33415
33416@defun calc-find-parent-formula expr part
33417Return the sub-formula of @var{expr} which immediately contains
33418@var{part}. If @var{expr} is @samp{a*b + (c+1)*d} and @var{part}
33419is @code{eq} to the @samp{c+1} term of @var{expr}, then this function
33420will return @samp{(c+1)*d}. If @var{part} turns out not to be a
33421sub-formula of @var{expr}, the function returns @code{nil}. If
33422@var{part} is @code{eq} to @var{expr}, the function returns @code{t}.
33423This function does not take associativity into account.
33424@end defun
33425
33426@defun calc-find-assoc-parent-formula expr part
33427This is the same as @code{calc-find-parent-formula}, except that
33428(unless @kbd{j b} has been used) it continues widening the selection
33429to contain a complete level of the formula. Given @samp{a} from
33430@samp{((a + b) - c) + d}, @code{calc-find-parent-formula} will
33431return @samp{a + b} but @code{calc-find-assoc-parent-formula} will
33432return the whole expression.
33433@end defun
33434
33435@defun calc-grow-assoc-formula expr part
33436This expands sub-formula @var{part} of @var{expr} to encompass a
33437complete level of the formula. If @var{part} and its immediate
33438parent are not compatible associative operators, or if @kbd{j b}
33439has been used, this simply returns @var{part}.
33440@end defun
33441
33442@defun calc-find-sub-formula expr part
33443This finds the immediate sub-formula of @var{expr} which contains
33444@var{part}. It returns an index @var{n} such that
33445@samp{(calc-find-nth-part @var{expr} @var{n})} would return @var{part}.
33446If @var{part} is not a sub-formula of @var{expr}, it returns @code{nil}.
33447If @var{part} is @code{eq} to @var{expr}, it returns @code{t}. This
33448function does not take associativity into account.
33449@end defun
33450
33451@defun calc-replace-sub-formula expr old new
33452This function returns a copy of formula @var{expr}, with the
33453sub-formula that is @code{eq} to @var{old} replaced by @var{new}.
33454@end defun
33455
33456@defun simplify expr
33457Simplify the expression @var{expr} by applying various algebraic rules.
33458This is what the @w{@kbd{a s}} (@code{calc-simplify}) command uses. This
33459always returns a copy of the expression; the structure @var{expr} points
33460to remains unchanged in memory.
33461
33462More precisely, here is what @code{simplify} does: The expression is
33463first normalized and evaluated by calling @code{normalize}. If any
33464@code{AlgSimpRules} have been defined, they are then applied. Then
33465the expression is traversed in a depth-first, bottom-up fashion; at
33466each level, any simplifications that can be made are made until no
33467further changes are possible. Once the entire formula has been
33468traversed in this way, it is compared with the original formula (from
33469before the call to @code{normalize}) and, if it has changed,
33470the entire procedure is repeated (starting with @code{normalize})
33471until no further changes occur. Usually only two iterations are
33472needed:@: one to simplify the formula, and another to verify that no
33473further simplifications were possible.
33474@end defun
33475
33476@defun simplify-extended expr
33477Simplify the expression @var{expr}, with additional rules enabled that
33478help do a more thorough job, while not being entirely ``safe'' in all
33479circumstances. (For example, this mode will simplify @samp{sqrt(x^2)}
33480to @samp{x}, which is only valid when @var{x} is positive.) This is
33481implemented by temporarily binding the variable @code{math-living-dangerously}
33482to @code{t} (using a @code{let} form) and calling @code{simplify}.
33483Dangerous simplification rules are written to check this variable
33484before taking any action.@refill
33485@end defun
33486
33487@defun simplify-units expr
33488Simplify the expression @var{expr}, treating variable names as units
33489whenever possible. This works by binding the variable
33490@code{math-simplifying-units} to @code{t} while calling @code{simplify}.
33491@end defun
33492
33493@defmac math-defsimplify funcs body
33494Register a new simplification rule; this is normally called as a top-level
33495form, like @code{defun} or @code{defmath}. If @var{funcs} is a symbol
33496(like @code{+} or @code{calcFunc-sqrt}), this simplification rule is
33497applied to the formulas which are calls to the specified function. Or,
33498@var{funcs} can be a list of such symbols; the rule applies to all
33499functions on the list. The @var{body} is written like the body of a
33500function with a single argument called @code{expr}. The body will be
33501executed with @code{expr} bound to a formula which is a call to one of
33502the functions @var{funcs}. If the function body returns @code{nil}, or
33503if it returns a result @code{equal} to the original @code{expr}, it is
33504ignored and Calc goes on to try the next simplification rule that applies.
33505If the function body returns something different, that new formula is
33506substituted for @var{expr} in the original formula.@refill
33507
33508At each point in the formula, rules are tried in the order of the
33509original calls to @code{math-defsimplify}; the search stops after the
33510first rule that makes a change. Thus later rules for that same
33511function will not have a chance to trigger until the next iteration
33512of the main @code{simplify} loop.
33513
33514Note that, since @code{defmath} is not being used here, @var{body} must
33515be written in true Lisp code without the conveniences that @code{defmath}
33516provides. If you prefer, you can have @var{body} simply call another
33517function (defined with @code{defmath}) which does the real work.
33518
33519The arguments of a function call will already have been simplified
33520before any rules for the call itself are invoked. Since a new argument
33521list is consed up when this happens, this means that the rule's body is
33522allowed to rearrange the function's arguments destructively if that is
33523convenient. Here is a typical example of a simplification rule:
33524
33525@smallexample
33526(math-defsimplify calcFunc-arcsinh
33527 (or (and (math-looks-negp (nth 1 expr))
33528 (math-neg (list 'calcFunc-arcsinh
33529 (math-neg (nth 1 expr)))))
33530 (and (eq (car-safe (nth 1 expr)) 'calcFunc-sinh)
33531 (or math-living-dangerously
33532 (math-known-realp (nth 1 (nth 1 expr))))
33533 (nth 1 (nth 1 expr)))))
33534@end smallexample
33535
33536This is really a pair of rules written with one @code{math-defsimplify}
33537for convenience; the first replaces @samp{arcsinh(-x)} with
33538@samp{-arcsinh(x)}, and the second, which is safe only for real @samp{x},
33539replaces @samp{arcsinh(sinh(x))} with @samp{x}.@refill
33540@end defmac
33541
33542@defun common-constant-factor expr
33543Check @var{expr} to see if it is a sum of terms all multiplied by the
33544same rational value. If so, return this value. If not, return @code{nil}.
33545For example, if called on @samp{6x + 9y + 12z}, it would return 3, since
335463 is a common factor of all the terms.
33547@end defun
33548
33549@defun cancel-common-factor expr factor
33550Assuming @var{expr} is a sum with @var{factor} as a common factor,
33551divide each term of the sum by @var{factor}. This is done by
33552destructively modifying parts of @var{expr}, on the assumption that
33553it is being used by a simplification rule (where such things are
33554allowed; see above). For example, consider this built-in rule for
33555square roots:
33556
33557@smallexample
33558(math-defsimplify calcFunc-sqrt
33559 (let ((fac (math-common-constant-factor (nth 1 expr))))
33560 (and fac (not (eq fac 1))
33561 (math-mul (math-normalize (list 'calcFunc-sqrt fac))
33562 (math-normalize
33563 (list 'calcFunc-sqrt
33564 (math-cancel-common-factor
33565 (nth 1 expr) fac)))))))
33566@end smallexample
33567@end defun
33568
33569@defun frac-gcd a b
33570Compute a ``rational GCD'' of @var{a} and @var{b}, which must both be
33571rational numbers. This is the fraction composed of the GCD of the
33572numerators of @var{a} and @var{b}, over the GCD of the denominators.
33573It is used by @code{common-constant-factor}. Note that the standard
33574@code{gcd} function uses the LCM to combine the denominators.@refill
33575@end defun
33576
33577@defun map-tree func expr many
33578Try applying Lisp function @var{func} to various sub-expressions of
33579@var{expr}. Initially, call @var{func} with @var{expr} itself as an
33580argument. If this returns an expression which is not @code{equal} to
33581@var{expr}, apply @var{func} again until eventually it does return
33582@var{expr} with no changes. Then, if @var{expr} is a function call,
33583recursively apply @var{func} to each of the arguments. This keeps going
33584until no changes occur anywhere in the expression; this final expression
33585is returned by @code{map-tree}. Note that, unlike simplification rules,
33586@var{func} functions may @emph{not} make destructive changes to
33587@var{expr}. If a third argument @var{many} is provided, it is an
33588integer which says how many times @var{func} may be applied; the
33589default, as described above, is infinitely many times.@refill
33590@end defun
33591
33592@defun compile-rewrites rules
33593Compile the rewrite rule set specified by @var{rules}, which should
33594be a formula that is either a vector or a variable name. If the latter,
33595the compiled rules are saved so that later @code{compile-rules} calls
33596for that same variable can return immediately. If there are problems
33597with the rules, this function calls @code{error} with a suitable
33598message.
33599@end defun
33600
33601@defun apply-rewrites expr crules heads
33602Apply the compiled rewrite rule set @var{crules} to the expression
33603@var{expr}. This will make only one rewrite and only checks at the
33604top level of the expression. The result @code{nil} if no rules
33605matched, or if the only rules that matched did not actually change
33606the expression. The @var{heads} argument is optional; if is given,
33607it should be a list of all function names that (may) appear in
33608@var{expr}. The rewrite compiler tags each rule with the
33609rarest-looking function name in the rule; if you specify @var{heads},
33610@code{apply-rewrites} can use this information to narrow its search
33611down to just a few rules in the rule set.
33612@end defun
33613
33614@defun rewrite-heads expr
33615Compute a @var{heads} list for @var{expr} suitable for use with
33616@code{apply-rewrites}, as discussed above.
33617@end defun
33618
33619@defun rewrite expr rules many
33620This is an all-in-one rewrite function. It compiles the rule set
33621specified by @var{rules}, then uses @code{map-tree} to apply the
33622rules throughout @var{expr} up to @var{many} (default infinity)
33623times.
33624@end defun
33625
33626@defun match-patterns pat vec not-flag
33627Given a Calc vector @var{vec} and an uncompiled pattern set or
33628pattern set variable @var{pat}, this function returns a new vector
33629of all elements of @var{vec} which do (or don't, if @var{not-flag} is
33630non-@code{nil}) match any of the patterns in @var{pat}.
33631@end defun
33632
33633@defun deriv expr var value symb
33634Compute the derivative of @var{expr} with respect to variable @var{var}
33635(which may actually be any sub-expression). If @var{value} is specified,
33636the derivative is evaluated at the value of @var{var}; otherwise, the
33637derivative is left in terms of @var{var}. If the expression contains
33638functions for which no derivative formula is known, new derivative
33639functions are invented by adding primes to the names; @pxref{Calculus}.
33640However, if @var{symb} is non-@code{nil}, the presence of undifferentiable
33641functions in @var{expr} instead cancels the whole differentiation, and
33642@code{deriv} returns @code{nil} instead.
33643
33644Derivatives of an @var{n}-argument function can be defined by
33645adding a @code{math-derivative-@var{n}} property to the property list
33646of the symbol for the function's derivative, which will be the
33647function name followed by an apostrophe. The value of the property
33648should be a Lisp function; it is called with the same arguments as the
33649original function call that is being differentiated. It should return
33650a formula for the derivative. For example, the derivative of @code{ln}
33651is defined by
33652
33653@smallexample
33654(put 'calcFunc-ln\' 'math-derivative-1
33655 (function (lambda (u) (math-div 1 u))))
33656@end smallexample
33657
33658The two-argument @code{log} function has two derivatives,
33659@smallexample
33660(put 'calcFunc-log\' 'math-derivative-2 ; d(log(x,b)) / dx
33661 (function (lambda (x b) ... )))
33662(put 'calcFunc-log\'2 'math-derivative-2 ; d(log(x,b)) / db
33663 (function (lambda (x b) ... )))
33664@end smallexample
33665@end defun
33666
33667@defun tderiv expr var value symb
33668Compute the total derivative of @var{expr}. This is the same as
33669@code{deriv}, except that variables other than @var{var} are not
33670assumed to be constant with respect to @var{var}.
33671@end defun
33672
33673@defun integ expr var low high
33674Compute the integral of @var{expr} with respect to @var{var}.
33675@xref{Calculus}, for further details.
33676@end defun
33677
33678@defmac math-defintegral funcs body
33679Define a rule for integrating a function or functions of one argument;
33680this macro is very similar in format to @code{math-defsimplify}.
33681The main difference is that here @var{body} is the body of a function
33682with a single argument @code{u} which is bound to the argument to the
33683function being integrated, not the function call itself. Also, the
33684variable of integration is available as @code{math-integ-var}. If
33685evaluation of the integral requires doing further integrals, the body
33686should call @samp{(math-integral @var{x})} to find the integral of
33687@var{x} with respect to @code{math-integ-var}; this function returns
33688@code{nil} if the integral could not be done. Some examples:
33689
33690@smallexample
33691(math-defintegral calcFunc-conj
33692 (let ((int (math-integral u)))
33693 (and int
33694 (list 'calcFunc-conj int))))
33695
33696(math-defintegral calcFunc-cos
33697 (and (equal u math-integ-var)
33698 (math-from-radians-2 (list 'calcFunc-sin u))))
33699@end smallexample
33700
33701In the @code{cos} example, we define only the integral of @samp{cos(x) dx},
33702relying on the general integration-by-substitution facility to handle
33703cosines of more complicated arguments. An integration rule should return
33704@code{nil} if it can't do the integral; if several rules are defined for
33705the same function, they are tried in order until one returns a non-@code{nil}
33706result.@refill
33707@end defmac
33708
33709@defmac math-defintegral-2 funcs body
33710Define a rule for integrating a function or functions of two arguments.
33711This is exactly analogous to @code{math-defintegral}, except that @var{body}
33712is written as the body of a function with two arguments, @var{u} and
33713@var{v}.@refill
33714@end defmac
33715
33716@defun solve-for lhs rhs var full
33717Attempt to solve the equation @samp{@var{lhs} = @var{rhs}} by isolating
33718the variable @var{var} on the lefthand side; return the resulting righthand
33719side, or @code{nil} if the equation cannot be solved. The variable
33720@var{var} must appear at least once in @var{lhs} or @var{rhs}. Note that
33721the return value is a formula which does not contain @var{var}; this is
33722different from the user-level @code{solve} and @code{finv} functions,
33723which return a rearranged equation or a functional inverse, respectively.
33724If @var{full} is non-@code{nil}, a full solution including dummy signs
33725and dummy integers will be produced. User-defined inverses are provided
33726as properties in a manner similar to derivatives:@refill
33727
33728@smallexample
33729(put 'calcFunc-ln 'math-inverse
33730 (function (lambda (x) (list 'calcFunc-exp x))))
33731@end smallexample
33732
33733This function can call @samp{(math-solve-get-sign @var{x})} to create
33734a new arbitrary sign variable, returning @var{x} times that sign, and
33735@samp{(math-solve-get-int @var{x})} to create a new arbitrary integer
33736variable multiplied by @var{x}. These functions simply return @var{x}
33737if the caller requested a non-``full'' solution.
33738@end defun
33739
33740@defun solve-eqn expr var full
33741This version of @code{solve-for} takes an expression which will
33742typically be an equation or inequality. (If it is not, it will be
33743interpreted as the equation @samp{@var{expr} = 0}.) It returns an
33744equation or inequality, or @code{nil} if no solution could be found.
33745@end defun
33746
33747@defun solve-system exprs vars full
33748This function solves a system of equations. Generally, @var{exprs}
33749and @var{vars} will be vectors of equal length.
33750@xref{Solving Systems of Equations}, for other options.
33751@end defun
33752
33753@defun expr-contains expr var
33754Returns a non-@code{nil} value if @var{var} occurs as a subexpression
33755of @var{expr}.
33756
33757This function might seem at first to be identical to
33758@code{calc-find-sub-formula}. The key difference is that
33759@code{expr-contains} uses @code{equal} to test for matches, whereas
33760@code{calc-find-sub-formula} uses @code{eq}. In the formula
33761@samp{f(a, a)}, the two @samp{a}s will be @code{equal} but not
33762@code{eq} to each other.@refill
33763@end defun
33764
33765@defun expr-contains-count expr var
33766Returns the number of occurrences of @var{var} as a subexpression
33767of @var{expr}, or @code{nil} if there are no occurrences.@refill
33768@end defun
33769
33770@defun expr-depends expr var
33771Returns true if @var{expr} refers to any variable the occurs in @var{var}.
33772In other words, it checks if @var{expr} and @var{var} have any variables
33773in common.
33774@end defun
33775
33776@defun expr-contains-vars expr
33777Return true if @var{expr} contains any variables, or @code{nil} if @var{expr}
33778contains only constants and functions with constant arguments.
33779@end defun
33780
33781@defun expr-subst expr old new
33782Returns a copy of @var{expr}, with all occurrences of @var{old} replaced
33783by @var{new}. This treats @code{lambda} forms specially with respect
33784to the dummy argument variables, so that the effect is always to return
33785@var{expr} evaluated at @var{old} = @var{new}.@refill
33786@end defun
33787
33788@defun multi-subst expr old new
33789This is like @code{expr-subst}, except that @var{old} and @var{new}
33790are lists of expressions to be substituted simultaneously. If one
33791list is shorter than the other, trailing elements of the longer list
33792are ignored.
33793@end defun
33794
33795@defun expr-weight expr
33796Returns the ``weight'' of @var{expr}, basically a count of the total
33797number of objects and function calls that appear in @var{expr}. For
33798``primitive'' objects, this will be one.
33799@end defun
33800
33801@defun expr-height expr
33802Returns the ``height'' of @var{expr}, which is the deepest level to
33803which function calls are nested. (Note that @samp{@var{a} + @var{b}}
33804counts as a function call.) For primitive objects, this returns zero.@refill
33805@end defun
33806
33807@defun polynomial-p expr var
33808Check if @var{expr} is a polynomial in variable (or sub-expression)
33809@var{var}. If so, return the degree of the polynomial, that is, the
33810highest power of @var{var} that appears in @var{expr}. For example,
33811for @samp{(x^2 + 3)^3 + 4} this would return 6. This function returns
33812@code{nil} unless @var{expr}, when expanded out by @kbd{a x}
33813(@code{calc-expand}), would consist of a sum of terms in which @var{var}
33814appears only raised to nonnegative integer powers. Note that if
33815@var{var} does not occur in @var{expr}, then @var{expr} is considered
33816a polynomial of degree 0.@refill
33817@end defun
33818
33819@defun is-polynomial expr var degree loose
33820Check if @var{expr} is a polynomial in variable or sub-expression
33821@var{var}, and, if so, return a list representation of the polynomial
33822where the elements of the list are coefficients of successive powers of
33823@var{var}: @samp{@var{a} + @var{b} x + @var{c} x^3} would produce the
33824list @samp{(@var{a} @var{b} 0 @var{c})}, and @samp{(x + 1)^2} would
33825produce the list @samp{(1 2 1)}. The highest element of the list will
33826be non-zero, with the special exception that if @var{expr} is the
33827constant zero, the returned value will be @samp{(0)}. Return @code{nil}
33828if @var{expr} is not a polynomial in @var{var}. If @var{degree} is
33829specified, this will not consider polynomials of degree higher than that
33830value. This is a good precaution because otherwise an input of
33831@samp{(x+1)^1000} will cause a huge coefficient list to be built. If
33832@var{loose} is non-@code{nil}, then a looser definition of a polynomial
33833is used in which coefficients are no longer required not to depend on
33834@var{var}, but are only required not to take the form of polynomials
33835themselves. For example, @samp{sin(x) x^2 + cos(x)} is a loose
33836polynomial with coefficients @samp{((calcFunc-cos x) 0 (calcFunc-sin
33837x))}. The result will never be @code{nil} in loose mode, since any
33838expression can be interpreted as a ``constant'' loose polynomial.@refill
33839@end defun
33840
33841@defun polynomial-base expr pred
33842Check if @var{expr} is a polynomial in any variable that occurs in it;
33843if so, return that variable. (If @var{expr} is a multivariate polynomial,
33844this chooses one variable arbitrarily.) If @var{pred} is specified, it should
33845be a Lisp function which is called as @samp{(@var{pred} @var{subexpr})},
33846and which should return true if @code{mpb-top-expr} (a global name for
33847the original @var{expr}) is a suitable polynomial in @var{subexpr}.
33848The default predicate uses @samp{(polynomial-p mpb-top-expr @var{subexpr})};
33849you can use @var{pred} to specify additional conditions. Or, you could
33850have @var{pred} build up a list of every suitable @var{subexpr} that
33851is found.@refill
33852@end defun
33853
33854@defun poly-simplify poly
33855Simplify polynomial coefficient list @var{poly} by (destructively)
33856clipping off trailing zeros.
33857@end defun
33858
33859@defun poly-mix a ac b bc
33860Mix two polynomial lists @var{a} and @var{b} (in the form returned by
33861@code{is-polynomial}) in a linear combination with coefficient expressions
33862@var{ac} and @var{bc}. The result is a (not necessarily simplified)
33863polynomial list representing @samp{@var{ac} @var{a} + @var{bc} @var{b}}.@refill
33864@end defun
33865
33866@defun poly-mul a b
33867Multiply two polynomial coefficient lists @var{a} and @var{b}. The
33868result will be in simplified form if the inputs were simplified.
33869@end defun
33870
33871@defun build-polynomial-expr poly var
33872Construct a Calc formula which represents the polynomial coefficient
33873list @var{poly} applied to variable @var{var}. The @kbd{a c}
33874(@code{calc-collect}) command uses @code{is-polynomial} to turn an
33875expression into a coefficient list, then @code{build-polynomial-expr}
33876to turn the list back into an expression in regular form.@refill
33877@end defun
33878
33879@defun check-unit-name var
33880Check if @var{var} is a variable which can be interpreted as a unit
33881name. If so, return the units table entry for that unit. This
33882will be a list whose first element is the unit name (not counting
33883prefix characters) as a symbol and whose second element is the
33884Calc expression which defines the unit. (Refer to the Calc sources
33885for details on the remaining elements of this list.) If @var{var}
33886is not a variable or is not a unit name, return @code{nil}.
33887@end defun
33888
33889@defun units-in-expr-p expr sub-exprs
33890Return true if @var{expr} contains any variables which can be
33891interpreted as units. If @var{sub-exprs} is @code{t}, the entire
33892expression is searched. If @var{sub-exprs} is @code{nil}, this
33893checks whether @var{expr} is directly a units expression.@refill
33894@end defun
33895
33896@defun single-units-in-expr-p expr
33897Check whether @var{expr} contains exactly one units variable. If so,
33898return the units table entry for the variable. If @var{expr} does
33899not contain any units, return @code{nil}. If @var{expr} contains
33900two or more units, return the symbol @code{wrong}.
33901@end defun
33902
33903@defun to-standard-units expr which
33904Convert units expression @var{expr} to base units. If @var{which}
33905is @code{nil}, use Calc's native base units. Otherwise, @var{which}
33906can specify a units system, which is a list of two-element lists,
33907where the first element is a Calc base symbol name and the second
33908is an expression to substitute for it.@refill
33909@end defun
33910
33911@defun remove-units expr
33912Return a copy of @var{expr} with all units variables replaced by ones.
33913This expression is generally normalized before use.
33914@end defun
33915
33916@defun extract-units expr
33917Return a copy of @var{expr} with everything but units variables replaced
33918by ones.
33919@end defun
33920
33921@node Formatting Lisp Functions, Hooks, Symbolic Lisp Functions, Internals
33922@subsubsection I/O and Formatting Functions
33923
33924@noindent
33925The functions described here are responsible for parsing and formatting
33926Calc numbers and formulas.
33927
33928@defun calc-eval str sep arg1 arg2 @dots{}
33929This is the simplest interface to the Calculator from another Lisp program.
33930@xref{Calling Calc from Your Programs}.
33931@end defun
33932
33933@defun read-number str
33934If string @var{str} contains a valid Calc number, either integer,
33935fraction, float, or HMS form, this function parses and returns that
33936number. Otherwise, it returns @code{nil}.
33937@end defun
33938
33939@defun read-expr str
33940Read an algebraic expression from string @var{str}. If @var{str} does
33941not have the form of a valid expression, return a list of the form
33942@samp{(error @var{pos} @var{msg})} where @var{pos} is an integer index
33943into @var{str} of the general location of the error, and @var{msg} is
33944a string describing the problem.@refill
33945@end defun
33946
33947@defun read-exprs str
33948Read a list of expressions separated by commas, and return it as a
33949Lisp list. If an error occurs in any expressions, an error list as
33950shown above is returned instead.
33951@end defun
33952
33953@defun calc-do-alg-entry initial prompt no-norm
33954Read an algebraic formula or formulas using the minibuffer. All
33955conventions of regular algebraic entry are observed. The return value
33956is a list of Calc formulas; there will be more than one if the user
33957entered a list of values separated by commas. The result is @code{nil}
33958if the user presses Return with a blank line. If @var{initial} is
33959given, it is a string which the minibuffer will initially contain.
33960If @var{prompt} is given, it is the prompt string to use; the default
33961is ``Algebraic:''. If @var{no-norm} is @code{t}, the formulas will
33962be returned exactly as parsed; otherwise, they will be passed through
33963@code{calc-normalize} first.@refill
33964
33965To support the use of @kbd{$} characters in the algebraic entry, use
33966@code{let} to bind @code{calc-dollar-values} to a list of the values
33967to be substituted for @kbd{$}, @kbd{$$}, and so on, and bind
33968@code{calc-dollar-used} to 0. Upon return, @code{calc-dollar-used}
33969will have been changed to the highest number of consecutive @kbd{$}s
33970that actually appeared in the input.@refill
33971@end defun
33972
33973@defun format-number a
33974Convert the real or complex number or HMS form @var{a} to string form.
33975@end defun
33976
33977@defun format-flat-expr a prec
33978Convert the arbitrary Calc number or formula @var{a} to string form,
33979in the style used by the trail buffer and the @code{calc-edit} command.
33980This is a simple format designed
33981mostly to guarantee the string is of a form that can be re-parsed by
33982@code{read-expr}. Most formatting modes, such as digit grouping,
33983complex number format, and point character, are ignored to ensure the
33984result will be re-readable. The @var{prec} parameter is normally 0; if
33985you pass a large integer like 1000 instead, the expression will be
33986surrounded by parentheses unless it is a plain number or variable name.@refill
33987@end defun
33988
33989@defun format-nice-expr a width
33990This is like @code{format-flat-expr} (with @var{prec} equal to 0),
33991except that newlines will be inserted to keep lines down to the
33992specified @var{width}, and vectors that look like matrices or rewrite
33993rules are written in a pseudo-matrix format. The @code{calc-edit}
33994command uses this when only one stack entry is being edited.
33995@end defun
33996
33997@defun format-value a width
33998Convert the Calc number or formula @var{a} to string form, using the
33999format seen in the stack buffer. Beware the the string returned may
34000not be re-readable by @code{read-expr}, for example, because of digit
34001grouping. Multi-line objects like matrices produce strings that
34002contain newline characters to separate the lines. The @var{w}
34003parameter, if given, is the target window size for which to format
34004the expressions. If @var{w} is omitted, the width of the Calculator
34005window is used.@refill
34006@end defun
34007
34008@defun compose-expr a prec
34009Format the Calc number or formula @var{a} according to the current
34010language mode, returning a ``composition.'' To learn about the
34011structure of compositions, see the comments in the Calc source code.
34012You can specify the format of a given type of function call by putting
34013a @code{math-compose-@var{lang}} property on the function's symbol,
34014whose value is a Lisp function that takes @var{a} and @var{prec} as
34015arguments and returns a composition. Here @var{lang} is a language
34016mode name, one of @code{normal}, @code{big}, @code{c}, @code{pascal},
34017@code{fortran}, @code{tex}, @code{eqn}, @code{math}, or @code{maple}.
34018In Big mode, Calc actually tries @code{math-compose-big} first, then
34019tries @code{math-compose-normal}. If this property does not exist,
34020or if the function returns @code{nil}, the function is written in the
34021normal function-call notation for that language.
34022@end defun
34023
34024@defun composition-to-string c w
34025Convert a composition structure returned by @code{compose-expr} into
34026a string. Multi-line compositions convert to strings containing
34027newline characters. The target window size is given by @var{w}.
34028The @code{format-value} function basically calls @code{compose-expr}
34029followed by @code{composition-to-string}.
34030@end defun
34031
34032@defun comp-width c
34033Compute the width in characters of composition @var{c}.
34034@end defun
34035
34036@defun comp-height c
34037Compute the height in lines of composition @var{c}.
34038@end defun
34039
34040@defun comp-ascent c
34041Compute the portion of the height of composition @var{c} which is on or
34042above the baseline. For a one-line composition, this will be one.
34043@end defun
34044
34045@defun comp-descent c
34046Compute the portion of the height of composition @var{c} which is below
34047the baseline. For a one-line composition, this will be zero.
34048@end defun
34049
34050@defun comp-first-char c
34051If composition @var{c} is a ``flat'' composition, return the first
34052(leftmost) character of the composition as an integer. Otherwise,
34053return @code{nil}.@refill
34054@end defun
34055
34056@defun comp-last-char c
34057If composition @var{c} is a ``flat'' composition, return the last
34058(rightmost) character, otherwise return @code{nil}.
34059@end defun
34060
34061@comment @node Lisp Variables, Hooks, Formatting Lisp Functions, Internals
34062@comment @subsubsection Lisp Variables
34063@comment
34064@comment @noindent
34065@comment (This section is currently unfinished.)
34066
34067@node Hooks, , Formatting Lisp Functions, Internals
34068@subsubsection Hooks
34069
34070@noindent
34071Hooks are variables which contain Lisp functions (or lists of functions)
34072which are called at various times. Calc defines a number of hooks
34073that help you to customize it in various ways. Calc uses the Lisp
34074function @code{run-hooks} to invoke the hooks shown below. Several
34075other customization-related variables are also described here.
34076
34077@defvar calc-load-hook
34078This hook is called at the end of @file{calc.el}, after the file has
34079been loaded, before any functions in it have been called, but after
34080@code{calc-mode-map} and similar variables have been set up.
34081@end defvar
34082
34083@defvar calc-ext-load-hook
34084This hook is called at the end of @file{calc-ext.el}.
34085@end defvar
34086
34087@defvar calc-start-hook
34088This hook is called as the last step in a @kbd{M-x calc} command.
34089At this point, the Calc buffer has been created and initialized if
34090necessary, the Calc window and trail window have been created,
34091and the ``Welcome to Calc'' message has been displayed.
34092@end defvar
34093
34094@defvar calc-mode-hook
34095This hook is called when the Calc buffer is being created. Usually
34096this will only happen once per Emacs session. The hook is called
34097after Emacs has switched to the new buffer, the mode-settings file
34098has been read if necessary, and all other buffer-local variables
34099have been set up. After this hook returns, Calc will perform a
34100@code{calc-refresh} operation, set up the mode line display, then
34101evaluate any deferred @code{calc-define} properties that have not
34102been evaluated yet.
34103@end defvar
34104
34105@defvar calc-trail-mode-hook
34106This hook is called when the Calc Trail buffer is being created.
34107It is called as the very last step of setting up the Trail buffer.
34108Like @code{calc-mode-hook}, this will normally happen only once
34109per Emacs session.
34110@end defvar
34111
34112@defvar calc-end-hook
34113This hook is called by @code{calc-quit}, generally because the user
34114presses @kbd{q} or @kbd{M-# c} while in Calc. The Calc buffer will
34115be the current buffer. The hook is called as the very first
34116step, before the Calc window is destroyed.
34117@end defvar
34118
34119@defvar calc-window-hook
34120If this hook exists, it is called to create the Calc window.
34121Upon return, this new Calc window should be the current window.
34122(The Calc buffer will already be the current buffer when the
34123hook is called.) If the hook is not defined, Calc will
34124generally use @code{split-window}, @code{set-window-buffer},
34125and @code{select-window} to create the Calc window.
34126@end defvar
34127
34128@defvar calc-trail-window-hook
34129If this hook exists, it is called to create the Calc Trail window.
34130The variable @code{calc-trail-buffer} will contain the buffer
34131which the window should use. Unlike @code{calc-window-hook},
34132this hook must @emph{not} switch into the new window.
34133@end defvar
34134
34135@defvar calc-edit-mode-hook
34136This hook is called by @code{calc-edit} (and the other ``edit''
34137commands) when the temporary editing buffer is being created.
34138The buffer will have been selected and set up to be in
34139@code{calc-edit-mode}, but will not yet have been filled with
34140text. (In fact it may still have leftover text from a previous
34141@code{calc-edit} command.)
34142@end defvar
34143
34144@defvar calc-mode-save-hook
34145This hook is called by the @code{calc-save-modes} command,
34146after Calc's own mode features have been inserted into the
34147@file{.emacs} buffer and just before the ``End of mode settings''
34148message is inserted.
34149@end defvar
34150
34151@defvar calc-reset-hook
34152This hook is called after @kbd{M-# 0} (@code{calc-reset}) has
34153reset all modes. The Calc buffer will be the current buffer.
34154@end defvar
34155
34156@defvar calc-other-modes
34157This variable contains a list of strings. The strings are
34158concatenated at the end of the modes portion of the Calc
34159mode line (after standard modes such as ``Deg'', ``Inv'' and
34160``Hyp''). Each string should be a short, single word followed
34161by a space. The variable is @code{nil} by default.
34162@end defvar
34163
34164@defvar calc-mode-map
34165This is the keymap that is used by Calc mode. The best time
34166to adjust it is probably in a @code{calc-mode-hook}. If the
34167Calc extensions package (@file{calc-ext.el}) has not yet been
34168loaded, many of these keys will be bound to @code{calc-missing-key},
34169which is a command that loads the extensions package and
34170``retypes'' the key. If your @code{calc-mode-hook} rebinds
34171one of these keys, it will probably be overridden when the
34172extensions are loaded.
34173@end defvar
34174
34175@defvar calc-digit-map
34176This is the keymap that is used during numeric entry. Numeric
34177entry uses the minibuffer, but this map binds every non-numeric
34178key to @code{calcDigit-nondigit} which generally calls
34179@code{exit-minibuffer} and ``retypes'' the key.
34180@end defvar
34181
34182@defvar calc-alg-ent-map
34183This is the keymap that is used during algebraic entry. This is
34184mostly a copy of @code{minibuffer-local-map}.
34185@end defvar
34186
34187@defvar calc-store-var-map
34188This is the keymap that is used during entry of variable names for
34189commands like @code{calc-store} and @code{calc-recall}. This is
34190mostly a copy of @code{minibuffer-local-completion-map}.
34191@end defvar
34192
34193@defvar calc-edit-mode-map
34194This is the (sparse) keymap used by @code{calc-edit} and other
34195temporary editing commands. It binds @key{RET}, @key{LFD},
34196and @kbd{C-c C-c} to @code{calc-edit-finish}.
34197@end defvar
34198
34199@defvar calc-mode-var-list
34200This is a list of variables which are saved by @code{calc-save-modes}.
34201Each entry is a list of two items, the variable (as a Lisp symbol)
34202and its default value. When modes are being saved, each variable
34203is compared with its default value (using @code{equal}) and any
34204non-default variables are written out.
34205@end defvar
34206
34207@defvar calc-local-var-list
34208This is a list of variables which should be buffer-local to the
34209Calc buffer. Each entry is a variable name (as a Lisp symbol).
34210These variables also have their default values manipulated by
34211the @code{calc} and @code{calc-quit} commands; @pxref{Multiple Calculators}.
34212Since @code{calc-mode-hook} is called after this list has been
34213used the first time, your hook should add a variable to the
34214list and also call @code{make-local-variable} itself.
34215@end defvar
34216
34217@node Installation, Reporting Bugs, Programming, Top
34218@appendix Installation
34219
34220@noindent
ed7899e8
CW
34221As of Calc 2.02g, Calc is integrated with GNU Emacs, and thus requires
34222no separate installation of its Lisp files and this manual.
d7b8e6c6 34223
d7b8e6c6
EZ
34224@appendixsec The GNUPLOT Program
34225
34226@noindent
34227Calc's graphing commands use the GNUPLOT program. If you have GNUPLOT
34228but you must type some command other than @file{gnuplot} to get it,
34229you should add a command to set the Lisp variable @code{calc-gnuplot-name}
34230to the appropriate file name. You may also need to change the variables
34231@code{calc-gnuplot-plot-command} and @code{calc-gnuplot-print-command} in
34232order to get correct displays and hardcopies, respectively, of your
34233plots.@refill
34234
34235@ifinfo
34236@example
34237
d7b8e6c6
EZ
34238@end example
34239@end ifinfo
34240@appendixsec Printed Documentation
34241
34242@noindent
34243Because the Calc manual is so large, you should only make a printed
34244copy if you really need it. To print the manual, you will need the
34245@TeX{} typesetting program (this is a free program by Donald Knuth
34246at Stanford University) as well as the @file{texindex} program and
34247@file{texinfo.tex} file, both of which can be obtained from the FSF
ed7899e8 34248as part of the @code{texinfo} package.@refill
d7b8e6c6 34249
0d48e8aa 34250To print the Calc manual in one huge 470 page tome, you will need the
ed7899e8 34251source code to this manual, @file{calc.texi}, available as part of the
0d48e8aa
EZ
34252Emacs source. Once you have this file, type @kbd{texi2dvi calc.texi}.
34253Alternatively, change to the @file{man} subdirectory of the Emacs
34254source distribution, and type @kbd{make calc.dvi}. (Don't worry if you
34255get some ``overfull box'' warnings while @TeX{} runs.)
d7b8e6c6
EZ
34256
34257The result will be a device-independent output file called
34258@file{calc.dvi}, which you must print in whatever way is right
34259for your system. On many systems, the command is
34260
34261@example
34262lpr -d calc.dvi
34263@end example
34264
0d48e8aa
EZ
34265@noindent
34266or
34267
34268@example
34269dvips calc.dvi
34270@end example
34271
34272@c the bumpoddpages macro was deleted
34273@ignore
d7b8e6c6
EZ
34274@cindex Marginal notes, adjusting
34275Marginal notes for each function and key sequence normally alternate
34276between the left and right sides of the page, which is correct if the
34277manual is going to be bound as double-sided pages. Near the top of
ed7899e8 34278the file @file{calc.texi} you will find alternate definitions of
d7b8e6c6
EZ
34279the @code{\bumpoddpages} macro that put the marginal notes always on
34280the same side, best if you plan to be binding single-sided pages.
0d48e8aa 34281@end ignore
d7b8e6c6 34282
d7b8e6c6
EZ
34283@appendixsec Settings File
34284
34285@noindent
34286@vindex calc-settings-file
34287Another variable you might want to set is @code{calc-settings-file},
34288which holds the file name in which commands like @kbd{m m} and @kbd{Z P}
34289store ``permanent'' definitions. The default value for this variable
34290is @code{"~/.emacs"}. If @code{calc-settings-file} does not contain
34291@code{".emacs"} as a substring, and if the variable
34292@code{calc-loaded-settings-file} is @code{nil}, then Calc will
34293automatically load your settings file (if it exists) the first time
34294Calc is invoked.@refill
34295
34296@ifinfo
34297@example
34298
34299@end example
34300@end ifinfo
34301@appendixsec Testing the Installation
34302
34303@noindent
34304To test your installation of Calc, start a new Emacs and type @kbd{M-# c}
34305to make sure the autoloads and key bindings work. Type @kbd{M-# i}
34306to make sure Calc can find its Info documentation. Press @kbd{q} to
34307exit the Info system and @kbd{M-# c} to re-enter the Calculator.
34308Type @kbd{20 S} to compute the sine of 20 degrees; this will test the
34309autoloading of the extensions modules. The result should be
343100.342020143326. Finally, press @kbd{M-# c} again to make sure the
34311Calculator can exit.
34312
34313You may also wish to test the GNUPLOT interface; to plot a sine wave,
5d67986c 34314type @kbd{' [0 ..@: 360], sin(x) @key{RET} g f}. Type @kbd{g q} when you
d7b8e6c6
EZ
34315are done viewing the plot.
34316
34317Calc is now ready to use. If you wish to go through the Calc Tutorial,
34318press @kbd{M-# t} to begin.
34319@example
34320
34321@end example
d7b8e6c6
EZ
34322@node Reporting Bugs, Summary, Installation, Top
34323@appendix Reporting Bugs
34324
34325@noindent
ed7899e8 34326If you find a bug in Calc, send e-mail to Colin Walters,
d7b8e6c6
EZ
34327
34328@example
ed7899e8
CW
34329walters@@debian.org @r{or}
34330walters@@verbum.org
d7b8e6c6
EZ
34331@end example
34332
34333@noindent
ed7899e8
CW
34334(In the following text, ``I'' refers to the original Calc author, Dave
34335Gillespie).
34336
d7b8e6c6
EZ
34337While I cannot guarantee that I will have time to work on your bug,
34338I do try to fix bugs quickly whenever I can.
34339
ed7899e8 34340The latest version of Calc is available from Savannah, in the Emacs
450c6476 34341CVS tree. See @uref{http://savannah.gnu.org/projects/emacs}.
d7b8e6c6 34342
ed7899e8 34343There is an automatic command @kbd{M-x report-calc-bug} which helps
d7b8e6c6
EZ
34344you to report bugs. This command prompts you for a brief subject
34345line, then leaves you in a mail editing buffer. Type @kbd{C-c C-c} to
34346send your mail. Make sure your subject line indicates that you are
ed7899e8
CW
34347reporting a Calc bug; this command sends mail to the maintainer's
34348regular mailbox.
d7b8e6c6
EZ
34349
34350If you have suggestions for additional features for Calc, I would
34351love to hear them. Some have dared to suggest that Calc is already
34352top-heavy with features; I really don't see what they're talking
34353about, so, if you have ideas, send them right in. (I may even have
34354time to implement them!)
34355
34356At the front of the source file, @file{calc.el}, is a list of ideas for
34357future work which I have not had time to do. If any enthusiastic souls
34358wish to take it upon themselves to work on these, I would be delighted.
34359Please let me know if you plan to contribute to Calc so I can coordinate
34360your efforts with mine and those of others. I will do my best to help
34361you in whatever way I can.
34362
34363@c [summary]
34364@node Summary, Key Index, Reporting Bugs, Top
34365@appendix Calc Summary
34366
34367@noindent
34368This section includes a complete list of Calc 2.02 keystroke commands.
34369Each line lists the stack entries used by the command (top-of-stack
34370last), the keystrokes themselves, the prompts asked by the command,
34371and the result of the command (also with top-of-stack last).
34372The result is expressed using the equivalent algebraic function.
34373Commands which put no results on the stack show the full @kbd{M-x}
34374command name in that position. Numbers preceding the result or
34375command name refer to notes at the end.
34376
34377Algebraic functions and @kbd{M-x} commands that don't have corresponding
34378keystrokes are not listed in this summary.
34379@xref{Command Index}. @xref{Function Index}.
34380
34381@iftex
34382@begingroup
34383@tex
34384\vskip-2\baselineskip \null
34385\gdef\sumrow#1{\sumrowx#1\relax}%
34386\gdef\sumrowx#1\:#2\:#3\:#4\:#5\:#6\relax{%
34387\leavevmode%
5d67986c
RS
34388{\smallfonts
34389\hbox to5em{\sl\hss#1}%
34390\hbox to5em{\tt#2\hss}%
34391\hbox to4em{\sl#3\hss}%
34392\hbox to5em{\rm\hss#4}%
d7b8e6c6 34393\thinspace%
5d67986c
RS
34394{\tt#5}%
34395{\sl#6}%
34396}}%
34397\gdef\sumlpar{{\rm(}}%
34398\gdef\sumrpar{{\rm)}}%
34399\gdef\sumcomma{{\rm,\thinspace}}%
34400\gdef\sumexcl{{\rm!}}%
d7b8e6c6
EZ
34401\gdef\sumbreak{\vskip-2.5\baselineskip\goodbreak}%
34402\gdef\minus#1{{\tt-}}%
34403@end tex
34404@let@:=@sumsep
34405@let@r=@sumrow
34406@catcode`@(=@active @let(=@sumlpar
34407@catcode`@)=@active @let)=@sumrpar
34408@catcode`@,=@active @let,=@sumcomma
34409@catcode`@!=@active @let!=@sumexcl
34410@end iftex
34411@format
34412@iftex
34413@advance@baselineskip-2.5pt
d7b8e6c6
EZ
34414@let@c@sumbreak
34415@end iftex
34416@r{ @: M-# a @: @: 33 @:calc-embedded-activate@:}
34417@r{ @: M-# b @: @: @:calc-big-or-small@:}
34418@r{ @: M-# c @: @: @:calc@:}
34419@r{ @: M-# d @: @: @:calc-embedded-duplicate@:}
34420@r{ @: M-# e @: @: 34 @:calc-embedded@:}
34421@r{ @: M-# f @:formula @: @:calc-embedded-new-formula@:}
34422@r{ @: M-# g @: @: 35 @:calc-grab-region@:}
34423@r{ @: M-# i @: @: @:calc-info@:}
34424@r{ @: M-# j @: @: @:calc-embedded-select@:}
34425@r{ @: M-# k @: @: @:calc-keypad@:}
34426@r{ @: M-# l @: @: @:calc-load-everything@:}
34427@r{ @: M-# m @: @: @:read-kbd-macro@:}
34428@r{ @: M-# n @: @: 4 @:calc-embedded-next@:}
34429@r{ @: M-# o @: @: @:calc-other-window@:}
34430@r{ @: M-# p @: @: 4 @:calc-embedded-previous@:}
34431@r{ @: M-# q @:formula @: @:quick-calc@:}
34432@r{ @: M-# r @: @: 36 @:calc-grab-rectangle@:}
34433@r{ @: M-# s @: @: @:calc-info-summary@:}
34434@r{ @: M-# t @: @: @:calc-tutorial@:}
34435@r{ @: M-# u @: @: @:calc-embedded-update@:}
34436@r{ @: M-# w @: @: @:calc-embedded-word@:}
34437@r{ @: M-# x @: @: @:calc-quit@:}
34438@r{ @: M-# y @: @:1,28,49 @:calc-copy-to-buffer@:}
34439@r{ @: M-# z @: @: @:calc-user-invocation@:}
34440@r{ @: M-# : @: @: 36 @:calc-grab-sum-down@:}
34441@r{ @: M-# _ @: @: 36 @:calc-grab-sum-across@:}
34442@r{ @: M-# ` @:editing @: 30 @:calc-embedded-edit@:}
34443@r{ @: M-# 0 @:(zero) @: @:calc-reset@:}
34444
34445@c
34446@r{ @: 0-9 @:number @: @:@:number}
34447@r{ @: . @:number @: @:@:0.number}
34448@r{ @: _ @:number @: @:-@:number}
34449@r{ @: e @:number @: @:@:1e number}
34450@r{ @: # @:number @: @:@:current-radix@t{#}number}
34451@r{ @: P @:(in number) @: @:+/-@:}
34452@r{ @: M @:(in number) @: @:mod@:}
34453@r{ @: @@ ' " @: (in number)@: @:@:HMS form}
34454@r{ @: h m s @: (in number)@: @:@:HMS form}
34455
34456@c
34457@r{ @: ' @:formula @: 37,46 @:@:formula}
34458@r{ @: $ @:formula @: 37,46 @:$@:formula}
34459@r{ @: " @:string @: 37,46 @:@:string}
34460
34461@c
34462@r{ a b@: + @: @: 2 @:add@:(a,b) a+b}
34463@r{ a b@: - @: @: 2 @:sub@:(a,b) a@minus{}b}
34464@r{ a b@: * @: @: 2 @:mul@:(a,b) a b, a*b}
34465@r{ a b@: / @: @: 2 @:div@:(a,b) a/b}
34466@r{ a b@: ^ @: @: 2 @:pow@:(a,b) a^b}
34467@r{ a b@: I ^ @: @: 2 @:nroot@:(a,b) a^(1/b)}
34468@r{ a b@: % @: @: 2 @:mod@:(a,b) a%b}
34469@r{ a b@: \ @: @: 2 @:idiv@:(a,b) a\b}
34470@r{ a b@: : @: @: 2 @:fdiv@:(a,b)}
34471@r{ a b@: | @: @: 2 @:vconcat@:(a,b) a|b}
34472@r{ a b@: I | @: @: @:vconcat@:(b,a) b|a}
34473@r{ a b@: H | @: @: 2 @:append@:(a,b)}
34474@r{ a b@: I H | @: @: @:append@:(b,a)}
34475@r{ a@: & @: @: 1 @:inv@:(a) 1/a}
34476@r{ a@: ! @: @: 1 @:fact@:(a) a!}
34477@r{ a@: = @: @: 1 @:evalv@:(a)}
34478@r{ a@: M-% @: @: @:percent@:(a) a%}
34479
34480@c
5d67986c
RS
34481@r{ ... a@: @key{RET} @: @: 1 @:@:... a a}
34482@r{ ... a@: @key{SPC} @: @: 1 @:@:... a a}
34483@r{... a b@: @key{TAB} @: @: 3 @:@:... b a}
34484@r{. a b c@: M-@key{TAB} @: @: 3 @:@:... b c a}
34485@r{... a b@: @key{LFD} @: @: 1 @:@:... a b a}
34486@r{ ... a@: @key{DEL} @: @: 1 @:@:...}
34487@r{... a b@: M-@key{DEL} @: @: 1 @:@:... b}
34488@r{ @: M-@key{RET} @: @: 4 @:calc-last-args@:}
d7b8e6c6
EZ
34489@r{ a@: ` @:editing @: 1,30 @:calc-edit@:}
34490
34491@c
34492@r{ ... a@: C-d @: @: 1 @:@:...}
34493@r{ @: C-k @: @: 27 @:calc-kill@:}
34494@r{ @: C-w @: @: 27 @:calc-kill-region@:}
34495@r{ @: C-y @: @: @:calc-yank@:}
34496@r{ @: C-_ @: @: 4 @:calc-undo@:}
34497@r{ @: M-k @: @: 27 @:calc-copy-as-kill@:}
34498@r{ @: M-w @: @: 27 @:calc-copy-region-as-kill@:}
34499
34500@c
34501@r{ @: [ @: @: @:@:[...}
34502@r{[.. a b@: ] @: @: @:@:[a,b]}
34503@r{ @: ( @: @: @:@:(...}
34504@r{(.. a b@: ) @: @: @:@:(a,b)}
34505@r{ @: , @: @: @:@:vector or rect complex}
34506@r{ @: ; @: @: @:@:matrix or polar complex}
34507@r{ @: .. @: @: @:@:interval}
34508
34509@c
34510@r{ @: ~ @: @: @:calc-num-prefix@:}
34511@r{ @: < @: @: 4 @:calc-scroll-left@:}
34512@r{ @: > @: @: 4 @:calc-scroll-right@:}
34513@r{ @: @{ @: @: 4 @:calc-scroll-down@:}
34514@r{ @: @} @: @: 4 @:calc-scroll-up@:}
34515@r{ @: ? @: @: @:calc-help@:}
34516
34517@c
34518@r{ a@: n @: @: 1 @:neg@:(a) @minus{}a}
34519@r{ @: o @: @: 4 @:calc-realign@:}
34520@r{ @: p @:precision @: 31 @:calc-precision@:}
34521@r{ @: q @: @: @:calc-quit@:}
34522@r{ @: w @: @: @:calc-why@:}
34523@r{ @: x @:command @: @:M-x calc-@:command}
34524@r{ a@: y @: @:1,28,49 @:calc-copy-to-buffer@:}
34525
34526@c
34527@r{ a@: A @: @: 1 @:abs@:(a)}
34528@r{ a b@: B @: @: 2 @:log@:(a,b)}
34529@r{ a b@: I B @: @: 2 @:alog@:(a,b) b^a}
34530@r{ a@: C @: @: 1 @:cos@:(a)}
34531@r{ a@: I C @: @: 1 @:arccos@:(a)}
34532@r{ a@: H C @: @: 1 @:cosh@:(a)}
34533@r{ a@: I H C @: @: 1 @:arccosh@:(a)}
34534@r{ @: D @: @: 4 @:calc-redo@:}
34535@r{ a@: E @: @: 1 @:exp@:(a)}
34536@r{ a@: H E @: @: 1 @:exp10@:(a) 10.^a}
34537@r{ a@: F @: @: 1,11 @:floor@:(a,d)}
34538@r{ a@: I F @: @: 1,11 @:ceil@:(a,d)}
34539@r{ a@: H F @: @: 1,11 @:ffloor@:(a,d)}
34540@r{ a@: I H F @: @: 1,11 @:fceil@:(a,d)}
34541@r{ a@: G @: @: 1 @:arg@:(a)}
34542@r{ @: H @:command @: 32 @:@:Hyperbolic}
34543@r{ @: I @:command @: 32 @:@:Inverse}
34544@r{ a@: J @: @: 1 @:conj@:(a)}
34545@r{ @: K @:command @: 32 @:@:Keep-args}
34546@r{ a@: L @: @: 1 @:ln@:(a)}
34547@r{ a@: H L @: @: 1 @:log10@:(a)}
34548@r{ @: M @: @: @:calc-more-recursion-depth@:}
34549@r{ @: I M @: @: @:calc-less-recursion-depth@:}
34550@r{ a@: N @: @: 5 @:evalvn@:(a)}
34551@r{ @: P @: @: @:@:pi}
34552@r{ @: I P @: @: @:@:gamma}
34553@r{ @: H P @: @: @:@:e}
34554@r{ @: I H P @: @: @:@:phi}
34555@r{ a@: Q @: @: 1 @:sqrt@:(a)}
34556@r{ a@: I Q @: @: 1 @:sqr@:(a) a^2}
34557@r{ a@: R @: @: 1,11 @:round@:(a,d)}
34558@r{ a@: I R @: @: 1,11 @:trunc@:(a,d)}
34559@r{ a@: H R @: @: 1,11 @:fround@:(a,d)}
34560@r{ a@: I H R @: @: 1,11 @:ftrunc@:(a,d)}
34561@r{ a@: S @: @: 1 @:sin@:(a)}
34562@r{ a@: I S @: @: 1 @:arcsin@:(a)}
34563@r{ a@: H S @: @: 1 @:sinh@:(a)}
34564@r{ a@: I H S @: @: 1 @:arcsinh@:(a)}
34565@r{ a@: T @: @: 1 @:tan@:(a)}
34566@r{ a@: I T @: @: 1 @:arctan@:(a)}
34567@r{ a@: H T @: @: 1 @:tanh@:(a)}
34568@r{ a@: I H T @: @: 1 @:arctanh@:(a)}
34569@r{ @: U @: @: 4 @:calc-undo@:}
34570@r{ @: X @: @: 4 @:calc-call-last-kbd-macro@:}
34571
34572@c
34573@r{ a b@: a = @: @: 2 @:eq@:(a,b) a=b}
34574@r{ a b@: a # @: @: 2 @:neq@:(a,b) a!=b}
34575@r{ a b@: a < @: @: 2 @:lt@:(a,b) a<b}
34576@r{ a b@: a > @: @: 2 @:gt@:(a,b) a>b}
34577@r{ a b@: a [ @: @: 2 @:leq@:(a,b) a<=b}
34578@r{ a b@: a ] @: @: 2 @:geq@:(a,b) a>=b}
34579@r{ a b@: a @{ @: @: 2 @:in@:(a,b)}
34580@r{ a b@: a & @: @: 2,45 @:land@:(a,b) a&&b}
34581@r{ a b@: a | @: @: 2,45 @:lor@:(a,b) a||b}
34582@r{ a@: a ! @: @: 1,45 @:lnot@:(a) !a}
34583@r{ a b c@: a : @: @: 45 @:if@:(a,b,c) a?b:c}
34584@r{ a@: a . @: @: 1 @:rmeq@:(a)}
34585@r{ a@: a " @: @: 7,8 @:calc-expand-formula@:}
34586
34587@c
34588@r{ a@: a + @:i, l, h @: 6,38 @:sum@:(a,i,l,h)}
34589@r{ a@: a - @:i, l, h @: 6,38 @:asum@:(a,i,l,h)}
34590@r{ a@: a * @:i, l, h @: 6,38 @:prod@:(a,i,l,h)}
34591@r{ a b@: a _ @: @: 2 @:subscr@:(a,b) a_b}
34592
34593@c
34594@r{ a b@: a \ @: @: 2 @:pdiv@:(a,b)}
34595@r{ a b@: a % @: @: 2 @:prem@:(a,b)}
34596@r{ a b@: a / @: @: 2 @:pdivrem@:(a,b) [q,r]}
34597@r{ a b@: H a / @: @: 2 @:pdivide@:(a,b) q+r/b}
34598
34599@c
34600@r{ a@: a a @: @: 1 @:apart@:(a)}
34601@r{ a@: a b @:old, new @: 38 @:subst@:(a,old,new)}
34602@r{ a@: a c @:v @: 38 @:collect@:(a,v)}
34603@r{ a@: a d @:v @: 4,38 @:deriv@:(a,v)}
34604@r{ a@: H a d @:v @: 4,38 @:tderiv@:(a,v)}
34605@r{ a@: a e @: @: @:esimplify@:(a)}
34606@r{ a@: a f @: @: 1 @:factor@:(a)}
34607@r{ a@: H a f @: @: 1 @:factors@:(a)}
34608@r{ a b@: a g @: @: 2 @:pgcd@:(a,b)}
34609@r{ a@: a i @:v @: 38 @:integ@:(a,v)}
34610@r{ a@: a m @:pats @: 38 @:match@:(a,pats)}
34611@r{ a@: I a m @:pats @: 38 @:matchnot@:(a,pats)}
34612@r{ data x@: a p @: @: 28 @:polint@:(data,x)}
34613@r{ data x@: H a p @: @: 28 @:ratint@:(data,x)}
34614@r{ a@: a n @: @: 1 @:nrat@:(a)}
34615@r{ a@: a r @:rules @:4,8,38 @:rewrite@:(a,rules,n)}
34616@r{ a@: a s @: @: @:simplify@:(a)}
34617@r{ a@: a t @:v, n @: 31,39 @:taylor@:(a,v,n)}
34618@r{ a@: a v @: @: 7,8 @:calc-alg-evaluate@:}
34619@r{ a@: a x @: @: 4,8 @:expand@:(a)}
34620
34621@c
34622@r{ data@: a F @:model, vars @: 48 @:fit@:(m,iv,pv,data)}
34623@r{ data@: I a F @:model, vars @: 48 @:xfit@:(m,iv,pv,data)}
34624@r{ data@: H a F @:model, vars @: 48 @:efit@:(m,iv,pv,data)}
34625@r{ a@: a I @:v, l, h @: 38 @:ninteg@:(a,v,l,h)}
34626@r{ a b@: a M @:op @: 22 @:mapeq@:(op,a,b)}
34627@r{ a b@: I a M @:op @: 22 @:mapeqr@:(op,a,b)}
34628@r{ a b@: H a M @:op @: 22 @:mapeqp@:(op,a,b)}
34629@r{ a g@: a N @:v @: 38 @:minimize@:(a,v,g)}
34630@r{ a g@: H a N @:v @: 38 @:wminimize@:(a,v,g)}
34631@r{ a@: a P @:v @: 38 @:roots@:(a,v)}
34632@r{ a g@: a R @:v @: 38 @:root@:(a,v,g)}
34633@r{ a g@: H a R @:v @: 38 @:wroot@:(a,v,g)}
34634@r{ a@: a S @:v @: 38 @:solve@:(a,v)}
34635@r{ a@: I a S @:v @: 38 @:finv@:(a,v)}
34636@r{ a@: H a S @:v @: 38 @:fsolve@:(a,v)}
34637@r{ a@: I H a S @:v @: 38 @:ffinv@:(a,v)}
34638@r{ a@: a T @:i, l, h @: 6,38 @:table@:(a,i,l,h)}
34639@r{ a g@: a X @:v @: 38 @:maximize@:(a,v,g)}
34640@r{ a g@: H a X @:v @: 38 @:wmaximize@:(a,v,g)}
34641
34642@c
34643@r{ a b@: b a @: @: 9 @:and@:(a,b,w)}
34644@r{ a@: b c @: @: 9 @:clip@:(a,w)}
34645@r{ a b@: b d @: @: 9 @:diff@:(a,b,w)}
34646@r{ a@: b l @: @: 10 @:lsh@:(a,n,w)}
34647@r{ a n@: H b l @: @: 9 @:lsh@:(a,n,w)}
34648@r{ a@: b n @: @: 9 @:not@:(a,w)}
34649@r{ a b@: b o @: @: 9 @:or@:(a,b,w)}
34650@r{ v@: b p @: @: 1 @:vpack@:(v)}
34651@r{ a@: b r @: @: 10 @:rsh@:(a,n,w)}
34652@r{ a n@: H b r @: @: 9 @:rsh@:(a,n,w)}
34653@r{ a@: b t @: @: 10 @:rot@:(a,n,w)}
34654@r{ a n@: H b t @: @: 9 @:rot@:(a,n,w)}
34655@r{ a@: b u @: @: 1 @:vunpack@:(a)}
34656@r{ @: b w @:w @: 9,50 @:calc-word-size@:}
34657@r{ a b@: b x @: @: 9 @:xor@:(a,b,w)}
34658
34659@c
34660@r{c s l p@: b D @: @: @:ddb@:(c,s,l,p)}
34661@r{ r n p@: b F @: @: @:fv@:(r,n,p)}
34662@r{ r n p@: I b F @: @: @:fvb@:(r,n,p)}
34663@r{ r n p@: H b F @: @: @:fvl@:(r,n,p)}
34664@r{ v@: b I @: @: 19 @:irr@:(v)}
34665@r{ v@: I b I @: @: 19 @:irrb@:(v)}
34666@r{ a@: b L @: @: 10 @:ash@:(a,n,w)}
34667@r{ a n@: H b L @: @: 9 @:ash@:(a,n,w)}
34668@r{ r n a@: b M @: @: @:pmt@:(r,n,a)}
34669@r{ r n a@: I b M @: @: @:pmtb@:(r,n,a)}
34670@r{ r n a@: H b M @: @: @:pmtl@:(r,n,a)}
34671@r{ r v@: b N @: @: 19 @:npv@:(r,v)}
34672@r{ r v@: I b N @: @: 19 @:npvb@:(r,v)}
34673@r{ r n p@: b P @: @: @:pv@:(r,n,p)}
34674@r{ r n p@: I b P @: @: @:pvb@:(r,n,p)}
34675@r{ r n p@: H b P @: @: @:pvl@:(r,n,p)}
34676@r{ a@: b R @: @: 10 @:rash@:(a,n,w)}
34677@r{ a n@: H b R @: @: 9 @:rash@:(a,n,w)}
34678@r{ c s l@: b S @: @: @:sln@:(c,s,l)}
34679@r{ n p a@: b T @: @: @:rate@:(n,p,a)}
34680@r{ n p a@: I b T @: @: @:rateb@:(n,p,a)}
34681@r{ n p a@: H b T @: @: @:ratel@:(n,p,a)}
34682@r{c s l p@: b Y @: @: @:syd@:(c,s,l,p)}
34683
34684@r{ r p a@: b # @: @: @:nper@:(r,p,a)}
34685@r{ r p a@: I b # @: @: @:nperb@:(r,p,a)}
34686@r{ r p a@: H b # @: @: @:nperl@:(r,p,a)}
34687@r{ a b@: b % @: @: @:relch@:(a,b)}
34688
34689@c
34690@r{ a@: c c @: @: 5 @:pclean@:(a,p)}
34691@r{ a@: c 0-9 @: @: @:pclean@:(a,p)}
34692@r{ a@: H c c @: @: 5 @:clean@:(a,p)}
34693@r{ a@: H c 0-9 @: @: @:clean@:(a,p)}
34694@r{ a@: c d @: @: 1 @:deg@:(a)}
34695@r{ a@: c f @: @: 1 @:pfloat@:(a)}
34696@r{ a@: H c f @: @: 1 @:float@:(a)}
34697@r{ a@: c h @: @: 1 @:hms@:(a)}
34698@r{ a@: c p @: @: @:polar@:(a)}
34699@r{ a@: I c p @: @: @:rect@:(a)}
34700@r{ a@: c r @: @: 1 @:rad@:(a)}
34701
34702@c
34703@r{ a@: c F @: @: 5 @:pfrac@:(a,p)}
34704@r{ a@: H c F @: @: 5 @:frac@:(a,p)}
34705
34706@c
34707@r{ a@: c % @: @: @:percent@:(a*100)}
34708
34709@c
34710@r{ @: d . @:char @: 50 @:calc-point-char@:}
34711@r{ @: d , @:char @: 50 @:calc-group-char@:}
34712@r{ @: d < @: @: 13,50 @:calc-left-justify@:}
34713@r{ @: d = @: @: 13,50 @:calc-center-justify@:}
34714@r{ @: d > @: @: 13,50 @:calc-right-justify@:}
34715@r{ @: d @{ @:label @: 50 @:calc-left-label@:}
34716@r{ @: d @} @:label @: 50 @:calc-right-label@:}
34717@r{ @: d [ @: @: 4 @:calc-truncate-up@:}
34718@r{ @: d ] @: @: 4 @:calc-truncate-down@:}
34719@r{ @: d " @: @: 12,50 @:calc-display-strings@:}
5d67986c
RS
34720@r{ @: d @key{SPC} @: @: @:calc-refresh@:}
34721@r{ @: d @key{RET} @: @: 1 @:calc-refresh-top@:}
d7b8e6c6
EZ
34722
34723@c
34724@r{ @: d 0 @: @: 50 @:calc-decimal-radix@:}
34725@r{ @: d 2 @: @: 50 @:calc-binary-radix@:}
34726@r{ @: d 6 @: @: 50 @:calc-hex-radix@:}
34727@r{ @: d 8 @: @: 50 @:calc-octal-radix@:}
34728
34729@c
34730@r{ @: d b @: @:12,13,50 @:calc-line-breaking@:}
34731@r{ @: d c @: @: 50 @:calc-complex-notation@:}
34732@r{ @: d d @:format @: 50 @:calc-date-notation@:}
34733@r{ @: d e @: @: 5,50 @:calc-eng-notation@:}
34734@r{ @: d f @:num @: 31,50 @:calc-fix-notation@:}
34735@r{ @: d g @: @:12,13,50 @:calc-group-digits@:}
34736@r{ @: d h @:format @: 50 @:calc-hms-notation@:}
34737@r{ @: d i @: @: 50 @:calc-i-notation@:}
34738@r{ @: d j @: @: 50 @:calc-j-notation@:}
34739@r{ @: d l @: @: 12,50 @:calc-line-numbering@:}
34740@r{ @: d n @: @: 5,50 @:calc-normal-notation@:}
34741@r{ @: d o @:format @: 50 @:calc-over-notation@:}
34742@r{ @: d p @: @: 12,50 @:calc-show-plain@:}
34743@r{ @: d r @:radix @: 31,50 @:calc-radix@:}
34744@r{ @: d s @: @: 5,50 @:calc-sci-notation@:}
34745@r{ @: d t @: @: 27 @:calc-truncate-stack@:}
34746@r{ @: d w @: @: 12,13 @:calc-auto-why@:}
34747@r{ @: d z @: @: 12,50 @:calc-leading-zeros@:}
34748
34749@c
34750@r{ @: d B @: @: 50 @:calc-big-language@:}
34751@r{ @: d C @: @: 50 @:calc-c-language@:}
34752@r{ @: d E @: @: 50 @:calc-eqn-language@:}
34753@r{ @: d F @: @: 50 @:calc-fortran-language@:}
34754@r{ @: d M @: @: 50 @:calc-mathematica-language@:}
34755@r{ @: d N @: @: 50 @:calc-normal-language@:}
34756@r{ @: d O @: @: 50 @:calc-flat-language@:}
34757@r{ @: d P @: @: 50 @:calc-pascal-language@:}
34758@r{ @: d T @: @: 50 @:calc-tex-language@:}
34759@r{ @: d U @: @: 50 @:calc-unformatted-language@:}
34760@r{ @: d W @: @: 50 @:calc-maple-language@:}
34761
34762@c
34763@r{ a@: f [ @: @: 4 @:decr@:(a,n)}
34764@r{ a@: f ] @: @: 4 @:incr@:(a,n)}
34765
34766@c
34767@r{ a b@: f b @: @: 2 @:beta@:(a,b)}
34768@r{ a@: f e @: @: 1 @:erf@:(a)}
34769@r{ a@: I f e @: @: 1 @:erfc@:(a)}
34770@r{ a@: f g @: @: 1 @:gamma@:(a)}
34771@r{ a b@: f h @: @: 2 @:hypot@:(a,b)}
34772@r{ a@: f i @: @: 1 @:im@:(a)}
34773@r{ n a@: f j @: @: 2 @:besJ@:(n,a)}
34774@r{ a b@: f n @: @: 2 @:min@:(a,b)}
34775@r{ a@: f r @: @: 1 @:re@:(a)}
34776@r{ a@: f s @: @: 1 @:sign@:(a)}
34777@r{ a b@: f x @: @: 2 @:max@:(a,b)}
34778@r{ n a@: f y @: @: 2 @:besY@:(n,a)}
34779
34780@c
34781@r{ a@: f A @: @: 1 @:abssqr@:(a)}
34782@r{ x a b@: f B @: @: @:betaI@:(x,a,b)}
34783@r{ x a b@: H f B @: @: @:betaB@:(x,a,b)}
34784@r{ a@: f E @: @: 1 @:expm1@:(a)}
34785@r{ a x@: f G @: @: 2 @:gammaP@:(a,x)}
34786@r{ a x@: I f G @: @: 2 @:gammaQ@:(a,x)}
34787@r{ a x@: H f G @: @: 2 @:gammag@:(a,x)}
34788@r{ a x@: I H f G @: @: 2 @:gammaG@:(a,x)}
34789@r{ a b@: f I @: @: 2 @:ilog@:(a,b)}
34790@r{ a b@: I f I @: @: 2 @:alog@:(a,b) b^a}
34791@r{ a@: f L @: @: 1 @:lnp1@:(a)}
34792@r{ a@: f M @: @: 1 @:mant@:(a)}
34793@r{ a@: f Q @: @: 1 @:isqrt@:(a)}
34794@r{ a@: I f Q @: @: 1 @:sqr@:(a) a^2}
34795@r{ a n@: f S @: @: 2 @:scf@:(a,n)}
34796@r{ y x@: f T @: @: @:arctan2@:(y,x)}
34797@r{ a@: f X @: @: 1 @:xpon@:(a)}
34798
34799@c
34800@r{ x y@: g a @: @: 28,40 @:calc-graph-add@:}
34801@r{ @: g b @: @: 12 @:calc-graph-border@:}
34802@r{ @: g c @: @: @:calc-graph-clear@:}
34803@r{ @: g d @: @: 41 @:calc-graph-delete@:}
34804@r{ x y@: g f @: @: 28,40 @:calc-graph-fast@:}
34805@r{ @: g g @: @: 12 @:calc-graph-grid@:}
34806@r{ @: g h @:title @: @:calc-graph-header@:}
34807@r{ @: g j @: @: 4 @:calc-graph-juggle@:}
34808@r{ @: g k @: @: 12 @:calc-graph-key@:}
34809@r{ @: g l @: @: 12 @:calc-graph-log-x@:}
34810@r{ @: g n @:name @: @:calc-graph-name@:}
34811@r{ @: g p @: @: 42 @:calc-graph-plot@:}
34812@r{ @: g q @: @: @:calc-graph-quit@:}
34813@r{ @: g r @:range @: @:calc-graph-range-x@:}
34814@r{ @: g s @: @: 12,13 @:calc-graph-line-style@:}
34815@r{ @: g t @:title @: @:calc-graph-title-x@:}
34816@r{ @: g v @: @: @:calc-graph-view-commands@:}
34817@r{ @: g x @:display @: @:calc-graph-display@:}
34818@r{ @: g z @: @: 12 @:calc-graph-zero-x@:}
34819
34820@c
34821@r{ x y z@: g A @: @: 28,40 @:calc-graph-add-3d@:}
34822@r{ @: g C @:command @: @:calc-graph-command@:}
34823@r{ @: g D @:device @: 43,44 @:calc-graph-device@:}
34824@r{ x y z@: g F @: @: 28,40 @:calc-graph-fast-3d@:}
34825@r{ @: g H @: @: 12 @:calc-graph-hide@:}
34826@r{ @: g K @: @: @:calc-graph-kill@:}
34827@r{ @: g L @: @: 12 @:calc-graph-log-y@:}
34828@r{ @: g N @:number @: 43,51 @:calc-graph-num-points@:}
34829@r{ @: g O @:filename @: 43,44 @:calc-graph-output@:}
34830@r{ @: g P @: @: 42 @:calc-graph-print@:}
34831@r{ @: g R @:range @: @:calc-graph-range-y@:}
34832@r{ @: g S @: @: 12,13 @:calc-graph-point-style@:}
34833@r{ @: g T @:title @: @:calc-graph-title-y@:}
34834@r{ @: g V @: @: @:calc-graph-view-trail@:}
34835@r{ @: g X @:format @: @:calc-graph-geometry@:}
34836@r{ @: g Z @: @: 12 @:calc-graph-zero-y@:}
34837
34838@c
34839@r{ @: g C-l @: @: 12 @:calc-graph-log-z@:}
34840@r{ @: g C-r @:range @: @:calc-graph-range-z@:}
34841@r{ @: g C-t @:title @: @:calc-graph-title-z@:}
34842
34843@c
34844@r{ @: h b @: @: @:calc-describe-bindings@:}
34845@r{ @: h c @:key @: @:calc-describe-key-briefly@:}
34846@r{ @: h f @:function @: @:calc-describe-function@:}
34847@r{ @: h h @: @: @:calc-full-help@:}
34848@r{ @: h i @: @: @:calc-info@:}
34849@r{ @: h k @:key @: @:calc-describe-key@:}
34850@r{ @: h n @: @: @:calc-view-news@:}
34851@r{ @: h s @: @: @:calc-info-summary@:}
34852@r{ @: h t @: @: @:calc-tutorial@:}
34853@r{ @: h v @:var @: @:calc-describe-variable@:}
34854
34855@c
34856@r{ @: j 1-9 @: @: @:calc-select-part@:}
5d67986c
RS
34857@r{ @: j @key{RET} @: @: 27 @:calc-copy-selection@:}
34858@r{ @: j @key{DEL} @: @: 27 @:calc-del-selection@:}
d7b8e6c6
EZ
34859@r{ @: j ' @:formula @: 27 @:calc-enter-selection@:}
34860@r{ @: j ` @:editing @: 27,30 @:calc-edit-selection@:}
34861@r{ @: j " @: @: 7,27 @:calc-sel-expand-formula@:}
34862
34863@c
34864@r{ @: j + @:formula @: 27 @:calc-sel-add-both-sides@:}
34865@r{ @: j - @:formula @: 27 @:calc-sel-sub-both-sides@:}
34866@r{ @: j * @:formula @: 27 @:calc-sel-mul-both-sides@:}
34867@r{ @: j / @:formula @: 27 @:calc-sel-div-both-sides@:}
34868@r{ @: j & @: @: 27 @:calc-sel-invert@:}
34869
34870@c
34871@r{ @: j a @: @: 27 @:calc-select-additional@:}
34872@r{ @: j b @: @: 12 @:calc-break-selections@:}
34873@r{ @: j c @: @: @:calc-clear-selections@:}
34874@r{ @: j d @: @: 12,50 @:calc-show-selections@:}
34875@r{ @: j e @: @: 12 @:calc-enable-selections@:}
34876@r{ @: j l @: @: 4,27 @:calc-select-less@:}
34877@r{ @: j m @: @: 4,27 @:calc-select-more@:}
34878@r{ @: j n @: @: 4 @:calc-select-next@:}
34879@r{ @: j o @: @: 4,27 @:calc-select-once@:}
34880@r{ @: j p @: @: 4 @:calc-select-previous@:}
34881@r{ @: j r @:rules @:4,8,27 @:calc-rewrite-selection@:}
34882@r{ @: j s @: @: 4,27 @:calc-select-here@:}
34883@r{ @: j u @: @: 27 @:calc-unselect@:}
34884@r{ @: j v @: @: 7,27 @:calc-sel-evaluate@:}
34885
34886@c
34887@r{ @: j C @: @: 27 @:calc-sel-commute@:}
34888@r{ @: j D @: @: 4,27 @:calc-sel-distribute@:}
34889@r{ @: j E @: @: 27 @:calc-sel-jump-equals@:}
34890@r{ @: j I @: @: 27 @:calc-sel-isolate@:}
34891@r{ @: H j I @: @: 27 @:calc-sel-isolate@: (full)}
34892@r{ @: j L @: @: 4,27 @:calc-commute-left@:}
34893@r{ @: j M @: @: 27 @:calc-sel-merge@:}
34894@r{ @: j N @: @: 27 @:calc-sel-negate@:}
34895@r{ @: j O @: @: 4,27 @:calc-select-once-maybe@:}
34896@r{ @: j R @: @: 4,27 @:calc-commute-right@:}
34897@r{ @: j S @: @: 4,27 @:calc-select-here-maybe@:}
34898@r{ @: j U @: @: 27 @:calc-sel-unpack@:}
34899
34900@c
34901@r{ @: k a @: @: @:calc-random-again@:}
34902@r{ n@: k b @: @: 1 @:bern@:(n)}
34903@r{ n x@: H k b @: @: 2 @:bern@:(n,x)}
34904@r{ n m@: k c @: @: 2 @:choose@:(n,m)}
34905@r{ n m@: H k c @: @: 2 @:perm@:(n,m)}
34906@r{ n@: k d @: @: 1 @:dfact@:(n) n!!}
34907@r{ n@: k e @: @: 1 @:euler@:(n)}
34908@r{ n x@: H k e @: @: 2 @:euler@:(n,x)}
34909@r{ n@: k f @: @: 4 @:prfac@:(n)}
34910@r{ n m@: k g @: @: 2 @:gcd@:(n,m)}
34911@r{ m n@: k h @: @: 14 @:shuffle@:(n,m)}
34912@r{ n m@: k l @: @: 2 @:lcm@:(n,m)}
34913@r{ n@: k m @: @: 1 @:moebius@:(n)}
34914@r{ n@: k n @: @: 4 @:nextprime@:(n)}
34915@r{ n@: I k n @: @: 4 @:prevprime@:(n)}
34916@r{ n@: k p @: @: 4,28 @:calc-prime-test@:}
34917@r{ m@: k r @: @: 14 @:random@:(m)}
34918@r{ n m@: k s @: @: 2 @:stir1@:(n,m)}
34919@r{ n m@: H k s @: @: 2 @:stir2@:(n,m)}
34920@r{ n@: k t @: @: 1 @:totient@:(n)}
34921
34922@c
34923@r{ n p x@: k B @: @: @:utpb@:(x,n,p)}
34924@r{ n p x@: I k B @: @: @:ltpb@:(x,n,p)}
34925@r{ v x@: k C @: @: @:utpc@:(x,v)}
34926@r{ v x@: I k C @: @: @:ltpc@:(x,v)}
34927@r{ n m@: k E @: @: @:egcd@:(n,m)}
34928@r{v1 v2 x@: k F @: @: @:utpf@:(x,v1,v2)}
34929@r{v1 v2 x@: I k F @: @: @:ltpf@:(x,v1,v2)}
34930@r{ m s x@: k N @: @: @:utpn@:(x,m,s)}
34931@r{ m s x@: I k N @: @: @:ltpn@:(x,m,s)}
34932@r{ m x@: k P @: @: @:utpp@:(x,m)}
34933@r{ m x@: I k P @: @: @:ltpp@:(x,m)}
34934@r{ v x@: k T @: @: @:utpt@:(x,v)}
34935@r{ v x@: I k T @: @: @:ltpt@:(x,v)}
34936
34937@c
34938@r{ @: m a @: @: 12,13 @:calc-algebraic-mode@:}
34939@r{ @: m d @: @: @:calc-degrees-mode@:}
34940@r{ @: m f @: @: 12 @:calc-frac-mode@:}
34941@r{ @: m g @: @: 52 @:calc-get-modes@:}
34942@r{ @: m h @: @: @:calc-hms-mode@:}
34943@r{ @: m i @: @: 12,13 @:calc-infinite-mode@:}
34944@r{ @: m m @: @: @:calc-save-modes@:}
34945@r{ @: m p @: @: 12 @:calc-polar-mode@:}
34946@r{ @: m r @: @: @:calc-radians-mode@:}
34947@r{ @: m s @: @: 12 @:calc-symbolic-mode@:}
34948@r{ @: m t @: @: 12 @:calc-total-algebraic-mode@:}
34949@r{ @: m v @: @: 12,13 @:calc-matrix-mode@:}
34950@r{ @: m w @: @: 13 @:calc-working@:}
34951@r{ @: m x @: @: @:calc-always-load-extensions@:}
34952
34953@c
34954@r{ @: m A @: @: 12 @:calc-alg-simplify-mode@:}
34955@r{ @: m B @: @: 12 @:calc-bin-simplify-mode@:}
34956@r{ @: m C @: @: 12 @:calc-auto-recompute@:}
34957@r{ @: m D @: @: @:calc-default-simplify-mode@:}
34958@r{ @: m E @: @: 12 @:calc-ext-simplify-mode@:}
34959@r{ @: m F @:filename @: 13 @:calc-settings-file-name@:}
34960@r{ @: m N @: @: 12 @:calc-num-simplify-mode@:}
34961@r{ @: m O @: @: 12 @:calc-no-simplify-mode@:}
34962@r{ @: m R @: @: 12,13 @:calc-mode-record-mode@:}
34963@r{ @: m S @: @: 12 @:calc-shift-prefix@:}
34964@r{ @: m U @: @: 12 @:calc-units-simplify-mode@:}
34965
34966@c
34967@r{ @: s c @:var1, var2 @: 29 @:calc-copy-variable@:}
34968@r{ @: s d @:var, decl @: @:calc-declare-variable@:}
34969@r{ @: s e @:var, editing @: 29,30 @:calc-edit-variable@:}
34970@r{ @: s i @:buffer @: @:calc-insert-variables@:}
34971@r{ a b@: s l @:var @: 29 @:@:a (letting var=b)}
34972@r{ a ...@: s m @:op, var @: 22,29 @:calc-store-map@:}
34973@r{ @: s n @:var @: 29,47 @:calc-store-neg@: (v/-1)}
34974@r{ @: s p @:var @: 29 @:calc-permanent-variable@:}
34975@r{ @: s r @:var @: 29 @:@:v (recalled value)}
34976@r{ @: r 0-9 @: @: @:calc-recall-quick@:}
34977@r{ a@: s s @:var @: 28,29 @:calc-store@:}
34978@r{ a@: s 0-9 @: @: @:calc-store-quick@:}
34979@r{ a@: s t @:var @: 29 @:calc-store-into@:}
34980@r{ a@: t 0-9 @: @: @:calc-store-into-quick@:}
34981@r{ @: s u @:var @: 29 @:calc-unstore@:}
34982@r{ a@: s x @:var @: 29 @:calc-store-exchange@:}
34983
34984@c
34985@r{ @: s A @:editing @: 30 @:calc-edit-AlgSimpRules@:}
34986@r{ @: s D @:editing @: 30 @:calc-edit-Decls@:}
34987@r{ @: s E @:editing @: 30 @:calc-edit-EvalRules@:}
34988@r{ @: s F @:editing @: 30 @:calc-edit-FitRules@:}
34989@r{ @: s G @:editing @: 30 @:calc-edit-GenCount@:}
34990@r{ @: s H @:editing @: 30 @:calc-edit-Holidays@:}
34991@r{ @: s I @:editing @: 30 @:calc-edit-IntegLimit@:}
34992@r{ @: s L @:editing @: 30 @:calc-edit-LineStyles@:}
34993@r{ @: s P @:editing @: 30 @:calc-edit-PointStyles@:}
34994@r{ @: s R @:editing @: 30 @:calc-edit-PlotRejects@:}
34995@r{ @: s T @:editing @: 30 @:calc-edit-TimeZone@:}
34996@r{ @: s U @:editing @: 30 @:calc-edit-Units@:}
34997@r{ @: s X @:editing @: 30 @:calc-edit-ExtSimpRules@:}
34998
34999@c
35000@r{ a@: s + @:var @: 29,47 @:calc-store-plus@: (v+a)}
35001@r{ a@: s - @:var @: 29,47 @:calc-store-minus@: (v-a)}
35002@r{ a@: s * @:var @: 29,47 @:calc-store-times@: (v*a)}
35003@r{ a@: s / @:var @: 29,47 @:calc-store-div@: (v/a)}
35004@r{ a@: s ^ @:var @: 29,47 @:calc-store-power@: (v^a)}
35005@r{ a@: s | @:var @: 29,47 @:calc-store-concat@: (v|a)}
35006@r{ @: s & @:var @: 29,47 @:calc-store-inv@: (v^-1)}
35007@r{ @: s [ @:var @: 29,47 @:calc-store-decr@: (v-1)}
35008@r{ @: s ] @:var @: 29,47 @:calc-store-incr@: (v-(-1))}
35009@r{ a b@: s : @: @: 2 @:assign@:(a,b) a @t{:=} b}
35010@r{ a@: s = @: @: 1 @:evalto@:(a,b) a @t{=>}}
35011
35012@c
35013@r{ @: t [ @: @: 4 @:calc-trail-first@:}
35014@r{ @: t ] @: @: 4 @:calc-trail-last@:}
35015@r{ @: t < @: @: 4 @:calc-trail-scroll-left@:}
35016@r{ @: t > @: @: 4 @:calc-trail-scroll-right@:}
35017@r{ @: t . @: @: 12 @:calc-full-trail-vectors@:}
35018
35019@c
35020@r{ @: t b @: @: 4 @:calc-trail-backward@:}
35021@r{ @: t d @: @: 12,50 @:calc-trail-display@:}
35022@r{ @: t f @: @: 4 @:calc-trail-forward@:}
35023@r{ @: t h @: @: @:calc-trail-here@:}
35024@r{ @: t i @: @: @:calc-trail-in@:}
35025@r{ @: t k @: @: 4 @:calc-trail-kill@:}
35026@r{ @: t m @:string @: @:calc-trail-marker@:}
35027@r{ @: t n @: @: 4 @:calc-trail-next@:}
35028@r{ @: t o @: @: @:calc-trail-out@:}
35029@r{ @: t p @: @: 4 @:calc-trail-previous@:}
35030@r{ @: t r @:string @: @:calc-trail-isearch-backward@:}
35031@r{ @: t s @:string @: @:calc-trail-isearch-forward@:}
35032@r{ @: t y @: @: 4 @:calc-trail-yank@:}
35033
35034@c
35035@r{ d@: t C @:oz, nz @: @:tzconv@:(d,oz,nz)}
35036@r{d oz nz@: t C @:$ @: @:tzconv@:(d,oz,nz)}
35037@r{ d@: t D @: @: 15 @:date@:(d)}
35038@r{ d@: t I @: @: 4 @:incmonth@:(d,n)}
35039@r{ d@: t J @: @: 16 @:julian@:(d,z)}
35040@r{ d@: t M @: @: 17 @:newmonth@:(d,n)}
35041@r{ @: t N @: @: 16 @:now@:(z)}
35042@r{ d@: t P @:1 @: 31 @:year@:(d)}
35043@r{ d@: t P @:2 @: 31 @:month@:(d)}
35044@r{ d@: t P @:3 @: 31 @:day@:(d)}
35045@r{ d@: t P @:4 @: 31 @:hour@:(d)}
35046@r{ d@: t P @:5 @: 31 @:minute@:(d)}
35047@r{ d@: t P @:6 @: 31 @:second@:(d)}
35048@r{ d@: t P @:7 @: 31 @:weekday@:(d)}
35049@r{ d@: t P @:8 @: 31 @:yearday@:(d)}
35050@r{ d@: t P @:9 @: 31 @:time@:(d)}
35051@r{ d@: t U @: @: 16 @:unixtime@:(d,z)}
35052@r{ d@: t W @: @: 17 @:newweek@:(d,w)}
35053@r{ d@: t Y @: @: 17 @:newyear@:(d,n)}
35054
35055@c
35056@r{ a b@: t + @: @: 2 @:badd@:(a,b)}
35057@r{ a b@: t - @: @: 2 @:bsub@:(a,b)}
35058
35059@c
35060@r{ @: u a @: @: 12 @:calc-autorange-units@:}
35061@r{ a@: u b @: @: @:calc-base-units@:}
35062@r{ a@: u c @:units @: 18 @:calc-convert-units@:}
35063@r{ defn@: u d @:unit, descr @: @:calc-define-unit@:}
35064@r{ @: u e @: @: @:calc-explain-units@:}
35065@r{ @: u g @:unit @: @:calc-get-unit-definition@:}
35066@r{ @: u p @: @: @:calc-permanent-units@:}
35067@r{ a@: u r @: @: @:calc-remove-units@:}
35068@r{ a@: u s @: @: @:usimplify@:(a)}
35069@r{ a@: u t @:units @: 18 @:calc-convert-temperature@:}
35070@r{ @: u u @:unit @: @:calc-undefine-unit@:}
35071@r{ @: u v @: @: @:calc-enter-units-table@:}
35072@r{ a@: u x @: @: @:calc-extract-units@:}
35073@r{ a@: u 0-9 @: @: @:calc-quick-units@:}
35074
35075@c
35076@r{ v1 v2@: u C @: @: 20 @:vcov@:(v1,v2)}
35077@r{ v1 v2@: I u C @: @: 20 @:vpcov@:(v1,v2)}
35078@r{ v1 v2@: H u C @: @: 20 @:vcorr@:(v1,v2)}
35079@r{ v@: u G @: @: 19 @:vgmean@:(v)}
35080@r{ a b@: H u G @: @: 2 @:agmean@:(a,b)}
35081@r{ v@: u M @: @: 19 @:vmean@:(v)}
35082@r{ v@: I u M @: @: 19 @:vmeane@:(v)}
35083@r{ v@: H u M @: @: 19 @:vmedian@:(v)}
35084@r{ v@: I H u M @: @: 19 @:vhmean@:(v)}
35085@r{ v@: u N @: @: 19 @:vmin@:(v)}
35086@r{ v@: u S @: @: 19 @:vsdev@:(v)}
35087@r{ v@: I u S @: @: 19 @:vpsdev@:(v)}
35088@r{ v@: H u S @: @: 19 @:vvar@:(v)}
35089@r{ v@: I H u S @: @: 19 @:vpvar@:(v)}
35090@r{ @: u V @: @: @:calc-view-units-table@:}
35091@r{ v@: u X @: @: 19 @:vmax@:(v)}
35092
35093@c
35094@r{ v@: u + @: @: 19 @:vsum@:(v)}
35095@r{ v@: u * @: @: 19 @:vprod@:(v)}
35096@r{ v@: u # @: @: 19 @:vcount@:(v)}
35097
35098@c
35099@r{ @: V ( @: @: 50 @:calc-vector-parens@:}
35100@r{ @: V @{ @: @: 50 @:calc-vector-braces@:}
35101@r{ @: V [ @: @: 50 @:calc-vector-brackets@:}
35102@r{ @: V ] @:ROCP @: 50 @:calc-matrix-brackets@:}
35103@r{ @: V , @: @: 50 @:calc-vector-commas@:}
35104@r{ @: V < @: @: 50 @:calc-matrix-left-justify@:}
35105@r{ @: V = @: @: 50 @:calc-matrix-center-justify@:}
35106@r{ @: V > @: @: 50 @:calc-matrix-right-justify@:}
35107@r{ @: V / @: @: 12,50 @:calc-break-vectors@:}
35108@r{ @: V . @: @: 12,50 @:calc-full-vectors@:}
35109
35110@c
35111@r{ s t@: V ^ @: @: 2 @:vint@:(s,t)}
35112@r{ s t@: V - @: @: 2 @:vdiff@:(s,t)}
35113@r{ s@: V ~ @: @: 1 @:vcompl@:(s)}
35114@r{ s@: V # @: @: 1 @:vcard@:(s)}
35115@r{ s@: V : @: @: 1 @:vspan@:(s)}
35116@r{ s@: V + @: @: 1 @:rdup@:(s)}
35117
35118@c
35119@r{ m@: V & @: @: 1 @:inv@:(m) 1/m}
35120
35121@c
35122@r{ v@: v a @:n @: @:arrange@:(v,n)}
35123@r{ a@: v b @:n @: @:cvec@:(a,n)}
35124@r{ v@: v c @:n >0 @: 21,31 @:mcol@:(v,n)}
35125@r{ v@: v c @:n <0 @: 31 @:mrcol@:(v,-n)}
35126@r{ m@: v c @:0 @: 31 @:getdiag@:(m)}
35127@r{ v@: v d @: @: 25 @:diag@:(v,n)}
35128@r{ v m@: v e @: @: 2 @:vexp@:(v,m)}
35129@r{ v m f@: H v e @: @: 2 @:vexp@:(v,m,f)}
35130@r{ v a@: v f @: @: 26 @:find@:(v,a,n)}
35131@r{ v@: v h @: @: 1 @:head@:(v)}
35132@r{ v@: I v h @: @: 1 @:tail@:(v)}
35133@r{ v@: H v h @: @: 1 @:rhead@:(v)}
35134@r{ v@: I H v h @: @: 1 @:rtail@:(v)}
35135@r{ @: v i @:n @: 31 @:idn@:(1,n)}
35136@r{ @: v i @:0 @: 31 @:idn@:(1)}
35137@r{ h t@: v k @: @: 2 @:cons@:(h,t)}
35138@r{ h t@: H v k @: @: 2 @:rcons@:(h,t)}
35139@r{ v@: v l @: @: 1 @:vlen@:(v)}
35140@r{ v@: H v l @: @: 1 @:mdims@:(v)}
35141@r{ v m@: v m @: @: 2 @:vmask@:(v,m)}
35142@r{ v@: v n @: @: 1 @:rnorm@:(v)}
35143@r{ a b c@: v p @: @: 24 @:calc-pack@:}
35144@r{ v@: v r @:n >0 @: 21,31 @:mrow@:(v,n)}
35145@r{ v@: v r @:n <0 @: 31 @:mrrow@:(v,-n)}
35146@r{ m@: v r @:0 @: 31 @:getdiag@:(m)}
35147@r{ v i j@: v s @: @: @:subvec@:(v,i,j)}
35148@r{ v i j@: I v s @: @: @:rsubvec@:(v,i,j)}
35149@r{ m@: v t @: @: 1 @:trn@:(m)}
35150@r{ v@: v u @: @: 24 @:calc-unpack@:}
35151@r{ v@: v v @: @: 1 @:rev@:(v)}
35152@r{ @: v x @:n @: 31 @:index@:(n)}
35153@r{ n s i@: C-u v x @: @: @:index@:(n,s,i)}
35154
35155@c
35156@r{ v@: V A @:op @: 22 @:apply@:(op,v)}
35157@r{ v1 v2@: V C @: @: 2 @:cross@:(v1,v2)}
35158@r{ m@: V D @: @: 1 @:det@:(m)}
35159@r{ s@: V E @: @: 1 @:venum@:(s)}
35160@r{ s@: V F @: @: 1 @:vfloor@:(s)}
35161@r{ v@: V G @: @: @:grade@:(v)}
35162@r{ v@: I V G @: @: @:rgrade@:(v)}
35163@r{ v@: V H @:n @: 31 @:histogram@:(v,n)}
35164@r{ v w@: H V H @:n @: 31 @:histogram@:(v,w,n)}
35165@r{ v1 v2@: V I @:mop aop @: 22 @:inner@:(mop,aop,v1,v2)}
35166@r{ m@: V J @: @: 1 @:ctrn@:(m)}
35167@r{ m@: V L @: @: 1 @:lud@:(m)}
35168@r{ v@: V M @:op @: 22,23 @:map@:(op,v)}
35169@r{ v@: V N @: @: 1 @:cnorm@:(v)}
35170@r{ v1 v2@: V O @:op @: 22 @:outer@:(op,v1,v2)}
35171@r{ v@: V R @:op @: 22,23 @:reduce@:(op,v)}
35172@r{ v@: I V R @:op @: 22,23 @:rreduce@:(op,v)}
35173@r{ a n@: H V R @:op @: 22 @:nest@:(op,a,n)}
35174@r{ a@: I H V R @:op @: 22 @:fixp@:(op,a)}
35175@r{ v@: V S @: @: @:sort@:(v)}
35176@r{ v@: I V S @: @: @:rsort@:(v)}
35177@r{ m@: V T @: @: 1 @:tr@:(m)}
35178@r{ v@: V U @:op @: 22 @:accum@:(op,v)}
35179@r{ v@: I V U @:op @: 22 @:raccum@:(op,v)}
35180@r{ a n@: H V U @:op @: 22 @:anest@:(op,a,n)}
35181@r{ a@: I H V U @:op @: 22 @:afixp@:(op,a)}
35182@r{ s t@: V V @: @: 2 @:vunion@:(s,t)}
35183@r{ s t@: V X @: @: 2 @:vxor@:(s,t)}
35184
35185@c
35186@r{ @: Y @: @: @:@:user commands}
35187
35188@c
35189@r{ @: z @: @: @:@:user commands}
35190
35191@c
35192@r{ c@: Z [ @: @: 45 @:calc-kbd-if@:}
35193@r{ c@: Z | @: @: 45 @:calc-kbd-else-if@:}
35194@r{ @: Z : @: @: @:calc-kbd-else@:}
35195@r{ @: Z ] @: @: @:calc-kbd-end-if@:}
35196
35197@c
35198@r{ @: Z @{ @: @: 4 @:calc-kbd-loop@:}
35199@r{ c@: Z / @: @: 45 @:calc-kbd-break@:}
35200@r{ @: Z @} @: @: @:calc-kbd-end-loop@:}
35201@r{ n@: Z < @: @: @:calc-kbd-repeat@:}
35202@r{ @: Z > @: @: @:calc-kbd-end-repeat@:}
35203@r{ n m@: Z ( @: @: @:calc-kbd-for@:}
35204@r{ s@: Z ) @: @: @:calc-kbd-end-for@:}
35205
35206@c
35207@r{ @: Z C-g @: @: @:@:cancel if/loop command}
35208
35209@c
35210@r{ @: Z ` @: @: @:calc-kbd-push@:}
35211@r{ @: Z ' @: @: @:calc-kbd-pop@:}
35212@r{ a@: Z = @:message @: 28 @:calc-kbd-report@:}
35213@r{ @: Z # @:prompt @: @:calc-kbd-query@:}
35214
35215@c
35216@r{ comp@: Z C @:func, args @: 50 @:calc-user-define-composition@:}
35217@r{ @: Z D @:key, command @: @:calc-user-define@:}
35218@r{ @: Z E @:key, editing @: 30 @:calc-user-define-edit@:}
35219@r{ defn@: Z F @:k, c, f, a, n@: 28 @:calc-user-define-formula@:}
35220@r{ @: Z G @:key @: @:calc-get-user-defn@:}
35221@r{ @: Z I @: @: @:calc-user-define-invocation@:}
35222@r{ @: Z K @:key, command @: @:calc-user-define-kbd-macro@:}
35223@r{ @: Z P @:key @: @:calc-user-define-permanent@:}
35224@r{ @: Z S @: @: 30 @:calc-edit-user-syntax@:}
35225@r{ @: Z T @: @: 12 @:calc-timing@:}
35226@r{ @: Z U @:key @: @:calc-user-undefine@:}
35227
35228@end format
35229
35230@noindent
35231NOTES
35232
35233@enumerate
35234@c 1
35235@item
35236Positive prefix arguments apply to @cite{n} stack entries.
35237Negative prefix arguments apply to the @cite{-n}th stack entry.
35238A prefix of zero applies to the entire stack. (For @key{LFD} and
5d67986c 35239@kbd{M-@key{DEL}}, the meaning of the sign is reversed.)
d7b8e6c6
EZ
35240
35241@c 2
35242@item
35243Positive prefix arguments apply to @cite{n} stack entries.
35244Negative prefix arguments apply to the top stack entry
35245and the next @cite{-n} stack entries.
35246
35247@c 3
35248@item
35249Positive prefix arguments rotate top @cite{n} stack entries by one.
35250Negative prefix arguments rotate the entire stack by @cite{-n}.
35251A prefix of zero reverses the entire stack.
35252
35253@c 4
35254@item
35255Prefix argument specifies a repeat count or distance.
35256
35257@c 5
35258@item
35259Positive prefix arguments specify a precision @cite{p}.
35260Negative prefix arguments reduce the current precision by @cite{-p}.
35261
35262@c 6
35263@item
35264A prefix argument is interpreted as an additional step-size parameter.
35265A plain @kbd{C-u} prefix means to prompt for the step size.
35266
35267@c 7
35268@item
35269A prefix argument specifies simplification level and depth.
352701=Default, 2=like @kbd{a s}, 3=like @kbd{a e}.
35271
35272@c 8
35273@item
35274A negative prefix operates only on the top level of the input formula.
35275
35276@c 9
35277@item
35278Positive prefix arguments specify a word size of @cite{w} bits, unsigned.
35279Negative prefix arguments specify a word size of @cite{w} bits, signed.
35280
35281@c 10
35282@item
35283Prefix arguments specify the shift amount @cite{n}. The @cite{w} argument
35284cannot be specified in the keyboard version of this command.
35285
35286@c 11
35287@item
35288From the keyboard, @cite{d} is omitted and defaults to zero.
35289
35290@c 12
35291@item
35292Mode is toggled; a positive prefix always sets the mode, and a negative
35293prefix always clears the mode.
35294
35295@c 13
35296@item
35297Some prefix argument values provide special variations of the mode.
35298
35299@c 14
35300@item
35301A prefix argument, if any, is used for @cite{m} instead of taking
35302@cite{m} from the stack. @cite{M} may take any of these values:
35303@iftex
35304{@advance@tableindent10pt
35305@end iftex
35306@table @asis
35307@item Integer
35308Random integer in the interval @cite{[0 .. m)}.
35309@item Float
35310Random floating-point number in the interval @cite{[0 .. m)}.
35311@item 0.0
35312Gaussian with mean 1 and standard deviation 0.
35313@item Error form
35314Gaussian with specified mean and standard deviation.
35315@item Interval
35316Random integer or floating-point number in that interval.
35317@item Vector
35318Random element from the vector.
35319@end table
35320@iftex
35321}
35322@end iftex
35323
35324@c 15
35325@item
35326A prefix argument from 1 to 6 specifies number of date components
35327to remove from the stack. @xref{Date Conversions}.
35328
35329@c 16
35330@item
35331A prefix argument specifies a time zone; @kbd{C-u} says to take the
35332time zone number or name from the top of the stack. @xref{Time Zones}.
35333
35334@c 17
35335@item
35336A prefix argument specifies a day number (0-6, 0-31, or 0-366).
35337
35338@c 18
35339@item
35340If the input has no units, you will be prompted for both the old and
35341the new units.
35342
35343@c 19
35344@item
35345With a prefix argument, collect that many stack entries to form the
35346input data set. Each entry may be a single value or a vector of values.
35347
35348@c 20
35349@item
5d67986c
RS
35350With a prefix argument of 1, take a single @c{$@var{n}\times2$}
35351@i{@var{N}x2} matrix from the
d7b8e6c6
EZ
35352stack instead of two separate data vectors.
35353
35354@c 21
35355@item
35356The row or column number @cite{n} may be given as a numeric prefix
35357argument instead. A plain @kbd{C-u} prefix says to take @cite{n}
35358from the top of the stack. If @cite{n} is a vector or interval,
35359a subvector/submatrix of the input is created.
35360
35361@c 22
35362@item
35363The @cite{op} prompt can be answered with the key sequence for the
35364desired function, or with @kbd{x} or @kbd{z} followed by a function name,
35365or with @kbd{$} to take a formula from the top of the stack, or with
35366@kbd{'} and a typed formula. In the last two cases, the formula may
35367be a nameless function like @samp{<#1+#2>} or @samp{<x, y : x+y>}, or it
35368may include @kbd{$}, @kbd{$$}, etc. (where @kbd{$} will correspond to the
35369last argument of the created function), or otherwise you will be
35370prompted for an argument list. The number of vectors popped from the
35371stack by @kbd{V M} depends on the number of arguments of the function.
35372
35373@c 23
35374@item
35375One of the mapping direction keys @kbd{_} (horizontal, i.e., map
35376by rows or reduce across), @kbd{:} (vertical, i.e., map by columns or
35377reduce down), or @kbd{=} (map or reduce by rows) may be used before
35378entering @cite{op}; these modify the function name by adding the letter
35379@code{r} for ``rows,'' @code{c} for ``columns,'' @code{a} for ``across,''
35380or @code{d} for ``down.''
35381
35382@c 24
35383@item
35384The prefix argument specifies a packing mode. A nonnegative mode
35385is the number of items (for @kbd{v p}) or the number of levels
35386(for @kbd{v u}). A negative mode is as described below. With no
35387prefix argument, the mode is taken from the top of the stack and
35388may be an integer or a vector of integers.
35389@iftex
35390{@advance@tableindent-20pt
35391@end iftex
35392@table @cite
35393@item -1
b275eac7 35394(@var{2}) Rectangular complex number.
d7b8e6c6 35395@item -2
b275eac7 35396(@var{2}) Polar complex number.
d7b8e6c6 35397@item -3
b275eac7 35398(@var{3}) HMS form.
d7b8e6c6 35399@item -4
b275eac7 35400(@var{2}) Error form.
d7b8e6c6 35401@item -5
b275eac7 35402(@var{2}) Modulo form.
d7b8e6c6 35403@item -6
b275eac7 35404(@var{2}) Closed interval.
d7b8e6c6 35405@item -7
b275eac7 35406(@var{2}) Closed .. open interval.
d7b8e6c6 35407@item -8
b275eac7 35408(@var{2}) Open .. closed interval.
d7b8e6c6 35409@item -9
b275eac7 35410(@var{2}) Open interval.
d7b8e6c6 35411@item -10
b275eac7 35412(@var{2}) Fraction.
d7b8e6c6 35413@item -11
b275eac7 35414(@var{2}) Float with integer mantissa.
d7b8e6c6 35415@item -12
b275eac7 35416(@var{2}) Float with mantissa in @cite{[1 .. 10)}.
d7b8e6c6 35417@item -13
b275eac7 35418(@var{1}) Date form (using date numbers).
d7b8e6c6 35419@item -14
b275eac7 35420(@var{3}) Date form (using year, month, day).
d7b8e6c6 35421@item -15
b275eac7 35422(@var{6}) Date form (using year, month, day, hour, minute, second).
d7b8e6c6
EZ
35423@end table
35424@iftex
35425}
35426@end iftex
35427
35428@c 25
35429@item
35430A prefix argument specifies the size @cite{n} of the matrix. With no
35431prefix argument, @cite{n} is omitted and the size is inferred from
35432the input vector.
35433
35434@c 26
35435@item
35436The prefix argument specifies the starting position @cite{n} (default 1).
35437
35438@c 27
35439@item
35440Cursor position within stack buffer affects this command.
35441
35442@c 28
35443@item
35444Arguments are not actually removed from the stack by this command.
35445
35446@c 29
35447@item
35448Variable name may be a single digit or a full name.
35449
35450@c 30
35451@item
35452Editing occurs in a separate buffer. Press @kbd{M-# M-#} (or @kbd{C-c C-c},
35453@key{LFD}, or in some cases @key{RET}) to finish the edit, or press
35454@kbd{M-# x} to cancel the edit. The @key{LFD} key prevents evaluation
35455of the result of the edit.
35456
35457@c 31
35458@item
35459The number prompted for can also be provided as a prefix argument.
35460
35461@c 32
35462@item
35463Press this key a second time to cancel the prefix.
35464
35465@c 33
35466@item
35467With a negative prefix, deactivate all formulas. With a positive
35468prefix, deactivate and then reactivate from scratch.
35469
35470@c 34
35471@item
35472Default is to scan for nearest formula delimiter symbols. With a
35473prefix of zero, formula is delimited by mark and point. With a
35474non-zero prefix, formula is delimited by scanning forward or
35475backward by that many lines.
35476
35477@c 35
35478@item
35479Parse the region between point and mark as a vector. A nonzero prefix
35480parses @var{n} lines before or after point as a vector. A zero prefix
35481parses the current line as a vector. A @kbd{C-u} prefix parses the
35482region between point and mark as a single formula.
35483
35484@c 36
35485@item
35486Parse the rectangle defined by point and mark as a matrix. A positive
35487prefix @var{n} divides the rectangle into columns of width @var{n}.
35488A zero or @kbd{C-u} prefix parses each line as one formula. A negative
35489prefix suppresses special treatment of bracketed portions of a line.
35490
35491@c 37
35492@item
35493A numeric prefix causes the current language mode to be ignored.
35494
35495@c 38
35496@item
35497Responding to a prompt with a blank line answers that and all
35498later prompts by popping additional stack entries.
35499
35500@c 39
35501@item
35502Answer for @cite{v} may also be of the form @cite{v = v_0} or
35503@cite{v - v_0}.
35504
35505@c 40
35506@item
35507With a positive prefix argument, stack contains many @cite{y}'s and one
35508common @cite{x}. With a zero prefix, stack contains a vector of
35509@cite{y}s and a common @cite{x}. With a negative prefix, stack
35510contains many @cite{[x,y]} vectors. (For 3D plots, substitute
35511@cite{z} for @cite{y} and @cite{x,y} for @cite{x}.)
35512
35513@c 41
35514@item
35515With any prefix argument, all curves in the graph are deleted.
35516
35517@c 42
35518@item
35519With a positive prefix, refines an existing plot with more data points.
35520With a negative prefix, forces recomputation of the plot data.
35521
35522@c 43
35523@item
35524With any prefix argument, set the default value instead of the
35525value for this graph.
35526
35527@c 44
35528@item
35529With a negative prefix argument, set the value for the printer.
35530
35531@c 45
35532@item
35533Condition is considered ``true'' if it is a nonzero real or complex
35534number, or a formula whose value is known to be nonzero; it is ``false''
35535otherwise.
35536
35537@c 46
35538@item
35539Several formulas separated by commas are pushed as multiple stack
35540entries. Trailing @kbd{)}, @kbd{]}, @kbd{@}}, @kbd{>}, and @kbd{"}
35541delimiters may be omitted. The notation @kbd{$$$} refers to the value
35542in stack level three, and causes the formula to replace the top three
35543stack levels. The notation @kbd{$3} refers to stack level three without
35544causing that value to be removed from the stack. Use @key{LFD} in place
35545of @key{RET} to prevent evaluation; use @kbd{M-=} in place of @key{RET}
35546to evaluate variables.@refill
35547
35548@c 47
35549@item
35550The variable is replaced by the formula shown on the right. The
35551Inverse flag reverses the order of the operands, e.g., @kbd{I s - x}
35552assigns @c{$x \coloneq a-x$}
35553@cite{x := a-x}.
35554
35555@c 48
35556@item
35557Press @kbd{?} repeatedly to see how to choose a model. Answer the
35558variables prompt with @cite{iv} or @cite{iv;pv} to specify
35559independent and parameter variables. A positive prefix argument
5d67986c 35560takes @i{@var{n}+1} vectors from the stack; a zero prefix takes a matrix
d7b8e6c6
EZ
35561and a vector from the stack.
35562
35563@c 49
35564@item
35565With a plain @kbd{C-u} prefix, replace the current region of the
35566destination buffer with the yanked text instead of inserting.
35567
35568@c 50
35569@item
35570All stack entries are reformatted; the @kbd{H} prefix inhibits this.
35571The @kbd{I} prefix sets the mode temporarily, redraws the top stack
35572entry, then restores the original setting of the mode.
35573
35574@c 51
35575@item
35576A negative prefix sets the default 3D resolution instead of the
35577default 2D resolution.
35578
35579@c 52
35580@item
35581This grabs a vector of the form [@var{prec}, @var{wsize}, @var{ssize},
35582@var{radix}, @var{flfmt}, @var{ang}, @var{frac}, @var{symb}, @var{polar},
35583@var{matrix}, @var{simp}, @var{inf}]. A prefix argument from 1 to 12
35584grabs the @var{n}th mode value only.
35585@end enumerate
35586
35587@iftex
35588(Space is provided below for you to keep your own written notes.)
35589@page
35590@endgroup
35591@end iftex
35592
35593
35594@c [end-summary]
35595
35596@node Key Index, Command Index, Summary, Top
35597@unnumbered Index of Key Sequences
35598
35599@printindex ky
35600
35601@node Command Index, Function Index, Key Index, Top
35602@unnumbered Index of Calculator Commands
35603
35604Since all Calculator commands begin with the prefix @samp{calc-}, the
35605@kbd{x} key has been provided as a variant of @kbd{M-x} which automatically
35606types @samp{calc-} for you. Thus, @kbd{x last-args} is short for
35607@kbd{M-x calc-last-args}.
35608
35609@printindex pg
35610
35611@node Function Index, Concept Index, Command Index, Top
35612@unnumbered Index of Algebraic Functions
35613
35614This is a list of built-in functions and operators usable in algebraic
35615expressions. Their full Lisp names are derived by adding the prefix
35616@samp{calcFunc-}, as in @code{calcFunc-sqrt}.
35617@iftex
35618All functions except those noted with ``*'' have corresponding
35619Calc keystrokes and can also be found in the Calc Summary.
35620@end iftex
35621
35622@printindex tp
35623
35624@node Concept Index, Variable Index, Function Index, Top
35625@unnumbered Concept Index
35626
35627@printindex cp
35628
35629@node Variable Index, Lisp Function Index, Concept Index, Top
35630@unnumbered Index of Variables
35631
35632The variables in this list that do not contain dashes are accessible
35633as Calc variables. Add a @samp{var-} prefix to get the name of the
35634corresponding Lisp variable.
35635
35636The remaining variables are Lisp variables suitable for @code{setq}ing
35637in your @file{.emacs} file.
35638
35639@printindex vr
35640
35641@node Lisp Function Index, , Variable Index, Top
35642@unnumbered Index of Lisp Math Functions
35643
35644The following functions are meant to be used with @code{defmath}, not
35645@code{defun} definitions. For names that do not start with @samp{calc-},
35646the corresponding full Lisp name is derived by adding a prefix of
35647@samp{math-}.
35648
35649@printindex fn
35650
35651@summarycontents
35652
35653@c [end]
35654
35655@contents
35656@bye
35657
35658