2014-07-20 53 views
0

铸造整数非常简单,额外的位就会消失。Java中的浮点数铸造

但是,理解转换浮点数的底层是什么很重要?我试图阅读关于如何计算浮点数的信息,但我还没有找到解释得很好的信息。至少这是我的借口。尽管尾数的计算有点困难,但我仍能得到基本的想法。

至少到Java 7,我知道浮点数不能用于按位运算。这是有道理的,因为它们是如何存储在内部的。有什么重要的知识需要知道浮点如何操作或被施放?

因此,要总结:

它是重要的,了解浮点整数一样的内部工作?

将浮点数转换为整数的内部过程是什么?

+0

一般来说:是的,理解浮点值如何表示是非常重要的。这是你必读的内容:[每个计算机科学家应该知道的浮点算术](http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+0

我想你在最少知道浮点数如何在各种表示中内部表示的基础知识。否则,只需简单地对待它们,就可能在程序中引入错误。 (直接比较为0,期望不现实的高精度等) –

+0

此博客文章展示了一种将浮点数转换为整数而不使用转换构造的方法。它避免了cast构造,因为其意图是舍入到最近的,但是这使它接近硬件中实现的内容,或者如果没有更好的函数可用于Java,则可以使用Java实现:http:// blog.frama-c.com/index.php?post/2013/05/03/nearbyintf2 –

回答

1

将浮点数转换为整数的内部过程是什么?

Java调用符合IEEE-754标准的机器代码指令。 Java没有这样做。如果你想知道如何铸造作品,我建议你阅读标准。

基本上,尾数是由指数和符号应用。即一个浮点数是sign * 2^exponent *尾数,它所做的全部就是执行这个计算以及下降和小数部分。

0

首先,您需要了解浮点数基本上是一个近似值。你可以输入1.23和1.229998(或者这样的),因为1.23代表的确切。不管你是否会做任何演员,你都需要了解它,以及它如何影响计算(尤其是比较)。

从演员的角度看,铸造floatdouble不会造成信息的丢失,因为double可以包含一个float可以包含每一个值。但是从doublefloat可能会导致精度损失(对于非常大或小的数字,指数上溢/下溢),因为64位值中的信息比32位中的更多,所以有些数据正在运行结束“在地板上”。

类似地,从一个intdouble原因没有信息损失铸造,由于double可以包含每一个值可以int含有,然后一些。但是从intfloat或从longdoublefloat可能导致精度损失(尽管永远不会有指数上溢/下溢)。

floatdouble投射到intlong极易造成上溢/下溢和数据的重大损失,如果floatdouble值具有大的正指数或任何负指数。当然,当你从浮点数到固定数时,数的小数部分被截断(本质上是一个“平面”操作)。