给定一个实数,我们可以检查是否需要使用double
数据类型来存储该数字,或者使用float
已足够?
我知道精度因架构而异。是否有C/C++函数可确定正确的数据类型?
给定一个实数,我们可以检查是否需要使用double
数据类型来存储该数字,或者使用float
已足够?
我知道精度因架构而异。是否有C/C++函数可确定正确的数据类型?
背景请参见计算机科学家应该了解的浮点数算术知识
不幸的是,我认为没有任何自动化决策的方法。
通常,当人们使用浮点数而不是字符串表示数字时,意图是使用数字进行算术运算。即使所有输入都以给定的浮点类型具有可接受的精度,仍然必须考虑舍入误差和中间结果。
实际上,大多数计算将使用64位类型具有足够的精度,以获得可用的结果。许多计算将无法仅使用32位获得可用的结果。
在现代处理器中,总线和算术单元宽度足以为32位和64位浮点数提供类似的性能。使用32位的主要动机是在存储非常大的数组时节省空间。
这导致以下策略:
如果数组足够大,可以花费大量精力将其减半,那么需要分析和实验来确定32位类型是否提供足够好的结果,如果是,则使用它。否则,使用64位类型。
1/7
或sqrt(2)
),您还需要检测以下内容:
0.9
,在理论上无法通过浮点数/双精度表示“准确”(至少在我们的二进制计算范例中不行)-请参见Jon Skeet在此问题上的出色回答。
最后,请参阅关于浮点数与双精度的其他讨论。
float
几乎普遍采用IEEE标准单精度浮点格式,而double
则是双精度浮点格式。
单精度分配了23位“尾数”或小数点后的二进制数字。由于小数点前的位始终为1,因此这相当于24位小数。除以log2(10)= 3.3,一个浮点数可以获得7.2个十进制数字的精度。
对于double
进行相同的过程会产生15.9个数字,而long double
会产生19.2个数字(适用于使用英特尔80位格式的系统)。
尾数之外的位用于指数。指数位数决定了允许的数字范围。单精度可达到约10±38,双精度可达到约10±308。
至于您是否需要7、16或19个数字,或者是否适用于有限精度表示,这实际上超出了问题的范围。这取决于算法和应用程序。
double
,它不应该是 log10(2^53) = 15.95
位数字吗? - Rajstd::numeric_limits
有一个名为 has_denorm
的布尔成员的原因。 - Pete Becker你可以将它存储到一个float
和一个double
变量中,然后比较这两个变量。这应该会隐式地将float
转换回double
- 如果没有差异,那么float
就足够了吗?
float f = value;
double d = value;
if ((double)f == d)
{
// float is sufficient
}
double
类型有53位的有效数字,而float
类型只有24位的有效数字。当你将double
类型转换为float
类型时,你会失去29位有效数字,即使这个数在单精度浮点数的最小/最大值范围内(我并没有说它可以被准确地表示;我想这是我用词不当的问题)。 - Victor K你不能用浮点或双精度变量表示实数,只能表示有理数的一个子集。
当进行浮点运算时,你的CPU浮点单元会为你决定最佳近似值。
我可能错了,但我认为浮点(4字节)和双精度(8字节)浮点表示实际上是独立于计算机体系结构指定的。