【问题标题】:Java Why is converting a long (64) to float (32) considered widening?Java为什么将long(64)转换为float(32)被认为是加宽?
【发布时间】:2013-02-20 04:19:15
【问题描述】:

正如它从 oracle 中所说的那样

参考来自 Oracle Docs

扩大原始转换 原始类型的 19 种特定转换称为扩展原始类型转换:

  1. byte 到 short、int、long、float 或 double
  2. 短于 int、long、float 或 double
  3. char 转换为 int、long、float 或 double
  4. int 到 long、float 或 double
  5. 长时间浮动或加倍
  6. 浮点数加倍

如果一个浮点数有 32 位,而一个长整数有 64 位,那如何认为是加宽?这不应该被视为缩小范围吗?

【问题讨论】:

  • 我认为它与精度有关。我只能这么想:)
  • 我不明白你的问题:如果 long 有 32 位,而 long 有 64 位,那如何认为是扩大?这不应该被认为是缩小范围吗? long 数据类型是 java 中的 64 位有符号二进制补码整数。请参考以下链接:docs.oracle.com/javase/tutorial/java/nutsandbolts/…
  • 你说“如果 long 有 32 位,而 long 有 64 位”......请下定决心
  • 对不起,我有一个错字。查看修改后的问题
  • 最有价值的问题。间接地,我得到了一个长期运行问题的解决方案。谢谢

标签: java promotions


【解决方案1】:

floatdouble 可以表示的值范围远大于long 可以表示的范围。虽然从long 转换为float 时可能会丢失有效数字,但它仍然是一种“扩大”操作,因为范围更广。

来自Java Language Specification, §5.1.2

将 int 或 long 值转换为 float,或将 long 值转换为 double,可能会导致精度损失 - 也就是说,结果可能会丢失值的某些最低有效位。在这种情况下,生成的浮点值将是整数值的正确舍入版本,使用 IEEE 754 舍入到最近模式(第 4.2.4 节)。

请注意,double 可以准确地表示所有可能的 int 值。

【讨论】:

  • @Mrshll187 - 实际上,float 是 32 位,其中 8 位是指数。只有 24 位可用于表示尾数。我不知道“我可以达到 64 位”是什么意思。浮点数可以表示 1.40129846432481707e-45 到 3.40282346638528860e+38 范围内的一些数字(以及一些特殊值,如 NaN 和 ±infinity)。 long 可以表示 -9,223,372,036,854,775,808 到 +9,223,372,036,854,775,807 范围内的所有数字。您可以将每个类型名称视为数字子集的名称。子集重叠,但每个子集都有其他元素不存在。
  • 谢谢特德!当我在思考比特时,我很难理解这一点。
【解决方案2】:

它被认为是扩大,因为floatdouble 可以表示比long 更大的值。您可能会丢失精度,但可以(至少近似地)表示该值。

【讨论】:

    【解决方案3】:

    它被认为是加宽,因为可以用 float 表示的数字大于可以用 long 表示的数字。仅仅因为 float 使用 32 位精度并不意味着它可以表示的数字仅限于 2^32。

    例如 float (float)Long.MAX_VALUE+(float)Long.MAX_VALUE 大于 Long.MAX_VALUE,即使 float 的精度低于 long。

    【讨论】:

      【解决方案4】:

      如果您简单地看待这个问题,它是关于原始设计者如何表示数据

      long(64) 的理想位深度大于 float(32)。但浮点数据已使用scientific notion 表示 这允许表示相当大的范围

      如:300【原数】:3×102【科学表示】


      长:-2^63 到 2^63-1

      浮点数:(-3.4)*10^38 到 (3.4)*10^38

      请注意 Long(2 的幂)与 Float(10 的幂)的表示差异,这允许浮点具有更高的范围

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2011-11-08
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 2011-01-13
        • 2011-06-17
        • 2011-12-22
        相关资源
        最近更新 更多