IEEE 754

https://en.wikipedia.org/wiki/IEEE_754

计算机如何存储浮点数?

二进制的科学计数法

符号位 + 指数位 + 底数位
float 一共 32 位 = 1 + 8 + 23
double 一共 64 位 = 1 + 11 + 52
long double 一共 80 位 = 1 + 15 + 1(整数部分) + 63

(这个描述不完全准确,因为无法存储0,而且0与最小整数之间的间隔过大)

整数范围问题

哪些整数可以被 double 精确表示?
253x253-2^{53} \leq x \leq 2^{53}

最小不能被 double 精确表示的正整数是什么?
253+12^{53} + 1

哪些整数可以被 long double 精确表示?
264x264-2^{64} \leq x \leq 2^{64}

最小不能被 long double 精确表示的正整数是什么?
264+12^{64} + 1

为什么 double 可以精确表示 2的次幂
2的次幂在二进制下只有一个1,用二进制的科学计数法表示出来是精确的

负数次幂也可以精确表示

小数转二进制

每次乘以2,取整数部分

精度问题

哪些数字可以被 double 精确表示? 0.1 0.2 0.5 0.75

只有在二进制下是有限小数的,才有可能被 double 精确表示

0.1 + 0.2
0.7 + 0.2 + 0.1
1.6 + 1.3 + 0.1

0.1 * 0.1
pow(0.1, 2)

1. / 100
0.01
1e-2
pow(10, -2)

舍入

四舍六入五成双

0.5 不一定进位,会舍入使得个位变为偶数

负0

sqrt / cbrt

直接用会有精度问题,绝对安全的方法:二分

cbrt 精度问题
https://atcoder.jp/contests/abc250/tasks/abc250_d

  1. IEEE 754
    1. 整数范围问题
    2. 小数转二进制
    3. 精度问题
    4. 舍入
      1. 四舍六入五成双
    5. 负0
    6. sqrt / cbrt