1
0
Fork 0
cl-sites/guile.html_node/Arithmetic.html
2024-12-17 12:49:28 +01:00

408 lines
38 KiB
HTML

<!DOCTYPE html>
<html>
<!-- Created by GNU Texinfo 7.1, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- This manual documents Guile version 3.0.10.
Copyright (C) 1996-1997, 2000-2005, 2009-2023 Free Software Foundation,
Inc.
Copyright (C) 2021 Maxime Devos
Copyright (C) 2024 Tomas Volf
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A
copy of the license is included in the section entitled "GNU Free
Documentation License." -->
<title>Arithmetic (Guile Reference Manual)</title>
<meta name="description" content="Arithmetic (Guile Reference Manual)">
<meta name="keywords" content="Arithmetic (Guile Reference Manual)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content=".texi2any-real">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="index.html" rel="start" title="Top">
<link href="Concept-Index.html" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Numbers.html" rel="up" title="Numbers">
<link href="Scientific.html" rel="next" title="Scientific">
<link href="Complex.html" rel="prev" title="Complex">
<style type="text/css">
<!--
a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
div.example {margin-left: 3.2em}
span:hover a.copiable-link {visibility: visible}
strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
-->
</style>
<link rel="stylesheet" type="text/css" href="https://www.gnu.org/software/gnulib/manual.css">
</head>
<body lang="en">
<div class="subsubsection-level-extent" id="Arithmetic">
<div class="nav-panel">
<p>
Next: <a href="Scientific.html" accesskey="n" rel="next">Scientific Functions</a>, Previous: <a href="Complex.html" accesskey="p" rel="prev">Complex Number Operations</a>, Up: <a href="Numbers.html" accesskey="u" rel="up">Numerical data types</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<h4 class="subsubsection" id="Arithmetic-Functions"><span>6.6.2.11 Arithmetic Functions<a class="copiable-link" href="#Arithmetic-Functions"> &para;</a></span></h4>
<a class="index-entry-id" id="index-max-2"></a>
<a class="index-entry-id" id="index-min-2"></a>
<a class="index-entry-id" id="index-_002b-2"></a>
<a class="index-entry-id" id="index-_002a-2"></a>
<a class="index-entry-id" id="index-_002d-2"></a>
<a class="index-entry-id" id="index-_002f-2"></a>
<a class="index-entry-id" id="index-1_002b"></a>
<a class="index-entry-id" id="index-1_002d"></a>
<a class="index-entry-id" id="index-abs-2"></a>
<a class="index-entry-id" id="index-floor-2"></a>
<a class="index-entry-id" id="index-ceiling-2"></a>
<a class="index-entry-id" id="index-truncate-3"></a>
<a class="index-entry-id" id="index-round-2"></a>
<a class="index-entry-id" id="index-euclidean_002f-1"></a>
<a class="index-entry-id" id="index-euclidean_002dquotient-1"></a>
<a class="index-entry-id" id="index-euclidean_002dremainder-1"></a>
<a class="index-entry-id" id="index-floor_002f-1"></a>
<a class="index-entry-id" id="index-floor_002dquotient-1"></a>
<a class="index-entry-id" id="index-floor_002dremainder-1"></a>
<a class="index-entry-id" id="index-ceiling_002f-1"></a>
<a class="index-entry-id" id="index-ceiling_002dquotient-1"></a>
<a class="index-entry-id" id="index-ceiling_002dremainder-1"></a>
<a class="index-entry-id" id="index-truncate_002f-1"></a>
<a class="index-entry-id" id="index-truncate_002dquotient-1"></a>
<a class="index-entry-id" id="index-truncate_002dremainder-1"></a>
<a class="index-entry-id" id="index-centered_002f-1"></a>
<a class="index-entry-id" id="index-centered_002dquotient-1"></a>
<a class="index-entry-id" id="index-centered_002dremainder-1"></a>
<a class="index-entry-id" id="index-round_002f-1"></a>
<a class="index-entry-id" id="index-round_002dquotient-1"></a>
<a class="index-entry-id" id="index-round_002dremainder-1"></a>
<p>The C arithmetic functions below always takes two arguments, while the
Scheme functions can take an arbitrary number. When you need to
invoke them with just one argument, for example to compute the
equivalent of <code class="code">(- x)</code>, pass <code class="code">SCM_UNDEFINED</code> as the second
one: <code class="code">scm_difference (x, SCM_UNDEFINED)</code>.
</p>
<dl class="first-deffn">
<dt class="deffn" id="index-_002b"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">+</strong> <var class="def-var-arguments">z1 &hellip;</var><a class="copiable-link" href="#index-_002b"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005fsum"><span class="category-def">C Function: </span><span><strong class="def-name">scm_sum</strong> <var class="def-var-arguments">(z1, z2)</var><a class="copiable-link" href="#index-scm_005fsum"> &para;</a></span></dt>
<dd><p>Return the sum of all parameter values. Return 0 if called without any
parameters.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-_002d"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">-</strong> <var class="def-var-arguments">z1 z2 &hellip;</var><a class="copiable-link" href="#index-_002d"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005fdifference"><span class="category-def">C Function: </span><span><strong class="def-name">scm_difference</strong> <var class="def-var-arguments">(z1, z2)</var><a class="copiable-link" href="#index-scm_005fdifference"> &para;</a></span></dt>
<dd><p>If called with one argument <var class="var">z1</var>, -<var class="var">z1</var> is returned. Otherwise
the sum of all but the first argument are subtracted from the first
argument.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-_002a"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">*</strong> <var class="def-var-arguments">z1 &hellip;</var><a class="copiable-link" href="#index-_002a"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005fproduct"><span class="category-def">C Function: </span><span><strong class="def-name">scm_product</strong> <var class="def-var-arguments">(z1, z2)</var><a class="copiable-link" href="#index-scm_005fproduct"> &para;</a></span></dt>
<dd><p>Return the product of all arguments. If called without arguments, 1 is
returned.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-_002f"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">/</strong> <var class="def-var-arguments">z1 z2 &hellip;</var><a class="copiable-link" href="#index-_002f"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005fdivide"><span class="category-def">C Function: </span><span><strong class="def-name">scm_divide</strong> <var class="def-var-arguments">(z1, z2)</var><a class="copiable-link" href="#index-scm_005fdivide"> &para;</a></span></dt>
<dd><p>Divide the first argument by the product of the remaining arguments. If
called with one argument <var class="var">z1</var>, 1/<var class="var">z1</var> is returned.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-1_002b-1"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">1+</strong> <var class="def-var-arguments">z</var><a class="copiable-link" href="#index-1_002b-1"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005foneplus"><span class="category-def">C Function: </span><span><strong class="def-name">scm_oneplus</strong> <var class="def-var-arguments">(z)</var><a class="copiable-link" href="#index-scm_005foneplus"> &para;</a></span></dt>
<dd><p>Return <em class="math"><var class="var">z</var> + 1</em>.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-1_002d-1"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">1-</strong> <var class="def-var-arguments">z</var><a class="copiable-link" href="#index-1_002d-1"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005foneminus"><span class="category-def">C function: </span><span><strong class="def-name">scm_oneminus</strong> <var class="def-var-arguments">(z)</var><a class="copiable-link" href="#index-scm_005foneminus"> &para;</a></span></dt>
<dd><p>Return <em class="math"><var class="var">z</var> - 1</em>.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-abs"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">abs</strong> <var class="def-var-arguments">x</var><a class="copiable-link" href="#index-abs"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005fabs"><span class="category-def">C Function: </span><span><strong class="def-name">scm_abs</strong> <var class="def-var-arguments">(x)</var><a class="copiable-link" href="#index-scm_005fabs"> &para;</a></span></dt>
<dd><p>Return the absolute value of <var class="var">x</var>.
</p>
<p><var class="var">x</var> must be a number with zero imaginary part. To calculate the
magnitude of a complex number, use <code class="code">magnitude</code> instead.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-max"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">max</strong> <var class="def-var-arguments">x1 x2 &hellip;</var><a class="copiable-link" href="#index-max"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005fmax"><span class="category-def">C Function: </span><span><strong class="def-name">scm_max</strong> <var class="def-var-arguments">(x1, x2)</var><a class="copiable-link" href="#index-scm_005fmax"> &para;</a></span></dt>
<dd><p>Return the maximum of all parameter values.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-min"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">min</strong> <var class="def-var-arguments">x1 x2 &hellip;</var><a class="copiable-link" href="#index-min"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005fmin"><span class="category-def">C Function: </span><span><strong class="def-name">scm_min</strong> <var class="def-var-arguments">(x1, x2)</var><a class="copiable-link" href="#index-scm_005fmin"> &para;</a></span></dt>
<dd><p>Return the minimum of all parameter values.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-truncate"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">truncate</strong> <var class="def-var-arguments">x</var><a class="copiable-link" href="#index-truncate"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005ftruncate_005fnumber"><span class="category-def">C Function: </span><span><strong class="def-name">scm_truncate_number</strong> <var class="def-var-arguments">(x)</var><a class="copiable-link" href="#index-scm_005ftruncate_005fnumber"> &para;</a></span></dt>
<dd><p>Round the inexact number <var class="var">x</var> towards zero.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-round"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">round</strong> <var class="def-var-arguments">x</var><a class="copiable-link" href="#index-round"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005fround_005fnumber"><span class="category-def">C Function: </span><span><strong class="def-name">scm_round_number</strong> <var class="def-var-arguments">(x)</var><a class="copiable-link" href="#index-scm_005fround_005fnumber"> &para;</a></span></dt>
<dd><p>Round the inexact number <var class="var">x</var> to the nearest integer. When exactly
halfway between two integers, round to the even one.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-floor"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">floor</strong> <var class="def-var-arguments">x</var><a class="copiable-link" href="#index-floor"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005ffloor"><span class="category-def">C Function: </span><span><strong class="def-name">scm_floor</strong> <var class="def-var-arguments">(x)</var><a class="copiable-link" href="#index-scm_005ffloor"> &para;</a></span></dt>
<dd><p>Round the number <var class="var">x</var> towards minus infinity.
</p></dd></dl>
<dl class="first-deffn">
<dt class="deffn" id="index-ceiling"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">ceiling</strong> <var class="def-var-arguments">x</var><a class="copiable-link" href="#index-ceiling"> &para;</a></span></dt>
<dt class="deffnx def-cmd-deffn" id="index-scm_005fceiling"><span class="category-def">C Function: </span><span><strong class="def-name">scm_ceiling</strong> <var class="def-var-arguments">(x)</var><a class="copiable-link" href="#index-scm_005fceiling"> &para;</a></span></dt>
<dd><p>Round the number <var class="var">x</var> towards infinity.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-scm_005fc_005ftruncate"><span class="category-def">C Function: </span><span><code class="def-type">double</code> <strong class="def-name">scm_c_truncate</strong> <code class="def-code-arguments">(double x)</code><a class="copiable-link" href="#index-scm_005fc_005ftruncate"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fc_005fround"><span class="category-def">C Function: </span><span><code class="def-type">double</code> <strong class="def-name">scm_c_round</strong> <code class="def-code-arguments">(double x)</code><a class="copiable-link" href="#index-scm_005fc_005fround"> &para;</a></span></dt>
<dd><p>Like <code class="code">scm_truncate_number</code> or <code class="code">scm_round_number</code>,
respectively, but these functions take and return <code class="code">double</code>
values.
</p></dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-euclidean_002f"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">euclidean/</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-euclidean_002f"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-euclidean_002dquotient"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">euclidean-quotient</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-euclidean_002dquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-euclidean_002dremainder"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">euclidean-remainder</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-euclidean_002dremainder"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005feuclidean_005fdivide"><span class="category-def">C Function: </span><span><code class="def-type">void</code> <strong class="def-name">scm_euclidean_divide</strong> <code class="def-code-arguments">(SCM <var class="var">x</var>, SCM <var class="var">y</var>, SCM *<var class="var">q</var>, SCM *<var class="var">r</var>)</code><a class="copiable-link" href="#index-scm_005feuclidean_005fdivide"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005feuclidean_005fquotient"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_euclidean_quotient</strong> <code class="def-code-arguments">(SCM <var class="var">x</var>, SCM <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005feuclidean_005fquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005feuclidean_005fremainder"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_euclidean_remainder</strong> <code class="def-code-arguments">(SCM <var class="var">x</var>, SCM <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005feuclidean_005fremainder"> &para;</a></span></dt>
<dd><p>These procedures accept two real numbers <var class="var">x</var> and <var class="var">y</var>, where the
divisor <var class="var">y</var> must be non-zero. <code class="code">euclidean-quotient</code> returns the
integer <var class="var">q</var> and <code class="code">euclidean-remainder</code> returns the real number
<var class="var">r</var> such that <em class="math"><var class="var">x</var> = <var class="var">q</var>*<var class="var">y</var> + <var class="var">r</var></em> and
<em class="math">0 &lt;= <var class="var">r</var> &lt; |<var class="var">y</var>|</em>. <code class="code">euclidean/</code> returns both <var class="var">q</var> and
<var class="var">r</var>, and is more efficient than computing each separately. Note
that when <em class="math"><var class="var">y</var> &gt; 0</em>, <code class="code">euclidean-quotient</code> returns
<em class="math">floor(<var class="var">x</var>/<var class="var">y</var>)</em>, otherwise it returns
<em class="math">ceiling(<var class="var">x</var>/<var class="var">y</var>)</em>.
</p>
<p>Note that these operators are equivalent to the R6RS operators
<code class="code">div</code>, <code class="code">mod</code>, and <code class="code">div-and-mod</code>.
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(euclidean-quotient 123 10) &rArr; 12
(euclidean-remainder 123 10) &rArr; 3
(euclidean/ 123 10) &rArr; 12 and 3
(euclidean/ 123 -10) &rArr; -12 and 3
(euclidean/ -123 10) &rArr; -13 and 7
(euclidean/ -123 -10) &rArr; 13 and 7
(euclidean/ -123.2 -63.5) &rArr; 2.0 and 3.8
(euclidean/ 16/3 -10/7) &rArr; -3 and 22/21
</pre></div>
</dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-floor_002f"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">floor/</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-floor_002f"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-floor_002dquotient"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">floor-quotient</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-floor_002dquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-floor_002dremainder"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">floor-remainder</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-floor_002dremainder"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005ffloor_005fdivide"><span class="category-def">C Function: </span><span><code class="def-type">void</code> <strong class="def-name">scm_floor_divide</strong> <code class="def-code-arguments">(SCM <var class="var">x</var>, SCM <var class="var">y</var>, SCM *<var class="var">q</var>, SCM *<var class="var">r</var>)</code><a class="copiable-link" href="#index-scm_005ffloor_005fdivide"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005ffloor_005fquotient"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_floor_quotient</strong> <code class="def-code-arguments">(<var class="var">x</var>, <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005ffloor_005fquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005ffloor_005fremainder"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_floor_remainder</strong> <code class="def-code-arguments">(<var class="var">x</var>, <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005ffloor_005fremainder"> &para;</a></span></dt>
<dd><p>These procedures accept two real numbers <var class="var">x</var> and <var class="var">y</var>, where the
divisor <var class="var">y</var> must be non-zero. <code class="code">floor-quotient</code> returns the
integer <var class="var">q</var> and <code class="code">floor-remainder</code> returns the real number
<var class="var">r</var> such that <em class="math"><var class="var">q</var> = floor(<var class="var">x</var>/<var class="var">y</var>)</em> and
<em class="math"><var class="var">x</var> = <var class="var">q</var>*<var class="var">y</var> + <var class="var">r</var></em>. <code class="code">floor/</code> returns
both <var class="var">q</var> and <var class="var">r</var>, and is more efficient than computing each
separately. Note that <var class="var">r</var>, if non-zero, will have the same sign
as <var class="var">y</var>.
</p>
<p>When <var class="var">x</var> and <var class="var">y</var> are integers, <code class="code">floor-remainder</code> is
equivalent to the R5RS integer-only operator <code class="code">modulo</code>.
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(floor-quotient 123 10) &rArr; 12
(floor-remainder 123 10) &rArr; 3
(floor/ 123 10) &rArr; 12 and 3
(floor/ 123 -10) &rArr; -13 and -7
(floor/ -123 10) &rArr; -13 and 7
(floor/ -123 -10) &rArr; 12 and -3
(floor/ -123.2 -63.5) &rArr; 1.0 and -59.7
(floor/ 16/3 -10/7) &rArr; -4 and -8/21
</pre></div>
</dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-ceiling_002f"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">ceiling/</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-ceiling_002f"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-ceiling_002dquotient"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">ceiling-quotient</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-ceiling_002dquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-ceiling_002dremainder"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">ceiling-remainder</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-ceiling_002dremainder"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fceiling_005fdivide"><span class="category-def">C Function: </span><span><code class="def-type">void</code> <strong class="def-name">scm_ceiling_divide</strong> <code class="def-code-arguments">(SCM <var class="var">x</var>, SCM <var class="var">y</var>, SCM *<var class="var">q</var>, SCM *<var class="var">r</var>)</code><a class="copiable-link" href="#index-scm_005fceiling_005fdivide"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fceiling_005fquotient"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_ceiling_quotient</strong> <code class="def-code-arguments">(<var class="var">x</var>, <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005fceiling_005fquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fceiling_005fremainder"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_ceiling_remainder</strong> <code class="def-code-arguments">(<var class="var">x</var>, <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005fceiling_005fremainder"> &para;</a></span></dt>
<dd><p>These procedures accept two real numbers <var class="var">x</var> and <var class="var">y</var>, where the
divisor <var class="var">y</var> must be non-zero. <code class="code">ceiling-quotient</code> returns the
integer <var class="var">q</var> and <code class="code">ceiling-remainder</code> returns the real number
<var class="var">r</var> such that <em class="math"><var class="var">q</var> = ceiling(<var class="var">x</var>/<var class="var">y</var>)</em> and
<em class="math"><var class="var">x</var> = <var class="var">q</var>*<var class="var">y</var> + <var class="var">r</var></em>. <code class="code">ceiling/</code> returns
both <var class="var">q</var> and <var class="var">r</var>, and is more efficient than computing each
separately. Note that <var class="var">r</var>, if non-zero, will have the opposite sign
of <var class="var">y</var>.
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(ceiling-quotient 123 10) &rArr; 13
(ceiling-remainder 123 10) &rArr; -7
(ceiling/ 123 10) &rArr; 13 and -7
(ceiling/ 123 -10) &rArr; -12 and 3
(ceiling/ -123 10) &rArr; -12 and -3
(ceiling/ -123 -10) &rArr; 13 and 7
(ceiling/ -123.2 -63.5) &rArr; 2.0 and 3.8
(ceiling/ 16/3 -10/7) &rArr; -3 and 22/21
</pre></div>
</dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-truncate_002f"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">truncate/</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-truncate_002f"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-truncate_002dquotient"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">truncate-quotient</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-truncate_002dquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-truncate_002dremainder"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">truncate-remainder</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-truncate_002dremainder"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005ftruncate_005fdivide"><span class="category-def">C Function: </span><span><code class="def-type">void</code> <strong class="def-name">scm_truncate_divide</strong> <code class="def-code-arguments">(SCM <var class="var">x</var>, SCM <var class="var">y</var>, SCM *<var class="var">q</var>, SCM *<var class="var">r</var>)</code><a class="copiable-link" href="#index-scm_005ftruncate_005fdivide"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005ftruncate_005fquotient"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_truncate_quotient</strong> <code class="def-code-arguments">(<var class="var">x</var>, <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005ftruncate_005fquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005ftruncate_005fremainder"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_truncate_remainder</strong> <code class="def-code-arguments">(<var class="var">x</var>, <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005ftruncate_005fremainder"> &para;</a></span></dt>
<dd><p>These procedures accept two real numbers <var class="var">x</var> and <var class="var">y</var>, where the
divisor <var class="var">y</var> must be non-zero. <code class="code">truncate-quotient</code> returns the
integer <var class="var">q</var> and <code class="code">truncate-remainder</code> returns the real number
<var class="var">r</var> such that <var class="var">q</var> is <em class="math"><var class="var">x</var>/<var class="var">y</var></em> rounded toward zero,
and <em class="math"><var class="var">x</var> = <var class="var">q</var>*<var class="var">y</var> + <var class="var">r</var></em>. <code class="code">truncate/</code> returns
both <var class="var">q</var> and <var class="var">r</var>, and is more efficient than computing each
separately. Note that <var class="var">r</var>, if non-zero, will have the same sign
as <var class="var">x</var>.
</p>
<p>When <var class="var">x</var> and <var class="var">y</var> are integers, these operators are
equivalent to the R5RS integer-only operators <code class="code">quotient</code> and
<code class="code">remainder</code>.
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(truncate-quotient 123 10) &rArr; 12
(truncate-remainder 123 10) &rArr; 3
(truncate/ 123 10) &rArr; 12 and 3
(truncate/ 123 -10) &rArr; -12 and 3
(truncate/ -123 10) &rArr; -12 and -3
(truncate/ -123 -10) &rArr; 12 and -3
(truncate/ -123.2 -63.5) &rArr; 1.0 and -59.7
(truncate/ 16/3 -10/7) &rArr; -3 and 22/21
</pre></div>
</dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-centered_002f"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">centered/</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-centered_002f"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-centered_002dquotient"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">centered-quotient</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-centered_002dquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-centered_002dremainder"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">centered-remainder</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-centered_002dremainder"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fcentered_005fdivide"><span class="category-def">C Function: </span><span><code class="def-type">void</code> <strong class="def-name">scm_centered_divide</strong> <code class="def-code-arguments">(SCM <var class="var">x</var>, SCM <var class="var">y</var>, SCM *<var class="var">q</var>, SCM *<var class="var">r</var>)</code><a class="copiable-link" href="#index-scm_005fcentered_005fdivide"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fcentered_005fquotient"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_centered_quotient</strong> <code class="def-code-arguments">(SCM <var class="var">x</var>, SCM <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005fcentered_005fquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fcentered_005fremainder"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_centered_remainder</strong> <code class="def-code-arguments">(SCM <var class="var">x</var>, SCM <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005fcentered_005fremainder"> &para;</a></span></dt>
<dd><p>These procedures accept two real numbers <var class="var">x</var> and <var class="var">y</var>, where the
divisor <var class="var">y</var> must be non-zero. <code class="code">centered-quotient</code> returns the
integer <var class="var">q</var> and <code class="code">centered-remainder</code> returns the real number
<var class="var">r</var> such that <em class="math"><var class="var">x</var> = <var class="var">q</var>*<var class="var">y</var> + <var class="var">r</var></em> and
<em class="math">-|<var class="var">y</var>/2| &lt;= <var class="var">r</var> &lt; |<var class="var">y</var>/2|</em>. <code class="code">centered/</code>
returns both <var class="var">q</var> and <var class="var">r</var>, and is more efficient than computing
each separately.
</p>
<p>Note that <code class="code">centered-quotient</code> returns <em class="math"><var class="var">x</var>/<var class="var">y</var></em>
rounded to the nearest integer. When <em class="math"><var class="var">x</var>/<var class="var">y</var></em> lies
exactly half-way between two integers, the tie is broken according to
the sign of <var class="var">y</var>. If <em class="math"><var class="var">y</var> &gt; 0</em>, ties are rounded toward
positive infinity, otherwise they are rounded toward negative infinity.
This is a consequence of the requirement that
<em class="math">-|<var class="var">y</var>/2| &lt;= <var class="var">r</var> &lt; |<var class="var">y</var>/2|</em>.
</p>
<p>Note that these operators are equivalent to the R6RS operators
<code class="code">div0</code>, <code class="code">mod0</code>, and <code class="code">div0-and-mod0</code>.
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(centered-quotient 123 10) &rArr; 12
(centered-remainder 123 10) &rArr; 3
(centered/ 123 10) &rArr; 12 and 3
(centered/ 123 -10) &rArr; -12 and 3
(centered/ -123 10) &rArr; -12 and -3
(centered/ -123 -10) &rArr; 12 and -3
(centered/ 125 10) &rArr; 13 and -5
(centered/ 127 10) &rArr; 13 and -3
(centered/ 135 10) &rArr; 14 and -5
(centered/ -123.2 -63.5) &rArr; 2.0 and 3.8
(centered/ 16/3 -10/7) &rArr; -4 and -8/21
</pre></div>
</dd></dl>
<dl class="first-deftypefn">
<dt class="deftypefn" id="index-round_002f"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">round/</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-round_002f"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-round_002dquotient"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">round-quotient</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-round_002dquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-round_002dremainder"><span class="category-def">Scheme Procedure: </span><span><strong class="def-name">round-remainder</strong> <code class="def-code-arguments"><var class="var">x</var> <var class="var">y</var></code><a class="copiable-link" href="#index-round_002dremainder"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fround_005fdivide"><span class="category-def">C Function: </span><span><code class="def-type">void</code> <strong class="def-name">scm_round_divide</strong> <code class="def-code-arguments">(SCM <var class="var">x</var>, SCM <var class="var">y</var>, SCM *<var class="var">q</var>, SCM *<var class="var">r</var>)</code><a class="copiable-link" href="#index-scm_005fround_005fdivide"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fround_005fquotient"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_round_quotient</strong> <code class="def-code-arguments">(<var class="var">x</var>, <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005fround_005fquotient"> &para;</a></span></dt>
<dt class="deftypefnx def-cmd-deftypefn" id="index-scm_005fround_005fremainder"><span class="category-def">C Function: </span><span><code class="def-type">SCM</code> <strong class="def-name">scm_round_remainder</strong> <code class="def-code-arguments">(<var class="var">x</var>, <var class="var">y</var>)</code><a class="copiable-link" href="#index-scm_005fround_005fremainder"> &para;</a></span></dt>
<dd><p>These procedures accept two real numbers <var class="var">x</var> and <var class="var">y</var>, where the
divisor <var class="var">y</var> must be non-zero. <code class="code">round-quotient</code> returns the
integer <var class="var">q</var> and <code class="code">round-remainder</code> returns the real number
<var class="var">r</var> such that <em class="math"><var class="var">x</var> = <var class="var">q</var>*<var class="var">y</var> + <var class="var">r</var></em> and
<var class="var">q</var> is <em class="math"><var class="var">x</var>/<var class="var">y</var></em> rounded to the nearest integer,
with ties going to the nearest even integer. <code class="code">round/</code>
returns both <var class="var">q</var> and <var class="var">r</var>, and is more efficient than computing
each separately.
</p>
<p>Note that <code class="code">round/</code> and <code class="code">centered/</code> are almost equivalent, but
their behavior differs when <em class="math"><var class="var">x</var>/<var class="var">y</var></em> lies exactly half-way
between two integers. In this case, <code class="code">round/</code> chooses the nearest
even integer, whereas <code class="code">centered/</code> chooses in such a way to satisfy
the constraint <em class="math">-|<var class="var">y</var>/2| &lt;= <var class="var">r</var> &lt; |<var class="var">y</var>/2|</em>, which
is stronger than the corresponding constraint for <code class="code">round/</code>,
<em class="math">-|<var class="var">y</var>/2| &lt;= <var class="var">r</var> &lt;= |<var class="var">y</var>/2|</em>. In particular,
when <var class="var">x</var> and <var class="var">y</var> are integers, the number of possible remainders
returned by <code class="code">centered/</code> is <em class="math">|<var class="var">y</var>|</em>, whereas the number of
possible remainders returned by <code class="code">round/</code> is <em class="math">|<var class="var">y</var>|+1</em> when
<var class="var">y</var> is even.
</p>
<div class="example lisp">
<pre class="lisp-preformatted">(round-quotient 123 10) &rArr; 12
(round-remainder 123 10) &rArr; 3
(round/ 123 10) &rArr; 12 and 3
(round/ 123 -10) &rArr; -12 and 3
(round/ -123 10) &rArr; -12 and -3
(round/ -123 -10) &rArr; 12 and -3
(round/ 125 10) &rArr; 12 and 5
(round/ 127 10) &rArr; 13 and -3
(round/ 135 10) &rArr; 14 and -5
(round/ -123.2 -63.5) &rArr; 2.0 and 3.8
(round/ 16/3 -10/7) &rArr; -4 and -8/21
</pre></div>
</dd></dl>
</div>
<hr>
<div class="nav-panel">
<p>
Next: <a href="Scientific.html">Scientific Functions</a>, Previous: <a href="Complex.html">Complex Number Operations</a>, Up: <a href="Numbers.html">Numerical data types</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>