Article View: fj.lang.misc
Article #222Re: 剰余について
From: MAEDA Atusi
Date: Fri, 13 Mar 1998 00:00
Date: Fri, 13 Mar 1998 00:00
68 lines
4202 bytes
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-mailReferences:
<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