浮点与固定点:优点/缺点是什么?

jok*_*oon 19 c c++ processor video-game-consoles

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

固定点类型存储具有2个字的数字,一个表示整数部分,另一个表示基数超过基数,在负指数中,2 ^ -1,2 ^ -2,2 ^ -3等.

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

在性能方面,哪一个具有最佳性能,或者有些情况下某些比另一个更快?

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

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

Ben*_*igt 5

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

更确切地说,在固定点上仅存储尾数并且指数是先验确定的常数.不需要二进制点落在尾数内,并且绝对不要求它落在单词边界上.例如,以下所有都是"固定点":

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

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

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

  • 整数和真定点类型之间的区别在于,当使用整数进行定点时,必须在多次或除法运算后移位结果.内置固定类型可以在引擎盖下完成.在定点DSP硬件上,这由指令集直接支持,但是如果使定点*和/操作比相应的普通整数操作器慢,则其他方面也是如此. (2认同)

rwo*_*ong 5

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

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

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

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