2

我在 C 编程语言中读过很多次,默认情况下任何浮点值的类型都是 double 而不是 float,所以当我们写的时候。

浮动 PI = 3.14;

那么PI 将有一个值 3.14-some_small_value,这是出于精度考虑,因为现在将8 个字节的值分配给4 个字节的变量。谁能解释一下它是如何在内存方面发生的,或者在内部如何改变这些值。

4

1 回答 1

4

在这种情况下,您观察到的变化与从 8 字节格式到 4 字节格式的转换没有太大关系。无论您将其声明为还是,您的PI都会有所不同。值不可能以二进制浮点格式精确表示。4、8 或 1234 字节仍然不足以构建 的精确二进制表示,因为在传统的二进制浮点格式中,这种表示是无限长的3.14floatdouble3.143.14

的精确二进制表示3.14

11.001000111101011100001010001010001111010... = 11.0(01000111101011100001010001)

意味着该01000111101011100001010001部分无限期地一次又一次地重复。当您使用float整个表示时,将被截断(或四舍五入)到 的容量float,而在这种情况下,double它被截断到 的容量double。因此,任何浮点类型都3.14只能表示近似值。double将比 更精确float,但仍不是绝对准确。

这种四舍五入正是in case of和 into 3.14in case of 的结果(来自 GCC 编译器的结果)。您的编译器可能使用不同的舍入策略,导致值略有不同。3.1400001049041748046875float3.140000000000000124344978758017532527446747double

于 2013-07-01T05:03:01.037 回答