hirax.net::Keywords::「計算順序」のブログ



2009-07-25[n年前へ]

エクセルの計算プロセスの詳細 

 Microsoft Excelにおける計算プロセスの詳細

エクセルにおける循環参照時の計算順序 

 表計算ソフトのエクセルを使えるようになりたいと考えた。そこで、(これまで近づかないようにしていた)エクセルを使ってみることにした。まずは、エクセルの計算順序について調べてみた。もう少し具体的に書くと、計算の順番が「セル配置」に依存するのはどのような場合かを調べてみた。

 まず、最初にわかったのは「循環参照がない場合」には、(各セルの)計算順序は「セル配置」に依存しないということである(エクセルの計算プロセスの詳細)。また、「手動計算」や「反復計算」を行うようなオプション設定にしていたとしても、循環参照さえなければ(各セルの)計算順序は「セル配置」に依存しなかった。

 その一方で、循環参照があると、(各セルの)計算順序は「セル配置」に依存するようになる。具体的には、左上から横1行を計算したあと、その下の1行を計算し、さらにその下の1行を計算する…という具合である。

 だから、「反復計算」を1回だけ「手動計算」で行うような設定にし、
B1に2
A1に=B2
C1も=B2
B2は=B1
B1にA1-C1
という風に入力し、F9を押して手動計算させると、次々と値が変わり、6回周期の動きを示す。しかもA1とC1はいつも同じ値だが、その差分をとっているはずのB1は、ゼロになる瞬間もあるが、2とか-2とかゼロでない値にもなる。

 これは、循環参照が行われている場合に、反復計算オプションを付けた際の「各セルの計算順序」が前述のようだからである。当たり前の話のようだが、少し面白い。

2012-01-30[n年前へ]

C++の「i++ と ++i の違い」とExcelの「i++ と ++i の違い」 

 ビール瓶を開けながら「プログラミング言語」の話題をしました。プログラミング…と言っても、思い切り(プログラミング言語的には)低レベルな話ばかりです。ここで言う「低レベル」というのは、ハードウェアに近いとかそういう意味の「低レベル」ではありません。

 たとえば、「C++で書くけど、ほぼFORTRANなんだよね〜」という「一体どんなC++だぁ?」というツッコミをしたくなるコード論であったり、「それって、必ず7文字のインデントを入れてからC++のコードを書くってことですか?」というこれまた低次元な「インデント論」だったりしたのです。

 そんな中、「(C++なら)とりあえず、a++とは書かずに、++aと書きますよね」という話になりました(参考:C++のi++ と ++i の違い)。そして、さらに、「(C++ではなくて)C言語のi++ と ++i の違い」みたいなことをMicrosoft Excelでも気にすることがあるか?という話題になりました。話題が脈絡無くサブルーチンに"GOTO"するのは、それは単にアルコール100%の酔っぱらいだから、です。

 「C言語のi++ と ++i の違い」みたいなことがMicrosoft Excelでもあるか?気にするか?というと、その答えはもちろん「YES」です。…なぜかといえば、たとえば、A1,B1,C1という3つのセルがあった時、それらの各セルに対して、
A1=B1
B1=B1+1
C1=B1
という式を設定する場合など、(自分自身のセルを参照する)循環参照になっているために、その際の計算順序は単純にZの法則にしたがって左→右・上→下の順番で行われるために、計算結果は
 A1,B1,C1=1,2,2
となるからです。A1とC1は、同じ式がセルに入力されていても、実は違う値(タイミング)のB1を参照するがために、違う値になるのです。…それは少しばかり「(C言語の)++iとi++の違い」に似ています。

 C++という言語名は「C++って、(++Cじゃないから)使う時は(前の値と同じというわけで)Cに過ぎないよね?」といった冗談をよく聞いたような気がします。それぞれの言語が抱える「(ちょっと意外にも感じる)++iとi++の違い」にはどんなものがあるのでしょうか?そしてまた、Microsoft Excel で++aとa++の違いを気にする人は、一体どのくらいいるものでしょうか?


参考:AWKの場合

2017-12-05[n年前へ]

Microsoft Excelで "=-1^2" が "-1"ではなくて"1"になる「理由」 

 Microsoft Excelで "=-1^2" が "-1"ではなくて"1"になるのが「なぜだろう?」というtweetを興味深く読み、そこから辿り着いた20年前のメーリングリスト記事が面白かったので、簡単なメモ書きをしてみます。メモ書きなので、面白い記事へのポインタと(その記事に対する)わずかな感想を書いただけの日記記事です。

 まず、この計算順にまつわる問題を考える時には、" Warning: Excel Performs Negation Before Exponentiation"のタイトルにもなっているように、Excelという一種のプログラミング環境上での、"negation"と"subtraction"という異なる2演算子の計算順序の違いを区別する必要があります。つまり、

=-A1^2
は"=(-A1)^2"と計算されるけれど、
=1-A1^2
は"=1-(A1^2)"と計算されるというように、前者の"negation"と後者の"subtraction"が異なる演算子として区別され・違う演算順序が適用されるという話です。

 次に、20世紀最後の年、つまり西暦2000年1月13日の20:18:46にDoctor Petersonがメールで書いている文面がとても参考になります。それは、"negation"のような単項演算子は”exponent”のような二項演算子に優先して演算されるものだったから、それをただ踏襲すると、こんな計算順序になるよね、というものです。「Lotus 1-2-3との互換性を重視した」わけではないけれど、プログラミング言語の過去経緯を踏まえて考える話だよね、というものです。

 そして何よりも、西暦2005年の12月16日にErikが書いているように、Windowsのメモ帳で "msgbox -2^2"と書いてから、そのファイルをtest.vbsという名前で保存して、もしもダブルクリックしたならば、(マイナス4ではなくて)"4"という答えが書かれたメッセージボックスを私たちは目にするよね。この例でもわかるように、エクセルの「ダメな話」として眺めるのではなくて、コンピューター科学の「興味深い話」として眺めるべき話じゃないか?というコメントが、とても参考になると思います。

So I think this isn't bad math on Excel's part, but good computer science.



■Powered by yagm.net