在不支持任何自己的十进制类型的平台上,定点有点用处;例如,我为 PIC16F 系列微控制器实现了一个 24 位定点类型(更多关于为什么我稍后选择定点)。
然而,几乎每个现代 CPU 在微码或硬件级别都支持浮点,因此对定点的需求并不大。
定点数在它们可以表示的范围内受到限制 - 考虑 64 位 (32.32) 定点与 64 位浮点:64 位定点数的十进制分辨率为 1/(2 32),而浮点数的十进制分辨率可达 1/(253);定点数可以表示高达 231 的值,而浮点数可以表示 高达 2223 的数字。如果您需要更多,大多数现代 CPU 都支持 80 位浮点值。
当然,浮点的最大缺点是在极端情况下精度有限 - 例如在定点上,表示 9000000000000000000000000000000.00000000000000000000000000000002 将需要更少的位。当然,使用浮点数,您可以在十进制算术的平均使用中获得更好的精度,而且我还没有看到十进制算术与上述示例一样极端但也不会溢出等效定点大小的应用程序。
我为 PIC16F 实现定点库而不是使用现有浮点库的原因是代码大小,而不是速度:16F88 有 384 字节的可用 RAM 和 4095 条指令的空间总共。为了添加两个预定义宽度的定点数,我在我的代码中内联整数加法和进位(定点无论如何都不会移动);为了将两个定点数相乘,我使用了一个带有扩展 32 位定点的简单移位加法函数,尽管这不是最快的乘法方法,以节省更多代码。
因此,当我只需要一两个基本算术运算时,我可以在不耗尽所有程序存储空间的情况下添加它们。相比之下,该平台上免费提供的浮点库约占设备总存储量的 60%。相比之下,软件浮点库大多只是一些算术运算的包装器,根据我的经验,它们大多是全有或全无,因此将代码大小减半,因为你只需要一半的函数是行不通的太好了。
虽然定点通常不会在速度方面提供太多优势,因为它的表示范围有限:您需要多少位来表示 15 位精度的 1.7E+/-308,与 64-有点双?如果我的计算是正确的,你需要大约 2020 位。我敢打赌,它的表现不会那么好。
30 年前,当硬件浮点数相对较少时,与基于软件的浮点数相比,非常专用的定点(甚至缩放整数)算法可以显着提高性能,但前提是允许的范围为值可以用缩放整数算法有效地表示(原始 Doom 在没有可用协处理器时使用这种方法,例如在 1992 年在我的 486sx-25 上 - 在运行频率为 4.0GHz 的超频超线程 Core i7 上使用 GeForce 卡输入有超过 1000 个独立的浮点计算单元,它似乎有点不对劲,虽然我不确定是 486 还是 i7...)。
浮点由于它可以表示的值范围而更通用以巨大的定点大小和非常慢的代码为代价的精度。