make zh2tw

This commit is contained in:
chai2010
2015-12-21 12:52:25 +08:00
parent 14665b4d9c
commit d024df28e9
7 changed files with 131 additions and 131 deletions

View File

@@ -1,23 +1,23 @@
## 3.2. 浮點數
Go言提供了两种精度的浮点数, float32 和 float64. 它的算术规范由 IEEE754 国际标准定义, 该浮点数规范被所有代的CPU支持.
Go言提供了兩種精度的浮點數, float32 和 float64. 它的算術規范由 IEEE754 國際標準定義, 該浮點數規范被所有代的CPU支持.
这些数值类型的范可以很微小到很大. 浮点数的范围极限值可以在 matn 包找到. 常量 math.MaxFloat32 表示 float32 能表示的最大值, 大是 3.4e38, 对应的 math.MaxFloat64 常量大是 1.8e308. 它能表示的最小值近似分别是1.4e-45 和 4.9e-324.
這些數值類型的范可以很微小到很大. 浮點數的范圍極限值可以在 matn 包找到. 常量 math.MaxFloat32 表示 float32 能表示的最大值, 大是 3.4e38, 對應的 math.MaxFloat64 常量大是 1.8e308. 它能表示的最小值近似分别是1.4e-45 和 4.9e-324.
float32 型的浮点数可以提供大约6个十进制数的精度, 而 float64 可以提供 15个十进制数精度; 通常应该优先使用 float64 型, 因 float32 型的累计计算误差很容易散, 且 float32 能精度表示的正整数并不是很大:
float32 型的浮點數可以提供大約6個十進製數的精度, 而 float64 可以提供 15個十進製數精度; 通常應該優先使用 float64 型, 因 float32 型的纍計計算誤差很容易散, 且 float32 能精度表示的正整數併不是很大:
```Go
var f float32 = 16777216 // 1 << 24
fmt.Println(f == f+1) // "true"!
```
点数的字面值可以直接写小数部分, 想这样:
點數的字面值可以直接寫小數部分, 想這樣:
```Go
const e = 2.71828 // (approximately)
```
数点前面或面的字都可能被省略(例如 .707 或 1.). 很小或很大的最好用科学计数法书写, 通e或E指定指部分:
數點前面或面的字都可能被省略(例如 .707 或 1.). 很小或很大的最好用科學計數法書寫, 通e或E指定指部分:
```Go
const Avogadro = 6.02214129e23
@@ -25,7 +25,7 @@ const Planck = 6.62606957e-34
```
用 Printf 函的 %g 参数打印浮点数, 采用紧凑的表示形式打印, 提供足的精度, 但是对应表格的数据, 使用 %e (带指数) 或 %f 的形式打印可能更合. 所有的这三个打印形式都可以指定打印的度和控打印精度.
用 Printf 函的 %g 參數打印浮點數, 采用緊湊的表示形式打印, 提供足的精度, 但是對應表格的數據, 使用 %e (帶指數) 或 %f 的形式打印可能更合. 所有的這三個打印形式都可以指定打印的度和控打印精度.
```Go
for x := 0; x < 8; x++ {
@@ -33,7 +33,7 @@ for x := 0; x < 8; x++ {
}
```
上面代打印e的, 打印精度是小数点后三个小数精度和8字符度:
上面代打印e的, 打印精度是小數點後三個小數精度和8字符度:
```
x = 0 e^x = 1.000
@@ -46,21 +46,21 @@ x = 6 e^x = 403.429
x = 7 e^x = 1096.633
```
math 包中除了提供大量常用的数学函数外, 提供了IEEE754标准中特殊值的建和测试: 正无穷大和负无穷大, 分别用表示太大溢出的数字和除零的果; 有 NaN 非, 一般用表示效的除法操作果 0/0 或 Sqrt(-1).
math 包中除了提供大量常用的數學函數外, 提供了IEEE754標準中特殊值的建和測試: 正無窮大和負無窮大, 分别用表示太大溢齣的數字和除零的果; 有 NaN 非, 一般用表示效的除法操作果 0/0 或 Sqrt(-1).
```Go
var z float64
fmt.Println(z, -z, 1/z, -1/z, z/z) // "0 -0 +Inf -Inf NaN"
```
math.IsNaN 用于测试一个数是否是非 NaN, math.NaN 则返回非数对应的值. 然可以用 math.NaN 表示一非法的果, 但是测试一个结果是否是非 NaN 是充满风险, 因 NaN 和任何都是不相等的:
math.IsNaN 用於測試一個數是否是非 NaN, math.NaN 則返迴非數對應的值. 然可以用 math.NaN 表示一非法的果, 但是測試一個結果是否是非 NaN 是充滿風險, 因 NaN 和任何都是不相等的:
```Go
nan := math.NaN()
fmt.Println(nan == nan, nan < nan, nan > nan) // "false false false"
```
如果一个函数返回的浮点数结果可能失, 最好的做法是用单独的标志报告失, 像这样:
如果一個函數返迴的浮點數結果可能失, 最好的做法是用單獨的標誌報告失, 像這樣:
```Go
func compute() (value float64, ok bool) {
@@ -72,7 +72,7 @@ func compute() (value float64, ok bool) {
}
```
接下的程序演示了浮点计算图形. 它是带有两个参数的 z = f(x, y) 函的三形式, 使用了可放矢量形(SVG)格式输出, 一个用于矢量线绘制的XML标准. 3.1示了 sin(r)/r 函数的输出图形, 其中 r 是 sqrt(x*x+y*y).
接下的程序演示了浮點計算圖形. 它是帶有兩個參數的 z = f(x, y) 函的三形式, 使用了可放矢量形(SVG)格式輸齣, 一個用於矢量線繪製的XML標準. 3.1示了 sin(r)/r 函數的輸齣圖形, 其中 r 是 sqrt(x*x+y*y).
![](../images/ch3-01.png)
@@ -135,32 +135,32 @@ func f(x, y float64) float64 {
}
```
意的是 corner 返回了两个结果, 对应 corner 的坐标参数.
意的是 corner 返迴了兩個結果, 對應 corner 的坐標參數.
要解程序是如何工作的需要了解基本的何知, 但是我可以跳过几何原理, 因程序的重是演示浮点运算. 程序的本是三不同的坐标系中映射关系, 如3.2所示. 第一是 100x100 的二维网格, 对应整数整数坐标(i,j), 从远处的 (0, 0) 位置始. 我们从远处像前面绘制, 因此远处先绘制的多形有可能被前面后绘制的多形覆.
要解程序是如何工作的需要了解基本的何知, 但是我可以跳過幾何原理, 因程序的重是演示浮點運算. 程序的本是三不同的坐標繫中映射關繫, 如3.2所示. 第一是 100x100 的二維網格, 對應整數整數坐標(i,j), 從遠處的 (0, 0) 位置始. 我們從遠處像前面繪製, 因此遠處先繪製的多形有可能被前面後繪製的多形覆.
第二个坐标系是一个三维的网格浮点坐标(x,y,z), 其中x和y是i和j的线性函, 通平移转换位center的中心, 然用xyrange系数缩放. 高度z是函f(x,y)的值.
第二個坐標繫是一個三維的網格浮點坐標(x,y,z), 其中x和y是i和j的性函, 通平移轉換位center的中心, 然用xyrange繫數縮放. 高度z是函f(x,y)的值.
第三个坐标系是一个二维的画布, 起(0,0)在左上角. 布中的坐用(sx, sy)表示. 我使用等角投影将三维点
第三個坐標繫是一個二維的畵布, 起(0,0)在左上角. 布中的坐用(sx, sy)表示. 我使用等角投影將三維點
![](../images/ch3-02.png)
(x,y,z) 投影到二维的画布中. 布中从远处到右边的点对应较大的x值和大的y值. 并且画布中x和y值越大, 则对应的z值越小. x和y的垂直和水平缩放系数来自30度角的正弦和余弦值. z的缩放系数0.4, 是一任意选择的参数.
(x,y,z) 投影到二維的畵布中. 布中從遠處到右邊的點對應較大的x值和大的y值. 併且畵布中x和y值越大, 則對應的z值越小. x和y的垂直和水平縮放繫數來自30度角的正絃和餘絃值. z的縮放繫數0.4, 是一任意選擇的參數.
对于二维网格中的每一个单位, main函数计算单元的四个顶点在画布中对应多边形ABCD的顶点, 其中B对应(i,j)顶点位置, A, C, 和 D是相邻的顶点, 然后输出SVG的绘制指令.
對於二維網格中的每一個單位, main函數計算單元的四個頂點在畵布中對應多邊形ABCD的頂點, 其中B對應(i,j)頂點位置, A, C, 和 D是相鄰的頂點, 然後輸齣SVG的繪製指令.
**练习3.1:** 如果 f 函数返回的是无限制的 float64 值, 那SVG文件可能输出无效的<polygon>形元素(虽然许多SVG渲染器妥善处理这类问题). 改程序跳过无效的多形.
**練習3.1:** 如果 f 函數返迴的是無限製的 float64 值, 那SVG文件可能輸齣無效的<polygon>形元素(雖然許多SVG渲染器妥善處理這類問題). 改程序跳過無效的多形.
**练习3.2:** 试验math包中其他函的渲染形. 你是否能输出一个egg box, moguls, 或 a saddle 案?
**練習3.2:** 試驗math包中其他函的渲染形. 你是否能輸齣一個egg box, moguls, 或 a saddle 案?
**练习3.3:**根高度给每个多边形上色, 那样峰值部将是红色(#ff0000), 谷部将是蓝色(#0000ff).
**練習3.3:**根高度給每個多邊形上色, 那樣峯值部將是紅色(#ff0000), 谷部將是藍色(#0000ff).
**3.4:** 考1.7Lissajous例子的函, 造一web服器, 用于计算函数曲面然后返回SVG数据给客户端. 服器必须设置 Content-Type 部:
**3.4:** 考1.7Lissajous例子的函, 造一web服器, 用於計算函數麴面然後返迴SVG數據給客戶端. 服器必鬚設置 Content-Type 部:
```Go
w.Header().Set("Content-Type", "image/svg+xml")
```
(一步在Lissajous例子中不是必的, 因为服务器使用标准的PNG像格式, 可以根前面的512个字节自动输出对应的头部.) 允许客户端通HTTP请求参数设置高度, 度, 和色等参数.
(一步在Lissajous例子中不是必的, 因爲服務器使用標準的PNG像格式, 可以根前面的512個字節自動輸齣對應的頭部.) 允許客戶端通HTTP請求參數設置高度, 度, 和色等參數.