浮点类型通过将其显着的数字和指数分别存储在单独的二进制单词上来表示数字,从而适合16、32、64或128位。

固定点类型用2个单词存储数字,一个代表整数部分,另一个代表超过radix的零件,为负指数为2^-1、2^-2、2^-3,等等。

浮点更好,因为它们具有指数意义上的范围更大,但如果一个人想在一定范围内更精确地存储数字,例如,仅使用-16到16的整数,因此使用更多的位置将数字固定在radix上方。

在表演方面,哪个表现最好,或者有些情况比另一个更快?

在视频游戏编程中,每个人都会使用浮点,因为FPU使其更快,或者由于性能下降而忽略不计,还是可以自己制作固定类型?

为什么C/C ++没有任何固定类型?

有帮助吗?

解决方案

该定义涵盖了固定点实现非常有限的子集。

更正确地说,在固定点中,只存储了mantissa,并且指数是常数确定的a-priori。不需要二进制点落入曼蒂萨(Mantissa)内部,绝对不需要它落在单词边界上。例如,以下所有内容均为“固定点”:

  • 64位mantissa,按2缩放-32 (这符合问题中列出的定义)
  • 64位mantissa,按2缩放-33 (现在整数和分数零件不能被八位字边界分开)
  • 32位mantissa,按2缩放4 (现在没有部分部分)
  • 32位mantissa,按2缩放-40 (现在没有整数部分)

GPU倾向于使用没有整数部分的固定点(通常为32位Mantissa缩放2-32)。因此,诸如OpenGL和Direct3D之类的API经常使用能够持有这些值的浮点类型。但是,操纵整数Mantissa通常更有效,因此这些API也允许指定坐标(在纹理空间,颜色空间等)。

至于您的说法C ++没有固定点类型,我不同意。 C ++中的所有整数类型都是固定点类型。指数通常被认为为零,但这不是必需的,我在C ++中使用了很多定点DSP代码。

其他提示

在代码级别,固定点算术简称与隐含分母的整数算术。

对于许多简单的算术操作,固定点和整数操作基本相同。但是,有一些操作必须用更高数量的位来表示中间值,然后舍入。例如,要乘以两个16位固定点,必须将结果临时存储在32位中,然后再重新归一化(或饱和)回到16位固定点。

当软件不利用矢量化(例如基于CPU的SIMD或GPGPU)时,整数和固定点算术都比FPU快。当使用矢量化时,矢量化的效率更重要,因此,固定点和浮点点之间的性能差异是有意义的。

一些架构为某些数学功能提供了硬件实现,例如 sin, cos, atan, sqrt, ,仅适用于浮点类型。一些架构根本不提供任何硬件实现。在这两种情况下,专业的数学软件库都可以仅使用整数或固定点算术来提供这些功能。通常,此类库将提供多个级别的精度,例如,仅准确的n位精确度,这比表示的全部精度要小。限时版本可能比最高精确版本更快。

固定点在DSP和嵌入式系统中广泛使用,在该系统中,目标处理器通常没有FPU,并且可以使用整数ALU可以合理地实现固定点。

在性能方面,这是根据目标体系结构和应用程序而变化的。显然,如果没有FPU,则固定点的速度将更快。当您拥有FPU时,它也将取决于应用程序。例如,执行某些功能(例如SQRT()或log()时,直接在指令集中直接支持而不是通过算法实现的速度会更快。

我想没有C ++中的内置固定点类型,因为它们(或至少C)被设想为系统级别的语言,并且需要固定点有点特定,也许是因为在通用处理器上有通常没有对固定点的直接硬件支持。

在C ++定义具有合适的操作员过载和相关数学功能的定点数据类型类中,可以轻松克服此快捷方式。但是,对于这个问题有好坏解决方案。一种 好的 示例可以在此处找到: http://www.drdobbs.com/cpp/207000448. 。该文章中指向代码的链接被打破,但我将其跟踪到 ftp://66.77.27.238/sourcecode/ddj/2008/0804.zip

浮点和整数数学之间的差异取决于您想到的CPU。在英特尔芯片上,差异在钟表上并不大。 INT数学仍然更快,因为有多个可以并行起作用的整数ALU。编译器也很聪明,可以使用特殊的地址计算说明来优化单个指令中的添加/乘。转换也是一个操作,因此只需选择您的类型并坚持下去即可。

在C ++中,您可以为固定点数学构建自己的类型。您只需用一个INT定义结构并覆盖适当的超载,并使他们做通常的事情,并将其转移以将逗号恢复到正确的位置。

在这种情况下讨论“精度”时,您需要小心。

对于代表中相同数量的位,最大固定点值具有 更多的 比任何浮点数值都比任何浮点数(因为浮点格式必须给指数赋予一些位),但最小固定点值具有 更少 比任何非划定的浮点数值(因为固定点值在领先零中的大部分鼠标浪费)。

还取决于您将固定点编号划分的方式,浮点值可能能够表示 较小 数字意味着它具有“微小但非零”的更精确表示。

等等。

您不会在游戏中使用Float,因为它使用的速度更快或较慢,因为在浮点上实现算法比固定点更容易。您假设原因与计算速度有关,这不是原因,它与易于编程有关。

例如,您可以将屏幕/视口的宽度定义为从0.0到1.0,屏幕高度为0.0到1.0。单词0.0至1.0的深度。等等。矩阵数学等使事情变得真正易于实现。这样做所有的数学,直到您需要在实际屏幕尺寸上计算真实像素(例如800x400)。将射线从眼睛到世界上对象上的点投射,并使用0到1个数学计算其刺穿屏幕的位置,然后将X乘以800,y times 400,并放置那个像素。

浮点不能单独存储指数,曼蒂萨(Mantissa)是一个愚蠢的数字,指数和签名之后剩下的东西,例如23位,而不是16或32或64位。

核心的浮点数学使用固定点逻辑,并具有额外的逻辑和额外的步骤。根据定义,将苹果与苹果的固定点数学比较更便宜,因为您不必在进入ALU的途中操纵数据,也不必在出路(正常化)上操纵数据。当您添加IEEE及其所有垃圾时,添加了更多逻辑,更多的时钟周期等(正确签名的无穷大,安静和信号NAN,如果启用了异常处理程序,则相同操作的不同结果)。正如某人在真实系统中的评论中指出的那样,您可以并行进行固定并浮动,您可以利用某些或全部处理器并以这种方式恢复一些时钟。通过使用大量的芯片房地产,可以提高浮动和固定时钟速度,固定速度将保持更便宜,但是Float可以使用此类技巧以及并行操作来接近固定速度。

一个不涵盖的问题是答案是功耗。尽管它在很大程度上取决于特定的硬件体系结构,但通常FPU比CPU中的ALU消耗的能量要多得多,因此,如果您针对功耗很重要的移动应用程序,那么值得考虑算法的固定点推动。

这取决于您在做什么。如果您使用的是固定点,则会失去精度;您必须选择十进制位置之后的位置数(这可能并不总是足够的)。在浮点上,您无需担心这一点,因为所提供的精度几乎总是足以满足手头的任务 - 使用标准表单实现来表示数字。

利弊归结为速度和资源。在现代32位和64位平台上,实际上无需使用固定点。大多数系统都带有内置的FPU,这些内置功能是在固定点操作中进行优化的。此外,大多数现代的CPU内在系统都伴随着SIMD诸如SIMD集合之类的操作,该操作通过矢量化和展开来帮助优化基于向量的方法。因此,固定点只有向下。

在嵌入式系统和小型微控制器(8位和16位)上,您可能没有FPU或扩展指令集。在这种情况下,您可能被迫使用固定点方法或不太快的浮点指令集。因此,在这种情况下,固定点将是更好的甚至您唯一的选择。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top