病的な計算式?(『ソフト・エッジ』から)

4621053833中島 震・みわ よしこ『ソフト・エッジ: ソフトウェア開発の科学を求めて』(丸善出版, 2013)で、数値計算の面白い例が紹介されていました。(参考文献リストあり。索引なし。)

精度を向上させれば近似はよくなるというのが、自然な考え方でしょう。でも、この直観に当てはまらない「病的な計算式」の例があります。(p.132)

ということで、f(a, b)=(333.75-a**2)*b**6+a**2*(11*a**2*b**2-121*b**4-2)+5.5*b**8+a/(2*b)としたときの、f(77617, 33096)が紹介されています。単精度・倍精度・4倍精度の浮動小数点数での計算結果は約1.17で、正しい値(約-0.827)とは符号も違ってしまうとのことです。

これだけ読むと、精度を向上させても近似はよくならないと思うかもしれませんが、そんなことはないはずです。実際、精度をある程度高くすれば、正しく計算できます。

Pythonで試します(ideone.comでも動きます)。

from decimal import getcontext, Decimal
for n in range(16, 40):
  getcontext().prec = n
  a = Decimal("77617")
  b = Decimal("33096")
  print(n, (Decimal("333.75")-a**2)*b**6+a**2*(11*a**2*b**2-121*b**4-2)+Decimal("5.5")*b**8+a/(2*b))
16 1.000000000000000E+21
17 -4.0000000000000000E+20
18 -2.00000000000000000E+19
19 2000000000000000001
20 -99999999999999998.827
21 1.17260394005317863186
22 -999999999999998.8273961
23 100000000000001.17260394
24 10000000000001.1726039401
25 -3999999999998.827396059947
26 -99999999998.827396059946821
27 -19999999998.8273960599468214
28 -999999998.8273960599468213681
29 100000001.17260394005317863186
30 20000001.1726039400531786318588
31 -999998.8273960599468213681411651
32 300001.17260394005317863185883490
33 -9998.82739605994682136814116509548
34 -1998.827396059946821368141165095480
35 -198.82739605994682136814116509547982
36 21.1726039400531786318588349045201837
37 -0.827396059946821368141165095479816292
38 -0.8273960599468213681411650954798162920
39 -0.82739605994682136814116509547981629200

このようにPythonでは、getcontext().precの値が37以上なら適切な結果が得られます。

Rubyでも、ちょっと工夫すれば適切な結果が得られます(ideone.comで確認)

Windows付属の電卓では、何の工夫も要りません(WIndows 7で確認)。xyのショートカットキーが「Y」なので、「(333.75-77617Y2)*33096Y6+77617Y2*(11*77617Y2*33096Y2-121*33096Y4-2)+5.5*33096Y8+77617/(2*33096)=」と打てば、適切な結果が得られます。

Mac OS Xでも計算できます(10.8.4で確認。できるようになったのは比較的最近のことだと思いますが)。「計算機」で計算する方法はよくわかりませんが、Spotlightに「(333.75-77617^2)*33096^6+77617^2*(11*77617^2*33096^2-121*33096^4-2)+5.5*33096^8+77617/(2*33096)」と入力すれば、適切な結果が得られます。

Windowsの電卓は32桁までの入力にしか対応していないので、230928922463004537535516678003369の平方根を求めたいというようなときに不便ですが、Spotlightなら、sqrt(230928922463004537535516678003369)とすればとりあえず計算できます。

参考:電卓に求められるコト

本稿執筆時点のWolframAlphaでは、まったく違う結果が2つ返ってきて、片方はあっていました

Googleはだめでした

Googleの例は別として、精度を上げてもうまくいかないようにするには、もっと「病的」でなければなりません。

Googleはそのミッションを変更する時期に来ているのでは?

Googleの現在のミッションは、

世界中の情報をアクセス可能にし、人々の役に立てる

だとされています。しかし、この「世界中の情報」に「Googleの検索アルゴリズムの詳細」は含まれていません。「Googleで検索して出てこないものは存在していないに等しい」と言われる時代、Googleのアルゴリズムは世界の成り立ちを決めていると言ってもいい時代です。検索結果に「Googleのアルゴリズム」が含まれていないのなら、それは「世界中の情報」とは呼べないでしょう。近いうちに出てくるということもないでしょう。ミッションはインポッシブルなのです。

Googleも営利企業ですから、自社の優位を保つために秘密を持つのはかまいません。そのこと自体を邪悪だとも思いません。でも、実現する気のないミッションを掲げたままにしておくのはいけません。邪悪です。

ついでに言うと、「アルゴリズムの詳細を公開するとチートされる」という言い方もどうかと思います。単純に「自社の優位を保つため」でいいと思いますが、それでは足りないというなら、せめて「世界中から優秀な人材を集めているが、公開してもチートされないようなアルゴリズムはまだ思いついていない」くらいにしておいてほしいものです。アルゴリズムとデータが分離できないような方式とか、いろいろやりようはあると思うのでがんばってください。

4484111160こんなことを考えたのは、レヴィ『グーグル ネット覇者の真実』(阪急コミュニケーションズ, 2011)を読んだからです。そこで紹介されていたジャック・ロマノス(サイモン&シェスターの元CEO)の発言が、最近のGoogleをよく表していると思います。

「ひたすら理想を追求しているかのような態度を取り、世界の知を拡大することだけが目的なのだと言うくせに、次の瞬間には、自分たちの流儀を受け入れなければ、今回の話はなかったことにすると言う」(p.565)

こんなことを言われない古き良きGoogleが私は好きでした。

http://rickwebb.tumblr.com/post/14467269283/god-i-am-getting-so-fed-up-with-google-this-is

グーグル検索の変化–問われる検索結果の関連性

ブラジル・シンドローム(Google Earth)

Google Maps版の続き。

Google Earthプラグインは操作環境の制約が厳しいという問題があります。たとえば、iPadでは動きません。

Google Earth
フクシマの反対側は海

ピンをクリックすると、地球の反対側に移動するようになっています。地球が完全な球では無いことは考慮していませんが、WolframAlphaの結果とだいたい同じなので、とりあえずよしとしましょう。

Googleのサンプルがありましたか(私のFirefoxはいつも固まってしまうけど)。

追記:Mathematicaでやるのが簡単です。

ブラジル・シンドローム(Google Maps)

メルトダウンと聞いて「何をいまさら」と思うのは、体制にとって都合のいい反応なのでしょう。

それはともかく、「メルトダウンした燃料がどんどん下に落ちていって、ついには地球の反対側つまりブラジルを汚染する」という話があって、ブラジルの人たちが逃げ惑っているそうです(嘘)。

地球儀を使えば、フクシマの反対側が陸地ではないことはわかるのですが、Google Mapsで確認しておきましょう。ブラジルでパニックや風評被害があってもいけませんし(WolframAlphaで確認する方法を先日紹介しました)。

Google Maps
フクシマの反対側は海

地球が完全な球では無いことは考慮していませんが、WolframAlphaの結果とだいたい同じなので、とりあえずよしとしましょう。

お約束ですが、Google Mapsを使ってオリジナルのウェブページをつくる方法は、拙著『Webアプリケーション構築入門』で紹介しています。

Mathematicaでやるのが一番簡単と思いつつ、Google Earthで確認する方法を後で書きます。(追記:書きました。

Twitter上のさまざまな言語のつぶやきをひとつずつ翻訳するユーザーサイドスクリプト

このスクリプトが利用しているGoogle Translate APIは廃止されることが決まっています。ですから、このスクリプトの代わりにBingを使ってTwitter上のさまざまな言語のつぶやきをひとつずつ翻訳するユーザーサイドスクリプトを利用することを検討してください。

Twitterは言葉の通じる相手とのコミュニケーションツールとして使うのが一般的ですが、大量の情報が集まっているわけですから、何か他のことにも活用してみたいと思うわけです。

何らかのキーワードを指定して、それを含んだつぶやきを検索してみる、なんていうことは、試したことのある人も多いでしょう。例として、「mathematica」というキーワードで検索した結果を挙げてみます。英語やスペイン語、中国語、ポルトガル語などがあるようです。よくわかりませんが。

「mathematica」というキーワードで検索した結果

日本語と英語はともかくとして、他の言語はよくわからないので、とりあえず、機械翻訳にかけてみたいところです。精度はともかく、使い勝手は向上している機械翻訳ですが、Twitter上で使うには、少し工夫が必要です。というのも、Twitterにはさまざまな言語のつぶやきがあるので、まとめて翻訳するわけにはいかないからです。

Google Chromeという親切なブラウザは、ユーザが設定した言語以外で書かれたページを、読みやすいように翻訳してくれます。しかし、元の言語を一つに決めなければならないので、Twitterでは失敗します。下の例では、英語以外のつぶやきは翻訳できていません。

Google Chromeの翻訳結果

ですから、Twitterのつぶやきは、ひとつずつ翻訳しなければならないのです。そのためのユーザーサイドスクリプトTwitter Translatorを書きました。

FirefoxとChrome 13で操作を確認しています。Chrome 12では動作しません。

インストール方法

  1. (Firefoxの場合)Greasemonkeyをインストールする
  2. Twitter Translatorをインストールする

つぶやきをひとつずつ翻訳した結果

翻訳先の言語は、ブラウザの言語設定で決まります。ふつうにFirefoxを使っている人は、特に何か設定する必要はないでしょう。言語設定を変更したい場合は、Google を使ったなんちゃって地域化で紹介したQuick Locale Switcherを使うといいでしょう。

一度にあまりたくさん翻訳させるとGoogleからIPではじかれるようです。残念ですが、タイムラインが忙しい人は使えないでしょう。

お約束ですが、こういう話を基本から学びたいという方には、拙著『Webアプリケーション構築入門 実践!Webページ制作からマッシュアップまで 』(森北出版, 2011)がおすすめです。