【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/