浮点数介绍
Go语言提供了两种精度的浮点数:float32
和 float64
。它们的算术规范由IEEE754浮点数国际标准定义,该浮点数规范被所有现代的CPU支持。
这些浮点数类型的范围可以从很微小到很巨大。浮点数的范围极限值可以在 math
包找到,常量 math.MaxFloat32
表示 float32
能表示的最大数值;对应的 math.MaxFloat64
表示 float64
能表示的最大数值。
单精度 浮点类型 | 取值范围 | |
---|---|---|
float32 | 负数时 | -3.402823E38 到 -1.401298E-45 |
float32 | 正数时 | 1.401298E-45 到 3.402823E38 |
双精度 浮点类型 | 取值范围 |
---|---|
float64 | -1.79E+308 到 +1.79E+308 |
1.79E-308
是 1.79 乘以 10的负308次方。 1.79E+308
是 1.79 乘以 10的308次方。
math
包中除了提供大量常用的数学函数外,还提供了IEEE754浮点数标准中定义的特殊值的创建和测试:正无穷大和负无穷大,分别用于表示太大溢出的数字和除零的结果;还有 NaN
非数,一般用于表示无效的除法操作结果0/0或Sqrt(-1).
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和任何数都是不相等的。
在浮点数中,NaN、正无穷大和负无穷大都不是唯一 的,每个都有非常多种的 bit
模式表示:
nan := math.NaN()
fmt.Println(nan == nan, nan < nan, nan > nan) // "false false false"
如果一个函数返回的浮点数结果可能失败,最好的做法是用单独的标志报告失败,像这样:
func compute() (value float64, ok bool) {
// ...
if failed {
return 0, false
}
return result, true
}
一个 float32
类型的浮点数可以提供大约 6 个十进制数的精度,而 float64
则可以提供约 15 个十进制数的精度;通常应该优先使用 float64
类型,因为 float32
类型的累计计算误差很容易扩散,并且 float32
能精确表示的正整数并不是很大。
单精度双精度两者区别
在内存中占有的字节数不同
单精度浮点数在机内占4个字节。
双精度浮点数在机内占8个字节。
有效数字位数不同
单精度浮点数 有效数字7位。
双精度浮点数 有效数字16位。
使用情况区别
一般用来表示美元和分的时候用单精度类型。
超出人类经验的数字函数,例如 sin() cos() tan() sqrt() 都使用双精度值。
浮点数类型值的字面量形式
一个浮点数的完整字面量形式包含一个十进制整数部分、一个小数点、一个十进制小数部分和一个整数指数部分。常常地,某些部分可以根据情况省略掉。
1.23
01.23 // == 1.23
.23
1.
// 一个e或者E随后的数值是指数值(底数为10)。
// 指数值必须为一个可以带符号的十进制整数字面量。
1.23e2 // == 123.0
123E2 // == 12300.0
123.E+2 // == 12300.0
1e-1 // == 0.1
.1e0 // == 0.1
0010e-2 // == 0.1
0e+5 // == 0.0
从Go 1.13开始,Go也支持另一种浮点数字面量形式(权称为十六进制浮点数文字表示)。 在一个十六进制浮点数文字表示中,
和整数的十六进制文字表示一样,浮点数的十六进制文字表示也必须使用 0x
或者 0X
开头。
和整数的十六进制文字表示不同的是,字母 p
或者 P
可以出现在浮点数的十六进制文字表示中,其后跟随着一个幂指数(底数为2)。
另外要注意,e
和 E
不能出现在浮点数的十六进制文字表示中。
一些合法的浮点数的十六进制文字表示例子(yPn
表示 y
乘以 2^n
的意思,而 yP-n
表示y
除以 2^n
的意思):
0x1p-2 // == 0.25
0x2.p10 // == 2048.0
0x1.Fp+0 // == 1.9375
0X.8p-0 // == 0.5
0X1FFFP-16 // == 0.1249847412109375
而下面这几个均是不合法的浮点数的十六进制文字表示。
0x.p1 // 整数部分表示必须包含至少一个数字
1p-2 // p指数形式只能出现在浮点数的十六进制文字表示中
0x1.5e-2 // e和E不能出现在浮点数的十六进制文字表示中
浮点类型的零值的标准字面量形式为 0.0
。 当然其它很多形式也是合法的,比如0.
、.0
、0e0
和 0x0p0
等。