【问题标题】:What are the rules governing Narrowing conversion from double to float?从 double 到 float 的 Narrowing 转换的管理规则是什么?
【发布时间】:2019-05-16 15:10:28
【问题描述】:

从 double 到 float 的转换是否基于大小(十进制范围)? 一开始我是这么想的,但是指数部分让我很困惑.. 那么是什么规则来管理这种转换

第二,浮点数转整数的规则是刚刚取出来的 分数部分?意思是 12.5 * 10^-6 将评估为零?

编辑:

我会用另一种更精确的形式来写我的问题:

  • java中将double转换为float的二进制级规则是什么 (即缩小转换过程中的符号、尾数、指数操作)

  • 这些二进制规则是否对应于十进制规则(人类可读),以便 结果可以根据源(双)值来预测吗?

  • 在将任一浮动类型规则转换为 整数类型?

谢谢

【问题讨论】:

  • 我不确定您所说的“管理该转换”和“管理缩小转换的规则”是什么意思。这种词的组合对我来说没有意义。您是在问 Java 如何从 double 转换为 float 以及从 float 转换为 int 吗?
  • 是的,例如,如果我们将浮点数转换为整数,小数部分将被删除,整数部分将被转换为 long 或 int,无论是保持 int 还是截断最高有效位留下一个不需要原始数字的数字,但是从双精度到浮点如何在二进制级别上完成(ieee 754尾数指数符号)可以为我说明这个想法并消除混淆
  • double 到 float 在二进制级别上的转换相当简单:保留符号,将用作指数的 signed int 11 转换为 signed int 8 并丢弃尾数的最后 29 位(如有必要,四舍五入) .结果,您已将双精度的 1+11+52 位转换为浮点数的 1+8+23 位。
  • 等待@Poohl ....你在我脑海中提出了一个亮点...我现在可以修改我一开始无法准确写出的问题...结果可以预测?我可以根据原始值预测会产生什么值吗?...或者二进制操作不符合十进制人类可读规则? .. 我会编辑原帖
  • @Poohl 是的,但这就是 Java 所做的......?我不知道 Java 是如何进行这两种转换的。只是希望澄清所提出的问题。 @AbdAllah 您可以尝试查看Float.valueOf(double) 的代码(我猜它的名称,应该是这样的)

标签: java casting floating-point type-conversion narrowing


【解决方案1】:

好的,因为根据评论要求二进制工作:

一般见https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.2.4

A)doublefloat

Java 编程语言要求浮点算术表现得好像每个浮点运算符都将其浮点结果四舍五入到结果精度。

所以双精度舍入到下一个浮点数。转换可以描述如下:

  • 保留标志。
  • 将用作指数的signed int 11 转换为signed int 8。如果这不可行,因为它会导致溢出,请返回 Float.POSITIVE_INFINITYFloat.NEGATIVE_INFINITY
  • 并通过舍入舍弃尾数的最后 29 位。

因此,您已将双精度的 1+11+52 位转换为浮点数的 1+8+23 位。

B) 浮点到int:

Java 编程语言在将浮点值转换为整数(第 5.1.3 节)时使用向零舍入,在这种情况下,就像数字被截断一样,丢弃尾数位。

简单来说:写下数字(不是科学计数法)并删除.之外的所有内容

在 PC 中,它可能通过将尾数指数位向适当的方向移动,然后丢弃(而不是四舍五入!)任何剩余的小数来工作。最后,如果浮点数为负,则将结果乘以 -1。简而言之:

 int = float.mantissa << float.exponent * (float < 0 ? -1 : 1)

所有这些都可以手动完成并因此预测结果:是的,当然,否则这些定义将毫无用处。但这需要您使用正在处理的数字的二进制表示,例如“丢弃数字”会根据基数产生不同的结果。

【讨论】:

  • “将signed int 11… 转换为signed int 8”不是正确的描述。指数的编码使用不同的偏差,仅仅移除或移位位是不够的。必须进行算术运算。 (另外,请注意“cast”是一个执行转换的运算符。说“cast x”就像说“asterisk x and y”而不是“multiply x and y”。)此外,这个描述不处理 NaN 或无穷大源,源中的次正规数,或源中正常但目标中次正规的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2015-04-06
  • 1970-01-01
  • 2013-01-06
相关资源
最近更新 更多