為了更清晰地解答這個問題,讓我們一起來展開一次思維的冒險:
假設(shè)我們所在的宇宙是一個巨大的計算機模擬,類似于《黑客帝國》中的設(shè)定;
這個超級計算機具有現(xiàn)實世界計算機類似的浮點數(shù)計算特性。
以此為出發(fā)點,如果我們要探討這個問題,那么一個有趣的探索路徑就展現(xiàn)在我們面前。
提及現(xiàn)實世界中的數(shù)值精度問題,我們?nèi)绾卧谶@樣一個模擬的《黑客帝國》世界中,感知到底層進行的數(shù)值計算,并進一步揭示其浮點數(shù)計算的性質(zhì)?
一個很好的思考方法是從我們?nèi)祟愖鳛樵煳镏髟谔摂M世界中的經(jīng)驗出發(fā)。
人類創(chuàng)造的最豐富的虛擬世界是什么?答案無疑是3D游戲,特別是3D的網(wǎng)絡(luò)多人在線角色扮演游戲(MMORPG)。
盡管人類現(xiàn)今打造的3D MMO游戲還遠遠不夠完善,與真正的《黑客帝國》相去甚遠,但它們在某些方面依然具有可比性。
設(shè)想我們在一個3D游戲里,如何才能了解游戲中的浮點數(shù)特性?
作為游戲玩家,我們自然無法觸及到游戲底層的計算細節(jié),但我們可以通過觀察游戲的視覺表現(xiàn)來推測浮點數(shù)計算的精度,例如通過觀察游戲引擎在處理模型細節(jié)時的表現(xiàn)來判斷。
3D游戲中的所有圖像渲染和3D計算都是以浮點數(shù)方式進行的,這些計算十分消耗資源,因此硬件廠商為滿足這一需求,專門設(shè)計了配備強大浮點數(shù)計算能力的GPU圖形處理器。然而,優(yōu)秀的程序員依舊會謹慎地優(yōu)化算法,以節(jié)省資源,避免卡頓現(xiàn)象。
在3D游戲中,優(yōu)化算法的一個重要領(lǐng)域是游戲空間的碰撞檢測。
簡單說來,就是檢測3D物體是否發(fā)生碰撞,舉個例子:
假設(shè)在游戲世界中有兩個小球,如何判斷它們是否發(fā)生碰撞?
利用初中數(shù)學(xué)知識,我們可以立即得知。
我們需要計算兩個球心之間的距離d與兩球半徑之和r1+r2,如果d小于或等于r1+r2,則說明發(fā)生了碰撞。
在3D空間中,可以利用距離公式計算距離d,看似簡單吧?
但若有三個物體,則需要兩兩比較,做3次計算;四個物體則需6次計算。
如果有100個物體,則計算次數(shù)就達到了5000次,游戲中的運動物體通常更多,形狀也更復(fù)雜,如墻壁、河流、樹木、人物、武器等,計算量會迅速增加。
這時,程序員需要運用各種技巧減少計算量,比如使用四叉樹等方法。
即使有了這些優(yōu)化,我們也無法進行無限精度的距離計算。當(dāng)兩個物體非常接近時,出于計算量的考慮,我們通常會限制浮點數(shù)的精度在一定范圍內(nèi)。
那么,這樣做會帶來什么后果?
如果碰撞檢測的精度不足,可能會出現(xiàn)視覺上的錯誤,被稱為“穿模”。
在3D游戲的靜態(tài)穿模BUG中,通常有兩個原因:
一是模型本身的設(shè)定問題,有些模型沒有加入碰撞檢測;
二是物體模型過小,導(dǎo)致碰撞檢測精度不足,如兩個角色站得太近,他們手中的武器可能會穿透對方身體。
這種近距離碰撞檢測的精度與游戲的浮點數(shù)特性直接相關(guān)。理論上,如果游戲能以最小的像素精度進行碰撞檢測,穿模現(xiàn)象是不會發(fā)生的。然而,由于成本問題,程序員通常會容忍游戲中出現(xiàn)這類視覺上的小錯誤,因為它們對玩家的游戲體驗影響不大。
但我們明白,這種現(xiàn)象的根本原因在于游戲引擎中碰撞算法的浮點數(shù)精度不足。
那么,在我們的現(xiàn)實世界里,是否存在類似的現(xiàn)象?
的確存在,在量子物理學(xué)中,就有一個相似的例子——“量子隧穿”。
量子隧穿是指微觀粒子在靠近一個勢壘時,在某些情況下會突然穿越勢壘的現(xiàn)象。在宏觀世界和經(jīng)典物理學(xué)中,這種事情是絕不可能發(fā)生的。但在微觀世界,當(dāng)尺度小到一定程度時,這種現(xiàn)象就會出現(xiàn)。經(jīng)典物理學(xué)無法解釋這一現(xiàn)象。
通常,一個小球不可能在不消耗能量或不破壞紙張的情況下穿過一張紙。但在量子世界中,粒子可以奇妙地穿越薄障礙。
對此,量子物理學(xué)的解釋是微觀粒子的位置和能量具有不確定性:粒子可能偶然從虛無中“借”到一些能量,用這些能量穿越障礙,從而實現(xiàn)穿墻。
這個現(xiàn)象聽上去非常玄幻,但卻是真實存在的,人們甚至利用它開發(fā)了許多高科技設(shè)備,如隧道掃描電子顯微鏡等。
此外,在微電子行業(yè)中,量子隧穿效應(yīng)限制了微電子芯片技術(shù)的進一步發(fā)展。當(dāng)芯片中的材料尺寸小到5納米以下時,隧穿效應(yīng)導(dǎo)致的漏電現(xiàn)象不可忽視,尺寸進一步縮小,漏電問題將更加嚴重,這已經(jīng)成為阻礙芯片技術(shù)進一步發(fā)展的主要障礙。
這與3D游戲中的穿模BUG非常相似:當(dāng)物體足夠小時,由于碰撞檢測算法的浮點數(shù)計算精度不足,細小物體在靠近障礙物時可能會穿透。
如果微觀世界也采用宏觀世界的碰撞算法,只要計算精度足夠,理論上就不會出現(xiàn)這種現(xiàn)象。
例如,如果采用普朗克尺度的計算精度,隧穿現(xiàn)象將不會出現(xiàn)。
而且,從實際發(fā)生的隧穿尺度來看,距離普朗克尺度還很遠,例如,1nm隧道的長度與普朗克長度相差26個數(shù)量級。
這顯示了我們宇宙的計算精度有多么低下。
為了證明這種思考方法的有效性,我們來看看量子隧穿中一個難以理解的現(xiàn)象:“超光速隧穿”。
根據(jù)量子理論的能量時間不確定性原理,量子穿越屏障的時間與屏障的能壘高度成反比,也就是說,屏障能量越高,穿越時間反而越短。如果屏障寬度足夠,那么足夠高的能壘會導(dǎo)致粒子以超光速穿越屏障,這與相對論中光速為宇宙最大速度的論斷相沖突。
理論物理學(xué)家對此爭論不休,并提出了各種新的假設(shè)來解釋這一現(xiàn)象,一面要捍衛(wèi)光速的至高地位,一面要解釋量子超光速現(xiàn)象。這些理論復(fù)雜而深奧,一般人不宜過多涉獵,以免大腦過載。
因此,我們還是回到現(xiàn)實,用我們的基礎(chǔ)知識去理解這一尖端科學(xué)問題吧。
讓我們一起構(gòu)想一個場景:
假設(shè)你是一名網(wǎng)絡(luò)賽車游戲的開發(fā)者,一天你內(nèi)心惴惴不安,因為某位玩家在你的游戲里創(chuàng)造了一項令人瞠目結(jié)舌的新紀錄,只用了零點幾秒就完成了一個賽段,這顯然是一個漏洞。你把運營和研發(fā)的負責(zé)人叫來,準(zhǔn)備討論此事。
“誰能告訴我,這玩家是如何做到這般速度的?”你作為領(lǐng)導(dǎo)者,自然有權(quán)尋求解釋。
運營的負責(zé)人連忙回答:“我檢查過了,這玩家是利用漏洞實現(xiàn)的。”
研發(fā)的負責(zé)人感到納悶:“這怎么可能?這樣的漏洞理論上是無法出現(xiàn)的。”
你接著問:“為何不可能?”
研發(fā)的負責(zé)人解釋:“因為在游戲中,車輛是有速度限制的,不管玩家怎么改裝,速度都不可能超過上限。”
“那么為什么速度不能超過上限呢?難道玩家沒有方法繞過這個限制嗎?”
“這不可能繞過,因為這個速度上限不是我們?yōu)榱吮苊饴┒炊O(shè)置的,而是游戲的基礎(chǔ)機制所決定的。在游戲中,賽車需要不斷地改變位置,而我們的游戲里物體位置改變的最小單位和最小時間單位都是固定的,因此理論上有一個速度上限。不管玩家采用什么手段,都不可能使賽車的速度超過這個極限。因為一旦速度過快,賽車在玩家眼中就會像瞬移一樣,這種移動方式在游戲的基礎(chǔ)算法上是無法實現(xiàn)的,我們的賽車只能在程序空間一格一格移動,不可能跳過任何一格。”
你聽后,覺得研發(fā)的負責(zé)人說得很有道理,于是帶著疑惑的眼神看著運營的負責(zé)人:“那么這個漏洞究竟是如何發(fā)生的?”
運營的負責(zé)人回答:“我不太明白其中的原理,但我可以重現(xiàn)給各位看。”
于是他進入游戲,開始比賽。他選擇了一個合適的地點,在賽道上快速地將車輛撞向路邊的懸崖,經(jīng)過幾次嘗試后,終于成功。車輛似乎一瞬間穿過了懸崖,從另一側(cè)被快速彈出,于是運營的負責(zé)人重現(xiàn)了玩家的超快速度。
辦公室里寂靜無聲,你和研發(fā)的負責(zé)人面面相覷。
研發(fā)的負責(zé)人是名校畢業(yè)生,他想了想,恍然大悟:“我明白了,沒想到會出現(xiàn)這種情況,這其實是因為賽道旁的懸崖太薄造成的。”
“懸崖薄怎么會導(dǎo)致這種漏洞?”你疑惑不解。
“是這樣的,”研發(fā)的負責(zé)人解釋,“我們的游戲碰撞檢測有一定的時間間隔,程序每隔一段時間檢測一次賽車和障礙物之間的距離。一旦距離小于某個值,就會發(fā)生碰撞,把車彈回。但當(dāng)車速達到一定程度,在兩次檢測之間的空隙,車的中心會穿過懸崖,因為模型已經(jīng)穿越出去,所以碰撞程序會把車移動到另一側(cè),從而造成賽車穿越了懸崖。這實際上是碰撞程序造成的,與正常移動不同,所以不受最小移動距離限制,因此超過了游戲的速度上限。”
“那么,碰撞算法有能力超越游戲的最高速度?”
“是的,”研發(fā)的負責(zé)人補充說,“游戲設(shè)定最高速度的根本原因是物體不能在空間中跳躍,否則會出現(xiàn)瞬移。為了防止兩個物體同時出現(xiàn)在同一個最小空間單位里,游戲要求物體連續(xù)運動。但碰撞算法的目的也是防止物體重疊,所以一旦出現(xiàn)重疊,碰撞程序會幾乎無延遲地將物體移開。雖然不是完全無時間,但遠低于游戲的最高速度。”
“哦,”你和運營的負責(zé)人終于明白了漏洞的深層原因,然后你問:“那么我們要如何避免玩家利用這個漏洞?”
研發(fā)的負責(zé)人回答:“很簡單,把懸崖加厚一些就可以了。”
運營的負責(zé)人有些質(zhì)疑:“這似乎沒有從根本上解決問題?”
研發(fā)的負責(zé)人聳聳肩:“這是最簡單的方法。如果你想從基礎(chǔ)算法上解決這個問題,我認為沒有必要,因為減少檢測間隔會大大增加系統(tǒng)的負擔(dān),需要購買更高性能、更昂貴的服務(wù)器。而且,大多數(shù)情況下,這對玩家的體驗并沒有太大改善。修改基礎(chǔ)算法有很大的風(fēng)險,可能會導(dǎo)致整個游戲崩潰。你認為呢,老板?”
“讓關(guān)卡策劃和美術(shù)把懸崖加厚,并檢查是否還有其他需要修改的賽道。”作為老板,你認為決策并不困難。
在會議結(jié)束前,你再次確認:“如果懸崖加厚,就不會再有這個漏洞,對嗎?”
研發(fā)的負責(zé)人謹慎地回答:“理論上,還是有幾率穿過。因為我們的檢測時間是隨機的,只要玩家嘗試的次數(shù)足夠多,再厚的阻擋也有可能被穿過,只是這個概率極小。”
“很好,就這樣吧。”作為老板,你明白不要為小概率事件煩惱的道理,這種問題,留給程序員們?nèi)ソ鉀Q就好。
盡管以上場景是虛構(gòu)的,但它展示了一個深刻的道理。從程序員和老板的對話中,我們看到一個令人驚訝的視角,看待宇宙的基本規(guī)律。我們可以不把光速看作是宇宙速度的上限,而是將其視為一種現(xiàn)象,那么一定有更深層次的規(guī)律導(dǎo)致了這種現(xiàn)象的出現(xiàn)。
我們可以用類似的方式看待物理學(xué)中的其他基礎(chǔ)常數(shù),它們可能不是不變的初始變量,而是某些基礎(chǔ)物理規(guī)律的結(jié)果。例如電子的電荷、質(zhì)子的質(zhì)量等。
從另一個角度看,如果我們認為常數(shù)之上還有更深層的規(guī)律,那么常數(shù)絕對不變的觀點就不那么牢不可破了。
光速可能被認為是基于普朗克長度和時間的基礎(chǔ)計算,但更深層的法則可能在于避免物質(zhì)在相同時空的重疊。在某些特殊情況下,例如解決量子尺度運算精度不足造成的重疊BUG,光速限制可能是可以被打破的。這體現(xiàn)了程序思維:下層邏輯必須服從上層邏輯的約束。
回到現(xiàn)實,我們可以將量子隧穿效應(yīng)看作是世界運算的精度BUG,這已經(jīng)推斷出我們的世界底層運算具有輸出精度范圍。
這說明我們的世界在底層運算中無法精確表示每個粒子的精確位置和狀態(tài),而是用大幅舍棄浮點精度后的結(jié)果來表示粒子狀態(tài),這些輸出結(jié)果互相制約,這就是物理學(xué)中的“測不準(zhǔn)原理”:你無法同時知道粒子的精確位置和速度。
我們只能認為這是世界底層算法的固有特性。世界的創(chuàng)造者在構(gòu)建底層算法時,可能為了節(jié)省資源,大幅降低了粒子運動算法的輸出精度,采用了一種微觀概率輸出的方式來表達宏觀世界。如果這是為了節(jié)省硬件資源,我必須贊嘆這是個漂亮而實用的算法。
這個節(jié)約資源的底層算法可能就是我們的世界能夠在現(xiàn)有主機上正常運行的原因,也是量子世界中各種奇怪實驗結(jié)果的根源,比如波粒二象性、延遲選擇實驗、光子全同性、粒子自旋、量子糾纏等。
如果我們能真正了解這個底層算法的本質(zhì),一定會對我們理解世界有巨大幫助。希望有一天,我們能揭示出造物主隱藏的真相。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.