Next: Complex Number Functions, Previous: Basic Arithmetic, Up: Arithmetic

There are four commands for truncating a real number to an integer, differing mainly in their treatment of negative numbers. All of these commands have the property that if the argument is an integer, the result is the same integer. An integer-valued floating-point argument is converted to integer form.

If you press `H` (`calc-hyperbolic`

) first, the result will be
expressed as an integer-valued floating-point number.

The `F` (`calc-floor`

) [`floor`

or `ffloor`

] command
truncates a real number to the next lower integer, i.e., toward minus
infinity. Thus `3.6 F` produces 3, but `_3.6 F` produces
*-4*.

The `I F` (`calc-ceiling`

) [`ceil`

or `fceil`

]
command truncates toward positive infinity. Thus `3.6 I F` produces
4, and `_3.6 I F` produces *-3*.

The `R` (`calc-round`

) [`round`

or `fround`

] command
rounds to the nearest integer. When the fractional part is .5 exactly,
this command rounds away from zero. (All other rounding in the
Calculator uses this convention as well.) Thus `3.5 R` produces 4
but `3.4 R` produces 3; `_3.5 R` produces *-4*.

The `I R` (`calc-trunc`

) [`trunc`

or `ftrunc`

]
command truncates toward zero. In other words, it “chops off”
everything after the decimal point. Thus `3.6 I R` produces 3 and
`_3.6 I R` produces *-3*.

These functions may not be applied meaningfully to error forms, but they
do work for intervals. As a convenience, applying `floor`

to a
modulo form floors the value part of the form. Applied to a vector,
these functions operate on all elements of the vector one by one.
Applied to a date form, they operate on the internal numerical
representation of dates, converting a date/time form into a pure date.

There are two more rounding functions which can only be entered in
algebraic notation. The `roundu`

function is like `round`

except that it rounds up, toward plus infinity, when the fractional
part is .5. This distinction matters only for negative arguments.
Also, `rounde`

rounds to an even number in the case of a tie,
rounding up or down as necessary. For example, ‘`rounde(3.5)`’ and
‘`rounde(4.5)`’ both return 4, but ‘`rounde(5.5)`’ returns 6.
The advantage of round-to-even is that the net error due to rounding
after a long calculation tends to cancel out to zero. An important
subtle point here is that the number being fed to `rounde`

will
already have been rounded to the current precision before `rounde`

begins. For example, ‘`rounde(2.500001)`’ with a current precision
of 6 will incorrectly, or at least surprisingly, yield 2 because the
argument will first have been rounded down to ‘`2.5`’ (which
`rounde`

sees as an exact tie between 2 and 3).

Each of these functions, when written in algebraic formulas, allows
a second argument which specifies the number of digits after the
decimal point to keep. For example, ‘`round(123.4567, 2)`’ will
produce the answer 123.46, and ‘`round(123.4567, -1)`’ will
produce 120 (i.e., the cutoff is one digit to the *left* of
the decimal point). A second argument of zero is equivalent to
no second argument at all.

To compute the fractional part of a number (i.e., the amount which, when
added to ``floor(``n``)`', will produce `n`) just take `n`
modulo 1 using the `%`

command.

Note also the `\` (integer quotient), `f I` (integer logarithm),
and `f Q` (integer square root) commands, which are analogous to
`/`, `B`, and `Q`, respectively, except that they take integer
arguments and return the result rounded down to an integer.