居然是Java,,小班讨论啊

在 JAVA 的 lang.math 库中,提供了一个浮点数的求前序函数,对于输入的浮点数 f_input,输出一个能精确表示的浮点数 f_output,且 f_output>=f_input。

其源代码如下:

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));

            }

}

试分析其原理。

 

二、题目分析:
public static float nextUp(float f) {

    if( Float.isNaN(f) || f == FloatConsts.POSITIVE_INFINITY)

 

    return f;

//如果f是NaN,或者为正无穷返回f本身

  1. Float.isNaN(f):判断浮点数f是否是NAN,即非数字
  2. FloatConsts.POSITIVE_INFINITY:判断浮点数f是否是POSITIVE_INFINITY,即正无穷大

 

    else

    {

           f += 0.0f;

//缺省值就是你在声明变量的时候,如果没有给它赋值,编译器会自动给你所声明的变量赋一个初始值。

     return Float.intBitsToFloat(Float.floatToRawIntBits(f) + ((f >= 0.0f)?+1:-1)); }

     //判断是大于0还是小于0,直接用floatToRawIntBits(f)函数将其转为致二进制码一的int变量,若大于0则对这个二进制值进行加一,frac就会加1,若有进位也会加到exp处,用函数intBitsToFloat将结果转为float型

  1. (f >= 0.0f)?+1:-1)    

         f>=0            Float.floatToRawIntBits(f) + 1

         f<0              Float.floatToRawIntBits(f) - 1

}

 

函数实现的功能:

  • 返回 f 和正无穷大之间与 f 相邻的浮点值
  • 特殊情况如下:
    • NaN,那么结果为 NaN。
    •  
    • 0,那么结果为 Float.MIN_VALUE
    • Float.MIN_VALUE
    • float类型能够表示的最小精度,它的实际定义如下: 
      Java 
      public static final float MIN_VALUE = 1.40129846432481707e-45f; 
      !!!:这是一个正值,比0

    • 参数 :f  --- 起始浮点值
  1. Float.intBitsToFloat:返回指定位表示形式的的float值,即将函数的参数(本身是整数)按照十进制转二进制的方式将其转化为二进制数,该数表示的是浮点数按照IEEE 754标准的表示形式,再将该数分别根据符号位、阶码、尾数的形式转化为浮点数。!请注意,此方法可能无法返回具有float与参数完全相同的位模式的NaN int

      2.Float.floatToRawIntBits(f):返回指定浮点值的表示形式,即将参数f按照IEEE 754标准的表示形式表示为二进制数,将该二进制数转化为十进制数

 

任意两个实数之间是有无穷多个实数,故有实数能把数轴填满一说,而浮点数(双精度类似)与实数不同,两个浮点数之间是只包含有限个浮点数的,换句话说,某个浮点数是存在确定的前序和后序的浮点数的,相邻的两个浮点数之间存在一个距离,这个距离被称为最小精度单位(Unit of Least Precision)或最后位置单位(Unit in the Last Place),简称ULP

Java对于任意一个浮点字面量,最终都舍入到所能表示的最靠近的那个浮点值,遇到该值离左右两个能表示的浮点值距离相等时,默认采用偶数优先(Ties to Even)即选择浮点数的二进制值以0结尾的那个。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值