我读过关于双精度和单精度之间的区别。然而,在大多数情况下,float和double似乎是可互换的,即使用其中一个似乎不会影响结果。事实真的如此吗?什么时候浮点数和双精度数可以互换?它们之间有什么区别?


当前回答

浮点数的精度比双精度数低。虽然你已经知道了,但为了更好地理解,请阅读《关于浮点算术我们应该知道什么》。

其他回答

双精度为64,单精度为64 (float)是32位。 double有一个更大的尾数(实数的整数位)。 任何不准确的地方都将在double中减小。

以下是标准C99 (ISO-IEC 9899 6.2.5§10)或c++ 2003 (ISO-IEC 14882-2003 3.1.9§8)标准所说的:

浮点数有三种类型:浮点数、双精度浮点数和长双精度浮点数。double类型提供的精度至少与float类型相同,long double类型提供的精度至少与double类型相同。float类型的值集是double类型值集的子集;double类型的值集是long double类型值集的子集。

c++标准增加了:

浮点类型的值表示是由实现定义的。

我建议你看一看优秀的《每个计算机科学家都应该知道浮点算术》,它深入介绍了IEEE浮点标准。您将了解表示细节,并将意识到在量级和精度之间存在权衡。浮点表示的精度随着幅度的减小而增加,因此-1到1之间的浮点数具有最高的精度。

与整型(整数)不同,浮点数有小数点,双精度浮点数也有。 但两者之间的区别在于,double类型的细节是float类型的两倍,这意味着它的小数点后的数字可以是小数点后的两倍。

内置比较操作的不同之处在于,当你用浮点数比较两个数字时,数据类型的差异(即浮点数或双精度数)可能会导致不同的结果。

如果使用嵌入式处理,最终底层硬件(例如FPGA或某些特定的处理器/微控制器模型)将在硬件中优化实现float,而double将使用软件例程。因此,如果浮点数的精度足以满足需求,则使用浮点数执行程序的速度将比使用浮点数执行程序的速度快几倍。正如在其他答案中提到的,要小心累积错误。