【问题标题】:How precision consideration works in C?精度考虑如何在 C 中起作用?
【发布时间】:2013-07-01 05:00:33
【问题描述】:

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

浮动 PI = 3.14;

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

【问题讨论】:

  • 如果有人反对这个问题,那么请提及你的 cmets..
  • 如果没有错,那么转换是实现定义的。
  • 您可能还想阅读this

标签: c type-conversion


【解决方案1】:

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

3.14 的精确二进制表示是

11.001000111101011100001010001010001111010... = 11.0(01000111101011100001010001)

表示01000111101011100001010001 部分无限地重复一遍又一遍。当你使用float 时,整个表示被截断(或四舍五入)到float 的容量,而在double 的情况下,它被截断到double 的容量。出于这个原因,任何浮点类型将仅近似表示3.14double 会比 float 更精确,但仍不是绝对准确。

这种舍入正是将3.14 转换为3.1400001049041748046875 的原因,float3.140000000000000124344978758017532527446747double(来自 GCC 编译器的结果)。您的编译器可能使用不同的舍入策略,导致值略有不同。

【讨论】:

  • PI 将有一个值 3.139998 或类似的值,我只想知道如何在内部将 3.14 更改为 3.139998? :)
  • @user2320537:我不知道你从哪里得到3.139998,但无论如何,实现可以以某种特定于实现的方式舍入该值。在我对 GCC 的实验中,我得到了答案中给出的值。您的编译器可能会对这些值进行不同的舍入,因此您会得到不同的结果。
猜你喜欢
  • 1970-01-01
  • 2013-08-14
  • 2019-07-26
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多