乘法运算
范围:
对于无符号型:
0
≤
x
∗
y
≤
(
2
w
−
1
)
2
=
2
2
w
−
2
w
+
1
+
1
0\le x*y\le (2^w-1)^2=2^{2w}-2^{w+1}+1
0≤x∗y≤(2w−1)2=22w−2w+1+1,最高位能到2w位(
2
2
w
2^{2w}
22w会排到2w+1位,但减去的
2
w
+
1
−
1
≥
1
2^{w+1}-1\ge 1
2w+1−1≥1,所以最多能排到2w位)
对于二补数的最小乘积:
x
∗
y
≥
(
−
2
w
−
1
)
∗
(
2
w
−
1
−
1
)
=
−
2
2
w
−
2
+
2
w
−
1
x*y\ge(-2^{w-1})*(2^{w-1}-1)=-2^{2w-2}+2^{w-1}
x∗y≥(−2w−1)∗(2w−1−1)=−22w−2+2w−1,最高位能到2w-1位(
−
2
2
w
−
2
-2^{2w-2}
−22w−2会排到2w-1位,加上符号位后排到2w位,而加上
2
w
−
1
2^{w-1}
2w−1后,最多排到2w-1位)
对于二补数的最大乘积:
x
∗
y
≤
(
−
2
w
−
1
)
2
=
2
2
w
−
2
x*y\le (-2^{w-1})^2=2^{2w-2}
x∗y≤(−2w−1)2=22w−2,最高位能到2w位,但只有x和y都取最小值时才会进位到这一位(原理同上)
需要延长字节才能保证计算结果的正确,这一点可以在"arbitrary precision"(高精度算法)包中得以实现
无符号型整数相乘
在C语言中,无符号型整数乘法运算(记作
U
M
u
l
t
w
(
u
,
v
)
\mathrm{UMult}_w(u,v)
UMultw(u,v))只保留原有的w位bits,高位的w位会被截断,即:
U
M
u
l
t
w
(
u
,
v
)
=
u
⋅
v
m
o
d
2
w
\mathrm{UMult}_w(u,v)=u\cdot v \mod 2^w
UMultw(u,v)=u⋅vmod2w
有符号型整数相乘
与无符号型相似,也是截断高位的w位,留下剩下的w位,记作 T M u l t w ( u , v ) \mathrm{TMult}_w(u,v) TMultw(u,v)
移位
左移位:乘法
u<< k的结果为
u
∗
2
k
u*2^k
u∗2k(无符号型和二补数都一样)
移位后截去最高k位:
U
M
u
l
t
w
(
u
,
2
k
)
\mathrm{UMult}_w(u,2^k)
UMultw(u,2k)和
T
M
u
l
t
w
(
u
,
2
k
)
\mathrm{TMult}_w(u,2^k)
TMultw(u,2k)
右移位:除法
对于无符号型,使用逻辑移位时,u>>k的结果为 ⌊ u / 2 k ⌋ \lfloor u/2^k\rfloor ⌊u/2k⌋
对于二补数,使用算术移位时,u>>k的结果为
⌊
u
/
2
k
⌋
\lfloor u/2^k\rfloor
⌊u/2k⌋
对于负数而言,需要
⌈
u
/
2
k
⌉
\lceil u/2^k \rceil
⌈u/2k⌉的结果(向0取整),因此可以使用
⌊
(
x
+
2
k
−
1
)
/
2
k
⌋
\lfloor (x+2^k-1)/2^k \rfloor
⌊(x+2k−1)/2k⌋进行计算,即:(x+(1<<k)-1)>>k
浮点数
如何表示
整数的最低位 b 0 b_0 b0右侧 b − 1 , b − 2 , … , b − j b_{-1},\ b_{-2},\ \dots,\ b_{-j} b−1, b−2, …, b−j,权重分别为 2 − 1 , 2 − 2 , … 2^{-1},\ 2^{-2},\ \dots 2−1, 2−2, …,因此,浮点数可以表示为: ∑ k = − j i b k × 2 k \sum\limits_{k=-j}^i b_k\times 2^k k=−j∑ibk×2k
浮点数的位置表示形式为:
b
m
b
m
−
1
⋯
b
1
b
0
.
b
−
1
b
−
2
⋯
b
−
n
+
1
b
−
n
b_m b_{m-1}\cdots b_1 b_0.b_{-1}b_{-2}\cdots b_{-n+1}b_{-n}
bmbm−1⋯b1b0.b−1b−2⋯b−n+1b−n
只能精确表示 x × 2 y x\times 2^y x×2y形式的数,对于 1 5 \frac{1}{5} 51之类的数只能近似表示
IEEE浮点数标准
使用位置表示来描述浮点数时,难以描述非常大的数字,因此,使用 x × 2 y x\times 2^y x×2y的形式来表示。
IEEE确立了浮点型标准,使用3部分(参数)来表示: V = ( − 1 ) s × M × 2 E V=(-1)^s\times M\times 2^E V=(−1)s×M×2E。其中,s用于决定正负,M表示[0, 1- ϵ \epsilon ϵ]或[1, 2- ϵ \epsilon ϵ]之间的值( ϵ \epsilon ϵ表示小量),E表示指数。
精度选项
单精度,由32-bits组成:s:1-bit;exp:8-bits;frac:23-bits;
双精度,由64-bits组成:s:1-bit;exp:11-bits;frac:52-bits;
其中,exp与E不同,frac与M不同,都有一定的转换关系
两种精度的图示如图1所示:
根据exp值的不同,可以将这样的表示分为三类:规格化值、未规格化值、特殊值
规格化值(normalized)
此时, e x p ≠ 000...0 exp\neq 000...0 exp=000...0,且 e x p ≠ 111...1 exp\neq111...1 exp=111...1
E=exp-Bias
其中,Bias=
2
k
−
1
−
1
2^{k-1}-1
2k−1−1,k为指数部分所占的bits数
对于单精度而言,
B
i
a
s
=
2
8
−
1
−
1
=
127
Bias=2^{8-1}-1=127
Bias=28−1−1=127,
e
x
p
=
1
∼
254
exp=1\sim 254
exp=1∼254,则
E
=
e
x
p
−
B
i
a
s
=
−
126...127
E=exp-Bias=-126...127
E=exp−Bias=−126...127
对于双精度而言,
B
i
a
s
=
2
11
−
1
−
1
=
1023
Bias=2^{11-1}-1=1023
Bias=211−1−1=1023,
e
x
p
=
1
∼
2046
exp=1\sim 2046
exp=1∼2046,则
E
=
e
x
p
−
B
i
a
s
=
−
1022...1023
E=exp-Bias=-1022...1023
E=exp−Bias=−1022...1023
M=1.xxx…x
2
_2
2
其中,xxx…x表示frac区域的值
当frac=000…0时,M取最小值1.0
当frac=111…1时,M趋近于最大值2.0,即M=
2.0
−
ϵ
2.0-\epsilon
2.0−ϵ
使用biases的原因:需要进行比较操作,比较指数。如果全部移到正数,就很容易进行比较(使用一个与门即可比较)
举例:对于浮点数F=15213.0:
15213.0
10
_{10}
10=11101101101101
2
_2
2=1.1101101101101
2
×
2
13
_2\times 2^{13}
2×213
M=1.11101101101101
2
_2
2,frac=111011011011010000000000
2
_2
2(后面的位数用0补齐)
E=13,Bias=127,exp=140=1001100
2
_2
2
则最后F的表示形式如图2所示:
非规格化值(denormalized)
此时,exp=000…0
E=1-Bias(与规格化值的E=exp-Bias不同)
M=0.xxx…x 2 _2 2
当exp=000…0,frac=000…0时,表示的是0
当exp=000…0,frac
≠
\neq
= 000…0时,表示的是接近0的数
特殊值(special)
此时,exp=111…1
当exp=111…1,frac=000…0时,表示的是无穷大(包括正溢出和负溢出)
当exp=111…1,frac
≠
\neq
= 000…0时,表示的是非数(Not-a-Number, NaN)