我应该使用double还是float?

时间:2009-07-02 13:53:58

标签: c++ types floating-point double-precision

在C ++中使用one而不是另一种有什么优缺点?

11 个答案:

答案 0 :(得分:94)

如果您想知道真正的答案,请阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

简而言之,尽管double在其表示中允许更高精度,但对于某些计算,它会产生更大的错误。 “正确”的选择是:根据需要使用尽可能多的精度选择正确的算法

许多编译器无论如何都在“非严格”模式下进行扩展浮点数学运算(即使用硬件中可用的更宽的浮点类型,例如80位和128位浮点),这也应该被考虑在内。在实践中,您可以几乎看不到任何速度上的差异 - 无论如何,它们都是硬件的原生。

答案 1 :(得分:31)

除非您有其他特殊原因,否则请使用double。

也许令人惊讶的是,它是double而不是float,它是C(和C ++)中的“普通”浮点类型。标准数学函数(如 sin log )将双精度作为参数,并返回双精度数。正常的浮点文字,就像在程序中编写 3.14 时一样,类型为double。不漂浮。

在典型的现代计算机上,双精度可以像浮点数一样快,甚至更快,因此性能通常不是要考虑的因素,即使对于大型计算也是如此。 (那些必须是大型计算,或者性能甚至不应该进入你的脑海。我的新i7台式计算机可以在一秒内完成60亿次双倍乘法。)

答案 2 :(得分:27)

这个问题无法回答,因为这个问题没有背景。以下是可能影响选择的一些事项:

  1. 编译器实现浮点数,双精度数和长双精度数。 C ++标准规定:

      

    有三种浮点类型:float,double和long double。 double类型提供至少与float一样多的精度,long double类型提供至少与double一样多的精度。

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

  2. FPU的存在。并非所有CPU都有FPU,有时会模拟浮点类型,有时候不支持浮点类型。

  3. FPU架构。 IA32的FPU内部为80位 - 32位和64位浮点数在负载时扩展到80位,并在存储时减少。还有SIMD可以并行执行四个32位浮点数或两个64位浮点数。标准中未定义SIMD的使用,因此需要编译器执行更复杂的分析以确定是否可以使用SIMD,或者需要使用特殊功能(库或内在函数)。 80位内部格式的结果是,您可以获得稍微不同的结果,具体取决于数据保存到RAM的频率(因此,精度会降低)。因此,编译器不能很好地优化浮点代码。

  4. 内存带宽。如果double需要比float更多的存储空间,那么读取数据需要更长的时间。这是天真的答案。在现代的IA32上,这一切都取决于数据的来源。如果它在L1高速缓存中,则只要数据来自单个高速缓存行,负载就可以忽略不计。如果它跨越多个缓存行,那么开销很小。如果它来自L2,它需要一段时间,如果它在RAM中那么它仍然更长,最后,如果它在磁盘上是一个巨大的时间。因此,float或double的选择不如数据的使用方式重要。如果要对大量顺序数据进行小型计算,则最好使用小数据类型。在小型数据集上进行大量计算将允许您使用具有任何显着效果的更大数据类型。如果您非常随机地访问数据,那么数据大小的选择并不重要 - 数据会加载到页面/缓存行中。因此,即使您只想从RAM中获取一个字节,也可以传输32个字节(这非常依赖于系统的体系结构)。除此之外,CPU / FPU可以是超标量(也称为流水线)。因此,即使负载可能需要几个周期,CPU / FPU也可能忙于做其他事情(例如乘法),将负载时间隐藏到一定程度。

  5. 该标准不对浮点值强制执行任何特定格式。

  6. 如果您有规格,那么这将指导您进行最佳选择。否则,可以体验到使用什么。

答案 3 :(得分:13)

Double更精确,但编码为8个字节。 float只有4个字节,因此空间更小,精度更低。

如果您的应用程序中有双倍并浮动,则应该非常小心。我过去因此而犯了一个错误。代码的一部分是使用float,而其余的代码是使用double。将double复制到float然后浮动到double会导致精度错误,从而产生很大的影响。就我而言,它是一家化工厂......希望它没有产生严重后果:)

我认为正是因为这种错误导致阿丽亚娜6号火箭几年前爆炸了!!!

仔细考虑变量

的类型

答案 4 :(得分:6)

我个人一直都会加倍,直到看到一些瓶颈。然后我考虑转向浮动或优化其他部分

答案 5 :(得分:4)

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

话虽如此,如果它们确实不同,主要问题是精确性。双精度由于尺寸不同而具有更高的精度。如果您使用的数字通常会超过浮点数,则使用双精度数。

其他几个人提到了表现问题。这将是我的考虑清单上的最后一个。正确应该是你的首要考虑因素。

答案 6 :(得分:3)

Use whichever precision is required to achieve the appropriate results。如果您发现您的代码表现不如您所希望的那样(您使用的分析是否正确?)请查看:

答案 7 :(得分:2)

我认为无论差异如何(正如大家所指出的那样,花车占用的空间更少,而且速度更快)...有没有人会遇到使用双重性能问题?我说使用双...如果你以后决定“哇,这真的很慢”......找到你的性能瓶颈(这可能不是你用过的事实)。那么,如果它对你来说仍然太慢,看看你可以牺牲一些精度并使用漂浮物。

答案 8 :(得分:1)

float和double之间的主要区别在于精度。维基百科有更多信息 Single precision(浮动)和Double precision

答案 9 :(得分:1)

在很大程度上取决于CPU,最明显的权衡是精确度和内存之间的权衡。使用GB的RAM,内存不是什么大问题,因此使用double通常会更好。

至于性能,它在很大程度上取决于CPU。在{32}计算机上,float通常会比double更好。在64位上,double有时更快,因为它(通常)是原生大小。但是,除了您选择的数据类型之外,重要的是您是否可以利用处理器上的SIMD指令。

答案 10 :(得分:0)

double具有更高的精度,而浮点数占用的内存更少,速度更快。一般情况下,你应该使用浮动,除非你的情况不够准确。