为什么你会使用浮动超过双倍,或双倍超长双?

时间:2013-07-11 21:34:57

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

我仍然是编程的初学者,我总是有比我们的书或互联网搜索更多的问题(除非我错过了什么)。如果这个问题得到解答,我会提前道歉,但我找不到它。

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

谢谢大家!

5 个答案:

答案 0 :(得分:25)

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

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

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

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

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

答案 1 :(得分:5)

使用浮动有两个成本,其中有限的范围和精度是明显的,而且不那么明显,这些限制所带来的分析就越困难。

通常相对容易确定double是足够的,即使在需要进行大量数值分析以显示浮点数足够的情况下也是如此。如果没有正确完成更困难的分析,这可以节省开发成本和不正确结果的风险。

Float在许多处理器上的最大优势是减少了内存占用。这转换为每个缓存行更多的数字,并且就每秒传输的数量而言更多的内存带宽。计算性能的任何提升通常都相对较小 - 事实上,流行的处理器以一种格式进行所有浮点运算,而不是双倍。

似乎最好使用double,除非满足两个条件 - 有足够数量的内存占用是一个重要的性能问题,开发人员可以证明浮点数足够精确。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

这里的基本原则是不要超过你的需要。

第一个考虑因素是内存使用,你可能已经意识到,如果你只制作一个双倍没什么大不了的,但如果你创造了十亿而不是你只使用了两倍的内存空间。

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

  

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

最后是可读性,当有人在阅读你的代码时,如果你使用浮动,他们会立即意识到你没有超过一定数量。 IMO有时候正确的精确数字会在代码中流动得更好。

答案 4 :(得分:0)

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

就像你不会乘坐公共汽车去驾驶自己和朋友到海滩一样......乘坐2座汽车会更好。

同样适用于长双倍的双倍......只保留你需要的内存。否则,如果代码更复杂,则存在使用太多内存并使进程变慢或崩溃的风险。