【问题标题】:Why does converting int to float lose precision in C programming language [duplicate]为什么在C编程语言中将int转换为float会失去精度[重复]
【发布时间】:2021-10-11 21:38:29
【问题描述】:

我运行这段代码

int a, b;
float t;
a = 18642731;  //16777217:16777217 16777216.000000 16777216
t = (float)a;
b = (int)t;
if (a != b)printf("%d %f %d\n", a, t, b);

输出是

18642731 18642732.000000 18642732

编译器是 gcc 9.3.0。 为什么t不是18642731.000000的值

【问题讨论】:

  • 因为IEEE标准见en.wikipedia.org/wiki/IEEE_754
  • 18642731 在二进制中是 1000111000111011100101011 需要 26 位。 IEEE float(单精度)类型具有 24 + 1 位精度。
  • int 和 float 在大多数实现中具有相同的大小,因此很明显,float 具有更大的范围,那么它会失去一些精度。重复:Strange behavior when casting an int to float in CUnderstanding casts from integer to floatCasting int to float changes value
  • 糟糕...单精度 IEEE 浮点具有 23 + 1 位精度。我之前的评论在这方面是错误的。
  • 查看问题的一种简单方法是:在该平台上,ints 和 float 都使用 4 个字节,并且有 4294967296 个可能的不同的四字节字节。有符号整数确实有 4294967296 个不同的值(从 -2147483648 到 2147483647)...如果浮点数能够表示任何整数,那么应该使用什么 4 个字节的组合来表示0.5?它们都已经被整数占用了! ...这意味着如果您可以拥有0.5(不是整数),那么某些整数一定不能用浮点数表示。

标签: c++ c gcc


【解决方案1】:

为什么在 C 编程语言中将 int 转换为 float 会丢失精度

因为float 类型是有限 精度浮​​点类型。它不能代表所有数字。如果将不可表示的数字转换为 float,则会丢失精度。

恰好在您运行程序的系统上,float 无法表示 18642731。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-23
    • 2019-06-01
    • 2015-07-27
    • 1970-01-01
    • 2022-12-31
    • 2021-11-09
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多