9

你认为 Float.MIN_VALUE 等于什么?

下一个代码解释了我过去 5 个小时的去向,试图解决一个错误。

public static void main(String[] args) {
    compareToZero(Float.MIN_VALUE); // Out = true false false
    compareToZero(Float.MAX_VALUE); // Out = true false false

    System.out.println("Float minimum " + Float.MIN_VALUE); // Out = 1.4E-45
    System.out.println("Float maximum " + Float.MAX_VALUE); // Out = 3.4028235E38
}

private static void compareToZero(float value1) {
    System.out.print((value1 > 0) + " ");
    System.out.print((value1 < 0) + " ");
    System.out.print((value1 == 0) + "\n");
}

我没想到浮动的最小值会是一个正值……找不到任何用处。

4

1 回答 1

20

根据Float.MIN_VALUE的文档:

一个保持浮点类型的最小正非零值的常量,2-149。它等于十六进制浮点文字 0x0.000002P-126f,也等于 Float.intBitsToFloat(0x1)。

float虽然名称作为 a的“真正最小值”值得商榷-Float.MAX_VALUE,但我怀疑MIN_VALUE选择它是为了与其他数字类型保持一致。使用名称MIN_RANGE_VALUEMAX_RANGE_VALUE(或类似名称)可能会使差异更加明显。

要理解为什么这是“最小值”,需要了解一点 Java(或IEEE-754)浮点值的工作原理。有了这个见解,在阅读了文档之后,很明显这Float.MIN_VALUE是可以由 float 的尾数和指数分量表示的最小非零值。或者,浮点数可以表示的最小正值。

“真正的最小值”是-Float.MAX_VALUE因为Float.MAX_VALUE表示浮点数的尾数和指数分量可以表示的最大值。由于浮点数的符号存储为离散位,因此此范围限制对于正数和负数都是相同的。

这与 Java(以及大多数 CPU)中整数的工作方式不同:它们使用二进制补码进行编码。(一些计算机系统使用离散符号位,称为“一个补码”,它有两个零整数值:0 和 -0!)

快乐研究!

于 2012-07-10T19:07:39.680 回答