java - 从 double 到 float 的 Narrowing 转换的管理规则是什么?
问题描述
从 double 到 float 的转换是否基于大小(十进制范围)?一开始我是这么想的,但是指数部分让我很困惑..那么什么规则控制着这种转换
其次,当从浮点数转换为整数时,规则是否只是取出小数部分?意思是 12.5 * 10^-6 将评估为零?
编辑:
我将以另一种更精确的形式写出我的问题:
在java中将double转换为float的二进制级规则是什么(即缩小转换期间的符号,尾数,指数操作)
这些二进制规则是否对应于十进制规则(人类可读),以便可以根据源(双精度)值预测结果?
将浮点类型规则转换为整数类型时是否有任何类似的规则?
谢谢
解决方案
好的,因为根据评论要求二进制工作:
一般参见https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.2.4
A)double
至float
:
Java 编程语言要求浮点算术表现得好像每个浮点运算符都将其浮点结果四舍五入到结果精度。
所以双精度数舍入到下一个浮点数。转换可以描述如下:
- 保留标志。
- 将
signed int 11
used 作为指数转换为 asigned int 8
。如果这是不可能的,因为它会导致溢出,返回Float.POSITIVE_INFINITY
或Float.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)
所有这些都可以手工完成并因此预测结果吗:是的,当然,否则这些定义将毫无用处。但这需要您使用正在处理的数字的二进制表示,例如“丢弃数字”会根据基数创建不同的结果。
推荐阅读
- android - 来自修复图像的专辑封面
- java - 使用 JavaFX 拖放
- python - twitter bot selenium 不喜欢页面上的所有推文
- outlook-addin - Office js 插件:我可以从 excel 插件发送电子邮件吗?
- r - 使用谷歌驱动器闪亮的交互式文件
- purescript - 具有并发限制的并行(Aff)执行?
- spring-boot - 如何导入具有spring cloud vault客户端依赖的本地外部jar
- attributes - 使用 freeradius 包中的 dhcpclient 实用程序
- python - 派生模型类的模式版本?
- javascript - 使用 POST 请求 JS 模拟按钮单击