- 締切済み
負の数 余り 剰余系
負の数の余りについて質問です。 http://okwave.jp/qa1547226.html に関連しますが、Excelは正しく(?)0以上法の数未満で C#(など、他は試していません)では、 int j = -10 % 9;//-1 となってしまいます。 8を返してくれる関数は自作するしかないのでしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- sakusaker7
- ベストアンサー率62% (800/1280)
あ、Wikipedia(英語版)をあたられたんですね。 最終的には、今回の場合は望む操作を行う関数を自分で定義するよりないと思います。 >また、J言語(ってなに?)の剰余の符号に「|~ 」が >使われていたので少し調べようかと思います。 Jという言語は、APLという言語(これもご存知ではないと思いますが)の後継のようなものです。 APLが、ASCIIにないような記号をガンガン使う言語だったのに対して、 Jはそのような記号をASCIIの範囲で定義された名前にしたりして つかえるプラットフォームを広げようとしたものです #大雑把な話 APL(とJ)は数学的な演算にとても強くできていて、そのための演算子もたくさんあるということです。 よく、Perlのプログラムが記号がたくさんあってよくわからない なんて話がありますが、APLはその比ではありません(笑)
- sakusaker7
- ベストアンサー率62% (800/1280)
>コンピュータ言語で、上記例の剰余が8になるものはありません。 ご冗談を。 >perl -e "print -10 % 9" 8 >python -c "print -10 % 9" 8 >ruby -e "puts -10 % 9" 8 少なくともこれらの言語の作者は、色々と考えた上で これらの仕様を採用しています。 ruby のメーリングリストなら、日本語でのやり取りを 見つけることもできると思います。
- nda23
- ベストアンサー率54% (777/1415)
なるほど、そういうことですか。理系の私には考えつかない理論ですが、一理ありますね。 つまり、被除数≧除数×商を適用すると、-10<9×(-1)なので、商が-1は理屈に合わない。 それで、商を-2にすれば-10>9×(-2)となって、辻褄が合うという訳ですね。 これなら、-10-9×(-2)=-10-(-18)=8となります。 しかし、これは数学的ではないので、一般の除算命令では得られない答えです。 数学では0を中心として正は→、負は←のベクトルになっています。矢印の長さ(量)は 絶対値です。これに対し、上記の理論は-∞の方向からモノを見ています。 コンピュータ言語で、上記例の剰余が8になるものはありません。 ExcelのMODもセル関数の場合であって、VBAではやはり-1です。
- nda23
- ベストアンサー率54% (777/1415)
-10を9で割ったら、商は-1、剰余は-1じゃないんですか? 被除数=除数×商+剰余とするなら、-10 = 9 × (-1) + (-1) ですね。 どうしたら剰余が8になるんでしょう? 処理上の「特別ルール」だというなら自作するしかないでしょう。
補足
こんにちは。 12 さんすう 34 数学 5 Go! http://www3.ocn.ne.jp/~fukiyo/math-mok/qa.htm 「負の整数でわったあまり」 にもありますが、剰余の定義的には8でよいのかなと思います (思っているので質問しています)。 また、再掲ですが、 http://okwave.jp/qa1547226.html にあるように、Excelでは =MOD(-10,9) は8になります。 説明不足ですいません。
お礼
もうレスが付かないと思うのでクローズします。
補足
(先のNo.2の補足と、どちらで補足しようか少し悩みましたが、 おとなしくこちらの補足として紹介させていただくことにしました。) いくつかの言語に対して剰余のsignについての定義がありましたので、報告します。 http://en.wikipedia.org/wiki/Modulo_operation (私にとって)残念ながら、C#はDividend基準でした。 Luaおよび、MathematicaがDivisorなのは特筆です。 また、J言語(ってなに?)の剰余の符号に「|~ 」が 使われていたので少し調べようかと思います。 また、他の処理方法についての議論は、 http://forum.agilissoftware.co.uk/yaf_postst960_Using-Remainder-Operator-with-Negative-Divident.aspx にもあるように定義済みではなさそうです。 しかしながら、質問をクローズせずもう少し粘りたいと思います。