これは時間とともに指数関数的にキレていく球体です
原文は Marcin Wichary により に公開されました。 このブログを購読する
コンピュータサイエンスを学んでいると、いつか必ず浮動小数点数という peculiar な存在に、その奇妙な栄光とともに向き合うことになる。浮動小数点数を使えば、とてつもなく巨大な値や、とてつもなく微小な値を扱えるようになるが、その代償として奇妙な制約がついてくる。数値自体の桁数はあくまで限られたままなのだが、そこにもう一つの数が寄り添っている——小数点をどこに置くか、前後にゼロを何個置くかを示す数だ。
要するに、数値が数百万になれば精度は数千単位になり、数十億になれば数百万単位でしか数えられなくなる、といった具合だ。これは直感的にも理解できる。億万長者が小銭を気にしないのと同じことだ。(浮動小数点ビジュアライザを開いてみればわかる。9000004や9000005、9000006は問題なく入力できるが、もう一桁増やして90000004を入れると90000000に切り捨てられ、90000005は90000008に切り上げられる。数が大きくなるほど精度はさらに落ちていくのだ。)
これがビデオゲームやグラフィックソフトでは奇妙な現象を引き起こす。宇宙の原点、すなわちXとYが0の場所から何かを遠ざければ遠ざけるほど、その内部的な精度が問題になってくるのだ。
現実世界ではこんな問題は起きない。どれほど精巧な腕時計の小さなネジでも、太陽系の彼方まで飛ばして連れ戻しても何の問題もない。だがデジタルの世界に置き換えて、地球を0:0だとしよう——コペルニクスには申し訳ないが——そうすると、遠くへ行けば行くほど浮動小数点は左へずれていき、やがて反対側の数値の精度が尽きてしまう。数十億キロメートルを表現できる値では、ミリメートルを捉えるには粗すぎるのだ。
これは実に興味深い問題で、こちらの短い動画で見事に可視化されている。一定の内部精度を持ったオブジェクトをどんどん遠くへ動かすと何が起こるか、というのがこれだ。

もちろん回避策はある。精度自体を上げたり、「フローティングオフセット」を導入したり、2つの浮動小数点を中心に2つの高精度領域を持たせたり、他にもいろいろな手はある——ただ、どれもコストがかかる。だからこそ、ときには最もシンプルな解決策が最善になる。すなわち、数をあまり大きくさせないことだ。
だからこそAdobe IllustratorやFigma、そしてきっと他にも無限キャンバスを謳ういくつかのツールが、中心からあまりに遠くへ行きすぎると実際にストップをかけるのだ。精度は大気のようなものだ、とキャンバスは言う。遠ざかるほど薄くなっていく。ある一点を超えれば構造の完全性は保証できない、だからそこから先へは行かせない、というわけだ。
こちらがFigmaの例だ。ある地点から、キャンバスがスクロール操作に追従しなくなる。
最初に見えなくなるX座標の値は131,072で、これがおなじみの数字の一つであることは、まったく驚くことではない。
一見すると十分すぎるほど大きな値に思えるが、スライドデッキの1枚が1920×1080であることを考えると、最初に思うほど「無限」ではないことがわかる。だからこそ——これも理由の一つだが——Figma Slidesでは20枚ごとに手動で折り返すようになっているのだ。
記事をランダムに読む
コメント
ログインしてコメントする