首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >double和float,哪个更快?

double和float,哪个更快?
EN

Stack Overflow用户
提问于 2011-01-03 21:02:29
回答 8查看 56.6K关注 0票数 59

我正在读"accelerated C++“。我发现有一句话是这样说的:“在C++中,有时double的执行速度比float快”。在读完一句话后,我对floatdouble的工作原理感到困惑。请向我解释一下这一点。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-01-03 21:13:42

这取决于本机硬件的功能。

  • 如果硬件是(或类似于)采用传统x87数学的x86,则浮点型和双精度型都(免费)扩展为内部80位格式,因此两者具有相同的性能(缓存占用空间/内存带宽除外)

FPU

  • 如果硬件本机实现两者,就像大多数现代ISA(包括x86-64,其中SSE2是标量FP数学的默认值),那么通常大多数操作对于两者都是相同的速度。Double division and sqrt can be slower than float,当然也比乘法或加法慢得多。(浮点数越小,意味着缓存未命中越少。而使用SIMD,向量化的循环的每个向量有两倍的元素)。

  • 如果硬件只实现double,则如果在浮点加载和浮点存储instructions.

中,与本地双精度格式之间的转换不是自由的,则浮点数将变慢

  • 如果硬件只实现浮点,那么使用它模拟双浮点将会花费更多的时间。在这种情况下,float会更快。

  • 和if硬件两者都不实现,并且两者都必须在软件中实现。在这种情况下,两者都会很慢,但double会稍微慢一些(至少会有更多的加载和存储操作)。

你提到的引文可能指的是x86平台,第一个案例就是在这个平台上出现的。但这在一般情况下并不成立。

还要注意,浮点数x,y的x * 3.3 + y将触发两个变量的双精度提升。这不是硬件的问题,你应该通过编写3.3f来避免它,让你的编译器生成有效的asm,如果这是你想要的,它实际上保持数字为浮点数。

票数 66
EN

Stack Overflow用户

发布于 2011-01-03 21:06:38

你可以在这篇文章中找到一个完整的答案:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

这是从之前的堆栈溢出线程中引用的,关于floatdouble变量如何影响内存带宽:

如果双精度型比浮点型需要更多的存储空间,则读取数据所需的时间会更长。这是一个天真的答案。在现代的IA32上,这完全取决于数据来自何处。如果它在L1缓存中,如果数据来自单个缓存线,那么负载可以忽略不计。如果它跨越多个缓存线,则会有很小的开销。如果它来自L2,它需要更长的时间,如果它在内存中,那么它更长,最后,如果它在磁盘上,这是一个巨大的时间。因此,浮点数或双精度数的选择并不像数据的使用方式那么重要。如果您想对大量顺序数据进行小型计算,小型数据类型是更好的选择。在一个较小的数据集上进行大量计算将允许您使用更大的数据类型,并产生任何显著的影响。如果您非常随机地访问数据,那么数据大小的选择并不重要--数据被加载到页面/缓存线中。因此,即使你只需要RAM中的一个字节,你也可以得到32个字节的传输(这非常依赖于系统的架构)。最重要的是,CPU/FPU可以是超标量的(也称为流水线)。因此,即使加载可能需要几个周期,CPU/FPU也可能忙于做其他事情(例如乘法),从而将加载时间隐藏到一定程度的

票数 35
EN

Stack Overflow用户

发布于 2011-01-03 22:23:13

简单的答案是:it取决于

使用x87的CPU处理浮点数和双精度浮点数的速度一样快。向量化的代码使用浮点数会运行得更快,因为SSE可以在一次传递中处理4个浮点数或2个双精度数。

另一件需要考虑的事情是内存速度。根据您的算法,您的CPU在等待数据时可能会空闲很多。内存密集型代码将从使用浮点数中受益,但ALU有限的代码不会(除非它是矢量化的)。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4584637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档