「6÷2(1+2)」をプログラマーが検証してみた

プログラミング
スポンサーリンク
スポンサーリンク

「6÷2(1+2)」の答えは、「1」なのか「9」なのか? と言う議論があるが、プログラマーが検証してみた。

要件を確認する

プログラマーたるもの、要件/要求仕様を確認するのは常である。
「6÷2(1+2)」の答えは「1」なのか「9」なのか? と、なぜ2通り出てくるのだろうか?

問題は、「2(1+2)」の部分の解釈の違いで次の2通り出てくる。

  1. 「6÷2(1+2)」の「2(1+2)」を先に計算して、「6÷6=1」とする場合
  2. 「6÷2(1+2)」は「6÷2×(1+2)」であり括弧内が先なので、「6÷2×3=9」とする場合

どちらが正しいかは結論が出ていないとのことだが、プログラマー的に検証してみる。

視点を変えて見てみる

まず本題に入る前に、「」を検証してみる。

この式をプログラミング(コーディング)するとき、「x」や「a」は変数のまま変わらい。
べき乗はプログラミング言語により記述が異なるので、ここでは「a^2」とExcelの記述と同じとする。
また、「2a」などの「乗算の演算子×の省略」はできないので、「2×a」であり、また、プログラミング言語では「乗算×」は演算子として「*」を利用するので、「2*a」と記述する。
同じく「除算÷」もプログラミング言語では「/」と記述する。

プログラミング言語でも各演算子には優先順位があり「べき乗^」>「乗算*」=「除算/」>「等号(代入)=」の順となるのも数学と変わらない。 「*」と「/」は同じ優先順位なので、「左から演算する」のも数学と変わらない

以上からプログラミングすると以下のようになる(なってしまう)。

x=6*a^2/2*a

この式がどのようにコンピューターが解釈するのかを分数および約分を使って表すと次になる。

元の式「」を同様に分数および約分すると次になる。

上記のプログラミングの結果は「」であり、元の式の結果「」とは違うので、誤ったプログラミングをしていることがわかる。

なぜ、このような間違いが出てしまったのだろうか?
プログラミングした、x=6*a^2/2*a では、「2a」の「a」が分子に統合されているのに対し、元の式の「2a」の「a」は分母に行っているという違いがある。
では、どのようにプログラミングすればよいのだろうか?
元の式は結果を変えずに次のように書くことができる。

これをプログラミングすると次になる。

x=(6*a^2)/(2*a)

このように書けば、元の式の結果「」と同じになる。

最初のプログラミングでは、「2a」は「乗算の演算子×の省略」 したものとして次となった。

x=6*a^2/2*a

この条件は不十分であったことがわかる。
正しいプログラミングでは次となる。

x=(6*a^2)/(2*a)

このことから、「2a」は、「括弧と乗算の演算子×を省略」したものが正しいことがわかる。
括弧が付くことから分かるように、「2a」などの『省略された乗算の演算子「×」』は『省略されて無い括弧のつかない演算子「×」や「÷」』より優先順位が高いものであることがわかる。

「6÷2(1+2)」のプログラマーの解釈

本題の「6÷2(1+2)」の「2(1+2)」部分は 「括弧と乗算の演算子×を省略」 したものなので「6÷(2×(1+2))」と書き、結果として次になる。

プログラマー的には、このように解釈するのだが、いかがだろうか?

まとめ

プログラミングするときは、乗算、除算などの優先順位の同じ演算子でもできる限り括弧をつけて分かりやすく書きましょう!

括弧が多くなると1行が長くなり見づらくなる場合は、改行やインデントするなり、変数を用意して分割しましょう。
今時のプログラミング言語は、最適化で効率よく実行してくれる(効率の良いコード(命令)を生成する)。
また、30年ぐらい前のパソコンのCPUのクロック数が10MHzとか20MHzとかだった頃に比べて、今時のスマホてもは2GHz(=2000MHz,100~200倍)とかで動きます。
さらに、IPC(1クロック当たりの命令実行数)も10倍は言い過ぎかもしれないが、それぐらいになっているはずなので結果として、1000~2000倍とか速いはずなので、少々無駄(冗長)な書き方をしても、問題となるケースはほぼ無いでしょう。(大々的な無駄は問題です)
見やすいプログラミング(コーディング)を心掛けましょう。

コメント

タイトルとURLをコピーしました