java中float的最小值是正的为什么?

时间:2012-03-17 02:55:06

标签: java

当我们在java中的任何一个基本类型上使用MIN_VALUE函数时,它为我们提供了该类型的最小值。 但 在float和double的情况下,它返回最小正值虽然float和double也可以有负值。

4 个答案:

答案 0 :(得分:29)

MIN_VALUE告诉你浮点数的精确程度,但不能表示它可以表示的数学最小值。他们应该把它命名为更好......

MAX_VALUE的负数是浮点数的最小值(同样是双数)。

您可以假设这与数字如何用二进制表示的原因有关:

Java float和double使用符号位表示负值/正值,而不是两个整数的补码表示。这意味着它的正负值具有相同的幅度,即。 - (最大正值)=负最大值因此,您不需要为浮点数定义实际的数学最小常量,因为您可以使用正的最大常量来确定负限值。对于整数,由于它们以二进制表示的方式,您需要2个不同的常量来定义最大值/最小值,即-max!= min。

了解更多信息http://people.uncw.edu/tompkinsj/133/numbers/Reals.htm

答案 1 :(得分:14)

MIN_VALUE应该命名为EPSILON,它是浮点数可以表示的最小正值。

因为float使用符号幅度编码,所以float可以表示的最低值为-MAX_VALUE

答案 2 :(得分:3)

  

java中float的最小值为正?为什么?

为什么他们选择命名这样的常数是无法回答的(由我们),因为决策时,SO上没有人在场。

此外,知道问题的答案并没有帮助,因为Float.MIN_VALUEDouble.MIN_VALUE的值不会改变,无论它们有多么“错误”。 (它会破坏使用这些常量的任何现有代码,而Java设计者只有在没有其他可行替代方案时才会这样做。单独留下它显然是一种可行的选择。)

我想,答案(即决定的真正原因)可能与开发全新编程语言的人有关。然而,无论如何,他们将不得不自己决定。 FWIW,我不会这样设计,但那不相关。

答案 3 :(得分:2)

可能的解释可能是Java只使用了与C ++相同的命名约定,后者又从C继承了名称。

Java受到C ++的影响,C ++共享同样令人困惑的命名模式。在C ++中,Float.MIN_VALUE的类比是std::numeric_limits<T>::min(),其定义为:

  

最小有限值。   对于具有非规范化的浮点类型(可变指数位数):最小正标准化值。

在C ++中,这是模板代码中潜在的错误来源,所以后来在C ++ 11中,他们添加了std::numeric_limits<T>::lowest(),其定义为:

  

最小有限值。 (自C ++ 11以来)   对于整数类型:与min()相同。   对于浮点类型:依赖于实现;通常,max()的负数。

但是C ++并不是第一语言。这一切都回到C,它定义了FLT_MIN最小浮点值。

那么,为什么C选择不一致地定义浮点数和整数的最小值?

不确定,但它可能与对称有关(见this answer)。对于花车,您可以使用-FLT_MAX(或-Float.MAX_VALUE)。对于整数,否定最大值是不可移植的。事实上,在所有现代架构中都存在错误(-INT_MAX == INT_MIN + 1应该保留)。