24

浮点类型通过将其有效数字和指数分别存储在单独的二进制字中来表示一个数字,因此它适合 16、32、64 或 128 位。

定点类型存储具有 2 个字的数字,一个代表整数部分,另一个代表小数部分,负指数,2^-1、2^-2、2^-3 等。

浮点数更好,因为它们在指数意义上具有更广泛的范围,但如果想要在某个范围内以更高的精度存储数字,例如仅使用从 -16 到 16 的整数,则使用更多位来保存超过基数的数字.

就性能而言,哪一个性能最好,或者是否存在一些比另一个更快的情况?

在视频游戏编程中,每个人都使用浮点数是因为 FPU 使它更快,还是因为性能下降可以忽略不计,还是他们自己制作固定类型?

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

4

8 回答 8

8

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

更正确的说法是,在定点中仅存储尾数并且指数是先验确定的常数。二进制点不要求落在尾数内,也绝对不要求它落在字边界上。例如,以下所有内容都是“定点”:

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

GPU 倾向于使用没有整数部分的定点(通常是 32 位尾数,按 2 -32缩放)。因此,OpenGL 和 Direct3D 等 API 通常使用能够保存这些值的浮点类型。但是,处理整数尾数通常更有效,因此这些 API 也允许以这种方式指定坐标(在纹理空间、颜色空间等中)。

至于您声称 C++ 没有定点类型,我不同意。C++ 中的所有整数类型都是定点类型。指数通常被假定为零,但这不是必需的,我有相当多的定点 DSP 代码用 C++ 以这种方式实现。

于 2010-09-11T21:51:17.540 回答
5

在代码级别,定点算术只是带有隐含分母的整数算术。

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

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

某些体系结构为某些数学函数提供硬件实现,例如sin, cos, atan, sqrt, 仅适用于浮点类型。有些架构根本不提供任何硬件实现。在这两种情况下,专门的数学软件库都可以通过仅使用整数或定点算术来提供这些功能。通常,此类库将提供多级精度,例如,仅精确到 N 位精度的答案,低于表示的完整精度。有限精度版本可能比最高精度版本更快。

于 2010-09-11T22:13:25.517 回答
4

定点广泛用于目标处理器通常没有 FPU 的 DSP 和嵌入式系统,使用整数 ALU 可以合理有效地实现定点。

在性能方面,可能会因目标架构和应用程序而异。显然,如果没有 FPU,那么定点将大大加快。当您拥有 FPU 时,它也将取决于应用程序。例如,在指令集中直接支持而不是通过算法实现时,执行诸如 sqrt() 或 log() 之类的功能会快得多。

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

在 C++ 中,使用合适的运算符重载和相关的数学函数定义定点数据类型类可以轻松克服这个缺点。然而,这个问题有好的和坏的解决方案。一个很好的例子可以在这里找到:http ://www.drdobbs.com/cpp/207000448 。该文章中代码的链接已损坏,但我将其追踪到ftp://66.77.27.238/sourcecode/ddj/2008/0804.zip

于 2010-09-11T21:54:54.330 回答
1

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

在 C++ 中,您可以为定点数学构建自己的类型。您只需使用一个 int 定义为 struct 并覆盖适当的重载,并让它们执行它们通常所做的操作,再加上将逗号放回正确位置的移位。

于 2010-09-11T21:51:42.783 回答
1

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

对于表示中的相同位数,最大定点值的有效位比任何浮点值都(因为浮点格式必须将一些位给指数),但最小定点值的有效位少于任何非- 非规格化浮点值(因为定点值在前导零中浪费了大部分尾数)。

此外,根据您划分定点数的方式,浮点值可能能够表示较小的数字,这意味着它具有“微小但非零”的更精确表示。

等等。

于 2010-09-11T22:00:17.067 回答
1

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

例如,您可以将屏幕/视口的宽度定义为从 0.0 到 1.0,屏幕的高度从 0.0 到 1.0。单词的深度 0.0 到 1.0。等等。矩阵数学等使事情变得非常容易实现。以这种方式进行所有数学运算,直到您需要在真实屏幕尺寸(例如 800x400)上计算真实像素。将光线从眼睛投射到世界上物体上的点,并计算它穿过屏幕的位置,使用 0 到 1 的数学运算,然后将 x 乘以 800,y 乘以 400 并放置该像素。

浮点不单独存储指数和尾数,尾数是一个愚蠢的数字,指数和符号之后剩下的东西,比如23位,而不是16位或32位或64位。

浮点数学的核心使用定点逻辑,需要额外的逻辑和额外的步骤。根据定义,苹果与苹果定点数学相比更便宜,因为您不必在进入 alu 的过程中操纵数据,也不必在退出时操纵数据(规范化)。当您添加 IEEE 及其所有垃圾时,它们会添加更多逻辑、更多时钟周期等(正确签名的无穷大、安静和信令 nan,如果启用了异常处理程序,则相同操作的不同结果)。正如有人在实际系统中的评论中指出的那样,您可以并行进行固定和浮动,您可以利用部分或全部处理器并以这种方式恢复一些时钟。浮动和固定时钟速率都可以通过使用大量芯片空间来提高,固定将保持更便宜,

于 2013-02-12T06:09:47.013 回答
0

一个未涵盖的问题是答案是功耗。虽然它高度依赖于特定的硬件架构,但通常 FPU 比 CPU 中的 ALU 消耗更多的能量,因此如果您的目标是功耗很重要的移动应用程序,那么值得考虑算法的定点实现。

于 2013-12-31T15:41:41.600 回答
0

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

利弊归结为速度和资源。在现代 32 位和 64 位平台上,确实不需要使用定点。大多数系统都带有内置的 FPU,这些 FPU 硬连线以针对定点操作进行优化。此外,大多数现代 CPU 内在函数都带有诸如 SIMD 集之类的操作,这些操作有助于通过向量化和展开来优化基于向量的方法。所以固定点只有一个缺点。

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

于 2016-07-29T11:14:35.267 回答