我应该使用双或浮动?我应该使用双或浮动?(Should I use double or float?

2019-05-14 12:05发布

什么是使用一个,而不是其他的C ++的优点和缺点?

Answer 1:

如果你想知道真正的答案,你应该阅读什么每台计算机科学家应该知道关于浮点运算 。

总之,虽然double允许在其表示中更高的精度 ,对于某些计算,将产生较大的误差 。 “正确”的选择是: 根据您的需要使用尽可能多的精度,但不是更多 ,并选择正确的算法

许多编译器不扩展浮点运算中的“非严格”模式反正(即使用硬件提供更宽的浮点类型,例如80位和128位的浮动),这应该被考虑为好。 在实践中,你几乎看不到任何速度差异 -他们是当地人硬件反正。



Answer 2:

除非你有特别的理由不这样做,使用双。

或许令人惊讶,这是双键和不漂浮是在C(和C ++)的“正常”的浮点型。 标准的数学函数,如日志采取双打作为参数,并返回双打。 一个正常的浮点文字,当你在程序编写为3.14,具有double类型。 不浮动。

在典型的现代计算机,双打可以是一样快的花车,甚至更快,因此性能通常不考虑,即使是大型计算的一个因素。 (而这些必须是大的计算,或者性能甚至不应该进入你的心。我的新酷睿i7台式电脑能做到双打六个十亿乘法一秒)。



Answer 3:

这个问题是不可能的回答,因为没有上下文的问题。 这里有一些事情可以影响选择:

  1. 编译器实现的花车,双打和长双打。 C ++标准规定:

    有三种浮点类型:浮动,双,和长双。 类型双提供至少尽可能精确float和类型长双提供至少尽可能精确的两倍。

    因此,所有这三个可以在内存中的大小相同。

  2. 一个FPU的存在。 并非所有CPU都具有的FPU,有时浮点类型是模拟的,有时浮点类型只是不支持。

  3. FPU体系结构。 在IA32的FPU内部80bit的 - 32位和64位浮点数被扩展为80bit的负载和在商店的降低。 还有SIMD可以做四个32位浮点数或并联的两个64位浮点。 SIMD的使用不标准的定义,因此它需要一个编译器,做更复杂的分析,以确定是否可以使用SIMD,或者需要使用特殊功能(库或内在)。 在80bit的内部格式的结果是,你可以得到略微不同的结果取决于如何将数据保存经常到RAM(因此,失去精度)。 出于这个原因,编译器不优化浮点代码特别好。

  4. 内存带宽。 如果双重需要比浮动更多的存储空间,那么它会需要更长的时间来读取数据。 这是天真的答案。 在一个现代化的IA32,这一切都取决于数据的来源。 如果是在L1高速缓存,可以忽略不计提供负载的数据来自一个高速缓存行。 如果它跨越一个以上的高速缓存行有一个小的开销。 如果从L2的,这需要一段时间,如果它是在RAM中,然后它再还最后,如果是在磁盘上这是一个巨大的时间。 所以float或double的选择比使用数据的方式不那么重要了。 如果你想要做的大量连续数据的计算量小,小数据类型是优选的。 在一个小数据集做了很多的计算将让你与任何显著影响使用更大的数据类型。 如果您所访问的数据很随意,那么数据大小的选择是不重要的 - 数据在页/高速缓存行加载。 所以,即使你只想从RAM中的字节,你可以得到32个传送字节(这是非常依赖于系统的体系结构)。 在这一切之上,CPU / FPU可能是超标量(又名流水线)。 所以,即使负载可能需要几个周期,在CPU / FPU可能是忙于做其他事情(例如乘法)隐藏加载时间在一定程度上。

  5. 该标准并没有强制要求浮点值的任何特定的格式。

如果你有一个规范,那么,这将引导你的最佳选择。 否则,它的下跌为使用什么体验。



Answer 4:

双是更精确,但是编码于8个字节。 浮法是只有4个字节,所以较少的空间和精度要求不高。

如果你在你的应用双和浮动你应该非常小心。 我有一个bug,由于在过去。 而代码的其余部分使用了双倍使用浮动的代码中的一个部分是。 复制双浮动,然后浮翻番可能会导致可以有很大的影响精度误差。 就我而言,这是一个化学工厂...希望它没有造成严重的后果:​​)

我认为,这是因为这种错误的是阿丽亚娜火箭6已经在几年前爆炸的!

仔细想想类型用于变量



Answer 5:

我personnaly去双所有的时间,直到我看到一些瓶颈。 然后我考虑迁移到漂浮或优化其它部分



Answer 6:

这取决于编译器如何实现翻番。 这是合法的double和float是相同类型的(它是在某些系统上)。

话虽这么说,如果他们确实是不同的,主要问题是精度。 双具有更高的精度,由于它的大小差异。 如果数字使用的是通常会超过一个浮动的值,然后用双。

其他几个人都提到性能isssues。 这将是最后一次正好我考虑的名单上。 正确性应该是你的#1的考虑。



Answer 7:

无论使用何种精确度的要求,以达到相应的效果 。 如果然后找到你的代码不执行,以及你希望(你使用正确的剖析?)看一看:

  • 英特尔64和IA-32架构优化参考手册
  • 对于AMD64处理器软件优化


Answer 8:

我觉得不管差异(这是每个人所指出的,花车占用空间少,且一般更快)...没有人使用过双遇到性能问题? 我说,使用双...如果您稍后决定“哇,这实在是太慢了” ......找到你的性能瓶颈(这可能不是你使用双倍的事实)。 然后,如果它仍然是你太慢了,看看你可以牺牲一些精度和使用浮点数。



Answer 9:

浮点和双精度之间的主要区别是精度。 维基百科有更多信息单精度 (浮点)和双精度 。



Answer 10:

这在很大程度上取决于CPU的最明显的权衡是精密和内存之间的。 随着GB的RAM,内存是没有太大问题的,所以它通常最好使用double秒。

至于性能方面,它高度依赖于CPU。 float S键通常会比更好的性能, double 32位计算机上秒。 在64位, double s为有时更快,因为它是(通常)本机尺寸。 不过,有什么事会比你所选择的数据类型是你是否可以把你的处理器上的优势的SIMD指令等等。



Answer 11:

双精度较高,而花车占用更少的内存和更快。 一般来说,除非你有地方不够准确的情况下,你应该使用浮动。



文章来源: Should I use double or float?