我应该使用双或浮动?
在C ++中使用一个而不是另一个的优点和缺点是什么?
如果你想知道真正的答案,你应该阅读每个计算机科学家应该知道的浮点算术 。
简而言之,虽然double
允许更高的精度表示,但是对于某些计算来说,会产生更大的误差 。 “正确的”select是: 使用尽可能多的精度,而不是更多 , select正确的algorithm 。
许多编译器在“非严格”模式下(即使用硬件中可用的更宽的浮点types,例如80位和128位浮点)进行扩展浮点运算,这也应该被考虑到。 在实践中,你几乎看不到任何速度上的差别 – 无论如何,它们都是硬件本地的。
这个问题是不可能回答的,因为这个问题没有背景。 以下是可能影响select的一些事情:
-
编译器实现了浮动,双打和长双打。 C ++标准规定:
有三种浮点types:float,double和long double。 doubletypes至less提供了与float相同的精度,long doubletypes的精度至less与double相同。
所以,这三者在内存上可以是相同的大小。
-
存在一个FPU。 并非所有的CPU都具有FPU,有时候模拟浮点types,有时仅仅不支持浮点types。
-
FPU架构。 IA32的FPU内部为80位 – 32位和64位浮点数扩展到80位,并在存储上减less。 还有SIMD可以并行执行四个32位浮点数或两个64位浮点数。 SIMD的使用没有在标准中定义,所以需要一个编译器来进行更复杂的分析,以确定是否可以使用SIMD,或者需要使用特殊函数(库或内部函数)。 80位内部格式的结果是,根据数据保存到RAM的频率(因此失去精度),可能会得到稍微不同的结果。 由于这个原因,编译器不能特别好地优化浮点代码。
-
内存带宽。 如果double需要比float更多的存储空间,那么读取数据需要更长的时间。 这是天真的答案。 在现代IA32上,这一切都取决于数据来自何处。 如果它在L1高速caching中,只要数据来自单个高速caching行,则负载可以忽略不计。 如果它跨越多个caching行,则会有小的开销。 如果它来自L2,则需要一段时间,如果它在RAM中,那么它会更长,最后,如果它在磁盘上,这是一个很长的时间。 所以浮点数或双精度的select不如数据的使用方式重要。 如果你想对大量的连续数据做一个小的计算,那么一个小的数据types是最好的。 在一个小的数据集上做大量的计算可以让你使用更大的数据types,并且有很大的作用。 如果您非常随机地访问数据,那么select数据大小并不重要 – 数据将以页面/caching行加载。 所以,即使你只需要一个RAM中的字节,也可以传送32个字节(这非常依赖于系统的体系结构)。 除此之外,CPU / FPU可以是超标量(又称stream水线)。 所以,即使一个负载可能需要几个周期,CPU / FPU也可能忙于做一些其他的事情(例如乘法),从而在一定程度上隐藏加载时间。
-
该标准不强制任何特定的浮点值格式。
如果你有一个规范,那么这将指导你最佳的select。 否则,关于使用什么是经验的。
除非你有一些特殊的理由否则,使用双。
也许令人惊讶的是,它是C(和C ++)中的“正常”浮点types的双精度浮点数。 标准的math函数,例如sin和log,以double为参数,返回double。 一个普通的浮点文字,就像在程序中写入3.14一样 ,它的types是double。 不漂浮。
在典型的现代计算机上,双打可以像浮游物一样快,甚至更快,所以即使对于大型计算,性能通常也不是要考虑的因素。 (而且这些都需要很大的计算,否则性能甚至不应该进入你的想法。我的新型i7台式计算机可以在一秒钟内完成60亿次双倍的乘法运算)。
双精度更高,但编码在8个字节。 float只有4个字节,所以空间less,精度不高。
你应该非常小心,如果你有双重和浮动在你的应用程序。 过去我曾经犯过一个错误。 代码的一部分是使用浮动,而其余的代码是使用双。 将double复制为float,然后将float复制为double可能会导致精度错误,从而可能产生重大影响。 在我的情况下,这是一个化学工厂…希望它没有戏剧性的后果:)
我想这是因为阿里安6号火箭几年前爆炸造成的这种臭虫!
仔细考虑用于variables的types
我personnaly所有的时间去双倍,直到我看到一些瓶颈。 然后我考虑移动或优化其他部分
这取决于编译器如何实现双重。 double和float是合法的,是相同的types(在某些系统上)。
这就是说,如果确实不同,主要的问题是精确。 由于它的大小不同,双倍精度要高得多。 如果你使用的数字通常会超过一个浮点数,那么使用double。
其他几个人都提到了性能问题。 这将是我的考虑清单的最后一个。 正确性应该是你的首要考虑。
使用任何精度来达到合适的结果 。 如果你发现你的代码performance不如你想要的(你使用的分析是正确的?)看看:
- Intel 64和IA-32体系结构优化参考手册
- AMD64处理器的软件优化
我认为不pipe区别如何(正如大家所指出的,花车占用更less的空间,总体来说速度更快)…有没有人会遇到使用双重性能问题? 我说使用双…如果以后你决定“哇,这是真的很慢”…find你的性能瓶颈(这可能不是你使用的双倍)。 那么,如果它对你来说太慢了,看看你可以牺牲一些精度并使用浮点数。
双精度更高,而浮点数占用内存less,速度更快。 一般来说,你应该使用float,除非你有一个不够精确的情况。
float和double的主要区别在于精度。 维基百科有关单精度 (浮点)和双精度的更多信息。
这在很大程度上取决于CPU的精度和内存之间的最明显的折衷。 使用GB的内存,内存不是一个问题,所以通常使用double
精度比较好。
至于性能,这在很大程度上取决于CPU。 在32位机器上, float
通常会比double
float
好。 在64位上, double
s有时更快,因为它通常是原生大小。 不pipe怎样,重要的是您是否可以利用处理器上的SIMD指令。