“This is a sphere getting exponentially angrier as time passes.”

Marcin Wichary

这是一个随着时间推移指数级变得愤怒的球体

原文由 Marcin Wichary 发布,订阅该博客

学习计算机科学时,你迟早会领教浮点数那种奇特的魅力。浮点数能让你存储极大或极小的数值,但为此要付出奇怪的代价。数字本身依然是精度有限的普通数字,只不过多了一个浮点——另一个用来表示要在后面或前面补多少个零的数字。

实际效果是,当数值达到几百万时,精度就只有几千;当数值达到几十亿时,就只能以百万为单位计数,以此类推。这其实很符合直觉,就像亿万富翁不会在意口袋里的零钱。(打开浮点数可视化工具看看,你会发现输入 9000004、9000005、9000006 都没问题,但再多加一个零,90000004 就会被向下舍入为 90000000,而 90000005 则会向上舍入为 90000008。数值越大,精度越低。)

这在电子游戏或图形软件中会带来奇怪的影响:物体离你所在宇宙的原点——也就是 X 和 Y 均为 0 的位置——越远,就越要担心它的内部精度。

在现实世界中这不是问题。你可以把一枚极其精细的手表螺丝送到太阳系之外再带回来,它依然完好无损。但切换到数字世界,假设地球就是坐标 0:0——向哥白尼道个歉——你离得越远,浮点就越往左移,终有一刻,小数点另一侧的精度会被耗尽;一个能表示数十亿公里的数值,已经粗糙到根本无法容纳毫米级的细节。

这是个非常有趣的问题,这段短视频就很直观地把它展示了出来。把一个内部精度固定的物体越移越远时,就会出现这样的情况:

当然也有绕开这个问题的办法——你可以提升精度、引入“浮动偏移”、围绕两个浮点设置双精度中心,或是做其他各种处理——但每种方案都要付出代价。所以有时候,最简单的办法反而是最好的:别让数值变得太大。

这也正是 Adobe Illustrator、Figma,以及我敢打赌至少还有几款号称提供无限画布的工具,会在你偏离中心太远时把你拦住的原因。用画布的话来说,精度就像大气层,越往外越稀薄。超过某个临界点,我们无法保证你的结构完整性还能维持,所以干脆不让你过去。

比如在 Figma 中,到了某个位置,画布就不再跟随你的滚动指令了:

第一个不可见的 X 坐标值是 131,072,毫不意外,它正是那些让人一看就觉得非常非常眼熟的数字之一。

这个数值看似已经很大,但如果考虑到演示文稿中的一张幻灯片就是 1920×1080,它就远没有最初看起来那么“无限”了。这也在一定程度上解释了为什么 Figma Slides 会在 20 张幻灯片后就手动为你换行:

本文章由 muse-spark-1.2-contributor 进行翻译

评论