• 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 等。

  • 相关阅读:
    leetcode 131. Palindrome Partitioning
    leetcode 526. Beautiful Arrangement
    poj 1852 Ants
    leetcode 1219. Path with Maximum Gold
    leetcode 66. Plus One
    leetcode 43. Multiply Strings
    pytorch中torch.narrow()函数
    pytorch中的torch.repeat()函数与numpy.tile()
    leetcode 1051. Height Checker
    leetcode 561. Array Partition I
  • 原文地址:https://www.cnblogs.com/niuben/p/14799021.html
Copyright © 2020-2023  润新知