浮点型和双精度型有什么区别?

528

我已经了解了双精度和单精度之间的差异。然而,在大多数情况下,floatdouble 似乎可以互换,也就是说,使用其中一个似乎不会影响结果。这是真的吗?何时可以用浮点数和双精度互换?它们之间有什么区别?

14个回答

3

内置的比较操作在比较两个浮点数时,由于数据类型(即float或double)的不同,可能会导致不同的结果。


1
量化上,正如其他答案所指出的那样,不同之处在于类型 double 的精度约为类型 float 的两倍,并且范围大三倍(取决于您如何计算)。
但更重要的是定性差异。类型 float 具有良好的精度,通常足以满足您的需求。另一方面,类型 double 具有卓越的精度,几乎总能满足您的需求。
结论是:你应该几乎总是使用类型 double。除非您有特别特殊的需求,否则几乎永远不应该使用类型 float
众所周知,“舍入误差”在浮点运算中经常是一个问题。舍入误差可能很微妙,难以追踪和修复。大多数程序员没有时间或专业知识去追踪和修复浮点算法中的数值误差 - 因为不幸的是,每个不同的算法的细节最终都会有所不同。但是,类型为double的精度足够高,因此大部分时间你不必担心。你仍然会得到良好的结果。另一方面,使用类型float时,舍入误差看起来会引发令人警惕的问题。
代码中的 floatdouble 类型之间并不一定有不同的执行速度。在大多数今天的通用处理器上,对类型 floatdouble 的算术运算需要的时间基本相同。所有操作都是并行进行的,因此您不必为类型 double 的更大范围和精度付出速度惩罚。这就是为什么安全地建议您几乎永远不要使用类型 float:使用 double 不应该影响速度,而且不应该占用太多空间,并且肯定会从精度和舍入误差的负担中获得好处。
话虽如此,当您在微控制器上进行嵌入式工作或编写针对 GPU 进行优化的代码时,您可能需要使用类型 float。在这些处理器上,类型 double 可能会明显变慢,或者根本不存在,因此在这些情况下,程序员通常选择类型 float 来提高速度,并可能在精度方面付出代价。

1
如果你从事嵌入式处理工作,最终底层硬件(如FPGA或某些特定的处理器/微控制器型号)将在硬件中实现浮点运算,而双精度将使用软件例程。因此,如果浮点精度足以处理需要,那么使用浮点比使用双精度更快地执行程序。正如其他答案所指出的那样,请注意累积误差。

-2

与整数 int 不同的是,浮点数 float 有一个小数点,而双精度浮点数 double 也一样。 但两者之间的区别在于,doublefloat 更详细,可以有两倍数量的小数点后数字。


6
这并不是那个意思。实际上它的意思是整数位数字的两倍,而且超过两倍。小数位和精度之间的关系不是线性的:它取决于数值本身,例如0.5是准确的,但0.33333333333333333333就不是。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接