0
点赞
收藏
分享

微信扫一扫

浮点数的精确度的探究

浮点数的精确度的探究

  • 浮点数的内部十分复杂,因此在运行环境中浮点数的运算结果并不一定完全一致的。这是因为如果只是使用符合 IEEE 754 的格式的精确数值进行运算的,CPU 硬件资源就无法被充分使用,运算会非常耗时,
  • 浮点数的在计算机的存放的形式,并不是你所以为的 比如 你认为的 5.0 在计算机中实际存放的数值可能是 4.999997
  • 所以一般不要使用浮点数 作为判断基准,而是使用整数

代码1:

public class Study7 {
    public static void main (String[] args) {
        /*对浮点数的探究*/
        float sum = 0.0F; // F 用于区分默认小数 double 的类型

        for(float x = 0.0F;x <= 1.0F; x+=0.001F ){
            System.out.println("x = "+x);
            sum +=x;
        }

        System.out.println("sum = "+sum);
    }
}


结果1:


解析1:

  • 上述代码中 我是以 x <=1.0F 为循环结束的基准,理论上 x=1.0 才对;
  • 但是;请注意,x 最后的值并不是1.0 , 而是0.9999907。这是因为浮点数**表示时无法保证每一为位都不发生数据的丢失,保证的精度值有限。因此,x 中积累了 1000 个误差的存在;

代码2:

public class Study7 {
    public static void main (String[] args) {
        /*对浮点数的探究*/
        float sum = 1.0F; // F 用于区分默认小数 double 的类型

        for(float x = 0.0F;x!= 1.0F;x += 0.001F){

            System.out.println("x = "+x);
            sum += x;
        }

        System.out.println("sum = "+sum);
    }
}


结果2:


解析2:

  • 结果可想而知,进入了无限的循环当中去了,因为 x 永远无法等于 1.0F 的,原因上面已经简述过了,浮点数的存储表达,保证的精度有限。

代码3:

public class Study7 {
    /*对浮点数的探究*/
    public static void main (String[] args) {
        float sum = 0.0F; // F 用于区分默认小数 double 的类型

        for(int i = 0; i <= 1000; i++) { 

            float x = (float)i / 1000;
            System.out.println("x = "+x);
            sum += x;

        }
        System.out.println("sum ="+sum);
    }
}


结果3:


解析3:

  • for 语句中,变量 i (int) 的值从 0 递增到 1000 。每次循环时,都会将 i 除以 1000 的值赋给 x.这种写法也无法保证 x 能准确的无误地表示实数值,但由于每次循环时都会重新计算 x 的值,因此不会出现像代码 1 的那种累计误差。得到的合计值也是近似于实际值的;

最后:


举报

相关推荐

0 条评论