-0.0 与 IEEE 754浮点标准

本文介绍了IEEE 754浮点数标准在Java中的应用,探讨了浮点数的表示方式,包括规格化和非规格化数,以及特殊值如NaN、无穷大。还讨论了浮点数的舍入规则和运算中的数学特性,强调了舍入对运算结果的影响及特殊值的运算规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言


本文针对的是IEEE 754标准,同时测试使用的是遵循IEEE 754标准的Java语言。


问题


也许你在Java中使用浮点数时也碰到了这样的情况:

+0.0 + -0.0 = +0.0
+0.0 - -0.0 = +0.0
-0.0 + -0.0 = -0.0
-0.0 - -0.0 = +0.0
-1.5 * +0.0 = -0.0
+1.5 * -0.0 = -0.0

“-0.0”是哪里来的?实际上不只是”-0.0”,Java(IEEE 754)还定义了诸如NaN(Not a Number)、正无穷、负无穷的特殊值。这些值是随着浮点数的表示标准而产生的,但也遵循了一定的数学意义。

本文将初步探讨浮点数的表示、舍入,以及浮点数运算的数学属性。


IEEE 754 浮点数表示


IEEE 754标准是20世纪实际80年代推出的,实际上浮点数运算通常不会太多地关注运算的精确性,而把实现速度和简便性看得更重要。


十进制与二进制


我们都知道计算机的浮点数不能精确表示某些小数,但这究竟是为什么?
这当然不是所谓的“二进制表示法的缺陷”。回想一下,1/3在十进制中如何表示?0.3333….?
任何进制都有小数表示的限制,如十进制所能描述的数值d定义如下:

d=i=nm10idi

仅考虑有限长度的编码,十进制表示法不能准确表达如1/3,1/7这样的数。同样,小数的二进制表示法也只能表示那些能够被写成 d=x2y

的数。由于我们习惯于日常使用的十进制表示法,于是对程序中的浮点数也经常会带有很多错误的偏见。为什么我在这2货程序里无法精确表示0.1这样简单的小数?你应该认识到你面对的就是”2”进制系统。


浮点数表示


位表示


IEEE浮点标准用 V=(1)SM2E 的形式来表示一个数:

  • S(符号):决定数的正负,但对于数值为0的浮点数,符号位解释为特殊情况处理。
  • M(尾数):是一个二进制小数,它的范围是 1 ~ 2 - ϵ 0 ~ 1 - ϵ 。其中的 ϵ 表示一个极小的数,如
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值