【问题标题】:Why would you use float over double, or double over long double?为什么要使用 float 而不是 double 或 double 而不是 long double?
【发布时间】:2013-07-10 08:21:42
【问题描述】:

我仍然是编程的初学者,而且我的问题总是比我们的书或互联网搜索所能回答的要多(除非我错过了什么)。因此,如果有人回答了这个问题,但我找不到,我提前道歉。

我知道 float 的范围比 double 更小,因此精度较低,据我所知,long double 更精确(?)。所以我的问题是你为什么要首先使用一个不太精确的变量?它是否与不同的平台、不同的操作系统版本、不同的编译器有关?或者在编程中是否有特定的时刻,在战略上使用浮点数比双/长双精度更有利?

谢谢大家!

【问题讨论】:

  • 至少在使用形式较窄的函数时不会丢失精度(或至少冒着这样做的风险并收到警告)。
  • 有时精度不如内存占用重要。

标签: c++ floating-point double long-double


【解决方案1】:

在几乎所有的处理器中,“较小的”浮点数在执行中占用相同或更少的时钟周期。有时差异不是很大(或没有),有时它可能是doublefloat 的周期数的两倍。

当然,影响缓存使用的内存占用也是一个因素。 float 的大小是double 的一半,而long double 更大。

编辑:较小尺寸的另一个副作用是处理器的 SIMD 扩展(x86 中的 3DNow!、SSE、AVX 以及其他几种架构中可用的类似扩展)可能仅适用于 float,或者可以采用floatdouble 的两倍(据我所知,在任何处理器中都没有可用于 long double 的 SIMD 指令)。因此,如果使用floatdouble 相比,通过一次性处理两倍的数据,这可能会提高性能。结束编辑。

因此,假设 6-7 位的精度足以满足您的需要,并且 +/-10+/-38 的范围就足够了,那么应该使用 float。如果您需要更多位数或更大范围,请移至double,如果这还不够好,请使用long double。但对于大多数事情,double 应该是完全足够的。

显然,当您有大量计算或大量数据要处理时,使用“正确大小”的重要性变得更加重要 - 如果有 5 个变量,并且您只需在一个做一百万其他事情的程序,谁在乎呢?如果您正在对一级方程式赛车以 200 英里/小时的速度进行流体动力学计算,那么您可能需要计算数千万个数据点,并且每个数据点需要每秒计算数十次汽车行驶,然后在每次计算中仅使用几个时钟周期将使整个模拟花费明显更长的时间。

【讨论】:

  • 非常感谢,这真的帮助我理解了这些数据类型的意义。我只是希望我们的书能详细说明为什么他们在初学者书籍(现在我知道)中使用 double 而不是浮点数,因为这些小程序甚至从未接近任何一种数据类型的界限。我只是在没有完全理解某些事情的情况下记忆力很差。
  • float ops 不一定比 doubles 快,一般来说 mult 都需要一个周期
  • @aaronman:谢谢。我尝试在合理/正确时考虑 cmets。如果没有别的,这是“学习”的一部分。 (虽然在这种情况下更多的是“保持简单”,而不是列举所有可能的相等和更快和更慢变化的情况,我只是写了一个我认为足够好的句子......)
  • @EricPostpischil 我没有说延迟总是一样的,至于 simd 看我的回答
  • @EricPostpischil 你可能是正确的,不会与苹果的主要 SE 开始争论,你将如何修改我的评论
【解决方案2】:

使用浮点数有两个成本,一个明显的成本是其有限的范围和精度,另一个不太明显的是,这些限制带来的分析难度更大。

通常比较容易确定 double 是否足够,即使在需要大量数值分析工作来证明 float 足够的情况下也是如此。如果没有正确完成更困难的分析,这可以节省开发成本,并避免出现错误结果的风险。

Float 在许多处理器上的最大优势是它减少了内存占用。这意味着每个高速缓存行的数量更多,就每秒传输的数量而言,内存带宽也更多。计算性能的任何提升通常都相对较小——事实上,流行的处理器以一种比 double 更宽的格式执行所有浮点运算。

似乎最好使用 double 除非满足两个条件 - 有足够的数字使其内存占用成为一个重要的性能问题,并且开发人员可以证明 float 足够精确。

【讨论】:

    【解决方案3】:

    您可能有兴趣查看此处发布的答案Should I use double or float?

    但这归结为内存占用与特定情况下所需的精度。在物理引擎中,您可能更关心精度,因此使用双精度或长双精度会更有意义。

    底线: 您应该只使用给定算法所需的精度

    【讨论】:

    • 并没有真正回答这个问题,只是同意他的说法
    • 另外,您可能应该只是将问题标记为骗子,而不是将骗子发布为答案
    【解决方案4】:

    这里的基本原则是不要使用超过你需要的东西。

    首先要考虑的是内存使用,你可能已经意识到,如果你只做一个两倍没什么大不了的,但是如果你创造了十亿比你使用的内存空间是你原来的两倍呢?

    接下来是处理器利用率,我相信在许多处理器上,如果您使用较小的数据类型,它可以执行一种线程形式,它可以一次执行多个操作。

    所以这部分答案的扩展是SSE instructions 基本上这允许您使用packed data 一次执行多个浮点运算,在 理想化 的情况下可以使速度加倍你的程序。

    最后是可读性,当有人阅读您的代码时,如果您使用浮点数,他们会立即意识到您没有超过某个数字。 IMO 有时正确的精度数字会在代码中更好地流动。

    【讨论】:

    • 不要使用超过你需要的东西:这是一个有效的观点,但正如 Patricia 的回答中强调的那样,你能在多大程度上降低准确性可能是一个难题,所以你必须交易一些成本(开发与运行时)...没有过早的优化是同样有效的观点。
    • @aka.nice 我不确定这条评论的意义是什么,问题是你为什么要使用 float,而不是为什么要使用 double
    • 是的,你的观点是使用浮点数的正当理由,但它们必须与其他权衡平衡,这就是我试图告诉你的
    • @aka.nice 我明白这个问题并没有问对方,暗示他们已经知道对方,所以我认为没有必要重申
    【解决方案5】:

    float 使用的内存比 double 少,所以如果你不需要你的数字是 double 的大小,你也可以使用 float,因为它会占用更少的内存。

    就像您不会使用公共汽车开车送自己和朋友去海滩一样......您最好乘坐 2 座汽车。

    这同样适用于长双倍的双倍...只保留您需要的内存量。否则,对于更复杂的代码,您将面临使用过多内存并使进程变慢或崩溃的风险。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多