java float 运算_java基础之float、double底层运算
目前java遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。
我们来看一段java代码:public class FloatToBinary {
public static void main(String[] args) {
float f1=8.5f;
System.out.println("f1底层数据(十进制):"+Float.floatToIntBits(f1));
int int1=Float.floatToIntBits(f1);
System.out.println("f1底层数据(二进制):"+Integer.toBinaryString(int1));
}
}
打印结果:
f1底层数据(十进制):1091043328
f1底层数据(二进制):1000001000010000000000000000000
我们知道float与double分别在内存中占有32位和64位,见下:
符号位阶码尾数长度
float182332
double1115264
IEEE浮点数表示标准:
V = (-1)s×M×2E
E = e-Bias
其中Bias表示偏移量,float的偏移量为Bias=2k-1-1=28-1-1=127,double的偏移量为Bias=210-1=1023
浮点数在计算机中存储时,按照二进制科学计数法拆分为三个部分:符号位、指数部分和尾数部分。如下图所示:
存储时,按照最高位存储符号位,次高位存储指数部分,低位存储尾数部分的次序存储。存储时的排列示意图如下:
float类型的内存分布如下图所示:
double类型的内存分布如下图所示:
编码规则
在实际存储时要对使用二进制科学计数法表示的浮点数值的符号位、指数部分和尾数部分进行编码处理。一般需要分为规约形式的浮点数、非规约形式的浮点数和特殊值三种类型进行编码。其编码前后处理如下图所示:
注:非规约浮点数主要用于扩大0值附近的浮点数表示范围,非规约浮点数的绝对值均小于规约浮点数的绝对值,即前者在实数轴上更靠近0,这样可以提高0附近的计算精度;一般C、C++中float和double的取值范围都是按照规约浮点数定义的,MSDN文档和相关教材也是这么说的,但部分编译器按照ANSI/IEEE Std 754-1985标准实现了非规约浮点数,本文末尾留有程序示例说明。
符号位:0表示正数,1表示负数;
指数部分: float的偏移量为2^8 - 1,double的偏移量为2^11 - 1;
尾数部分:实际尾数部分中的小数点后的数值,规约浮点数使用标准的二进制科学计数法表示,其尾数范围在 [1,2),非规约浮点数的尾数部分范围在(0,1)。
上面的理论在哪里都能看到,这只是IEEE754的定义而已,我们来实际用一下它是怎么表达小数的:
①求单精度8.5f 的二进制 过程。
首先8.5是正数所以符号位为0;
然后化为二进制,1*2^3+0*2^2+0*2^1+0*2^0 (整数部分) . (小数点) 1*2^-1小数部分简化为1000.1
要把二进制数变成(1.f)*2^(exponent)的形式,其中exponent是指数即1.0001*2^3.
然后我们得到阶码为e=3+127=130 即阶码表示二进制为10000010.
余下小数0001,我们补齐至23位即00010000000000000000000。
这样符合结构 符号位 0 阶码 10000010 尾数00010000000000000000000
然后我们来看一下8.5存储在内存中01000001000010000000000000000000
因为java.lang.Integer.toBinaryString() 方法返回一个字符串表示的整数参数,以2为底的无符号整数,所以在开始的程序打印结果我们添加一个0,与我们算出的结果就相同了。
网上有很多关于float、double的转换解说,这里只是我涉及到了这块,然后自己去学习了一下,其实刚开始我看理论知识比较晕,后来看到别人以列子详细解说,然后再回头看理论,就发现也没那么难了。
java float 运算_java基础之float、double底层运算相关推荐
- java表达式语句_Java基础知识笔记第三章:运算符表达式语句
算术运算符与表达式 操作符描述例子 + 加法 - 相加运算符两侧的值 A + B 等于 30 - 减法 - 左操作数减去右操作数 A – B 等于 -10 * 乘法 - 相乘操作符两侧的值 A * B ...
- java数据类型后缀_java基础知识---基本数据类型
1)四种整数类型(byte.short.int.long): byte:8 位,用于表示最小数据单位,如文件中数据,-128~127 short:16 位,很少用,-32768 ~ 32767 int ...
- java 绘制长方形_Java基础之在窗口中绘图——绘制直线和矩形(Sketcher 2 drawing lines and rectangles)...
控制台程序. import javax.swing.JComponent; import java.util.*; import java.awt.*; import java.awt.geom.*; ...
- java float四舍五入保留两位小数_java基础入门-float四舍五入保留两位小数注意的地方...
float四舍五入保留两位小数注意的地方 最近在codewars做了一道非常简单的题目,但是它却花了我20来分钟,虽然最后解决了,但是中间发觉对于java的基础实在不行,回去要好好补一下 不说这么多, ...
- java long 除法运算_java基础知识学习文档二
一.基本概念 1 对象: 对象是Java类的一个实例,它有状态.属性.行为.如:一个人,具体的某一个人是人类的一个实例.这个人他有名字.性别.年龄等属性,他可以吃饭.说话.走路等行为. 2 类: 类是 ...
- java numberformat异常_Java NumberFormat格式化float类型的bug
首先,这个NumberFormat这个类,可以格式化各种数字.你只要稍微设置一下,结果还是很理性的. 但是,他有那么一丢丢的bug,不知道你知道不? /** * 2.3F经过格式化,竟然变成2.99啦 ...
- java 基础运算_Java 基础 运算符
Java运算符 运算符:是一种用于对数据进行运算,赋值,比较的特殊符号. Java语言中运算符总共分为以下几大类: 算术运算符:+ - * / ++ -- 示例如下代码: 1 public class ...
- java super用法_Java基础面试题汇总
blog.csdn.net/ThinkWon/article/details/104390612 Java概述 何为编程 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结 ...
- 在java中蓝色_Java基础
cmd命令符 dir:显示当前文件夹下的子文件 cd..:后退上一级的文件 cd 子文件:跳到子文件 cd/:直接跳到根目录 盘符: :跳到相关盘 万能的Tab键:补齐 Java环境配置 1.官网下载 ...
- java冰法_Java基础学习笔记二 Java基础语法
注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /*这是 * 一段注释, * 它跨越了多个行*/ public void ...
最新文章
- 裴礼文数学分析中的典型问题与方法第4章一元函数积分学练习
- asp.net mysql 事务_ASP.NET Core 1.0 使用 Dapper 操作 MySql(包含事务)
- [Leetcode][第120题][JAVA][三角形最小路径和][动态规划][递归]
- Linux下数据传输安全与加密
- 计算机教学软件cai,计算机毕业论文cai教学软件中数据的分割
- android自定义软键盘
- 远程连接到 SQL Server 2005 时的问题汇集!!
- flowable 监听器中无法获取 oauth 上下文对象
- 遗传算法图解_遗传算法图解指南
- afuwin64教程_华硕主板BIOS降级强刷教程
- 调起百度地图客户端之导航功能
- ECharts南丁格尔图
- ubuntu安装及使用笔记
- js导出WORD设置分页
- PM at Google —— 最全产品经理常用术语及知识点,建议收藏!
- axios中put的参数怎么传_iOS开发之如何通过PUT请求上传数据
- 【开发教程9】疯壳·人形街舞机器人-整机代码
- Docker容器安装ssh
- Hdmi光纤线标准最高支持8K 60Hz、4K 120Hz、10K@120Hz分辨率的传输
- 中文文本分类的java包_java实现中文文本分类