22

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

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

谢谢大家!

4

5 回答 5

31

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

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

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

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

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

于 2013-07-11T21:52:01.767 回答
5

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

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

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

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

于 2013-07-12T03:03:42.953 回答
2

您可能有兴趣查看此处发布的答案我应该使用双精度还是浮点数?

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

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

于 2013-07-11T21:45:10.017 回答
1

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

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

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

因此,这部分答案的扩展是SSE 指令,基本上这允许您使用打包数据一次执行多个浮点运算,在理想情况下,这可以使您的程序速度加倍。

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

于 2013-07-11T21:44:14.390 回答
1

浮点数比双精度数使用更少的内存,所以如果你不需要你的数字是双精度数的大小,你最好使用浮点数,因为它会占用更少的内存。

就像您不会使用公共汽车将自己和朋友带到海滩一样……您最好乘坐 2 座汽车。

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

于 2014-02-06T13:55:41.037 回答