关于c ++:实数 – 如何确定是否需要float或double?

Real numbers - how to determine whether float or double is required?

给定一个实值,我们可以检查float数据类型是否足以存储数字,或者需要double数据类型吗?

我知道不同建筑的精确度各不相同。是否有任何C/C++函数来确定正确的数据类型?


有关背景,请参阅每个计算机科学家应该了解的关于浮点运算的知识。

不幸的是,我认为没有任何方法可以使决策自动化。

通常,当人们用浮点数而不是字符串来表示数字时,目的是使用数字进行算术运算。即使所有输入都符合给定的浮点类型,并且精度可以接受,您仍然需要考虑舍入误差和中间结果。

在实践中,大多数计算都将使用64位类型,具有足够的精度来获得可用的结果。许多计算只使用32位就无法得到可用的结果。

在现代处理器中,总线和算术单元的宽度足以提供32位和64位浮点类似的性能。使用32位的主要动机是在存储非常大的数组时节省空间。

这将导致以下策略:

如果数组足够大,足以证明花费大量精力将其大小减半是合理的,那么请进行分析和实验,以确定32位类型是否能提供足够好的结果,如果是这样,请使用它。否则,请使用64位类型。


我认为你的问题预设了一种在没有精确损失的情况下向C/C++(或任何其他程序)指定任何"实数"的方法。

假设您通过在代码中指定或通过用户输入获得这个实数;一种检查float或double是否足以在不丢失精度的情况下存储它的方法是只计算有效位的数量,并对照float和double的数据范围检查它。

如果数字是以表达式(即1/7sqrt(2)给出的),您还需要检测:

  • 如果数字是有理数,那么它是有重复小数还是循环小数。
  • 或者,当你有一个无理数时会发生什么?

此外,还有一些数字,比如0.9,在理论上,float/double不能"精确地"表示,至少在我们的二进制计算范式中不能如此——请看jon skeet关于这一点的最佳答案。

最后,请参阅关于浮动与双精度的其他讨论。


精度与平台无关。虽然平台允许不同,但float几乎是通用的IEEE标准单精度,double是双精度。

单精度在基数点(小数点)后指定23位尾数或二进制数字。因为点之前的位总是1,这等于24位小数。除以log2(10)=3.3,浮点数得到精度的7.2位小数。

按照相同的过程,double生成16.2位数字,long double生成19.2位数字(对于Intel和大多数使用80位格式的系统)。

尾数之外的位用于指数。指数位数决定了允许的数字范围。单程至~10±38,双程至~10±308。

至于您是否需要7、16或19位数字,或者如果有限的精度表示法完全合适,那就超出了问题的范围。这取决于算法和应用程序。


一篇非常详细的文章,可以回答你的问题,也可以不回答你的问题。

浮点数复杂的整个系列!


你不能简单地把它存储到一个float和一个double变量中,然后比较这两个变量吗?这应该隐含地将float转换回双精度-如果没有差别,float就足够了?

1
2
3
4
5
6
float f = value;
double d = value;
if ((double)f == d)
{
     // float is sufficient
}


不能用浮点或双变量表示实数,只能用有理数的子集。

当您进行浮点计算时,您的CPU浮点单元将为您决定最佳近似值。

我可能错了,但我认为float(4字节)和double(8字节)浮点表示实际上是独立于comp架构指定的。