コンピュータは数が扱えるか

http://d.hatena.ne.jp/nuc/20050726/p5
田崎先生のノートが(細かいところだけれども)要訂正と思ったので論じてみる。

もちろん、コンピューターのなかであつかわれる数もすべて有理数(のごく一部)だ。

という箇所であるが、何通りか解釈が出来るだろう。何通りか解釈が出来る時点で曖昧だから訂正するべきだろうが、ほうれん草の目利きののりで http://d.hatena.ne.jp/nuc/20050618/p4 あげてみる。

0. コンピュータは数が扱えないという考え方も出来る。なぜならば、ただ電圧の変化がおきているだけで、それは数自体ではないから。だとしたら、コンピュータで扱える数全体は空集合だからそれは有理数の一部で、命題は真。
だが、人が紙の上に8と書いた時に、"One fat lady" のような図形をSSSSSSSS0と解釈している(SSSSSSSS0も"八"自体ではないが)のだからその意味では人も数が扱えない。

1. コンピュータ全体の状態は{{0,1}^N|Nはコンピュータのサイズ}の部分集合と思えば、整数と対応付けられるから、まあ整数しか扱えない。
整数ならば有理数だから命題は真。

2. 機械語を想定していて、大抵の機械語として用意される"数"は、整数と浮動小数点型でそれは確かに有理数の一部だけれども、例えば half-adder というのは人がこれは adder だと解釈をしているわけで (A,B) \mapsto (A&&B, (A||B)&&!(A&&B)) (ugh! mimetex には mapsto が用意されていない。埋め込みもないのか。)の回路自体のどこが足し算かと聞かれれば、そこに解釈が入っている。その解釈と、「体 Q(\sqrt{2}) の元の一部を 128bits のビット列 (\text{double } a, \text{double } b) \dot{=} a + b \sqrt{2} で表現してFPUで演算を入れたもの」と解釈することに違いがあるかといわれれば、そこを区別する確固とした理由はないと思われる。そういう意味では、命題は偽。

3. また、機械語で直接表現される数だけを数とするならば、たしかに fortran や C は機械語で表現されるそのままの数を扱っているから、それらが整数型や浮動小数点型を扱えているのは確かだが、そうすると perlscheme は無限(メモリーの許す限り)桁数の整数を扱うのでこれらは数もどきを扱っていることになる。他に Haskell では遅延評価を利用して精度が(言語として)限界のない実数を扱える。だが、これらは数もどきなので、命題は真。ただ、perlscheme では数が扱えない?

4. あと上の議論は複素数の部分集合だけを数としてきたけれども、いくら Gelfand-Mazur の定理が実ノルム体ならば、C or R と同型と云っているにしても、あまり fair ではないかと。

5. もう一つ、コンピュータの原理的な限界と現在の実装とは区別されなくてはいけないと考える。

6. れ〜べんはいむ=すこ〜れむノ定理によると、可算モデルありそう(顔。

みたいなことを考えまして、まとめると

> コンピューターのなかであつかわれる数
多分読み手は「原理的に扱える」と読み取るだろう。所詮なんかのモデルなんだ考えると「扱える」が哲学になって楽しいが、さらっと読む人がいることを考えると非常に曖昧で嫌だなあと。

> すべて有理数(のごく一部)
言いたいことは分かるのだけれども、全称量化子が密かに制限された範囲を動いている気がする。

あと、もう一つ correct と fair の区別がある気がして、現在のCPUが literal に扱える数は、64bit以下の整数型と浮動小数点型で、それらは有理数の一部である、というのは correct だろうが、fair かどうかは疑問だ。それは、例えば人が紙の上で literal に扱える数式記号は500種類に満たない(数適当)や、連結成分が有限である図形しか書けない、というのが何か誤解させようとしていると感じるのと同じであり、整数型と浮動小数点型だけだが、それらを組み合わせて他の数を表現できるというところまで言って fair だろうと。もっともコンピュータの解説ノートではないのでどこまで書くかは難しいが。