408 lines
38 KiB
HTML
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> [<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"> ¶</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 …</var><a class="copiable-link" href="#index-_002b"> ¶</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"> ¶</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 …</var><a class="copiable-link" href="#index-_002d"> ¶</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"> ¶</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 …</var><a class="copiable-link" href="#index-_002a"> ¶</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"> ¶</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 …</var><a class="copiable-link" href="#index-_002f"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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 …</var><a class="copiable-link" href="#index-max"> ¶</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"> ¶</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 …</var><a class="copiable-link" href="#index-min"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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 <= <var class="var">r</var> < |<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> > 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) ⇒ 12
|
|
(euclidean-remainder 123 10) ⇒ 3
|
|
(euclidean/ 123 10) ⇒ 12 and 3
|
|
(euclidean/ 123 -10) ⇒ -12 and 3
|
|
(euclidean/ -123 10) ⇒ -13 and 7
|
|
(euclidean/ -123 -10) ⇒ 13 and 7
|
|
(euclidean/ -123.2 -63.5) ⇒ 2.0 and 3.8
|
|
(euclidean/ 16/3 -10/7) ⇒ -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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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) ⇒ 12
|
|
(floor-remainder 123 10) ⇒ 3
|
|
(floor/ 123 10) ⇒ 12 and 3
|
|
(floor/ 123 -10) ⇒ -13 and -7
|
|
(floor/ -123 10) ⇒ -13 and 7
|
|
(floor/ -123 -10) ⇒ 12 and -3
|
|
(floor/ -123.2 -63.5) ⇒ 1.0 and -59.7
|
|
(floor/ 16/3 -10/7) ⇒ -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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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) ⇒ 13
|
|
(ceiling-remainder 123 10) ⇒ -7
|
|
(ceiling/ 123 10) ⇒ 13 and -7
|
|
(ceiling/ 123 -10) ⇒ -12 and 3
|
|
(ceiling/ -123 10) ⇒ -12 and -3
|
|
(ceiling/ -123 -10) ⇒ 13 and 7
|
|
(ceiling/ -123.2 -63.5) ⇒ 2.0 and 3.8
|
|
(ceiling/ 16/3 -10/7) ⇒ -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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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) ⇒ 12
|
|
(truncate-remainder 123 10) ⇒ 3
|
|
(truncate/ 123 10) ⇒ 12 and 3
|
|
(truncate/ 123 -10) ⇒ -12 and 3
|
|
(truncate/ -123 10) ⇒ -12 and -3
|
|
(truncate/ -123 -10) ⇒ 12 and -3
|
|
(truncate/ -123.2 -63.5) ⇒ 1.0 and -59.7
|
|
(truncate/ 16/3 -10/7) ⇒ -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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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| <= <var class="var">r</var> < |<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> > 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| <= <var class="var">r</var> < |<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) ⇒ 12
|
|
(centered-remainder 123 10) ⇒ 3
|
|
(centered/ 123 10) ⇒ 12 and 3
|
|
(centered/ 123 -10) ⇒ -12 and 3
|
|
(centered/ -123 10) ⇒ -12 and -3
|
|
(centered/ -123 -10) ⇒ 12 and -3
|
|
(centered/ 125 10) ⇒ 13 and -5
|
|
(centered/ 127 10) ⇒ 13 and -3
|
|
(centered/ 135 10) ⇒ 14 and -5
|
|
(centered/ -123.2 -63.5) ⇒ 2.0 and 3.8
|
|
(centered/ 16/3 -10/7) ⇒ -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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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"> ¶</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| <= <var class="var">r</var> < |<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| <= <var class="var">r</var> <= |<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) ⇒ 12
|
|
(round-remainder 123 10) ⇒ 3
|
|
(round/ 123 10) ⇒ 12 and 3
|
|
(round/ 123 -10) ⇒ -12 and 3
|
|
(round/ -123 10) ⇒ -12 and -3
|
|
(round/ -123 -10) ⇒ 12 and -3
|
|
(round/ 125 10) ⇒ 12 and 5
|
|
(round/ 127 10) ⇒ 13 and -3
|
|
(round/ 135 10) ⇒ 14 and -5
|
|
(round/ -123.2 -63.5) ⇒ 2.0 and 3.8
|
|
(round/ 16/3 -10/7) ⇒ -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> [<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>
|