溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

精度 Precision

發(fā)布時間:2020-07-01 17:52:33 來源:網(wǎng)絡(luò) 閱讀:216 作者:xmgdc 欄目:網(wǎng)絡(luò)安全

柏拉圖認(rèn)為,盡管世間萬物是不完美的,但存在一種永恒不變的形式,這個形式是完美的,而生命的意義就是讓這個世界盡可能的接近這個完美的形式。

       怎么理解這句話,和我們今天講的精度有什么關(guān)系。我們先舉一個例子,方便大家的理解。比如一個圓,對應(yīng)的數(shù)學(xué)形式為:

精度 Precision

       相信大家都不會否認(rèn)這個公式很優(yōu)雅,真的可以用完美無瑕來形容了?,F(xiàn)在畫出來,去其中的一段圓弧,你就意識到,要達(dá)到形式上的完美,步步維艱。

精度 Precision

       可見,在現(xiàn)實生活中不存在絕對的完美,總有更高的標(biāo)準(zhǔn),讓它變得完美。對應(yīng)到數(shù)字上,不完美就是精度的損失。當(dāng)然,這種損失是不可避免的,甚至是有益的,首先,它能降低成本,比如有損壓縮技術(shù)。其次,也有助于我們對事物的理解,比如地球是一個不規(guī)則球體,我們會認(rèn)為它是一個橢球,甚至?xí)M(jìn)一步簡化,認(rèn)為它是一個圓球。

       這就有了矛盾點,精度損失本來是一件壞事,怎么讓你三言兩語說成了一件好事。問題的癥結(jié)就在于我們對“形式”的理解深度,幫助我們更好的取舍,當(dāng)我們合理的評估這種精度的損失,達(dá)到剛剛好的平衡,也是一種退而求其次的完美。

       上一節(jié)我們講了球心坐標(biāo)和本地坐標(biāo)之間的轉(zhuǎn)換,這里也有一個精度的問題。假設(shè)赤道上相距1米的兩個點之間的delta,如果是球心坐標(biāo),我們用經(jīng)緯度來表示的話,地球半徑R為6378137米,兩點之間的經(jīng)度差為x,推算如下。而我們采用以其中一點為原點的本地坐標(biāo)時,兩點之間的差就是1米(b)。

精度 Precision

       兩個答案哪一個更準(zhǔn)確。分為三種情況,一部分人認(rèn)為答案a詳細(xì)準(zhǔn)確,比如我們在星戰(zhàn)類電影里面都會有一個畫面,艦長說,距離地球還有多遠(yuǎn),總會有一個人說出一串長長的的數(shù)字,讓人覺得準(zhǔn)確無誤;一部分人認(rèn)為答案b簡單準(zhǔn)確;還有一部分人認(rèn)為,兩者一樣準(zhǔn)確。確實,兩個答案都是通過數(shù)學(xué)公式推到出來的,理論上講可以做到一樣準(zhǔn)確,但從程序員的角度,浮點型是有精度損失,這是浮點型的存儲規(guī)范導(dǎo)致的,通常精度能夠滿足多數(shù)需求,但一旦滿足不了,損失是巨大的,而且難發(fā)現(xiàn)難解決。比如哥倫比亞號爆炸,就是因為double精度問題導(dǎo)致。

浮點型格式

精度 Precision

       這部分之前做過一個視頻,可以在百度搜索:[編程]1 C++類型簡析,會有詳細(xì)介紹。如果不想花時間,只需要記住,float可以有7位有效數(shù)字,而double可以有16位,選擇合適的浮點類型,當(dāng)你的精度需求超過這個范圍時,你就要小心了。

相機(jī)抖動

       如果精度達(dá)不到要求,怎么辦?不妨把原點換到一個相對近的位置,這樣就可以大大提高精度。這不就是坐標(biāo)轉(zhuǎn)換的意義嗎?

       通常,我們都會有一個基準(zhǔn)點,保證它是準(zhǔn)確的,周邊的物體都是相對該基準(zhǔn)點的位置,成為RTC,Relative to centre。但在Virtual Earth中,如果我們近地面瀏覽,RTC-rendering還是會出現(xiàn)瀏覽范圍超過float精度的情況,就會出現(xiàn)精度的丟失,也就是相機(jī)抖動。

       這里有兩個步驟,第一將RTC改為RTE(eye),以前以某一個事先約定的中心點為基準(zhǔn)點,在瀏覽中,總會出現(xiàn)偏離該點的情況,越遠(yuǎn)精度損失就越大,這時我們改為以相機(jī)位置為中心點有機(jī)會在介紹相關(guān)的推導(dǎo),模型試圖矩陣,法向量等相機(jī)矩陣推導(dǎo)后續(xù)會專門介紹。當(dāng)距離物體非常近時,采用RTE的坐標(biāo)轉(zhuǎn)換會更精確。

       同時,因為shader中僅支持float類型,這里,Cesium提供了一種編碼方式,用float-float模擬一個double,來確保精度問題,對應(yīng)EncodedCartesian3.encode方法。這樣,通過一個high的float和一個low的float,分別運(yùn)算,解決抖動的問題,也算是GPU之duoble運(yùn)算的一種思路吧。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI