实数 – 如何确定是否需要浮点数或双精度数?
给定一个实际值,我们可以检查float
数据类型是否足以存储数字,还是需要double
?
我知道从建筑到建筑的精度各不相同。 是否有任何C / C ++函数来确定正确的数据类型?
有关背景知识,请参阅每个计算机科学家应该知道的关于浮点运算的内容
不幸的是,我认为没有办法让决策自动化。
通常,当人们用浮点而不是字符串表示数字时,意图是使用数字进行算术运算。 即使所有输入都以适当的精度适合给定的浮点类型,您仍然必须考虑舍入误差和中间结果。
实际上,大多数计算都可以使用64位类型以足够的精度来获得可用的结果。 许多计算仅使用32位无法获得可用结果。
在现代处理器中,总线和算术单元的宽度足以提供32位和64位浮点类似的性能。 使用32位的主要动机是在存储非常大的数组时节省空间。
这导致了以下策略:
如果arrays足够大以certificate花费大量精力来减小其大小,则进行分析和实验以确定32位类型是否提供足够好的结果,如果是这样,则使用它。 否则,请使用64位类型。
我认为你的问题预设了一种方法,可以在没有精度损失的情况下为C / C ++(或任何其他程序)指定任何“实数”。
假设您通过在代码中或通过用户输入指定它来获得此实数; 检查float或double是否足以存储它而没有精度损失的方法是只计算有效位的数量并检查float和double的数据范围。
如果数字是作为表达式给出的(即1/7
或sqrt(2)
),您还需要检测方法:
- 如果数字是合理的,是否有重复小数或循环小数 。
- 或者, 当你有一个无理数的时候会发生什么?
更重要的是,有一些数字,例如0.9
,浮点数/双数在理论上不能代表“完全”,至少在我们的二进制计算范例中不是这样) – 请参阅Jon Skeet对此的出色答案。
最后,请参阅有关float与double的其他讨论。
精度与平台无关。 虽然允许平台不同,但float
几乎是普遍的IEEE标准单精度 , 双精度是双精度 。
单精度在小数点(小数点)后分配23位“尾数”或二进制数字。 由于点之前的位始终为1,因此这相当于24位分数。 除以log2(10)= 3.3,浮点数将获得7.2精度的十进制数字 。
对于double
收益率采用相同的处理,16.2位数和long double
收益率为19.2(对于英特尔和大多数使用80位格式的系统)。
除了尾数之外的位用于指数。 指数位数决定了允许的数字范围。 单个变为~10 ±38 ,双变为~10 ±308 。
至于你是需要7位,16位还是19位还是有限精度表示是完全合适的,这实际上超出了问题的范围。 这取决于算法和应用程序。
一个非常详细的post ,可能会也可能不会回答您的问题。
浮点复杂的整个系列 !
难道你不能简单地将它存储到float
和double
变量,而不是比较这两个? 这应该隐含地将float
转换回双倍 – 如果没有差异, float
就足够了?
float f = value; double d = value; if ((double)f == d) { // float is sufficient }
您不能用float或double变量表示实数,而只能表示有理数的子集。
进行浮点计算时,CPU浮点单元将为您确定最佳近似值。
我可能错了,但我认为float(4字节)和double(8字节)浮点表示实际上是独立于comp架构而指定的。