・割り算の余り                         S.H氏

 5を3で割った余りが2であることは万人が認める事実だろう。また、−5を3で割った余
りが1であることも、数学に親しんだ方だったら少し考えれば納得されるだろう。

 それでは、3.14を0.3で割った余りはどうなるのだろう。小数で割った余りを求めるこ
とは現実的ではないかもしれないが、不思議な感覚に襲われること必定である。

 3.14÷0.3 の商を小数第一位まで求めるときの余りはいくつか?

この問題は、通常筆算で次のように計算される。

     問題は、左記の筆算の結果を見て、余りを何と答えるかである。

    余りを「0.2」と答えた方はいないだろうか?正解は、「0.02」である。

    割るときに小数点を移動させているので余りを「0.2」と答えがちだが、

    正しくは、もとの小数点の位置で答えなければならないということだ。



 そもそも、N÷a の余り r とは、 N=a・Q+r ( 0≦r<a )を満たす数である。問題では

3.14=0.3・Q+r ( 0≦r<0.3 )を満たす数 r を求めればいいわけだが、上記の筆

算では、両辺を10倍して、 31.4=3・Q+10・r から、 10・r=0.2

 よって、 r=0.02 となる。


 このことについて、攻略法さんからの追記です。(平成22年12月14日付け)

 Excel のワークシート関数では、「MOD(3.14,0.3)=0.14 です。」

 C言語では、「fmod(3.14,0.3)=0.14 です。」

 Excel のワークシート関数では、「MOD(−5,3)=1 です。」

 Excel のVBAでは、「−5 MOD 3 は、−2 です。」

 C言語では、「−5 % 3=−2 です。」

私「あれ〜ぇ?」

(考察) 基本関数を

 SGN(x) x の符号 、ABS(x) x の絶対値 、INT(x) x を超えない最大の整数

とする。このとき、

Excel のワークシート関数では、 MOD(x ,y)=x−y*INT(x/y)

C言語では、 REMAINDER(x ,y)=x−y*IP(x/y)

       ただし、IP(x)=SGN(x)*INT(ABS(x))  x の整数部分

で求めているようだ。

 FNさんからのコメントです。(平成22年12月14日付け)

 大昔パソコンがROMでBASICを持ってた時代、INTという関数の仕様はまちまちでした。
INT(−1.3)で「−1」を返すのと、「−2」を返すのがありました。

 C言語は使わない(使えない)のでわかりませんが、Excel VBAでは、MODは演算子で、
「−5 MOD 3」 は、「−2」を返します。C言語の%と同じ動作のようです。ワークシート関数
のMODとVBAの演算子としてのMODは違う仕様にしているようです。だから、C言語でも 1
を返すような関数があるかもしれません。

 INT(−5/3)は、「−2」ですが、「−5 \ 3」は「−1」です。「−1.3」の整数部分を「−2」と
する流儀にも、「−1」にする流儀にも対応しようということでしょう。数学的には「−2」の方が
いいと思いますが、日常言語の整数部分という表現からは、「−1」は間違いだと断言するこ
とはできないでしょう。

 数学で、負の数に対して、整数部分とか小数部分という言葉を使うことはないと思います。
大学入試問題では正であることが明らかな具体的な数、例えば、「1+」に対して整数部
分とかを使うことはあっても、x>0が明らかでも、x の整数部分とは書かないだろうと思いま
す。どうしても使いたければ、「x を越えない最大の整数を x の整数部分という」と定義して
からでしょう。



                                             投稿一覧に戻る