nextUp(float)函数Java源码结合浮点型加法原理详解

此文章未经作者允许禁止转载

Java源码结合浮点型加法原理详解(附测试代码、测试结果和详细解析)

【nextUp()函数解读】
如果参数为 NaN,那么结果为 NaN。
如果参数为正无穷大,那么结果为正无穷大。
如果参数为 0,那么结果为 Float.MIN_VALUE
参数:
f - 起始浮点值
返回:
离正无穷大较近的相邻浮点值。

【源码】

public static float nextUp(float f) { 
    if( Float.isNaN(f) || f == FloatConsts.POSITIVE_INFINITY) 
    return f; 
    else { 
        f += 0.0f; 
        return Float.intBitsToFloat(Float.floatToRawIntBits(f)+((f>= 0.0f)?+1:-1)); 
    } 
} 

【源码部分语句解析】
Float.isNaN(f)
Java.lang.Float.isNaN()方法 :
此方法如果此对象所表示的值是NaN,返回true,否则返回false。NaN 实际上就是 Not a Number的简称。0.0f/0.0f的值就是NaN,从数学角度说,0/0就是一种未确定。

FloatConsts.POSITIVE_INFINITY
正无穷大

f += 0.0f
0.0f为浮点型的0即0.0

Float.intBitsToFloat(Float.floatToRawIntBits(f)+((f>= 0.0f)?+1:-1))
Float.floatToRawIntBits() 是将浮点型数字当成整形数字,即32位不变,读数的时候当成整型读。
如果参数为正无穷大,其结果是0x7f800000.
如果参数为负无穷大,其结果是0xff800000.
如果参数为NaN,则结果是表示实际NaN值的整数。
(f>= 0.0f)?+1:-1) 这句话是判断f是否≥0,如果是,在已经变为整型的f最后一位加1,否则减1。
Float.floatToRawIntBits() 是将整型数字当成浮点型数字,即32位不变,读数的时候当成浮点型读。

【浮点数加法规则】
① 对阶,小阶向大阶对齐
② 尾数进行加法运算
③ 结果规格化并进行舍入处理
④ 判断溢出

【测试代码】
在这里插入图片描述

【测试结果及解析】
第一组
在这里插入图片描述
这两个输入的数字都是规格化数字,所以是执行else中的语句。

1.5=1.1(2)
符号位 0 阶码 0(exp 01111111) 尾数10000000000000000000000
1.5f与0.0f阶码相同都是0,所以可以直接相加。0.0在内存中为32位0。
于是相加没有影响,继续执行下一步,1.5大于零,转变为整数后在末尾加1,变为0 01111111 100000000000000000000001,再将这个数变成浮点型读出来,也就是1.5+2-23,2-23=1.19e-7,19部分溢出不要,故最后结果为1.5000001。

2.5=10.1(2)
符号位 0 阶码 1(exp 10000000) 尾数01000000000000000000000
2.5f与0.0f阶码不相同,所以不可以直接相加。0.0在内存中为32位0。
要想相加,需要与2.5解码一致,阶码增大后,尾数右移,但因为都是0,故不变。继续执行下一步,2.5大于零,转变为整数后在末尾加1,变为0 10000000 010000000000000000000001,再将这个数变成浮点型读出来,也就是2.5+2-22,2-23=2.38e-7,38部分溢出不要,故最后结果为2.5000002。

第二组
在这里插入图片描述
第一个数字是规格化数字,第二个数字是非规格化数字。

第一个数字的返回值解析同第一组数字。

第二个数字的表示超出了浮点型能表示的范围,正下溢,但它是一个数并且不是正无穷,故执行else语句。返回浮点型能表示的最小的值,即1.4E-45。

第三组
在这里插入图片描述
第一个数字是规格化数字,第二个数字是非规格化数字。

第一个数字的返回值解析同第一组数字。

第二个数字的表示超出了浮点型能表示的范围,它是正无穷大,正上溢,执行的是if判断条件里的语句,直接返回正无穷即Infinity。因为稍微大于正无穷的精确浮点型还是正无穷,故此返回值符合本函数条件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值