2.5 定点数的误差对比与性能测试
2.5.1 超越函数及开方的误差测试
以double(双精度)的运算函数作为测试基准,对比float(单精度)和fixedpoint(32.32)的计算误差,其中测试的对比函数有标准库的std::sqrt、std::pow、std::log、std::exp、std::sin和std::asin,两者的误差列于表2.4中。
表2.4 超越函数及开方的误差比较
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0047_0001.jpg?sign=1739545749-403AxpuxOymzuEkR6F6zUAreJ4hOKrQv-0-a9c2f6a23a30ba71da02932f833a76fc)
在fixedpoint(32.32)能表示的实数范围内,对比double(双精度)在标准库的实现,平均误差都小于万分之一。
2.5.2 性能测试
我们在两个平台上测试浮点数(单精度)与定点数(32.32)的性能,每个测试量度运算1000000次的总耗时。测试使用的硬件如表2.5所示。性能结果列于表2.6中。
表2.5 测试使用的硬件
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0048_0001.jpg?sign=1739545749-73pwYrWqryEugWz36s4kxnGOYxAcx2xI-0-844b6f1b25ad6236d51faf8fd00e83c4)
表2.6 性能结果(运算耗时统计,单位为ms)
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0048_0002.jpg?sign=1739545749-vfDUcYlt8V6oTgtdZJAYd3GLxEVxYMkI-0-a89e0cd25366011b9c29e6275d6e5a22)
其中,除除法两者差距大外,其他函数的执行都在同一个量级内,在部分情况下,例如add、sin,定点数的运算还快一些。