どうでもいい べき乗 の話

xyzzy を愛用しているので、電卓代わりに lisp をよく使います。例えば今回の Time Base Register (下位32bit) の 一巡する時間は

(float
 (/ (expt 2 32)
    (* 200 1000000)))

になります。とっても便利♪(そしてますます暗算が苦手になってゆく・・・)

ですが、せっかくSqueak が起動してるので、今日はこっちで計算しようと、2 pow: 32 とか 2 expt: 32 とかテキトーにそれっぽいのを打っても、そんなメッセージは無いといいます。えっと・・・なんだったっけ? とNumberクラスをシステムブラウザで覗いてみると、2 raisedTo: 32 とやるらしい。へ〜。#sqrt: とか #exp とかが ありがちな名前だったので べき乗もてっきりその手の名前かと思っていたのですが、 #raisedTo: と文章調だとはちょっと意外。でも、らしいのかも(笑)。


「そういえば『べき乗』って、言語によって結構ばらばらだなぁ」と、なんだか気になってしまったので、(仕事中にもかかわらず)手元の処理系でざっと実験してみました。結果はだいたい 4通りで、pow(2, 32) と expt(2, 32) と 2 ^ 32 と 2 ** 32 になりました。(Smalltalkは除くw)

C は演算子ではなくライブラリでべき乗を提供していて math.h の pow() 関数。Java とか C# とか JavaScript とかはそれに習う感じ。
Cでは ^演算子をXOR に使ってるので無理なのですが、もし C が ^ 演算子を使ってたら、これがデファクトスタンダードになっていたかな、と思います。

ちなみに べき乗が ^ 演算子なのは VB系で、さすがと言ったところ。Delphi もそうだったかな?と調べたら、どちらかと言えばC系な mathユニット power()関数。うーん、フルスペル万歳!

expt はLispHaskell、派閥というにはちょっと寂しい。電卓ではそれなりに見る気がしてたのですが、記憶違いだったか〜。

Perl Python Ryby は ** 演算子なのです。なんとなく「凄いかけ算」(笑)というイメージが直感的な気がします。これからの主流派になるのかしら。

猫的にどれが好きかといえば、やっぱり ** 演算子でしょうか。と、いうわけで my Squeak イメージにも早速追加。

Number >> #** aNumber 
	^ self raisedTo: aNumber
2 ** 32 "==>print it" 4294967296

半分冗談だったのですが、動いちゃうから恐ろしい。