繁体   English   中英

实数 - 如何确定是否需要 float 或 double?

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

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

我知道精度因架构而异。 是否有任何 C/C++ 函数来确定正确的数据类型?

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

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

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

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

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

这导致了以下策略:

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

我认为您的问题预设了一种在不损失精度的情况下为 C/C++(或任何其他程序)指定任何“实数”的方法。

假设您通过在代码中指定或通过用户输入获得这个实数; 检查浮点数或双精度数是否足以在不损失精度的情况下存储它的方法是仅计算有效位的数量,然后根据浮点数和双精度数的数据范围进行检查。

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

此外,还有一些数字,例如0.9 , float / double 理论上不能“完全”表示))至少在我们的二进制计算范式中不是) - 请参阅Jon Skeet 对此的出色回答。

最后,请参阅有关 float 与 double 的其他讨论。

精度不是很依赖平台。 尽管允许平台不同,但float几乎是普遍的IEEE 标准单精度,double双精度

单精度在小数点(小数点)后分配 23 位“尾数”或二进制数字。 由于点之前的位始终为 1,因此这相当于 24 位小数。 除以 log2(10) = 3.3,浮点数得到7.2 位十进制数的精度。

遵循相同的过程double产生 15.9 位数字和long double产生 19.2(对于使用 Intel 80 位格式的系统)。

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

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

一个非常详细的帖子,可能会也可能不会回答您的问题。

浮点复杂性的整个系列

您不能用 float 或 double 变量表示实数,而只能表示有理数的子集。

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

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

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

float f = value;
double d = value;
if ((double)f == d)
{
     // float is sufficient
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM