Fundamentals
evaluating a polynomial use nested multiplication (Horner's method)
c1+c2x+c3x2+c4x3+c5x4 =c1+x(c2+x(c3+x(c4+x(c5)))) 总共4次乘法,4次加法
Example
P(x)=4x5+7x8−3x11+2x14x5(4+x3(7+x3(−3+x3⋅2))) binary numbers
Decimal to binary
整数十进制转二进制,不断除2(到0停止),记下余数(0/1),倒写余数即2进制表示
小数部分十进制转二进制
Example1.求0.7的二进制表示 0.7×2=0.4+1 0.4×2=0.8+0 0.8×2=0.6+1 0.6×2=0.2+1 ⋯ (0.7)10=(0.1011⋯)2 Example2.求0.5的二进制表示 0.5×2=0.0+1 (0.5)10=(0.1)2 Floating Point Representation Of Real Numbers
浮点数的表示由 符号位(sign)、尾数(mantissa)、指数(exponent)三部分构成
分类:单精度(double precision),双精度(double precision),extended precision
各部分在不同精度浮点数下占用的bits数量
| precision | sign | exponent | mantissa |
| single | 1 | 8 | 23 |
| double | 1 | 11 | 52 |
| long double | 1 | 15 | 64 |
正规的 IEEE 浮点数长这样: ±1.bbb⋯b×2p
the leading bit must be 1 , 所以 9 在浮点数下的表示为 +1.001×23
machine epsilon: ϵmach 表示1 和 比1大的最小的浮点数之间的差
对于 双精度浮点数来说 , ϵmach=2−52
当表示一些非常长的小数(极端一点比如无限小数),mantissa 只有52位,装不下。所以要做舍入(rounding)
Rounding Rules
对于双精度浮点数,如果第53位(从左往右数)尾数是0,那就直接舍去,后边的直接截断。
如果第53位是1,就向上进位(给第52位 + 1 )
❗️特殊情况
如果第53位是1,后边的全是0,那么只有52位是1的时候才进位
把实数转化成IEEE浮点数的步骤
1.先用二进制表示
2.shift radix point to the right of leftmost 1, and compensate with the exponent
3.执行舍入
Example: 把9.4用双精度浮点数进行表示
(9.4)10=(1001.0110)=1.0010110×23
","分割方便阅读,未舍入之前长下边这样
+1.0010,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100超过尾数长度的部分,1100×23
舍入后
+1.0010,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1100,1101×23 Rounding Error
用 fl(x) 函数表示对x进行舍入后的值
fl(9.4)=9.4+(2−52∗23)−(.1100×2−53×23)=9.4+2−49−(.0110×2−51×23)=9.4+2−49−0.4×2−48=9.4+(1−0.8)×2−49=9.4+0.2×2−49 0.2×2−49 称为 rounding error
relative rounding error
∣x∣∣fl(x)−x∣≤21ϵmach Machine representation
bits layout : se1e2⋯e11b1b2⋯b52
符号位 0 表示 正 , 1表示负
指数的范围是 -1022到1023,但是二进制表示需要加一个偏移量1023(这里讨论双精度的情况下),加上偏移后的范围是1-2046. 指数部分 0 和 2047预留出来有特殊的用途
1的浮点数表示
1.0=1.0×20 (0+1023)10=011 1111 1111 (1.0)10=0011 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 特殊的指数值2047
2047是用来表示正负无穷的以及NaN的
表示正负无穷的时候尾数为全0,表示NaN的时候尾数随意(但得是非0)
∞的前12bits:0111 1111 1111
−∞的前12bits:1111 1111 1111
| machine number | example | hex format |
| +∞ | 1/0 | 7FF0000000000000 |
| −∞ | -1/0 | FFF0000000000000 |
| NaN | 0/0 | FFFxxxxxxxxxxxxx |
特殊的指数值 0
当指数是0的时候,不使用标准的浮点数表示方式,而是下面这种
±0.b1b2⋯b52×2−1022
2−52×2−1022=2−1074 是双精度浮点数能表示的最小的非零实数
其二进制表示为0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
比 ϵmach小的数是可以被表示的,虽然把这些数加到1上可能会没有任何作用。但是比2−1074更小的数字是没法被表示的
术语 underflow 表示运算结果太小了以至于不能被表示
Addition of floating point numbers
浮点数加法先根据对齐指数,然后尾数相加
=1.00...0×20+1.00...0×2−53=1. 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 ×20+0. 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1×20=1. 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1×20 从结果来看 , 1+2−53=1
任何比2−53更大的数加到1上,都将会大于1