浮点数的精确度的探究

21 篇文章 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值