![腾讯游戏开发精粹](https://wfqqreader-1252317822.image.myqcloud.com/cover/110/26262110/b_26262110.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.2 基于整数的二进制表示的定点数原理
把整数的二进制表示中较低的n位视为小数部分,那么一个整数的二进制形式表示的定点数值其实就是这个整数值除以2n。设a为定点数,f(a)为这个定点数对应的整数值,即f(a)是一个整数,a是它所表示的定点数,那么有
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0036_0003.jpg?sign=1739350539-W5smvAOwV74Uk6dgzfhJVErhV1sgm3DQ-0-b1b61fde2a4abf90623a3df66804bda1)
定点数对应的整数值可以实现为定点数类的成员变量。
2.2.1 32位定点数表示原理
如下为32位定点数的实现方法。
class FScalar { std::int32_t rawValue; static const std::int32_t fractionBits = 10; // 小数位数 static const std::int32_t wholeBits = 22; // 整数位数 }
如表2.2所示为32位定点数的结构。
表2.2 32位定点数的结构
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0037_0001.jpg?sign=1739350539-4RhdrByvVaYJUsw3zyIDPrTihiN4kzNp-0-0cc1053250cb59defdb07be83dc23905)
内部的原始表示方式为32位整数,采用22.10定点数格式,即22位有符号整数,10位小数。可表示精度为
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0037_0002.jpg?sign=1739350539-8TC7DRkAML3LIf5ZvHZDbSnCVokF3Y0Q-0-3df4022ab1ba475b4b82847cd6c678fb)
数学上的范围为
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0037_0003.jpg?sign=1739350539-xi6CpzJ8N6ngj70WgcdZwrkvMJwPyvAa-0-f2c1f7708581edfa5106e803a14b5e1b)
实际值为
-2097152.0~2097151.990234375
2.2.2 64位定点数表示原理
上一节讲的基于32位整数的定点数方案最早由本书主编叶劲峰实现,之后在他的指导下由笔者扩充实现为基于64位整数的版本。因为64位定点数有着更高的精度,所以可以实现更复杂的超越函数运算。
如下为64位定点数的实现方法。
class FDouble { std::int64_t rawValue; static const std::int32_t fractionBits = 32; // 小数位数 static const std::int32_t wholeBits = 32; // 整数位数 }
如表2.3所示为64位定点数的结构。
表2.3 64位定点数的结构
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0037_0004.jpg?sign=1739350539-L2dGyNUCGL8n4ExXijqFQMajthXEgvF5-0-7758d21d84bd905e42deeed39c15164f)
内部的原始表示方式为64位整数,采用32.32定点数格式,即32位有符号整数,32位小数。可表示精度为
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0038_0001.jpg?sign=1739350539-5bfTRX76On7pORQjfy22OTsnS6o6KmSu-0-478db6d2ebb81ce6d47538360d74709f)
数学上的范围为
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0038_0002.jpg?sign=1739350539-zYHxECj5uU89ot9Y79rZPMq8Bf0iBiAk-0-d5cea897d3648d4a0db2f8efab058e82)
实际值为
-2147483648.0~2147483647.9999999997671693563461
其中,32位定点数选择了10位小数,64位定点数选择了32位小数。也可以根据实际情况,按所需精度来确定小数位数。