为什么要使用float over double,或者double over long double
Why would you use float over double, or double over long double?
我还是一个编程初学者,我总是有比我们的书或互联网搜索所能回答的更多的问题(除非我错过了什么)。因此,如果这个问题得到了回答,但我找不到,我提前道歉。
我知道float的范围比double小,所以它不那么精确,据我所知,长double甚至更精确(?)。所以我的问题是,为什么你首先要使用一个不那么精确的变量?这与不同的平台、不同的操作系统版本、不同的编译器有关吗?或者在编程中是否有特定的时刻,在双/长双上使用浮点更具战略优势?
谢谢大家!
在几乎所有处理器中,"较小"的浮点数字在执行中占用相同或更少的时钟周期。有时差异不是很大(或者什么都没有),有时它可能是double
与float
的循环次数的两倍。
当然,影响缓存使用的内存足迹也是一个因素。float
的大小是double
的一半,而long double
则更大。
编辑:较小尺寸的另一个副作用是,处理器的SIMD扩展(x86中的3DNow!、SSE、AVX以及其他几种体系结构中的类似扩展)可能只适用于float
,或者可能需要两倍于double
的float
(据我所知,任何处理器中都没有可用于long double
的SIMD指令)。因此,如果使用float
而不是double
,通过一次处理两倍的数据,这可能会提高性能。结束编辑。
因此,假设6-7位数的精度足以满足您的需求,并且+/-10+/-38的范围足够,则应使用float
。如果您需要数字中的更多数字或更大的范围,请转到double
,如果这还不够好,请使用long double
。但对于大多数情况,double
应该是完全足够的。
显然,当你有大量的计算或大量的数据要处理时,使用"合适的大小"的重要性就变得更加重要了——如果有5个变量,而你在一个做一百万其他事情的程序中只使用了几次,谁在乎呢?如果你正在对一级方程式赛车在200英里/小时的速度下的表现进行流体动力学计算,那么你可能有几千万个数据点需要计算,每个数据点在赛车行驶的每秒钟都需要计算几十次,那么在每次计算中只使用几个额外的时钟周期就会使整个模拟耗时明显更长。
使用float有两个成本,一个是其范围和精度有限,另一个是这些限制带来的分析难度越大。
通常比较容易确定二重是否足够,即使在需要大量数值分析才能证明浮点数足够的情况下也是如此。这节省了开发成本,如果更困难的分析没有正确完成,也节省了错误结果的风险。
Float在许多处理器上的最大优势是减少了内存占用。这就意味着每个缓存行有更多的数字,并且以每秒传输的数字为单位有更多的内存带宽。计算性能的任何提高通常都相对较小——事实上,流行的处理器以一种比双倍宽的格式执行所有浮点运算。
除非满足两个条件,否则最好使用double——有足够的数量使它们的内存占用成为一个重大的性能问题,并且开发人员可以证明float足够精确。
您可能有兴趣看到这里发布的答案。我应该使用double还是float?
但它可以归结为内存占用量与特定情况下所需的精度。在物理引擎中,你可能更关心精度,所以使用二重或长二重更有意义。
底线:您应该只使用给定算法所需的精度
这里的基本原则是不要使用超出需要的内容。
首先要考虑的是内存的使用,你可能已经意识到,如果你只赚了一倍,那没什么大不了的,但如果你创造了10亿个,而你只使用了两倍的内存空间呢。
其次是处理器利用率,我相信在许多处理器上,如果使用较小的数据类型,它可以执行一种线程形式,一次执行多个操作。
因此,这部分答案的扩展是SSE指令,基本上这允许您使用打包数据一次进行多个浮点运算,在理想化的情况下,这可以使程序的速度翻倍。
最后是可读性,当有人在阅读你的代码时,如果你使用float,他们会立即意识到你没有超过某个数字。IMO有时正确的精度数字只会在代码中更好地流动。
浮点使用的内存少于双精度,所以如果你不需要数字是双精度的大小,你也可以使用浮点,因为它会占用更少的内存。
就像你不会坐公共汽车开车送自己和朋友去海滩一样。。。你最好开双座车。
同样的道理也适用于长双上的双。。。只保留你需要的内存。否则,对于更复杂的代码,您将面临使用过多内存、进程减慢或崩溃的风险。
- C++在数学计算中将double转换为int
- 在c++中为double类型的数组创建一个unique_ptr
- vector<vector<double>> to mxArray using memcpy
- (double) 和 double() 之间的区别
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- C++ Version Of Double.longBitsToDouble
- 错误:类型"double()"和"double()"的操作数无效到二进制&quo
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 使用 std::vector<double> 访问由 std::unique_ptr<double[2] 管理的数据>
- 将 std::vector<double> 从 C++ 包装到 C 以在 Swift 中使用
- 错误:无法将"<lambda(double)>"转换为"double(*)(double)"
- 如何正确将"strings"转换为"double"?
- 如何在<double>矢量中创建复杂类型的模板<T>?
- "double* grade"、"double *grade"和"double* fn()"有什么区别?
- 在不损失精度的情况下将double从C++传输到python
- 重复使用预分配的向量<复杂<double>>作为<double>长度两倍的向量
- 编译器给出错误:format 指定类型 'float *',但参数的类型'double' [-Wformat]
- Zedboard zynq-7000 Opencl 浮点数从类型 'double*' 强制转换为类型 'double' 无效
- 为什么要使用float over double,或者double over long double