3.2 浮點數
go具有兩種大小的浮點數float32和float64。其算術特性遵從ieee 754標準,所有新式cpu都支援該標準。
這兩個型別的值可從極細微到超巨集大。math包給出了浮點值的極限。常量math.maxfloat32是float32的最大值,大約為3.4e38,而math.maxfloat64則大約為1.8e308。相應地,最小的正浮點值大約為1.4e-45和4.9e-324。
十進位制下,float32的有效數字大約是6位,float64的有效數字大約是15位。絕大多數情況下,應優先選用float64,因為除非格外小心,否則float32的運算會迅速累積誤差。另外,float32能精確表示的正整數範圍有限:
在原始碼中,浮點數可寫成小數,如:
小數點前的數字可以省略(.707),後面的也可省去(1.)。非常小或非常大的數字最好使用科學記數法表示,此方法在數量級指數前寫字母e或e:
浮點值能方便地通過printf的謂詞%g輸出,該謂詞會自動保持足夠的精度,並選擇最簡潔的表示方式,但是對於資料表,%e(有指數)或%f(無指數)的形式可能更合適。這三個謂詞都能掌控輸出寬度和數值精度。
上面的**按8個字元的寬度輸出自然對數e的各個冪方,結果保留三位小數:
除了大量常見的數學函式之外,math包還有函式用於建立和判斷ieee 754標準定義的特殊值:正無窮大和負無窮大,它表示超出最大許可值的數及除以零的商;以及nan(not a number),它表示數學上無意義的運算結果(如0/0或sqrt(-1))。
math.isnan函式判斷其引數是否是非數值,math.nan函式則返回非數值(nan)。在數字運算中,我們傾向於將nan當作訊號值(sentinel value),但直接判斷具體的計算結果是否為nan可能導致潛在錯誤,因為與nan的比較總不成立(除了!=,它總是與==相反):
乙個函式的返回值是浮點型且它有可能出錯,那麼最好單獨報錯,如下:
下乙個程式以浮點繪圖運算為例。它根據傳入兩個引數的函式z=f(x,y),繪出三維的網線狀曲面,繪製過程中運用了可縮放向量圖形(scalable vector graphics,svg),繪製線條的一種標準xml格式。圖3-1是函式sin(r)/r的圖形輸出樣例,其中r為sqrt(x*x+y*y)。
圖3-1 函式sin(r)/r的圖形輸出樣例
注意,corner函式返回兩個值,構成網格單元其中一角的座標。
理解這段程式只需基本的幾何知識,但略過也無妨,因為本例旨在說明浮點運算。這段程式本質上是三套不同座標系的相互對映,見圖3-2。首先是個包含100×100個單元的二維網格,每個網格單元用整數座標(i, j)標記,從最遠處靠後的角落(0, 0)開始。我們從後向前繪製,因而後方的多邊形可能被前方的遮住。
圖3-2 三套不同座標系
第二個座標系內,網格由三維浮點數(x, y, z)決定,其中x和y由i和j的線性函式決定,經過座標轉換,原點處於**,並且座標系按照xyrange進行縮放。高度值z由曲面函式f(x, y)決定。
第三個座標系是二維成像繪圖平面(image canvas),原點在左上角。這個平面中點的座標記作(sx, sy)。我們用等角投影(isometric projection)將三維座標點(x, y, z)對映到二維繪圖平面上。若乙個點的x值越大,y值越小,則其在繪圖平面上看起來就越接近右方。而若乙個點的x值或y值越大,且z值越小,則其在繪圖平面上看起來就越接近下方。縱向(x)與橫向(y)的縮放係數是由30°角的正弦值和余弦值推導而得。z方向的縮放係數為0.4,是個隨意選定的引數值。
二維網格中的單元由main函式處理,它算出多邊形abcd在繪圖平面上四個頂點的座標,其中b對應(i, j),a、c、d則為其他三個頂點,然後再輸出一條svg指令將其繪出。
練習3.1:假如函式f返回乙個float64型的無窮大值,就會導致svg檔案含有無效的元素(儘管很多svg繪圖程式對此處理得當)。修改本程式以避免無效多邊形。
練習3.2:用math包的其他函式試驗視覺化效果。你能否生成各種曲面,分別呈雞蛋盒狀、雪坡狀或馬鞍狀?
練習3.3:按高度給每個多邊形上色,使得峰頂呈紅色(#ff0000),谷底呈藍色(#0000ff)。
練習3.4:仿照1.7節的示例lissajous的方法,構建乙個web伺服器,計算並生成曲面,同時將svg資料寫入客戶端。伺服器必須如下設定content-type報頭。
(在lissajous示例中,這一步並不強制要求,因為該伺服器使用標準的啟發式規則,根據響應內容最前面的512位元組來識別常見的格式(如png),並生成正確的http報頭。)允許客戶端通過http請求引數的形式指定各種值,如高度、寬度和顏色。
Go語言 浮點數型別
浮點數型別有兩個,即float32和float64。你可能已經想到,儲存這兩個型別的值的空間分別需要 4個位元組和 8個位元組。浮點數型別的值一般由整數部分 小數點 和小數部分組成。其中,整數部分和小數部分均由10進製表示法表示。不過還有另一種表示方法。那就是在其中加入指數部分。指數部分由 e 或 ...
程式設計雜談 浮點數
1 單精度浮點數用4位元組 32bit 表示浮點數,採用ieee754標準的計算機浮點數,在內部是用二進位制表示的 如 7.22用32位二進位制是表示不下的。所以就不精確了。2 mysql 中為了保證最大可能的可移植性,需要使用近似數值資料值儲存的 應使用float或double precision...
c語言整數轉浮點數 浮點數的秘密
我們在學習 c 語言時,通常認為浮點數和小數是等價的,並沒有嚴格區分它們的概念,這也並沒有影響到我們的學習,原因就是浮點數和小數是繫結在一起的,只有小數才使用浮點格式來儲存。其實,整數和小數可以都使用定點格式來儲存,也可以都使用浮點格式來儲存,但實際情況卻是,c 語言使用定點格式儲存整數,使用浮點格...