【问题标题】:Is there a case when an integer loses its precision when casted to double?是否存在整数在转换为双精度时失去精度的情况?
【发布时间】:2016-04-21 03:21:01
【问题描述】:

假设我有

int i=25;
double j=(double)i;

j 是否有可能具有 24.9999999..upto_allowed25.00000000..._upto_allowed_minus_one_and_then_1 的值。我记得在某个地方读过这样的东西,但无法正确回忆。

换句话说:

是否存在整数在转换为 double 时会丢失精度的情况?

【问题讨论】:

  • 请把你的问题解释得更容易理解。
  • 视情况而定。大多数计算机使用IEEE 754 浮点数,其中精确表示-2⁵³ 和2⁵³ 之​​间的整数。在 ILP32 和 LP64 架构(大多数 32 位和 64 位架构是)上,int 是 32 位的,这意味着 double 类型可以准确地表示所有 int 值。
  • @AdalarasanSachithanantham :抱歉有点乱。查看编辑。

标签: c casting


【解决方案1】:

对于像25 这样的小数字,你很好。对于 ints 的非常大(绝对)值在 int 为 64 位(具有无法以 53 位表示的值)或更大的架构上,您将失去精度。

Double precision floating point number 具有 53 位精度,其中最高有效位(隐式)通常是 1

在浮点表示不是 IEEE-754 的平台上,答案可能会有所不同。有关详细信息,您可以参考 C99/C11 规范的 5.2.4.2.2 章节

【讨论】:

    【解决方案2】:

    IEEE-754 double 的有效位精度为 53 位。这意味着它可以存储 2^53 和 -2^53 范围内的所有有符号整数。

    因为int 在大多数编译器/架构上通常具有 32 位,double 通常能够处理 int

    【讨论】:

    • 比以前好一点。当int 为 16-32(或 53)位和更大时,您应该涵盖这两种情况。那时我很乐意撤回我的投票。
    • 我认为您还需要提供该图表来源的链接。
    • 它仍然说 can store all ints 这是错误的
    • "小于或等于 53 位宽的有符号整数。"是真的,但double 也可以表示“小于或等于 54 位宽的有符号整数”。 754 double 具有 53 位精度(52 位显式存储)一个符号位。如果存在此类类型,这将允许对所有 int54_tuint53_t 进行精确编码。
    • @chux 有 53 位信息可供使用,因此我们只能(以精确的精度)存储 53 位信息。并且由于有符号位导致 0 重复,因此在这种特殊情况下我们只能存储 log2(2^53 - 1) 位。
    【解决方案3】:

    @Mohit Jain 的答案很适合实践编码。

    根据 C 规范,DBL_DIGFLT_RADIX/DBL_MANT_DIGINT_MAX/INT_MIN 是重要的值。

    DBL_DIG 在最大十进制数字中,一个数字在转换为double 和返回时肯定会有相同的值。它是至少 10。所以像 9,999,999,999 这样的整数当然可以转换为 double 并返回而不会丢失精度。可能更大的值也可以成功往返。

    真正的往返问题始于超过+/-power(FLT_RADIX, DBL_MANT_DIG) 的整数值。 FLT_RADIX 是浮点基数(绝大多数是2),DBL_MANT_DIG 是“浮点有效数中基数-FLT_RADIX 的位数”​​,例如带有 IEEE-754 binary64 的 53

    当然int 的范围是[INT_MIN ... INT_MAX]。范围必须至少 [-32767...+32,767]。

    当数学上为power(FLT_RADIX, DBL_MANT_DIG) >= INT_MAX 时,不存在转换问题。这适用于所有符合标准的 C 编译器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      相关资源
      最近更新 更多