圖形方面的函數的參數為什麼多用浮點?

GPU為什麼要設計成浮點運算。浮點運算相較整數運算在處理圖形方面有什麼優勢?


計算機圖形學中,許多方程需要使用實數集。但計算機是無法表示連續實數集的,只能表示其離散的子集。

相對於浮點(floating point),另一種表示近似實數集的方式是定點(fixed point)。

這兩種方式各有優點。

由於浮點有廣泛使用的標準(IEEE 754),硬體有良好支持,使用上非常方便

但浮點也有其天生的弱點,其實在圖形編程中也會用到定點,特別是在存儲方面。例如紋理的格式多數為定點(0~255 常用作表示 0.0~1.0),頂點位置/法線/骨骼權重等也會使用定點表示方式。在中間計算過程,使用浮點會比較方便

回應一下 @金秉文 答案中的這個說法:

我覺得原因主要是:利用相同的存儲空間,浮點數所能表示的數值範圍更大,而更大的數值範圍就意味著更高的精度。

在同樣的存儲空間下,數值範圍和精度是反比關係。浮點數常給予這種錯覺,因為一個浮點數可以表示很小的值(如10^-38),但在表示較大的數值時,兩個相鄰的可表達數字間的差距會大得多。定點的方式是在整個範圍內,令可表示數字間有固定的間距。

  1. 描繪圖形細節。比如你有一個巨大的三維場景,在使用相同的存儲空間的前提下,如果用浮點數來存儲這個場景中的所有面片的頂點坐標,比起用整數,可以更為細緻地描繪這個場景。

實際上,表示巨大場景時,浮點數常會成為問題。例如場景採用 1m 為 1 單位的話,由於32位單精度浮點數只能表示6~7個十進位的精度,在距離原點 100km (10^5 m)處,精度只有大約1cm~10cm。如果直接渲染,會造成許多著色問題。用這個空間來做物理模擬的話問題更大。

再考慮用32位定點數,設 1m = 1000 單位,這樣可表示 &>4000 km 的範圍,而精度是固定1mm。


我不明白這個問題的意義。 當前的任何計算領域有不需要實數運算的么?(除了數論之外,如果有請不吝賜教) 浮點數的出現甚至比計算機本身的歷史還要早。實數運算的需求並非僅限於圖形學,而是廣泛的存在於幾乎所有計算領域。另外實數運算並非只有浮點運算一種形式,還有定點運算。當然,浮點運算的優點使得它被廣泛使用。我有一個問題反問提問者,你了解什麼是浮點運算和圖形學數學基礎么?看上去如果你了解兩者你就不會問這個問題了。如果你不了解,不妨先提出這兩個問題。


因為3D運算中存在大量的浮點運算。

浮點數有兩個特點:

1、數值範圍大。

2、有效數字長度固定(在特定進位下)。

這兩點對於3D運算中大量的運算是至關重要的。

考慮一根棍子,上面有三個點:

-----|----------------|----------------------------------------------|-----

如果用浮點數表示,那麼不論這根棍子怎麼伸長縮短,這三個點的相對距離比例可以得到很好的保持。

而用整型就是做不到的,,,,,,,,,

考慮一下3D運算中有多少這種棍子伸長縮短的計算?

@金秉文 的答案基本是錯的。浮點數的值域比整型大得多,但精度卻未必,因為需要保留額外的位數來表示浮點,所以精度(有效數字長度)反而是不如相同長度的整型。

而且他的答案中的各種例子都是整數和小數的區別,而不是整型和浮點型的區別。如果要表示小數也可以用整型來實現定點小數。而浮點數的關鍵性優勢在於值域大的同時確保有效數字長度是固定的,這對於3D運算非常方便。


浮點是實數在一定範圍內的離散化。

常用的笛卡爾坐標和仿射坐標系,都是實數序列啊。。。

https://zh.wikipedia.org/wiki/%E7%AC%9B%E5%8D%A1%E5%84%BF%E5%9D%90%E6%A0%87%E7%B3%BB


比如一個圖形要旋轉幾度,這個是要和三角函數計算的,如果用整數,如何處理這個問題,雖然原始圖象位置都是整數,但處理以後必然變成小數了。


整型計算為主,輔以浮點:

浮點計算

自己選


首先,謝邀。

理論上說,在所有使用浮點數的程序中,有兩個方法可以把浮點運算轉變成整數運算:

  1. 對於像頂點坐標這樣的數據,只要根據你所需要的計算精度,把所有浮點數都放大一定的倍數就可以把浮點數轉變成整數了;
  2. 對於像三角函數的返回值這樣的數據,放大其倍數會改變數學含義,不過仍然可以用分數,也就是兩個整數來替換浮點數,當然,從浮點數到分數的轉換也要考慮精度的問題。事實上,如果你願意,所有的浮點數都可以通過這種方法轉變成整數,但你不嫌麻煩我還嫌麻煩呢...所以,只要可以,我們都應該用第1種方法來把浮點數轉變成整數。

雖然有以上兩個方法可以把浮點運算轉變為整數運算。但即便如此,很多時候我們還是喜歡用浮點數,比如題主所說的圖形處理,我覺得原因主要是:利用相同的存儲空間,浮點數所能表示的數值範圍更大,而更大的數值範圍就意味著更高的精度。

精度在圖形處理的程序中有兩個方面的作用:

  1. 描繪圖形細節。比如你有一個巨大的三維場景,在使用相同的存儲空間的前提下,如果用浮點數來存儲這個場景中的所有面片的頂點坐標,比起用整數,可以更為細緻地描繪這個場景。
  2. 高精度計算。在圖形處理的一些演算法中,精度特別重要。比如在光線追蹤演算法中,光線每經過一次反射,計算誤差都可能會被放大;再比如在物理模擬的演算法中,由於需要用迭代的方法解微分方程,計算精度的要求就更高了,初始的一點點誤差在經過成千上萬次迭代之後就慘不忍睹了。所以,如果用整數運算把這些演算法實現出來了,那麼我們在使用這些演算法時,就要經常地對計算精度進行預估,並把數據進行合理地放大,而事實上,這種預估又很難,通常你能做的就是試探法,用maya做過場景繪製的同學都知道,花十幾個小時繪製一個三維場景是再正常不過的事情了,所以試探是很痛苦的。如果我們使用浮點數,由於其值域很大,通常都不需要考慮計算精度,使用起來非常方便,限制比整數小很多。


主要是三角函數,pie這些都是浮點,整形不好處理小數點,容易出錯。


那不用浮點你要怎麼算?你倒是告訴我你用整數能怎麼算?喵喵喵?


推薦閱讀:

如果讓你只推薦一本PHP書籍,你會推薦什麼?
數學不好該不該學計算機?
貪心演算法 啟發式演算法 近似演算法 區別?
c語言基礎差,數據結構學不會怎麼辦?
為什麼windows 可以直接支持skylake 的驅動?

TAG:中央處理器CPU | 計算機 | 信息技術IT | 運算 | 圖形處理器GPU | 函數 |