🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.misc
Article #222

Re: 剰余について

#222
From: MAEDA Atusi
Date: Fri, 13 Mar 1998 00:00
68 lines
4202 bytes
h-satoh@rd.njk.co.jp (Hiroyuki Satoh) writes:

>         整数 A, B があり、B > 0 の場合、これに対して
>            A = ( B * q ) + r
>            0 <= r < B
>         であるような整数 q, r がただ一組存在する。
>         q を A を B で割った「商」、r を「余り」という。

上の定義はBが正の時しか使えませんよね。Bが負の場合も考慮した場合、
A/Bを整数値に丸める方法として以下の4通りが一般的です。

(1) 0に向かって丸める(truncate)。
    すなわち、『商』とは、A/Bより絶対値が大きくない整数の中でもっとも
    A/Bに近いものと定義する。
(2) 正の無限大に向かって丸める(ceiling)。
    商とはA/Bより小さくない整数の中でもっともA/Bに近いものと定義する。
(3) 負の無限大に向かって丸める(floor)。
    商とはA/Bより大きくない整数の中でもっともA/Bに近いものと定義する。
(4) もっとも近い整数に丸める(round)。
    商とはすべての整数の中でもっともA/Bに近いものと定義する。
    (ちょうど2つの整数の中間にある時は、偶数を選ぶ)。

この4つに応じてそれぞれ『余り』が定義できます。

> どちらにしてもこれらは、数学上の考え方とは異なるようです。

数学的には上の4つのどれが「正しい」ともいえないと思います。佐藤さんが
示した除法定理も、「除数は正」という範囲でしか成り立ちませんよね。この
範囲以外だと上を満たすq, rは存在しませんから。

ceilingやfloorは数学で良く使いますよね。統計学ではroundを使わないと困
る事も多いでしょう。また、「整数部と小数部」なんていう言い方をした時は、
truncateが整数部を求める演算に相当するでしょう。

> コンピュータ言語で、「これが仕様」と決められ、広く認知されて
> いる以上、それを否定するつもりは全くありません。
> 
> 私が知りたいのは「算術」演算子/関数によって導かれる結果を、
> 「なぜ数学上の概念と違う仕様に決めたのか?」という事です。
>   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

プログラミング言語では、演算子としてこれらのうち1つしか用意していない
言語が多いですね。「除数または被除数のいずれかが負の時、剰余の符号は不
定(あるいは処理系依存)」としている言語もあります。

実際にtruncateを採用している処理系が多いのは、おそらくそれがコンピュー
タで処理する上でもっとも楽だからでしょう。floorやceilingは商の正負によっ
てアルゴリズムを変えなければいけませんし、roundもtruncateより手間がか
かります。

ちなみに、Common Lispではtruncate, floor, ceiling, roundという4つの丸
め方が用意されています。剰余にはfloorの剰余を返すmodと、truncateの剰余
を返すremの2とおりがあります。SchemeというLispの方言にもmoduloと
remainderという2つの剰余関数があります。Fortranの組み込み関数やCのライ
ブラリ関数では、浮動小数点数を整数値に丸めるときにtruncateする関数
(aint)とroundする関数(anint)の2つが用意されています。

> # 手元にあるバージョンのjparl では、
> #      -5 / +2 は -2,  -5 % +2 は +1 
> #      +5 / -2 は -2,  +5 % -2 は +5 になっちゃいます。
> # これは話になりませんね。制限仕様?バグ?

Perlにはちゃんとした仕様がない(仕様 = 実装)ので推測するしかありません
が、除数・被除数のどちらかが負だと剰余はまったく不定なのかも。つまり、
除法定理が成り立つ範囲でしか使ってはいけないとか???

				前田敦司
Technical Details
Message-ID: <pypiupisr63.fsf@tp560e.sowa.is.uec.ac.jp>
Path: arc1-ca.pugleaf.net!unknown!not-for-mail
References: <6eb19n$lv3$1@sunny.njk.co.jp>

Show Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS
X-Google-Thread: 10b195,716a868b8fc068f4
X-Google-Attributes: gid10b195,public
From: MAEDA Atusi <maeda@is.uec.ac.jp>
Subject: Re: 剰余について
Date: 1998/03/13
Message-ID: <pypiupisr63.fsf@tp560e.sowa.is.uec.ac.jp>
X-Deja-AN: 333665002
References: <6eb19n$lv3$1@sunny.njk.co.jp>
Mime-Version: 1.0 (generated by tm-edit 7.103)
Reply-To: maeda@is.uec.ac.jp
Content-Type: text/plain; charset=ISO-2022-JP
Organization: The Univ. of Electro-Communications, Tokyo, Japan
Newsgroups: fj.lang.misc