関数電卓コラム

09/09/07 負数の実数乗

今回取り上げるのは関数電卓には必ず付いている累乗機能.yが正の実数のとき,xには任意の実数を代入可能だ.例えば「2.5の3.6乗」も定義可能だし,関数電卓にとっては造作もない計算である.

しかし,yが負数になったときには解がない.厳密に言えば「実数体の中には解がない」と言うべきか.-2の平方根は実数の中に見つからず「複素数」という数の体系を定義して初めて存在が可能になるように,負数の実数乗も複素数体の中に答がある.
※もちろん,xが整数の場合はyが負数も含む任意の実数で解が存在する.

とにかく,計算してみる

では,これを関数電卓にやらせるとどうなるだろうか.問題を「-2の1.5乗」としよう.操作キーはそれぞれ

「標準電卓」 [2] [+/-] [y^x] [1] [.][5] [=]
「数式通り」 [+/-] [2] [y^x] [1] [.][5] [=]
「Natural display」 [y^x] [+/-] [2] [→] [1] [.][5] [=]

となる.さて,結果はどうなるか.

「標準電卓」 エラー
「数式通り」(CASIO,Canon) -2.828427125
「数式通り」(SHARP) エラー
「Natural display」 -2.828427125

となった.数学的に正しいのは「標準電卓」とSHARPの「数式通り」のみで,CASIO,Canonの「数式通り」は式を-(2^1.5)と解釈して計算を行っている.符号のマイナスは数値に付属するもので,あらゆる演算の優先順位に勝るはずなのだが,どうしてだろうか.

一方,SHARPの「数式通り」はマイナスの数値([+/-] [2] )に関数を作用させると自動的に括弧が補われるので当然のごとくエラーとなる.

強制的に優先順位を入れ換えてやると,

「数式通り」(CASIO,Canon) [( ] [+/-] [2] [ )] [y^x] [1] [.][5] [=]
「Natural display」 [( ] [+/-] [2] [ )] [→] [1] [.][5] [=]

さすがに,今度は観念してどちらも「Math Error」が出る.

CASIO/Caonoの「数式通り」におけるマイナス符号の扱い

CASIO,Canonの関数電卓で,なぜ負数の実数乗を実行させると先に「実数乗」が評価されてしまうのか,それはこれら機種のマイナス符号の扱いが原因である.Canon F-715Sのマニュアル(p12)を例にとるが,符号(-)はlogやln,sin,cosなどと同じ「Bタイプ関数」と呼ばれるグループに属し,優先順位は累乗「」より低い.したがって「-2の1.5乗」は先に「2の1.5乗」が評価されそれに負号が付くためエラーにならないのだ.なぜ,符号(-)の優先順位が関数より下なのか知る由はないが,数学的には誤りなので今回はシャープの関数電卓を高く評価したい.

負数の実数乗ができる関数電卓

国産の関数電卓で負数の実数乗が正しく計算できるものは無いが,私の手持ちではHP 35sが唯一それが可能な関数電卓である.ただしやり方は少々トリッキーだ.普通に

[2] [+/-] [ENTER] [1] [.] [5] [x^y]

とやっても「Invalid 」になって答えが得られない.ここは,解が複素数の範囲になりうることをあらかじめ電卓に教えるため,1.5乗を「1.5+0i」と入力する必要がある.

[2] [+/-] [ENTER] [1] [.] [5] [i] [0] [x^y]

するとごらんの通り.

答えは「0.00000-2.82843i」(純虚数)となる.

HPの関数電卓はsinやlogなどの関数も引数に複素数が取れる優秀なものだが,一部の関数,例えばや√に負数を与えるとエラーとなる.確かに,実数も複素数に含まれるので,電卓のアルゴリズムを全て複素数で行うようにしてしまえばエラーは出ないかも知れない.どうしてこういう不便な仕様になっているのか,以下の理由と想像される.

関数電卓は全ての計算を有限桁の近似計算で行っている.全ての計算を複素数で行うと,本来実数体で閉じているはずの計算も,虚数成分にわずかな誤差が乗ってしまうのである.それを嫌って,引数に実数が与えられる限りにおいては,実数体で閉じない計算はエラーを返す仕様としているのではないだろうか.

例えば,数式処理ソフトMathematicaで(-2)^1.5を計算させてみよう.

ごらんの通り,純虚数になるべき計算結果に,実数成分の誤差が乗っている.天才ウルフラムでさえ,この問題に完全な解決策を与えていないことがお分かりだろう.

では,負数の実数乗とはどんな計算なのか

変数の範囲を複素数まで広げれば,上述のように負数の実数乗にも解があることがわかった.では,y<0のときはグラフ上でどんな軌跡を描くのだろうか.難しい理屈は省略して,答だけを示そう.

y<0のとき,yはと書ける.従ってとなる.こうすると,負数の実数乗とは「正数の実数乗」と「原点廻りの回転」の積で表せることがわかる.

解は複素数なので,これはxをパラメータとする複素平面[Re(z),Im(z)]上の曲線となる.|y|>1のとき,曲線はx=-∞で原点から出発し,だんだん大きくなる螺旋を描く.正確には,これはベルヌーイの螺旋」,または「対数螺旋」と呼ばれるものになる.うーん,なんだか今回はアカデミックだなあ.

0の0乗について

ところで,皆さん「0の0乗」は幾つかご存じだろうか.直感的には

  • どんな数でも0乗すれば1なので,0の0乗も1だろう
  • 0は何乗しても0なので,0の0乗も0だろう

のどちらかとなるが,実はこれは結構奥の深い問題なのだ.Wikipediaの当該記事を見ると,「標準的な教科書においては0の0乗は定義されない」とある.一方,TeXで有名なクヌース教授は「1と定義されるのが妥当だろう」とのこと.数学の深淵を垣間見たようで面白い話である.

プログラム言語,処理系がこれをどう扱うかは様々で,Wikipediaの記事によるとMS Windows付属の関数電卓は1を返すらしい.Googleの電卓機能も1を返すが,これは自分で確かめてみよう

逆に「エラー」とする派閥はMathematica,MS Excelなどが挙げられる(上記記事より).我々の興味は,「関数電卓はこの問題をどう処理するか?」だが,テストした全ての機種で例外なく0の0乗はエラーを返した.

ただ,エラーの出方には個性があって,日本の電卓は「演算エラー」だがTI 30XBは「DOMAIN Error」,HP 35sは「Invalid 」を返す.関数電卓に対する日米の姿勢の違いが分かるベンチマークである.