数学や論述が苦手なのは日本人だけとは限らない

そりゃそーだ。

Python 公式ドキュメントの和訳してると結構あんのよね、原文がオカシなことを言ってることが。

これがもうヘンチクリン(太字はワタシ):

Modern systems usually provide floating-point support that conforms to a standard called IEEE 754. C’s :c:type:`double` type is usually implemented as a 64-bit IEEE 754 number, which uses 52 bits of space for the mantissa. This means that numbers can only be specified to 52 bits of precision. If you’re trying to represent numbers whose expansion repeats endlessly, the expansion is cut off after 52 bits. Unfortunately, most software needs to produce output in base 10, and common fractions in base 10 are often repeating decimals in binary. For example, 1.1 decimal is binary “1.0001100110011 …“; .1 = 1/16 + 1/32 + 1/256 plus an infinite number of additional terms. IEEE 754 has to chop off that infinitely repeated decimal after 52 digits, so the representation is slightly inaccurate.

これは「なぜ (浮動小数点数があるのに) Decimal が必要なのか」のなかの一文で、つまりこのあと「ほーら、Decimal ならこんなにいーんだぜ」という論述が始まる。

けどこの文章、「why の答えになってない」(あまり)。いっしょけんめい仮数部の表現 \(\sum{a_k \frac{1}{2^k}}\) を説明し、循環小数になることを説明し、切捨てを説明するのはいいのだが、「をぃをぃ、 \(\sum{a_k \frac{1}{10^k}}\) だろうとおんなじだぜ?」など、各々単独ではちっとも論拠として成立はしない。ここ、やるなら IEEE 754 のシカケはシカケとして説明するのはいいけど「それはそれ」として、「選択できない精度 52 ビットに制限されている」とシンプルに言うことだけが「根拠」として成立するだけなのね、本来。

それと「common fractions in base 10」がやはり例のごとく意味不明。「常分数」と「10進数」とは何の関係もない直交した概念。常分数とは単に分母と分子が整数であることを指すのではないのか。さらに「1/3」が循環小数になることを忘れてやしないか。

これに続く一文も、ワタシにはちょっと「それは論述としては弱い」と思えてならない:

The inaccuracy isn’t always visible when you print the number because the FP-to- decimal-string conversion is provided by the C library, and most C libraries try to produce sensible output. Even if it’s not displayed, however, the inaccuracy is still there and subsequent operations can magnify the error.

先にも書いた通り。「52 ビットという精度が足りてるのか足りてないのか」だけの話でしょう。誤差がたまる、かどうかは要求精度次第。要求精度を遥かに超える誤差について議論したって仕方ないわけです。だからここでも「52 ビットという選べない精度」だけが問題なわけ。誤差がたまるのは「真の無限精度」が実現しない限り起こるんだからさ。(いわゆる「イタチごっこ」。)

つまりなんだか難しい説明を頑張ってしようとしてるけど、「Decimal は任意精度、浮動小数点数は固定精度」てだけのことなんよ。IEEE 754 の仕組みを知ることもときに大事ではあるけれどもね。特にバイナリデータを読み解く必要がある場合なんかにね(とりわけエンディアン違いの)。












2015-12-16 08:30 追記
イキオイでちょっと御幣を招くこと言っちゃってるんで補足しときます。

当然ながら「2 進数での級数近似では起こって 10 進数では起こらない」ことは本質です。なので IEEE 754 説明をしてこの解説をするのは無論正しい。アタシが問題にしたのはそこではなくて、「10 進数でも起こること」サイドの説明がゴッソリ抜け落ちているために、あたかも「10進だけバンザイ!」に読めてしまうし、多分著者自身がそう誤解してたんだろう、ということです。底が 2 で起こって 10 で起こらないこと、どちらでも起こること、の両方あります。1/3 なんかが「どっちでも起こる」例だね。1.1 がおっさる通りで 2 でしか起こらない。

もう一つが「誤差の伝播」の話ね。

誤差の話は「その数値一個」だけで検討してはダメです。例えば一億人の総資産を厳密に1円単位で計算するとした場合、全ての個人の 1000 円未満を切り捨てた場合の誤差は最大で「999円 x 1億 = 999 億円」です。これはもちろん(厳密にというなら)全然無視できるもんではない、よね。つまり集団の母数も考慮に含めなければいけない。(そして結果として興味が「1000兆円単位」ということなら、相変わらず無視できるわけよ。)

非常に当たり前のことなんだけど、こうやって順を追って考える癖がついてない人が多いから、結構「困ったちゃん」が増殖することになるのよね。