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 0101000S    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基本上没有影响

  因此会是死循环!!!

时间: 2024-10-17 15:01:05

Float之谜的相关文章

Java常见问题3:周期之谜

谜24 byte是有符号的.范围是-128 - 127. 而0x90是int类型. 比較的时候.不相等. 假设想让其相等,须要进行类型转换:(byte & 0xff) 或者 (byte)0x99. 谜题25 自增运算符对循环的影响.j = j++,先赋值. 谜题26 Integer.MAX_VALUE加一之后会变成Integer.MIN_VALUE.这对循环会有影响. 能够考虑使用long来表示i变量,或者使用效率更高的i != Integer.MAX_VALUE. 谜题27 (-1 <&l

Java解惑三:循环之谜

谜题24 byte是有符号的,范围是-128 - 127.而0x90是int类型.比较的时候,不相等. 如果想让其相等,需要进行类型转换:(byte & 0xff) 或者 (byte)0x99. 谜题25 自增运算符对循环的影响.j = j++,先赋值. 谜题26 Integer.MAX_VALUE加一之后会变成Integer.MIN_VALUE,这对循环会有影响. 可以考虑使用long来表示i变量,或者使用效率更高的i != Integer.MAX_VALUE. 谜题27 (-1 <<

Microsoft HoloLens 技术解谜(下)

读者提问之“HoloLens 的深度传感器有没有可能是基于 TOF?” 先介绍下背景知识,市面上常见的有三种类型的深度传感器: 结构光,这个技术的代表产品是 Kinect 一代,它的传感器芯片用的是 PrimeSense 家的.说句题外话,PrimeSense 现在是苹果旗下的公司,这个领域未来一定会很精彩. TOF,time-of-flight,代表产品是 Kinect 二代,由于微软对于 One 这个单词的热爱,它的官方名字是 Kinect One,有点混乱是吧? 双目摄像头,代表产品是 G

CUFFT 高速运行之谜

最近在做并行计算, 应用的是典型的计算快速傅立叶变换 FFT, 程序设计的环境是 Window7, GTX 660ti  使用的软件操作是  CUDA 6.0, OpenCL1.2 , VC2005 笔者试图破解 CUFFT 高速运行之谜, 但很遗憾未能如愿, 其探索过程却有颇多趣味, 写出来与诸位亲们共勉. 实验设计是这样的, 笔者要做规模为 2048 的 FFT 做512 次, 这样得到的结果用 matlab 来衡量程序计算结果的正确性. 在保证正确性的条件下, 测量程序中 512次规模为2

float类型如何转换为string类型

在一些很大的float类型的地方会用科学记数法表示,这个时候如果想完整记录下来,还是得转字符串,这里书写一个float类型转string类型的方法 <?php function float_to_string($float=0) { if(stripos($float, "e")!==false) { $tmp = explode("e",strtolower($float)); $float=bcmul($tmp[0], bcpow(10, $tmp[1])

CSS学习之float解析

转自:http://www.w3cplus.com/css/float.html 一.float是什么? float即为浮动,在CSS中的作用是使元素脱离正常的文档流并使其移动到其父元素的“最左边”或“最右边”.下面解释下这个定义中的几个名词的概念: 文档流:在html中文档流即为元素从上至下排列的顺序. 脱离文档流:元素从正常的排列顺序被抽离. 最左边/最右边:上述的移动到父元素最左和最右是指元素往左或往右移动直到碰到另一个浮动元素或父元素内容区的边界(不包括padding). 二.float

Java中的简单浮点数类型float和double不能够进行精确运算

在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { double radius; static final double PI=3.14; public Circle(){this.radius=0;} public Circle(double r){this.radius=r;} public double getArea(){return PI*this

CSS px, em, 和rem; float以及clear(第一篇学习)

px:相对长度,相对于屏幕分辨率: em:相对长度单位,相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸.  任意浏览器的默认字体高都是16px.所有未经调整的浏览器都符合: 1em=16px.那么12px=0.75em,10px=0.625em.为了简化font-size的换算,需要在css中的body选择器中声明Font-size=62.5%,这就使em值变为 16px*62.5%=10px, 这样 12px=1.2em, 10px=1em

我的Android进阶之旅------&gt;Java字符串格式化方法String.format()格式化float型时小数点变成逗号问题

今天接到一个波兰的客户说有个APP在英文状态下一切运行正常,但是当系统语言切换到波兰语言的时候,程序奔溃了.好吧,又是我来维护. 好吧,先把系统语言切换到波兰语,切换到波兰语的方法查看文章 我的Android进阶之旅------>Android[设置]-[语言和输入法]-[语言]列表中找到相应语言所对应的列表项 地址:http://blog.csdn.net/ouyang_peng/article/details/50209789 ================================