【Go笔记】浮点数

定点数和浮点数

  • 定点数用固定的大小表示整数部分和小数部分
  • 浮点数使用以2为底的科学计数法来表示和存储一个小数
  • 使用IEEE-754浮点数标准来存储小数

IEEE-754

  • 分为系数、底数与指数三个部分
  • 单精度(32位) - 符号1位、指数8位、小数23位、偏移量127
  • 双精度(64位) - 符号1位、指数11位、小数52位、偏移量1023
  • 使用以2为底的科学计数法,系数的整数部分一定是1,所以不储存
  • https://zhuanlan.zhihu.com/p/144697348

常规数和非常规数

  • 常规数 - 系数在1与2之间
  • 非常规数 - 系数小于1(指数小于下限了,单精度是-126,双精度是-1022)

NaN、±Inf

  • 1/0 - +Inf
  • -1/0 - -Inf
  • 0/0 - NaN
  • sNAN - 代表无效的操作
  • qNAN - 代表无效或异常的结果
  • 使用math.NaN()会生成一个NaN,对NaN作任何操作都是NaN
  • 当浮点数不等于它本身的时候,该浮点数是一个NaN(浮点数会被编译成UCOMISD或COMISD CPU指令,该指令会判断和处理异常情况)
  • 判断浮点数是否在有效范围内而判断是否为Inf,浮点数的最大最小值在math/const.go中有定义

浮点数精度

  • 精度指在d位下面进制转换过后不发生数据的变化
  • 浮点数精度不是固定的
  • 单精度的精度为68位,双精度在1517位,取决于所在范围
  • 加(减)浮点数时需要进行指数调整,可能会造成精度丢失,因此在执行混合运算时优先执行乘除法可以获取相对更高的精度

多精度浮点数与大数

  • 三种大数- big.Int, big.Float, big.Rat
  • big.Int采用了uint切片来存储大整数,可以认为是可以无限扩容的
  • big.Float也会损失精度,但可以通过调整prec的值来设定。prec越大,精度越高,运算速度也越慢,53的时候与float64相同,一般设置在数百位。
  • big.Float不一定存储超大整数,也可以存储超精确的数字
  • big.Rat用来进行分数的运算,但是分子分母都是big.Int

总结

浮点数的计算是非常基础而又非常具有挑战性的概念,需要在精度和计算性能之间做出取舍


【Go笔记】浮点数
https://study.0x535a.cn/go-note/go-float/
Author
Stephen Zeng
Posted on
August 9, 2025
Licensed under