Java源码系列-Float源码 mainclass.java源代码
lipiwang 2024-10-20 10:13 8 浏览 0 评论
1.类图
2.存储位置
- Float类中的静态属性存储在方法区中的静态区。
- 通过new Float()方法创建出来的对象存储在堆区。
3.了解IEEE 754
3.1 IEEE 754简介
在看Float前需要先了解IEEE 754标准,该标准定义了浮点数的格式还有一些特殊值,它规定了计算机中二进制与十进制浮点数转换的格式及方法。规定了四种表示浮点数值的方法,单精确度(32位)、双精确度(64位)、延伸单精确度(43位以上)与延伸双精确度(79位以上)。 多数编程语言支持单精确度和双精确度,该标准的全称为IEEE二进制浮点数算术标准(ANSI/IEEE Std 754-1985),又称IEC 60559:1989,微处理器系统的二进制浮点数算术(本来的编号是IEC 559:1989)。后来还有“与基数无关的浮点数”的“IEEE 854-1987标准”,有规定基数为2跟10的状况。最新标准是“ISO/IEC/IEEE FDIS 60559:2010”。 Float就是Java的单精度实现。
3.2 IEEE 754单精度浮点数表示
浮点数由三部分组成,分别是符号位s、指数e和尾数f。
在IEEE754标准中,一个规格化的32位浮点数x的真值表示为 x = (?1)s?(1.f)?2(e?127) e = E - 127
其中尾数域所表示的值是1.f。由于规格化的浮点数的尾数域最左位(最高有效位)总是1,故这一位经常不予存储,而认为隐藏在小数点的左边。于是用23位字段可以存储24位有效数。
我们举个例子来看,二进制的“01000001001101100000000000000000”表示的浮点数是啥?
符号位为0,表示正数。
指数为“10000010”,减去127后为3。
尾数对应的值为“1.011011”。
于是最终得到浮点数为“1011.011”,转成十进制为“11.375”。
4.源码解读
4.1 属性说明
public final class Float extends Number implements Comparable<Float> {
// System.out.println(Float.POSITIVE_INFINITY == Float.intBitsToFloat(0x7f800000)); // true
// System.out.println(Float.POSITIVE_INFINITY); ==> Infinity
// 用来表示正无穷大,按照IEEE 754浮点标准规定,任何有限正数除以0为正无穷大,正无穷的值为0x7f800000。
public static final float POSITIVE_INFINITY = 1.0f / 0.0f;
// System.out.println(Float.NEGATIVE_INFINITY == Float.intBitsToFloat(0xff800000)); // true
// System.out.println(Float.NEGATIVE_INFINITY); // -Infinity
// 用来表示负无穷大,任何有限负数除以0为负无穷的,负无穷的值为0xff800000。
public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;
// System.out.println(Float.isNaN(Float.intBitsToFloat(0x7fc00000))); // true
// System.out.println(Float.intBitsToFloat(0x7fc00000)); // NaN
// NaN 用来表示处理计算中出现的错误情况,比如0除以0或负数平方根。对于单精度浮点数,IEEE 标准规定 NaN 的指数域全为 1,且尾数域不等于零的浮点数。它并没有要求具体的尾数域,所以 NaN 实际上不非是一个,而是一族。Java这里定义的值为0x7fc00000。
public static final float NaN = 0.0f / 0.0f;
// System.out.println(Float.MAX_VALUE == Float.intBitsToFloat(0x7f7fffff)); // true
// System.out.println(Float.intBitsToFloat(0x7f7fffff)); // 3.4028235E38
// 用来表示最大的浮点数值,它定义为0x1.fffffeP+127f,这里0x表示十六进制,1.fffffe表示十六进制的小数,P表示2,+表示几次方,这里就是2的127次方,最后的f是转成浮点型。所以最后最大值为3.4028235E38。
public static final float MAX_VALUE = 0x1.fffffeP+127f; // 3.4028235e+38f
// System.out.println(Float.MIN_NORMAL == Float.intBitsToFloat(0x00800000)); // true
// System.out.println(Float.intBitsToFloat(0x00800000)); // 1.17549435E-38
// 1.6开始存在
// 用来表示最小标准值,它定义为0x1.0p-126f,这里其实就是2的-126次方的了,值为1.17549435E-38f。
public static final float MIN_NORMAL = 0x1.0p-126f; // 1.17549435E-38f
// System.out.println(Float.MIN_VALUE == Float.intBitsToFloat(0x1)); // true
// System.out.println(Float.intBitsToFloat(0x1)); // 1.4E-45
// 用来表示浮点数最小值,它定义为0x0.000002P-126f,最后的值为1.4e-45f
public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f
// System.out.println(Math.getExponent(Float.MAX_VALUE) == Float.MAX_EXPONENT); // true
// System.out.println(Math.getExponent(Float.MAX_VALUE)); // 127
// 1.6开始
// 用来表示指数的最大值,这里定为127,这个也是按照IEEE 754浮点标准的规定。
public static final int MAX_EXPONENT = 127;
// System.out.println(Math.getExponent(Float.MIN_NORMAL) == Float.MIN_EXPONENT); // true
// System.out.println(Float.MIN_EXPONENT); // -126
// 1.6开始
// 用来表示指数的最小值,按照IEEE 754浮点标准的规定,它为-126。
public static final int MIN_EXPONENT = -126;
// 用来表示二进制float值的比特数,值为32,静态变量且不可变。
public static final int SIZE = 32;
// 用来表示二进制float值的字节数,值为SIZE除于Byte.SIZE,结果为4字节,表示存储一个Float类型的变量占用4字节。
public static final int BYTES = SIZE / Byte.SIZE;
}
4.2 方法说明
Float构造方法
Float构造方法有3个,第一个是将float但精度浮点数转为Float值,第二个是将double值的双精度浮点数转为单精度浮点数,该转化可能出现精度丢失的情况。 第三个构造方法是将字符串转为单精度浮点数。
public final class Float extends Number implements Comparable<Float> {
public Float(float value) {
this.value = value;
}
public Float(double value) {
this.value = (float)value;
}
public Float(String s) throws NumberFormatException {
value = parseFloat(s);
}
}
toHexString方法
- 该方法是将浮点数转为16进制数的字符串
public final class Float extends Number implements Comparable<Float> {
public static String toHexString(float f) {
if (Math.abs(f) < FloatConsts.MIN_NORMAL
&& f != 0.0f ) {// float subnormal
// Adjust exponent to create subnormal double, then
// replace subnormal double exponent with subnormal float
// exponent
String s = Double.toHexString(Math.scalb((double)f,
/* -1022+126 */
DoubleConsts.MIN_EXPONENT-
FloatConsts.MIN_EXPONENT));
return s.replaceFirst("p-1022#34;, "p-126");
}
else // double string will be the same as float string
return Double.toHexString(f);
}
}
public class FloatDemoTest {
@Test
public void testToHexString() {
System.out.println(Float.toHexString(1.0f)); //0x1.0p0
}
}
valueOf方法
改方法有两个,一个是将字符串转为单精度浮点数,一个是将float值转化为Float对象
public final class Float extends Number implements Comparable<Float> {
public static Float valueOf(String s) throws NumberFormatException {
return new Float(parseFloat(s));
}
public static Float valueOf(float f) {
return new Float(f);
}
}
public class FloatDemoTest {
@Test
public void testValueOf() {
System.out.println(Float.valueOf(1.01f)); // 1.01
System.out.println(Float.valueOf("1.01")); // 1.01
System.out.println(Float.valueOf("+1.01f")); // 1.01
System.out.println(Float.valueOf("-1.01f")); // -1.01
System.out.println(Float.valueOf("1.01F")); // 1.01
System.out.println(Float.valueOf("1.01d")); // 1.01
System.out.println(Float.valueOf("1.01I")); // java.lang.NumberFormatException: For input string: "1.01I"
}
}
parseFloat方法
该是Java中的内置方法,该方法返回一个新的float,该新float初始化为指定的String表示的值,这由Float类的valueOf方法完成。
public final class Float extends Number implements Comparable<Float> {
public static float parseFloat(String s) throws NumberFormatException {
return FloatingDecimal.parseFloat(s);
}
}
isNaN方法
- 该方法是判断是否是非数字的值(NAN), NaN是Not a Number的缩写。
public final class Float extends Number implements Comparable<Float> {
public boolean isNaN() {
return isNaN(value);
}
public static boolean isNaN(float v) {
return (v != v);
}
}
isInfinite与isInfinite方法
- isInfinite()方法用于检查此Float对象的无穷大(即正无穷大或负无穷大)
- isFinite() 方法如果传递的参数是有限浮点数,则返回 true,否则返回 false(在 NaN 和无穷大参数的情况下)。
public final class Float extends Number implements Comparable<Float> {
public static boolean isInfinite(float v) {
return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}
public static boolean isFinite(float f) {
return Math.abs(f) <= FloatConsts.MAX_VALUE;
}
}
public class FloatDemoTest {
@Test
public void testInfiniteAndFinite() {
System.out.println(Float.isInfinite(Float.POSITIVE_INFINITY)); // true
System.out.println(Float.isInfinite(0.05f)); // false
System.out.println(Float.isFinite(0.05f)); // true
System.out.println(Float.isFinite(Float.POSITIVE_INFINITY)); // false
}
}
floatToIntBits方法
Float类中的floatToIntBits()方法是Java中的内置函数,它根据IEEE 754浮点“single format”位布局返回指定浮点值的表示形式。
返回值:该函数返回表示浮点数的整数位。以下是特殊情况:
- 如果参数为正无穷大,则结果为0x7f800000。
- 如果参数为负无穷大,则结果为0xff800000。
- 如果参数为NaN,则结果为0x7fc00000。
public final class Float extends Number implements Comparable<Float> {
public static int floatToIntBits(float value) {
int result = floatToRawIntBits(value);
// Check for NaN based on values of bit fields, maximum
// exponent and nonzero significand.
if ( ((result & FloatConsts.EXP_BIT_MASK) ==
FloatConsts.EXP_BIT_MASK) &&
(result & FloatConsts.SIGNIF_BIT_MASK) != 0)
result = 0x7fc00000;
return result;
}
}
sum/max/min方法
- sum方法是用来计算两个float值之和。
- max方法是用来查找两个float值的最大值。
- min方法是用来查找两个float值的最小值。
public final class Float extends Number implements Comparable<Float> {
public static float sum(float a, float b) {
return a + b;
}
public static float max(float a, float b) {
return Math.max(a, b);
}
public static float min(float a, float b) {
return Math.min(a, b);
}
}
floatToRawIntBits/intBitsToFloat native方法()
- Float类中的floatToRawIntBits()方法是Java中的内置函数,该函数根据IEEE 754浮点“single format”位布局返回指定浮点值的表示形式,并保留Not-a-Number(NaN)值。
返回值:该函数返回代表浮点数的位。但是,有3种特殊情况:
* 如果参数为正无穷大,则结果为0x7f800000。
* 如果参数为负无穷大,则结果为0xff800000。
* 如果参数为NaN,则结果为0x7fc00000。
- Java Float 类的 intBitsToFloat() 方法返回与给定位表示相关的浮点值。根据 IEEE 754 浮点 'single format' 位布局,传递的参数被视为浮点值的表示。
此方法返回具有相同位模式的浮点值。
* 如果传递的参数为 0X7f800000,则返回的结果为正无穷大。
* 如果传递的参数为 0Xff800000,则返回的结果为负无穷大。
* 如果传递的参数在 0x7f800001 到 0x7fffffff 之间的范围内或在 0xff800001 到 0xffffffff 之间的范围内,则返回的结果为 Nan。
public final class Float extends Number implements Comparable<Float> {
public static native int floatToRawIntBits(float value);
public static native float intBitsToFloat(int bits);
}
5.说明
- 需要精确计算时不要使用float和double,如果需要精度计算,请使用BigDecimal
- 不能用浮点数作为循环变量,浮点数不能为循环因子,精度问题会导致 (float)2000000000 == 2000000050为true
- 浮点型数据判断相等不能直接使用,应采用如下方式
float a =...;
float b =...;
if (Math.abs(a-b) < 1E-6f) {
...
}
相关推荐
- Nat. Synthesis: 重大突破,电化学形成C-S键
-
第一作者:JunnanLi,HasanAl-Mahayni通讯作者:AliSeifitokaldani,NikolayKornienko通讯单位:蒙特利尔大学,麦吉尔大学【研究亮点】形成C-...
- 网络安全与应用(二)(网络安全理论与应用)
-
1、应用层安全协议SHTTP和HTTPS:SHTTP:SecHTTP,安全超文本传输协议,是HTTP扩展,使用TCP的80端口。HTTPS:HTTP+SSL,使用TCP的443端口。大部分web应用...
- TN-C、TN-S、TT、IT供电系统详解及对比
-
TN-C、TN-S、TT、IT供电系统是低压配电系统中常见的四种接地方式,它们各自有不同的特点和适用场景。一、系统介绍TN-C供电系统①定义:整个系统中,工作零线(N线)与保护零线(PE线)是合一的,...
- 网络应用服务器(三)(网络应用程序服务器)
-
#头条创作挑战赛#1、DNS协议:域名解析协议,用于把主机域名解析为对应的IP地址。是一个分布式数据库,C/S工作方式。主要基于UDP协议,少数使用TCP,端口号都是53。常用域名如下2、DNS协议...
- 腾讯发布混元Turbo S:业界首次无损应用Mamba架构
-
21世纪经济报道记者白杨北京报道2月27日,腾讯正式发布新一代基座模型——混元TurboS。据腾讯混元团队介绍,混元TurboS在架构方面创新性地采用了Hybrid-Mamba-Transfor...
- 【收藏】低压配电系统中TT IT TN-S/TN-C/TN-C-S 的区别?
-
低压配电系统的接地型式选择是电气安全设计的核心环节,TT、IT、TN-S、TN-C、TN-C-S这五种主要接地型式因其结构、保护原理和故障特性的显著差异,在工程应用中有不同的适用范围和限制条件。如若发...
- 金万维公有云平台如何实现C/S架构软件快速SaaS化
-
金万维作为国内领先的企业信息化垂直B2B平台运营商,拥有超过5000家管理软件合作伙伴,掌握管理软件一线的发展动态,因此深知传统管理软件近年来面对的困境和问题。而SaaS却在软件行业内发展迅猛势如燎原...
- 随时随地做翻译:B/S架构的传奇时代到来
-
随着新兴技术的发展和大数据时代的到来,翻译作为连接各国语言和文化的工具,更是具有前所未有的拓展空间。传统的在计算机辅助翻译软件(CAT)上进行翻译的模式,受到时间和空间的限制,导致翻译过程中面临层层障...
- BS和CS 架构的介绍(一篇就够了)(cs和bs架构的含义)
-
简介C/S又称Client/Server或客户/服务器模式。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或SQLServer。...
- 物管王(包租婆)软件架构与B/S和C/S架构的优点和缺点比较
-
一、B/S系统架构的优点和缺点优点:1)客户端无需安装,有Web浏览器即可。2)BS架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强。3)BS架构无需升级多个客户端,升级服...
- 监听器入门看这篇就够了(怎么检查车上有没有被别人安装监听器)
-
什么是监听器监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。。为什么我们要使用监听器?...
- 购物车【JavaWeb项目、简单版】(java购物车的实现原理)
-
①构建开发环境免费学习资料获取方式导入需要用到的开发包建立程序开发包②设计实体书籍实体publicclassBook{privateStringid;privat...
- 基础篇-SpringBoot监听器Listener的使用
-
1.监听器Listener简介1.1监听器Listener介绍Listener是JavaWeb的三大组件(Servlet、Filter、Listener)之一,JavaWeb中的监听器主要用...
- 你在 Spring Boot3 整合 JWT 实现 RESTful 接口鉴权时是否遇到难题?
-
各位后端开发小伙伴们!在日常使用SpringBoot3搭建项目时,RESTful接口的鉴权至关重要。而JWT技术,作为一种简洁且高效的鉴权方式,被广泛应用。但大家是不是在整合过程中遇到过各...
- javaWeb RSA加密使用(rsa加密java代码)
-
加密算法在各个网站运用很平常,今天整理代码的时候看到了我们项目中运用了RSA加密,就了解了一下。先简单说一下RSA加密算法原理,RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)