zoukankan      html  css  js  c++  java
  • Golang 入门 : 浮点数

    浮点数介绍

    Go语言提供了两种精度的浮点数:float32float64。它们的算术规范由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 用于测试一个数是否是非数 NaNmath.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)。
    • 另外要注意,eE 不能出现在浮点数的十六进制文字表示中。
      一些合法的浮点数的十六进制文字表示例子(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..00e00x0p0 等。

  • 相关阅读:
    Python——pygame入门实例
    Python——基础函数2
    Python——面向对象的三特征
    201521123083《Java程序设计》第四周学习总结
    201521123083《Java程序设计》第二周学习总结
    201521123083 《Java程序设计》第6周学习总结
    《Java程序设计》第1周学习总结
    201521123083《Java程序设计》第5周学习总结
    《Java程序设计》第3周学习总结
    201521123083 《Java程序设计》第7周学习总结
  • 原文地址:https://www.cnblogs.com/niuben/p/14799021.html
Copyright © 2011-2022 走看看