Pie*_*tro 17 c++ floating-point double performance
在我看到的大多数代码double
中float
,即使不需要高精度也是最受欢迎的代码.
由于使用双重类型(CPU/GPU /内存/总线/缓存/ ...)时存在性能损失,这种双重过度使用的原因是什么?
示例:在计算流体动力学中,我使用的所有软件都使用了双打.在这种情况下,高精度是无用的(因为数学模型中的近似引起的误差),并且有大量的数据需要移动,使用浮点数可以减少一半.
今天的计算机功能强大这一事实毫无意义,因为它们被用来解决越来越复杂的问题.
Ded*_*tor 22
其中:
但最后,YMMV:测量,测试并自行决定您的具体情况.
BTW:性能狂热分子还有更多:使用IEEE半精度类型.存在很少的硬件或编译器支持,但它再次将您的带宽需求减半.
Kaz*_*Kaz 11
double
在某种程度上,C语言中的"自然"浮点类型也会影响C++.考虑一下:
13.9
有类型一样double
.为了使它浮动,我们必须添加一个额外的后缀f
或F
.float
函数参数*转换为double
:当没有参数声明时,例如当函数声明为variadic(例如printf
)或者没有声明存在时(旧式C,C++中不允许).%f
转换符printf
需要一个double
说法,不是float
.没有专门的打印方式float
; 一个float
参数默认提升到double
等相匹配%f
.在现代硬件,float
和double
通常映射,分别为32位和64位IEEE 754的类型.硬件"本机"使用64位值:浮点寄存器为64位宽,操作围绕更精确的类型构建(或者内部可能比这更精确).由于double
映射到该类型,因此它是"自然"浮点类型.
float
任何严肃的数字工作的精度都很差,减小的范围也可能是一个问题.IEEE 32位类型只有23位尾数(指数字段消耗8位,符号消耗1位).float类型对于在大型浮点值数组中保存存储非常有用,前提是精度和范围的损失在给定的应用程序中不是问题.例如,有时在音频中使用32位浮点值来表示样本.
确实,使用32位类型的64位类型会使原始内存带宽加倍.但是,这只影响具有大量数据的程序,这些程序以显示不良局部性的模式访问.64位浮点类型的卓越精度胜过优化问题.数值结果的质量比剃须周期的运行时间更重要,按照"先把它做,然后再做快"的原则.
*但请注意,float
表达式中没有一般的自动升级double
; 唯一的推广之类的是积分的推广:char
,short
与位域去int
.
在我看来,到目前为止的答案并没有真正得到正确的观点,所以这是我的解决方案.
简短的回答是C++开发人员在浮点数上使用双精度数:
对于单个计算,它的真实双倍可能与浮点一样快,因为大多数FPU具有比32位浮点或64位双重表示更宽的内部表示.
然而,这只是图片的一小部分.如果你的缓存/内存带宽瓶颈,现在的运营优化并不意味着什么.
这就是为什么一些寻求优化代码的开发人员应该考虑使用32位浮点数而不是64位双精度数:
一般来说,在我遇到的大多数开发人员中,实际上缺乏关于浮点数如何真正起作用的知识.所以我并不感到惊讶,大多数开发人员盲目地使用双倍.
这主要取决于硬件,但考虑到最常见的CPU(基于x86/x87)具有内部FPU,它以80位浮点精度(超过浮点数和双精度数)运行.
如果你必须在内存中存储一些中间计算,double是内部精度和外部空间的良好平均值.在单个值上,性能或多或少相同.它可能受到大型数字管道上的内存带宽的影响(因为它们具有双倍长度).
考虑浮点数的精度约为6位十进制数.在N立方复杂性问题(如矩阵求逆或变换)上,你会丢失两到三个,mul
并且div
只剩下3个有意义的数字.在1920像素宽的显示器上,它们是不够的(您需要至少5个才能正确匹配像素).
这大致是双倍的优选.
归档时间: |
|
查看次数: |
2896 次 |
最近记录: |