如何解决Float.MIN_VALUE和Float.MIN_NORMAL之间的区别? [重复]
| 这个问题已经在这里有了答案:解决方法
第一个问题的答案是重复的。
第二个问题的答案是:
浮点数和双打数都没有无限的精度。您可以方便地认为它们的精度约为16位。超过此限制的所有内容都将导致舍入错误和截断。
因此,1.0e0 + 1e-38由于会舍弃多余的精度,因此除了以1.0e0结尾以外,将无法执行任何操作。
与其他答案一样,它确实需要了解IEEE格式的浮点数实际上是如何以二进制形式添加的。基本思想是二进制浮点数的非符号和指数部分在CPU的IEEE-754单元中进行了移位(Intel上为80位宽,这意味着在末尾总是会截断)计算)代表其实数。以十进制表示,如下所示:
位数:1 234567890123456
值:1.0000000000000000000000000000 ... 0000
值:0.0000000000000000000000000000 ... 0001
处理完添加后,实际上是:
位数:1 234567890123456
值:1.0000000000000000000000000000 ... 0001
因此,请记住,该值会在16位数字标记附近截断(以十进制表示,在32位浮点数中恰好是22个二进制数字,在64位双精度数中恰好是51个二进制数字,而忽略了非常重要的事实前导1被移位(相对于指数)并被假定(有效地将23位二进制数字压缩为32位的22和22位的52压缩为51),这是很有趣的一点,但是您应该阅读更多详细示例,例如此处的详细信息)。
截断:
位数:1 234567890123456
价值:1.00000000000000000000
请注意,非常小的小数部分将被截断,因此保留1。
当我在考虑内存中的实际表示时遇到问题时,可以使用以下页面:十进制到32位IEEE-754格式。在该站点中,还有指向64位的链接,并且反向链接。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。