当前位置: 首页 > 知识库问答 >
问题:

为什么Java的double/float math.min()是这样实现的?

梁丘书
2023-03-14

我查看了java.lang.Math代码中的一些内容,并注意到虽然math.min(int,int)(或其长的对应部分)是这样实现的:

public static int min(int a, int b) {
   return a <= b ? a : b;
}

这对我来说是完全有意义的,这和我想做的是一样的。但是,double/float的实现是这样的:

public static float min(float a, float b) {
   if (a != a) {
      return a;
   } else if (a == 0.0F && b == 0.0F && (long)Float.floatToRawIntBits(b) == negativeZeroFloatBits) {
      return b;
   } else {
      return a <= b ? a : b;
   }
}

我完全傻眼了。是否将A与其自身进行比较?第二张支票是为了什么?为什么它的实现方式不像int/long版本一样?

共有1个答案

公西岳
2023-03-14

浮点数比整数值复杂得多。

对于这一具体情况,有两个区别是重要的:

  • nanfloatdouble的有效值,它表示“不是数字”,并且行为怪异。即它与自身不相等。
  • 浮点数可以区分0.0和-0.0。在计算某个函数的极限时,可以想象负零点是有用的。区分极限是正向还是负向接近0,可能是有益的。

所以这部分:

if (a != a) {
      return a;
}

确保如果anan(如果a不是nan而是b是,则稍后的“正常”检查将返回b,即nan,因此在这种情况下不需要显式检查),则返回nan。这是一种常见的模式:当计算输入为nan的任何东西时,输出也将是nan。由于nan通常表示计算中的某些错误(例如将一个值除以0),因此重要的是它“毒害”了所有进一步的计算,以确保错误不会被默默吞噬。

此部分:

if (a == 0.0F && b == 0.0F && (long)Float.floatToRawIntBits(b) == negativeZeroFloatBits) {
      return b;
}

确保如果与零值浮点数进行比较,并且b为负零,则返回该负零(因为-0.0“小于”0.0)。与nan类似,如果a为-0.0,而b为0.0,则正常检查将正确返回a

 类似资料:
  • 问题内容: 我正在研究Java标准库(6)中compare(double,double)的实现。内容为: 此实现的优点是什么? 编辑:“优点”是一个(非常)错误的单词选择。我想知道这是如何工作的。 问题答案: @Shoover的答案是正确的(阅读它!),但是它还不止于此。 由于javadoc中的规定: “此定义允许哈希表正常运行。” 假设Java设计者决定采用与包装实例相同的语义来实现。这意味着将

  • 在添加新的键值对时,我有几个关于重建哈希映射的问题。我将根据这些事实提出问题(它们对于Oracle JVM是正确的,不确定它们对于其他JVM是否正确): 每次当HashMap增长大于阈值(阈值=加载因子*条目数)时,Resize将重建HashMap,使其具有更大的内部表数组。新创建的条目放在哪个存储桶中并不重要,Map仍然会变得更大。即使所有条目都进入一个bucket(即它们的键“返回相同的数字)

  • 我们知道Java 8引入了一个新的流API和Java。util。流动收集器是定义如何聚合/收集数据流的接口。 但是,收集器接口的设计如下: 为什么它不是这样设计的? 后者更容易实现。把它设计成前者的考虑是什么?

  • 我正在看宣传单。 在setTimeout中调用

  • 我想知道为什么下面的代码: 我被要求详细解释,但我不明白为什么输出是这样的。请有人帮帮我。