我是靠谱客的博主 辛勤手套,最近开发中收集的这篇文章主要介绍java源码分析---Float类(JDK14),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


更多源码分析,请点击


Float

Float 类将基本类型 float 的值包装在对象中。 Float 类型的对象包含一个类型为 float 的属性。

另外,提供了几种将 float 转换为 StringString 转换为 float 的方法,以及其他在处理 float 类型时有用的方法。

Float 类被 final 关键字修饰,不能被继承。Float 类继承自 Number 类,实现了 ComparableConstableConstantDesc 接口。

public final class Float extends Number implements Comparable<Float>, Constable, ConstantDesc {
private final float value;
public static final float POSITIVE_INFINITY = 1.0f / 0.0;
public static final float NEGATIVE_INFINITY = -1.0f / 0.0;
public static final float NaN = 0.0f / 0.0f;
public static final float MAX_VALUE = 0x1.fffffeP+127f;
public static final float MIN_NORMAL = 0x1.0p-126f;
public static final float MIN_VALUE = 0x0.000002P-126f;
public static final int MAX_EXPONENT = 127;
public static final int MIN_EXPONENT = -126;
public static final int SIZE = 32;
public static final int BYTES = SIZE / Byte.SIZE;
public static final Class<Float>
TYPE = (Class<Float>) Class.getPrimitiveClass("float");
}

value 为常量,用于保存 Float 对象所对应的基本类型 float 的值。

POSITIVE_INFINITY 为常量,表示正无穷。

NEGATIVE_INFINITY 为常量,表示负无穷。

NAN 为常量,表示值为 float 类型的非数字值。

MAX_VALUE 为常量,表示 float 类型的值所能表示的最大正数。(2-2-23)·2127

MIN_NORMAL 为常量,表示 float 类型标准浮点数的最小正数。2-126

MIN_VALUE 为常量,表示 float 类型的值所能表示的最小正数。2-149

MAX_EXPONENT 为常量,表示有限双精度变量可能具有的最大指数。

MIN_EXPONENT 为常量,表示归一化双精度变量可能具有的最小指数。

SIZE 为静态常量,用于表示二进制形式的 float 类型所需要的位数。

BYTES 为静态常量,用于表示二进制形式的 float 值所占的字节数。即8个字节。

TYPE 为静态常量,基本类型 floatClass 对象。

toString(float)

返回 float 参数的字符串表示形式。

  • 如果参数为NaN,则结果为字符串“ NaN”。
  • 否则,结果是一个字符串,代表参数的符号和大小(绝对值)。如果符号为负,则结果的第一个字符为’-’(’ u002D’);如果符号为正,则结果中不显示符号字符。至于大小m:
  • 如果m为无穷大,则用字符“ Infinity”表示;因此,正无穷大产生结果“无穷大”,而负无穷大产生结果“-无穷大”。
  • 如果m为零,则用字符“ 0.0”表示;因此,负零产生结果“ -0.0”,而正零产生结果“ 0.0”。
public static String toString(double d) {
return FloatingDecimal.toJavaFormatString(d);
}

toString()

将该对象的值以字符串形式返回。

public String toString() {
return Float.toString(value);
}

toHexString(float)

返回给定浮点数 f 的十六进制字符串表示形式。

如果浮点数 f 是标准化浮点数,即绝对值大于 MIN_NORMAL ,则直接调用 Double.toHexString(double) 方法,点击查看 Double 类源码分析了解详情

如果 f 是非标准化浮点数,即绝对值小于 MIN_NORMAL,即浮点数 f 的指数一定为 -126

  • Math.scalb(double d, int scaleFactor) 的返回值为 d * 2scaleFactor 。在此调用即进行操作 f * 2-1022+126 (即结果为 f 的尾数乘以 2-1022 )。然后调用 Double.toHexString(double) 方法将浮点数转换为16进制表示的字符串。
  • 由于上一步操作给乘了 2-1022 ,所以转换为字符串形式后指数为p-1022,需要将指数转换为p-126。调用 String.replaceFirst() 方法实现。这里通过正则表达式匹配,关于正则表达式点此了解详情
public static String toHexString(float f) {
if (Math.abs(f) < Float.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 */
Double.MIN_EXPONENT-
Float.MIN_EXPONENT));
return s.replaceFirst("p-1022$", "p-126");
}
else // double string will be the same as float string
return Double.toHexString(f);
}

valueOf(float)

float 类型的值转为 Float 对象。

public static Float valueOf(float f) {
return new Float(f);
}

valueOf(String)

将字符串 s 转为 Float 对象。

调用 parseFloat(String) 方法先将字符串 s 转为 Float 类型,然后调用 Float 类的构造方法实现。

public static Float valueOf(String s) throws NumberFormatException {
return new Float(parseFloat(s));
}

parseFloat(String)

将字符串 s 转换为 float 类型的值。 调用 FloatingDecimal.parseFloat(String) 方法实现。

public static float parseFloat(String s) throws NumberFormatException {
return FloatingDecimal.parseFloat(s);
}

isNaN(float)

如果浮点数 v 是NaN,则返回true,否则,返回false。

public static boolean isNaN(float v) {
return (v != v);
}

isNaN()

如果该对象的值是否是 NaN,则返回true,否则,返回false。

public boolean isNaN() {
return isNaN(value);
}

isInfinite(float)

如果浮点数 v 是无穷,则返回true,否则,返回false。

public static boolean isInfinite(float v) {
return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}

isFinite(float)

如果该浮点数的绝对值小于浮点数最大值 MAX_VALUE ,则返回true,否则,返回false(无穷大或者NaN)。

public static boolean isFinite(float f) {
return Math.abs(f) <= Float.MAX_VALUE;
}

isInfinite()

如果该对象的值是无穷,则返回true,否则,返回false。

public boolean isInfinite() {
return isInfinite(value);
}

byteValue()shortValue()intValue()longValuefloatValue()doubleValue() 等方法实现简单,不再赘述。

hashCode(float)

返回浮点数 value 的哈希值。将 value 数据按 bit 转为16进制形式即为哈希值。

public static int hashCode(float value) {
return floatToIntBits(value);
}

floatToIntBits(float)

根据[IEEE 754浮点数标准]([https://baike.baidu.com/item/IEEE%20754/3869922?fr=aladdin](https://baike.baidu.com/item/IEEE 754/3869922?fr=aladdin)),返回指定浮点值的表示形式。(不了解该标准的可以点击链接了解详情)

public static int floatToIntBits(float value) {
if (!isNaN(value)) {
return floatToRawIntBits(value);
}
return 0x7fc00000;
}

floatToRawIntBits(float)

本地静态方法doubleToLongBits(float) 方法的具体实现,具体功能一致。该方法在本地采用C/C++实现。

public static native int floatToRawIntBits(float value);

hashCode()

返回当前对象的哈希值。

public int hashCode() {
return Float.hashCode(value);
}

equals(Object)

将此对象与指定对象进行比较。 当且仅当参数不为null且是一个 Float 对象,floatToIntBits(float) 方法在应用于每个值时返回相同的 int 值时,才将两个 float 值视为相同。

如果d1和d2都表示 NaN ,则即使 NaN == NaN的值为false,equals方法也将返回true。

如果d1表示+0.0,而d2表示-0.0,反之亦然,即使+0.0 ==-0.0的值为true,相等测试的值为false。

public boolean equals(Object obj) {
return (obj instanceof Float)
&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}

intBitsToFloat(int)

本地静态方法,返回对应于给定位表示形式的 float 值。根据IEEE 754浮点“双格式”位布局,该参数被认为是浮点值的表示。

public static native float intBitsToFloat(int bits);

compare(float, float)

比较给定的两个浮点值的大小。

public static int compare(float f1, float f2) {
if (f1 < f2)
return -1;
// Neither val is NaN, thisVal is smaller
if (f1 > f2)
return 1;
// Neither val is NaN, thisVal is larger
// Cannot use floatToRawIntBits because of possibility of NaNs.
int thisBits
= Float.floatToIntBits(f1);
int anotherBits = Float.floatToIntBits(f2);
return (thisBits == anotherBits ?
0 : // Values are equal
(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
1));
// (0.0, -0.0) or (NaN, !NaN)
}

compareTo(Float)

比较当前对象和指定对象的大小。

public int compareTo(Float anotherFloat) {
return Float.compare(value, anotherFloat.value);
}

sum(double, double)max(double, double)min(double, double) 等方法实现简单,不再赘述。

describeConstable()

Constable 接口中的方法。点此了解详情。

@Override
public Optional<Float> describeConstable() {
return Optional.of(this);
}

resolveConstantDesc(MethodHandles.Lookup)

ConstantDesc 接口中的方法,点此了解详情。

@Override
public Float resolveConstantDesc(MethodHandles.Lookup lookup) {
return this;
}

更多源码分析,请点击

最后

以上就是辛勤手套为你收集整理的java源码分析---Float类(JDK14)的全部内容,希望文章能够帮你解决java源码分析---Float类(JDK14)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部