6÷2(1+2)の計算に思うこと ITの観点から
■はじめに
6÷2(1+2)でYoutubeを検索すると沢山でてきますね。
インフルエンサーの動画では、あいまいなことしか言っていないからだと思います。 ITの世界では、9 の一択が現実解です。
私も軽くYoutubeでコメントしましたが、たくさんのコメントに埋もれました。
算数的に解釈するとか数学的に解釈するとか色々解釈してますが、私の考え方は次のとおりです。
■6÷2(1+2) は多項式? 単項式?
明らかに単項式です。 この式を多項式と言う数学者はいないと思います。
※ちなみに変数が含まれていませんので分数式でもありません。
また、÷という演算記号を/ に置き換えると
6/2(1+2)
一つの項内でも、()があればそれを優先して計算する。 ですから
6/2・3
括弧の無い演算子は、数値の前の演算子とともに可換であるためには
この値は
6・3/2
と書いても良いはずです。 つまり /2 は ・(1/2) または ・0.5 の乗算として置き換えられるとも言えます。
入れ替えても、左から計算すれば、常に 9 となります。
どうしても、2(1+2) を一つの数値として解釈したいなら
6÷(2(1+2)) と書かないとそのように解釈されません。
つまり、6÷2(1+2)のデフォルトの解釈として、6÷(2(1+2)) とすることはできないという考え方です。
■ITの世界では、9の一択が現実解です。
プログラミングの世界では÷という演算子は使わず、精々 / に強制的に置き換えられます。 ちなみに電卓には÷と言うキーがありますが、/と作用はほぼ同じです。
例えば、ExcelやGoogle、計算知能と呼ばれる数式処理プログラムworlframでも、9になります。
不正な式を書くなと怒られるか、しれっと÷を / に置き換えて計算されます。
何故そうなっているのかというと、はっきりとした理由があります。
プログラミング言語には、デフォルトも含めて演算子の優先順位が厳密に定められていますので、私の知る限りに於いては9と言う答になります。 それは、ANSI規格やJIS規格で決まっているからです。
これらは、欧米のPEMDAS という子どもから習う演算規則に由来しています。 ですから、これで大騒ぎしているのは、日本特有でもあります。
■Excelでの実例
Excel では、以下のような流れになります。 もちろん÷をそのまま入力するとエラーになりますが、/の変更に同意しますか? で
「はい」と答えれば 9 になります。
「いいえ」として 1という答えにしたければ 6/(2(1+2)) と()をつけざるを得ません。
デフォルト以外の解釈をするように変更するには、現実解として大変面倒くさいことになります。
※Excelのバージョンによっては、2(1+2)の部分が「この計算式には問題があります。」と言うエラーになって、2 と(1+2)間の * が省略できないことがあります。
もちろん、2(1+2)を一つの数値して先に解釈させるには、(2*(1+2)) と書かねばなりません。 上記の画像は、PC版のOffice 365 のExcel で iPad のExcelでは、エラーになります。 また、÷ の演算子は確認されることなく、無条件に / に置き換えられました。
6÷2(1+2) → エラー
6÷2*(1+2) → 6/2*(1+2) に置き換えられ → 9
÷を/ に置き換えれば、Excelに限らず、他のALGOL系のプログラミング言語でも、上記の解釈となります。 詳しくは各言語の仕様書を参考にしてください。
÷は/ と同等でないと主張するなら、その違いの定義を明確にすべきです。
■計算知能WolframAlphaの場合
もう一つ簡単に確認できる例を示します。
ネットで手軽に使えるWolframAlpe計算知能で計算してみたところ
9
です。
■÷と/は違うという主張について
÷演算子の由来は、上下の二つの点が分母・分子を表しているところから来ているらしいのです。 つまり、分数の分母・分子を上下に隔てる横棒-とほぼ等価なのですが、大きく異なるのは、上下に書かずに横一列に式を書くことです。
イタリアなどでは÷は使わず、/ とか : (コロン)です。 12:4=3 ですね。
÷は/ と同等でないと主張するなら、その違いの定義を明確にすべきです。
■除算記号で÷を使うのは世界的にメジャーではない
国によっては、除算記号で÷ を使わず、/ や : を使うようです。
というか、むしろ、日本のように÷を使う国の方が少ないようです。 / か : が主流のようで、普段、自分達が使っている記号が、世界的にメジャーだと思わない方が良いでしょう。
■私個人としては、手書きでは認めないわけではない。
そもそも÷とか使わないし、分数を横一列に書かないのですが、筆算するときは面倒なので 6÷2(1+2) は 1 もあり得るかと思います。 あくまで筆算とのときの私的なローカル・ルールです。
でも、シビアなITの世界では、多くのデフォルトがそうではありません。
曖昧さを排除することにおいて、血道を上げている数学では、このような記法が用いられたとき、誤解があるような場合、何らかの定義があるものと考えた方が良いでしょう。 ここに於いても、一番手っ取り早いのは()を付けることです。 この問題を騒いだところで、定義を定めない以上答えはいくらでも変わります。 無意味です。
ドリルや参考書などでは、印刷や紙面の都合上、横書きにせざるを得ないこともあり、帰納法的に解法のパターンが定められていると思います。 ローカルルールで一部の教育現場であるかもしれません。 それに従わないと、ほぞを噛むのは生徒さんや学生さんです。 でも、グローバルスタンダードのことも知っておいた方が良いでしょう。
■補足 単位の場合の記法
単位を大事にする技術者なら、単位の記法に、÷などを使わず、/を使います。
それに、単位の記法は、/ を使うときは誤解がないよう、
$$
m・kg/(s^3・A)
$$
ぅのように()で囲みます。
また、時速100キロメートル(100 km/h)を、100 km÷h と書く人はいません。
※参考 「単位や学名等の記載方法について」JAB NL512 : 2019 第2版 : 2019年6月11日
https://www.jab.or.jp/files/items/common/File/NL5122019V2.pdf
■文字式の場合
ab÷ab の場合を考えて見ましょう。
■プログラミングとして
x = ab ÷ab と書いたとき
(x = ab ÷ab; でもいいですが)
私の知る限りのプログラミング言語では、÷という演算子が定義されていませんので、エラーになります。
精々、÷を / に置き換えた演算を警告付きでデフォルトで示されるかが関の山です。
もちろん、ab は a と bの積とは解釈してくれません。
(※1文字の変数名しか扱えない処理系ならエラーでしょうね。)
変数名 "ab" と解釈されます。
実行時に ab = 0 でない限り、x には 1 が代入されるでしょう。
最近のプログラミング言語では、コンパイラが賢いので、事前に計算してしまい定数1に置き換えられてしまいます。
■変数の場合は違う
ちなみに、6÷2(1+2) の質問とは若干違います。 何故ならこれらは変数ではなく定数だからです。
この場合も、不正な式を書くなと怒られるか、しれっと ÷を / に置き換えて、欧米のPEMDAS で、有名な計算知能とも言われる数式処理プログラム worlframでも、Excel等と同じデフォルトで 9 として扱われるだけです。
また、プログラミング言語には、デフォルトも含めて演算子の優先順位が厳密に定められていますので、私の知る限りに於いては9と言う答えで一択になります。 ANSI規格やJIS規格で決まっています。
■実装は統一されていない
しかし、すべてが守られている訳ではない、実装はまちまちです。
一部の電卓では、1となる結果も出るようですが、その電卓のマニュアルに演算規則が書かれてると思います。 それに従えば、1になるというだけで、多くの言語と単に異なっているだけで驚きもしません。
電卓は直接、レジスタに置数するので、プログラミング言語のANSI規格に揃えなければならないという縛りもないと思います。 そういう、実装だったのです。
しかし、名前を持つプログラミング言語としては無いかと思います。 現実では、こういった単純なものではなく、複雑な混合演算をすると同じ言語のコンパイラやインタプリタでも、メーカーやバージョンが違えば、演算結果が異なる実装があります。 ですから、プログラマは、できるだけ曖昧な解釈が出来ないように、プログラミングすることが要求されます。
括弧()を付けろと言うことですね。
まぁ、答えが分かっている定数の演算をコードに埋め込むこと自体、稚拙ですけどね。 計算の由来を示したければ、マクロにするかコメント等に書くべきです。
■ 演算子のオーバーロード
話は少し逸れますが…
そもそも、C++などは、演算子のオーバーロードが可能なので、*を/ に見せたり、+ を * に見せたりできます。 制限はありますがこれらはシンタックスシュガー(糖衣構文)と呼ばれ、非常に便利ですが、他人を欺くことも出来ますので、乱用することを厳に慎むべき機能です。
ベクトル・行列・テンソル・複素数・四元数・自らが設計した概念の数空間などの演算で、拡張するときに使うものです。
■数学として
普段の感覚では 1 ですね。 でも、ITの世界では、多くのデフォルトがそうではありません。
曖昧さを排除することにおいて、血道を上げている数学では、このような記法が用いられたとき、誤解があるような場合、何らかの定義があるものと考えた方が良いでしょう。 ここに於いても、一番手っ取り早いのは()を付けることです。 この問題を騒いだところで、定義を定めない以上答えはいくらでも変わります。 無意味です。
ドリルや参考書などでは、印刷や紙面の都合上、横書きにせざるを得ないこともあり、帰納法的に解法のパターンが定められていると思います。 それに従わないと、ほぞを噛むのは生徒さんや学生さんです。
■手書き・板書と比較
で、私見ですが...私は、かけ算の記号の省略とか、()のあるなしとかではなく、÷という演算子?の曖昧性が問題だと思っています。
÷演算子の由来は、上下の二つの点が分母・分子を表しているところから来ているらしいのです。
つまり、分母・分子を上下に隔てる横棒-とほぼ等価なのですが、大きく異なるのは、横一列に式を書くことです。
そういう意味では、/と同じ使い方をされますが、/ は÷よりバリエーションが多いのです。
活字の場合と手書きの場合で、若干感じが異なると思います。
手書きや板書などでは、ab,cd とかは一般の数学で変数a,b,c,d の積であるというコンセンサスは取れていると思います。
ほんの一例ですが、下の画像で示した式では、(3)など怪しいと思いませんか?
手書きや板書では、分母・分子を別々に計算して(5)のようなことをしますよね。 たまに、(5')のような場合もあると思います。
なにも横一列に書く必要は無いのですから。