鉴于真实价值,我们是否可以检查float
数据类型是否足以存储该数字,还是需要double
?
我知道精确度因建筑而异。是否有任何C / C ++函数来确定正确的数据类型?
答案 0 :(得分:4)
有关背景信息,请参阅What Every Computer Scientist Should Know About Floating-Point Arithmetic
不幸的是,我认为没有办法让决策自动化。
通常,当人们用浮点而不是字符串表示数字时,意图是使用数字进行算术运算。即使所有输入都以可接受的精度适合给定的浮点类型,您仍然必须考虑舍入误差和中间结果。
实际上,大多数计算都可以使用64位类型以足够的精度获得可用结果。许多计算仅使用32位无法获得可用的结果。
在现代处理器中,总线和算术单元足够宽,可以提供32位和64位浮点类似的性能。使用32位的主要动机是在存储非常大的数组时节省空间。
这导致以下策略:
如果数组足够大以证明花费大量精力来减小其大小,请进行分析和实验以确定32位类型是否提供足够好的结果,如果是这样,则使用它。否则,请使用64位类型。
答案 1 :(得分:3)
我认为你的问题预设了一种方法,可以在没有精确损失的情况下为C / C ++(或任何其他程序)指定任何“实数”。
假设您通过在代码中或通过用户输入指定实数来获得此实数;检查浮点数或双精度是否足以存储它而没有精度损失的方法是仅计算有效位的数量并检查浮点数和双精度数据范围。
如果数字是作为表达式(即1/7
或sqrt(2)
)给出的,您还需要检测方法:
更重要的是,有些数字,例如0.9
,浮点数/双数在理论上不能代表“完全”,至少不在我们的二进制计算范例中) - 参见Jon Skeet's excellent answer on this.
答案 2 :(得分:2)
精确度与平台无关。虽然允许平台不同,但float
几乎普遍IEEE standard single precision而double
是double precision。
单精度分配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位数,或者如果有限精度表示是合适的,这实际上超出了问题的范围。这取决于算法和应用程序。
答案 3 :(得分:1)
答案 4 :(得分:0)
您不能用float或double变量表示实数,而只能表示有理数的子集。
当您进行浮点计算时,您的CPU浮点单元将为您决定最佳近似值。
我可能错了,但我认为float(4字节)和double(8字节)浮点表示实际上是独立于comp架构而指定的。
答案 5 :(得分:0)
难道您不能简单地将其存储到float
和double
变量中,而不是比较这两个变量吗?这应该隐含地将float
转换回双倍 - 如果没有差异,float
就足够了吗?
float f = value;
double d = value;
if ((double)f == d)
{
// float is sufficient
}