zoukankan      html  css  js  c++  java
  • Float之谜

    先来看几个例子:

    public class Thirtyfirst1{
            public static void main(String[] args){
                    int i = 2000000000;
                    int count = 0;
                    for(float f = i; f < i + 50 ; f ++){
                            count++;
                    }
                    System.out.println(count);
            }
    }

    会输出多少?

    public class Thirtyfirst1{
            public static void main(String[] args){
                    int i = 2000000000;
                    int count = 0;
                    for(float f = i; f < i + 64 ; f ++){
                            count++;
                    }
                    System.out.println(count);
            }
    }

    这个会输出多少?

    public class Thirtyfirst1{
            public static void main(String[] args){
                    int i = 2000000000;
                    int count = 0;
                    for(float f = i; f < i + 65 ; f ++){
                            count++;
                    }
                    System.out.println(count);
            }
    }

    这个输出多少?

    第一题:0

    第二题:0

    第三题:死循环

    再看下面的解析时需要知道浮点数的存储,以及int转float时的步骤(java浮点数剖析

    一、首先看看2000000000的二进制

    01110111  00110101  10010100  0(0000000)

    括号内为转换成浮点数后要舍弃的尾部

    转换成浮点数后

    0  10011101  11011100 11010110 0101000
    S    E          M(23位)

    二、然后观察2000000000+64

    01110111  00110101  10010100  0(1000000)

    转换成浮点数

    0  10011101  11011100 11010110 0101000

    发现和2000000000的浮点存储一模一样

    三、然后观察2000000000+65

    01110111  00110101  10010100  0(1000001)

    显然

    01110111  00110101  10010100  0

    01110111  00110101  10010100  0(1000001)
    01110111  00110101  10010100  1

    显然中间的数更接近下面的数,因此浮点化之后

    0  10011101  11011100 11010110 0101001

    比2000000000的浮点存储大1

    因此前两个程序打印0就可以理解了(重点要知道怎么转化成浮点数,以及怎么舍弃尾部)

    四、1的浮点表示

    0  01111111  0000000 00000000 00000000

    五、浮点数的加减运算

    对阶:

      阶差位30

      故f++对f基本上没有影响

      因此会是死循环!!!

  • 相关阅读:
    学习进度(2)
    模拟退火 [JSOI2004]平衡点 / 吊打XXX
    快读快写 O3 优化
    卡特兰数(Catalan)公式、证明、代码、典例
    树状数组 :单点修改,区间查询
    倍增 [模板]最近公共祖先LCA
    对测 【模拟】
    对测 【离线DP+二分】
    模拟退火 (骗分算法)
    基础数论入门
  • 原文地址:https://www.cnblogs.com/qionghua520/p/4378989.html
Copyright © 2011-2022 走看看