6.9 The Modes Variable

The m g (calc-get-modes) command pushes onto the stack a vector of numbers that describes the various mode settings that are in effect. With a numeric prefix argument, it pushes only the nth mode, i.e., the nth element of this vector. Keyboard macros can use the m g command to modify their behavior based on the current mode settings.

The modes vector is also available in the special variable Modes. In other words, m g is like s r Modes RET. It will not work to store into this variable; in fact, if you do, Modes will cease to track the current modes. (The m g command will continue to work, however.)

In general, each number in this vector is suitable as a numeric prefix argument to the associated mode-setting command. (Recall that the ~ key takes a number from the stack and gives it as a numeric prefix to the next command.)

The elements of the modes vector are as follows:

  1. Current precision. Default is 12; associated command is p.
  2. Binary word size. Default is 32; associated command is b w.
  3. Stack size (not counting the value about to be pushed by m g). This is zero if m g is executed with an empty stack.
  4. Number radix. Default is 10; command is d r.
  5. Floating-point format. This is the number of digits, plus the constant 0 for normal notation, 10000 for scientific notation, 20000 for engineering notation, or 30000 for fixed-point notation. These codes are acceptable as prefix arguments to the d n command, but note that this may lose information: For example, d s and C-u 12 d s have similar (but not quite identical) effects if the current precision is 12, but they both produce a code of 10012, which will be treated by d n as C-u 12 d s. If the precision then changes, the float format will still be frozen at 12 significant figures.
  6. Angular mode. Default is 1 (degrees). Other values are 2 (radians) and 3 (HMS). The m d command accepts these prefixes.
  7. Symbolic mode. Value is 0 or 1; default is 0. Command is m s.
  8. Fraction mode. Value is 0 or 1; default is 0. Command is m f.
  9. Polar mode. Value is 0 (rectangular) or 1 (polar); default is 0. Command is m p.
  10. Matrix/Scalar mode. Default value is -1. Value is 0 for Scalar mode, -2 for Matrix mode, -3 for square Matrix mode, or N for NxN Matrix mode. Command is m v.
  11. Simplification mode. Default is 1. Value is -1 for off (m O), 0 for m N, 2 for m B, 3 for m A, 4 for m E, or 5 for m U. The m D command accepts these prefixes.
  12. Infinite mode. Default is -1 (off). Value is 1 if the mode is on, or 0 if the mode is on with positive zeros. Command is m i.

For example, the sequence M-1 m g RET 2 + ~ p increases the precision by two, leaving a copy of the old precision on the stack. Later, ~ p will restore the original precision using that stack value. (This sequence might be especially useful inside a keyboard macro.)

As another example, M-3 m g 1 - ~ DEL deletes all but the oldest (bottommost) stack entry.

Yet another example: The HP-48 “round” command rounds a number to the current displayed precision. You could roughly emulate this in Calc with the sequence M-5 m g 10000 % ~ c c. (This would not work for fixed-point mode, but it wouldn’t be hard to do a full emulation with the help of the Z [ and Z ] programming commands. See Conditionals in Keyboard Macros.)