当前位置: 首页 > 知识库问答 >
问题:

定点数学比浮点数学快吗?

龙珂
2023-03-14

几年前,在20世纪90年代初,我创建了图形包,用于优化基于定点算术的计算,并预先计算出了cos、sin和sqrt和log近似的缩放方程的表格,这些表格使用牛顿近似法。这些先进的技术似乎已经成为图形和内置数学处理器的一部分。大约5年前,我上了一堂数值分析课,涉及到一些古老的技术。我已经编码了近30年,很少看到那些老的定点优化在使用,即使在为世界级粒子加速器实验的GPGPU应用工作之后。固定点方法是否仍然有用,在整个软件行业的任何地方,还是对那些知识的有用性现在已经永远消失了?

共有1个答案

司空坚
2023-03-14

固定点在不支持任何类型的小数类型的平台上是有用的;例如,我为PIC16F系列微控制器实现了一个24位定点类型(稍后将详细介绍我为什么选择定点)。

然而,几乎每一个现代CPU都支持微码或硬件级别的浮点,所以不太需要固定点。

固定点数在它们所能代表的范围内受到限制--考虑64位(32.32)固定点与64位浮点:64位固定点数的小数分辨率为1/(232),而浮点数的小数分辨率高达1/(253);固定点数可以表示高达231的值,而浮点数可以表示高达2223的数字。如果需要更多,大多数现代CPU都支持80位浮点值。

当然,浮点的最大缺点是在极端情况下精度有限--例如,在固定点中,它将需要更少的位来表示当然,使用浮点,您可以获得更好的精度,平均使用小数算术,我还没有看到一个应用程序,其中小数算术是极端的,如上例,但也不会溢出等效的定点大小。

我为PIC16F实现定点库而不是使用现有浮点库的原因是代码大小,而不是速度:16F88有384字节的可用RAM和4095条指令的空间。为了添加两个预定义宽度的固定点数,我在代码中内联了带进位的整数加法(固定点无论如何都不会移动);为了将两个固定点数相乘,我使用了一个简单的移位加函数和扩展的32位固定点数,尽管这不是最快的乘法方法,以便节省更多的代码

所以,当我只需要一个或两个基本的算术运算时,我可以在不耗尽所有程序存储的情况下将它们相加。作为比较,该平台上免费可用的浮点库大约占设备总存储量的60%。相比之下,软件浮点库大多只是围绕着几个算术运算的包装器,而且以我的经验,它们大多是全有或全无的,所以因为你只需要一半的函数而将代码大小削减一半并不是那么好用。

固定点通常在速度上没有多大的优势,因为它的表示范围有限:您需要多少位来表示1.7e+/-308的15位精度,就像64位的双倍?如果我的计算是正确的,你需要大约2020位。我敢打赌那部戏的表现不会那么好。

三十年前,当硬件浮点比较少见时,与基于软件的浮点运算相比,非常特殊的定点(甚至是缩放整数)运算可以提供显著的性能增益,但前提是允许的值范围可以用缩放整数运算有效地表示(最初的Doom在没有协处理器可用的情况下使用了这种方法,比如1992年在我的486SX-25上--在一个超频超线程内核i7上用一个有1000多个独立浮点计算单元的GeForce卡运行在4.0GHz时输入这种方法,但它似乎不对,尽管我不确定是486还是i7。)。

由于浮点可以表示的值范围较广,它的用途更为广泛,并且在CPU和GPU的硬件中实现,它在任何方面都胜过定点,除非您真的需要80位以上的浮点精度,而代价是巨大的定点大小和非常慢的代码。

 类似资料:
  • 为什么当输出0.3时,它能解释错误(如果是的话),而当相加发生时,它却不能解释错误呢?

  • 问题内容: 我认为是非常基本的问题-我正在执行此功能: 问题是输出;例如,我从101的输入中获得337.36080000000004。截断浮点数的适当做法是什么? 正如下面假设的那样,我希望4个有效数字与我的转化率保持一致。 问题答案: 您可以使用NumberFormat实例。 或者,您可以使用DecimalFormat。 后者(DecimalFormat)用于显式地声明格式,而前者(Number

  • 问题内容: 我有一个以指数形式输出的数字: 如何使它以普通格式打印? 问题答案: 您可以将其格式化为定点数字。

  • 问题内容: 遇到一个问题,我的JSON数据以科学计数法而不是浮点数打印。 打印以下值;。我需要它是一个浮点数,小数点后有8个字符(0.00001370) 如您在此处看到的-> http://i.imgur.com/FCVM1UN.jpg,我的GUI显示正确的第一行(使用完全相同的代码)。 问题答案: 您正在查看浮点数的 默认格式,其中科学计数法用于足够小的数字或大的数字。 您无需进行转换,该 值本

  • 问题内容: 考虑以下代码: 为什么会出现这些错误? 问题答案: 二进制浮点数学就是这样。在大多数编程语言中,它基于IEEE754标准。问题的症结在于数字以这种格式表示为整数乘以2的幂。分母不是2的幂的有理数(例如,是)无法精确表示。 对于标准格式,表示形式可以完全按照 以十进制表示,或 以C99十六进制表示法表示。 相比之下,合理数量0.1,这是1/10可以完全按照书面 以十进制表示,或 以C99

  • 问题内容: 我知道浮点数学充其量可能很难看,但我想知道是否有人可以解释以下怪癖。在大多数编程语言中,我测试了0.4到0.2的添加会产生轻微的错误,而0.4 + 0.1 + 0.1会给出非错误。 计算不均的原因是什么,人们可以在相应的编程语言中采取什么措施以获得正确的结果。 在python2 / 3中 在Julia 0.3中也是如此 和Scala: 和Haskell: 但是R v3正确了: 问题答案