伪浮点数的原理、运算及误差分析
1. 伪浮点数基础示例
伪浮点数是一种特殊的数值表示方式,下面通过几个例子来理解。
首先,以四分之一块馅饼为例,分子是 1,分母已经是 2 的幂次方。可以用如下结构体表示:
struct sFakeFloat oneFourth = {1, 2};负的移位值会改变移位的方向,比如数字 4 可以这样表示:
struct sFakeFloat four = {1, -2}; floatingPointValue = four.num >> shift ==> 1/(2(-2)) ==> 1 * 22 ==> 4伪浮点数还能处理比通常 32 位(或其他分子大小)所能存储的更大的数,但结果的精度会比使用更大的变量时低。例如,要存储 10000000001,可将其除以 8 以适应有符号的 32 位整数:
struct sFakeFloat notTenBillionOne = { 1250000000, -3 };不过,虽然这个值与正确值的误差在一百亿分之一以内,但最后一位数字丢失了,结果仅为 100 亿。
2. 精度问题
在结构体中,可以使用 24 位的分子和 8 位的分母移位值。虽然这样能将所有数据存放在一个方便的 32 位变量中