有哪些优点和缺点使用一种而不是其他用C++?

有帮助吗?

解决方案

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

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

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

其他提示

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

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

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

这个问题无法回答,因为没有上下文。以下是一些可能影响选择的因素:

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

    浮点类型共有三种:浮点型、双精度型和长双精度型。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. 内存带宽。如果双精度数比浮点数需要更多的存储空间,则读取数据将花费更长的时间。这就是天真的答案。在现代 IA32 上,这完全取决于数据的来源。如果它位于 L1 缓存中,则只要数据来自单个缓存行,负载就可以忽略不计。如果它跨越多个缓存行,则会产生很小的开销。如果它来自 L2,则需要更长的时间,如果它在 RAM 中,则需要更长的时间,最后,如果它在磁盘上,则需要很长的时间。因此,选择 float 或 double 并不重要,重要的是数据的使用方式。如果您想对大量连续数据进行小型计算,则最好选择小型数据类型。在小数据集上进行大量计算将允许您使用更大的数据类型,从而产生显着的效果。如果您非常随机地访问数据,那么数据大小的选择并不重要 - 数据加载在页面/缓存行中。因此,即使您只需要 RAM 中的一个字节,也可以传输 32 个字节(这很大程度上取决于系统的架构)。最重要的是,CPU/FPU 可以是超标量(也称为流水线)。因此,即使加载可能需要几个周期,CPU/FPU 也可能忙于执行其他操作(例如乘法),从而在一定程度上隐藏了加载时间。

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

如果您有规格,那么它将指导您做出最佳选择。否则,使用什么就取决于经验了。

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

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

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

仔细考虑的类型被用于变量

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

这依赖于编译器是如何实现的两倍。这是合法的double和float是相同类型的(它是在某些系统上)。

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

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

使用所需的精度来获得适当的结果. 。如果您随后发现代码的性能没有达到您想要的效果(您使用的分析正确吗?)请查看:

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

主要的差异之间浮动和双为精确。维基百科具有更多信息 单一精准 (float)和 双精密.

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top