爲了能回答清楚這個問題,我們先來開一個腦洞:
如果從這個角度來考慮,對於這個問題我可以提供一個有趣的思路。
既然已經提到了現實世界的數值精度問題,那麼我們身處在這個黑客帝國世界裏,怎樣才能感知到世界底層正在進行的數值計算過程,從而還進一步能瞭解到其浮點運算的特性呢?
其實,我們可以從我們自己構建過的虛擬世界的創造者的角度來同理思考這個問題。
人類構建的最多的虛擬世界是什麼呢?
答案是3D遊戲,尤其是3D的MMORPG(網絡多人角色扮演)類別的遊戲。
雖然人類現在創造的3DMMO遊戲還很簡陋,離真正的「黑客帝國」還差很遠,但是某些特性還是有可類比性的。
假如我們在一個3D遊戲中,要如何瞭解這個遊戲浮點方面的特性?
雖然身爲玩家,我們沒辦法瞭解遊戲底層的計算過程,但是我們可以觀察到與浮點計算有關的一些畫面表現,比如說遊戲引擎在處理模型細節方面的表現來分析運算精度方面是否有問題。
在3D遊戲中,所有的畫面渲染和三維計算都是用浮點方式進行計算的,這種計算非常消耗系統的資源,所以硬件廠商爲這種計算,專門設計了具有強大浮點計算能力的GPU芯片的顯卡來專司這方面的計算需求,但是好的程序員還是會非常謹慎地優化算法,力求節省計算資源,以免造成系統的卡頓。
在3D遊戲中,有一個很重要的優化算法的地方就是遊戲的空間碰撞問題。
說白了就是3D物體的碰撞檢測,簡單來說,就是判斷遊戲裏兩個物體有沒有碰撞,舉個簡單例子:
上面是遊戲世界中的兩個小球,如何判斷它們有沒有碰撞呢?
這用初中數學知識馬上就可以知道。
計算圓心之間的距離d和兩球半徑和r1+r2,如果d=r1+r就說明發生了碰撞。
三維座標系中,距離d可以用距離公式計算,超簡單是不?
但是如果有三個物體呢,那就麻煩一點,需要兩兩比較,做3次計算,四個物體自然做6次運算。
但是如果有100個物體呢,那我們就需要5000次的計算了,在遊戲中往往會有更多的運動物體需要計算,而且這些物體的形狀往往是非常不規則的,比如牆壁、河流、樹木、人物、武器等等,那麼這些計算量就馬上指數上升起來。
這時候,程序員就需要運用各種算法技巧來減少運算量,比如四叉樹:
當然,就算有了這些方法,我們也要不能無限精度地計算距離,當兩個物體捱得很近的時候,出於計算量的考慮,我們一般把浮點精度都控制在一定範圍內。
那麼控制了計算精度以後會發生什麼事情呢?
如果出現了碰撞檢測精度不足的情況,往往就會出現一定的顯示BUG,這種BUG就叫作「穿模」。
3D遊戲中的慢速運動下的靜態穿模BUG主要有兩種因素引起:
這個極近距離的碰撞檢測精度就和遊戲的浮點特性非常相關了,理論上如果遊戲裏碰撞精度能計算到最小的像素的話,是不會出現這種穿模現象的,但是這樣做的開銷太大了,所以一般程序員也就容忍遊戲出現一些這種顯示上的小BUG,反正對玩家遊戲體驗影響也不太大。
但是我們很清楚,這種現象出現的本質就是因爲遊戲引擎裏碰撞算法的浮點精度不足造成的。
那麼,在現實世界裏,我們能觀察到類似的現象嗎?
還真的能,在量子物理學裏就有一個非常類似的現象——「量子隧穿」。
所謂量子隧穿,就是微觀粒子在非常靠近一個屏障(高能位勢壘)的時候,某種情況下會憑空直接穿越屏障跑到對面去的現象。這種現象,在宏觀世界、經典物理學體系下是絕對不可能發生的,但是在微觀世界、在尺度小到一定程度的時候卻會出現。這用傳統的經典物理學是完全無法解釋的。
在正常認知裏,一個小球想要穿過哪怕是極薄的紙,也不可能既不付出任何能量,也不弄破這張紙。可是在量子世界裏,粒子就是這樣詭異地越過了足夠薄的障礙。
量子物理學對此的解釋也非常晦澀。
量子物理以微觀粒子的位置和能量具備不確定性來進行解釋:量子具有一些不確定的能量漲落,偶爾它們可以從虛無中憑空「借」到了一些外界能量,然後藉助這些能量就越過了牆壁,從而實現了憑空穿牆。
這聽起來是不是非常玄幻?
但是,這個現象的的確確真實存在,甚至人們已經利用該現象開發出了很多實用的高科技設備,比如隧道掃描電子顯微鏡等等。
而這個現象的副作用則是大大影響了我們對微觀世界的掌控。比如在微電子行業裏,也正是因爲存在量子的隧穿效應,才導致現在的微電子芯片技術發展到1nm時代就碰上了繼續縮小尺寸的物理學障礙。芯片裏阻隔電子的材料如果尺寸小到5nm以下,量子隧穿效應導致的漏電現象就不可忽視了,如果尺寸進一步減小,那麼漏電問題將更加嚴重,電子會隨機的穿越過薄的柵極,從而導致芯片的邏輯電路無法正常工作。
而這個問題已經成爲芯片技術繼續發展需要克服的最大障礙了。
這聽起來像不像3D遊戲裏的細小物體的穿模BUG,當物體小的一定程度的時候,因爲碰撞檢測算法的浮點計算精度不足,所以細小物體在靠近牆壁時候,偶爾就會穿透到牆壁或者物件裏面去一樣。
理論上,如果微觀世界採用和宏觀世界一樣的碰撞算法的話,只要計算精度足夠,是應該不會出現這種現象的。
比如說,計算精度達到普朗克尺度,那麼絕對就不可能出現隧穿現象了。
而且,從隧穿發生的尺度來看,其實距離普朗克尺度還非常遙遠,出現隧穿現象的尺度我們按1nm=1E-9m算,而普朗克尺寸大約是1.6E-35m,兩者竟然相差了26個數量級之多!
可見,我們這個宇宙的計算精度有多低!
最後,爲了證明我們這種離譜的理解方式有效,我們來看一個量子隧穿中非常難以理解的問題。
隧穿效應裏面最難以解釋的現象是:「超光速隧穿」。
根據量子理論中能量時間的不確定性原理,量子穿越屏障的時間和屏障的能壘高度是成反比的,也就是說,屏障能量越高,穿越時間反而越短,如果這個屏障的寬度足夠的話,那麼足夠高能的屏障就會導致粒子以穿越光速的速度穿過了屏障,這和相對論中指出的光速是宇宙最大速度就衝突了。
理論物理學家們就這個現象爭論不休,並且提出了各種各樣的新的假設和說法來解釋這個現象,試圖一方面要堅決捍衛光速是宇宙速度絕對上限的地位,另一方面又要能解釋出量子超光速穿牆的現象是咋回事。這些先進理論彎彎繞繞複雜無比,一般人建議不要去了解,以免出現頭腦過載的症狀。
所以我們這些凡人還是回到地面來,想想看怎麼用我們初中二年級的水平來理解這個最尖端的科學問題吧。
我們來虛擬一段場景對話:
雖然上面的場景對話是我虛擬出來的情節,但是大家應該明白這段對話指的是什麼意思。
從上面程序員和老闆的對話中,其實我們得到了一個非常驚人地看待宇宙基礎規律的視角,比如我們可以不把光速是當前時空速度上限當作是一種最底層的初始規律,而是把它視作一種現象,那麼這個宇宙必然還有更底層的規律導致了這種現象的出現。
除了光速,我們甚至可以用類似的角度來看待物理學中的各種基礎常數,尤其是那些有量綱的常數,它們很可能不是絕對不變的宇宙初始變量,而只是某些更底層的物理規律導致的一種結果。比如電子的電荷數值,或者質子的質量等等。
從另一方面來想,既然我們感覺常數之上還有更底層的規律,那麼常數絕對不變也不是那麼不可挑戰了。
就好像光速問題,雖然在底層上有普朗克長度和時間做爲計算基礎,但是更基礎的約束法則很可能來自宇宙要絕對避免不同物質在相同時空的重疊可能,那麼在某些特殊的情況下(比如爲解決量子尺度運算精度不足造成的重疊BUG進行的緊急操作),這個光速限制就有可能是會被打破的,這也體現了一種很容易理解的程序思維:下層邏輯必須服從上層邏輯的約束。
最後回到問題吧,我們既然可以把量子的隧穿效應想象成世界運算的精度BUG,那麼實際上就已經推算證明了我們這個世界底層的浮點運算是具有輸出精度範圍的。
這說明我們這個世界在底層運算中並不能以最小的尺度精確地表達每一個粒子在每一時刻的精確位置和狀態,而是用一種被大幅度捨棄浮點精度後的結果來大致表達粒子各種狀態而已,而且這些輸出結果互相制約,這個測量特性正是在物理學上經常被人提起的「測不準原理」:當你企圖得到粒子更精確的位置數值的時候,那麼你就無法得到粒子的精確運動數值(速度)。
我們只能認爲這就是我們世界底層算法造成的固有特性,我們世界的創造者(或者說程序員)在構造我們世界的底層算法的時候,可能出於節省資源的考慮,大幅度地縮減了粒子運動算法的輸出精度,採用了一種微觀概率輸出的方式來解決宏觀世界精確表達,如果這的確是出於節省硬件資源的目的的話,作爲一名程序員同行,我需要表達由衷的讚歎:漂亮而又實用的算法!
這個節約資源的底層算法想必是我們世界能正常運行在現有主機上的原因,當然也是造成量子世界裏各種詭異的實驗結果的原因所在,比如:波粒二象性問題、延遲選擇實驗、光子全同性問題、粒子自旋問題、量子糾纏效應等等。
我們如果能真正弄清這個底層算法的本質,想必對了解我們這個世界會有極大的幫助吧,希望有一天,我們能揭開造物主所隱藏起來的真相。
本篇作者:阿布大樹