首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么Java的double/float Math.min()是这样实现的?

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

Stack Overflow用户
提问于 2021-05-06 07:55:15
回答 3查看 5.1K关注 0票数 70

我查看了java.lang.Math源代码中的一些东西,我注意到虽然Math.min(int, int) (或它的长对应项)是这样实现的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static int min(int a, int b) {
   return a <= b ? a : b;
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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版本相同的方式实现?

EN

回答 3

Stack Overflow用户

发布于 2021-05-06 08:01:13

Floating-point数比整数值复杂得多。

对于这种特定情况,有两个区别很重要:

  • NaNfloatdouble的有效值,表示“不是数字”,行为怪异。也就是说,它不等于itself.
  • Floating点编号可以区分0.0和-0.0。当你在计算某个函数的极限时,一个负的零值可能会很有用。区分限制是从正方向还是从负方向接近0可能是有益的。

所以这一部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (a != a) {
      return a;
}

确保如果aNaN,则返回NaN (如果a不是NaN,但b是,则稍后的“正常”检查将返回b,即NaN,因此这种情况不需要显式检查)。这是一种常见的模式:在计算输入为NaN的任何内容时,输出也将为NaN

这部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (a == 0.0F && b == 0.0F && (long)Float.floatToRawIntBits(b) == negativeZeroFloatBits) {
      return b;
}

NaN类似,如果正常检查为-0.0且b为0.0,则正常检查将正确返回a

票数 103
EN

Stack Overflow用户

发布于 2021-05-06 08:04:21

我建议仔细阅读Math.min的文档以及关于浮点的numeric comparison operators。他们的行为是完全不同的。

来自Math.min的相关部分

根据IEEE754标准的规范确定的浮点比较结果为:

  • 正零和负零被认为是相等的。

如果任何参数为NaN,Math.min将选取该参数,但如果任何操作数为NaN,则<=的计算结果为false。这就是为什么它必须检查a是否与自身不相等-这意味着a是NaN。

这就是第二次检查的目的。

票数 40
EN

Stack Overflow用户

发布于 2021-05-06 08:14:38

我可以在第一个比较if (a != a)上帮你。这显然只考虑了a,所以在哪些情况下,无论b如何,a都可能是最小的

float数字与int的不同之处在于它有special values,例如NANNAN的一个特殊属性是比较总是假的。因此,如果a上的每个比较运算符都返回false,则第一个条件返回a

在最后一行中可以找到与b相同的条件。如果b上的比较总是返回false,那么最后一行总是返回b

在第二种情况下,我只能猜测这与“负零”和“正零”有关,这是float的另外两个特殊值。当然,负零比正零小。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67414007

复制
相关文章
在 Gitlab CI 中调用 Sonarqube 进行代码扫描
Gitlab 提供了基于 Code Climate 的代码质量评估功能,这一功能是通过 dind(Docker in Docker)方式运行的,在 Kubernetes 环境中、尤其是托管集群中,这种方式不太合适,还好还有一个替代方案:Sonarqube,通过在 .gitlab-ci.yml 中的设置,可以使用 Sonarqube 对代码进行扫描,接收到 Commit 之后,Sonarqube 会生成针对提交的代码质量提示,如图所示:
崔秀龙
2019/07/22
8.1K0
在 Gitlab CI 中调用 Sonarqube 进行代码扫描
在python环境调用C库
注意: 如果返回是无符号长类型, 需要在py里面设置返回类型 t1.restype = ctypes.POINTER(ctypes.c_ulong) 其它类型同理
大大刺猬
2022/09/29
5710
如何使用MrKaplan在红队活动中隐藏和清理代码执行痕迹
关于MrKaplan  MrKaplan是一款功能强大的红队安全研究工具,该工具可以帮助广大红队研究人员清理和隐藏活动中的代码执行痕迹。该工具可以通过保存文件运行时间、存储文件快照等信息来辅助红队活动,并将所有的取证信息与相关用户关联起来。  功能介绍  1、关闭系统事件日志记录功能; 2、清理文件和代码组件; 3、清理注册表; 4、支持多用户运行; 5、支持以普通用户或管理员身份运行(建议以管理员权限运行); 6、支持保存文件时间戳; 7、支持排除指定操作,并将组件留给蓝队人员。  工具下载  该工具本质
FB客服
2023/03/30
1.8K0
如何使用MrKaplan在红队活动中隐藏和清理代码执行痕迹
在 Node 中调用 Python
在 Node 中如何调用 Python 的方法?通常可以通过 REST 接口或者 RPC 的方式来完成,但是某些时候我们仅仅只需要调用对方几个很简单的方法,这种情况下去构建一个提供 REST 接口的服务或者两者对接实现 RPC 调用,这种做法的成本显然有点高。本文将会介绍一种更轻量的调用方式。
凌虚
2020/07/17
5.7K0
在Java中调用Python
在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢。当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单。恰好我在项目中就遇到了这个问题,需要在Java程序中调用Python程序。关于在Java中调用Python程序的实现,根据不同的用途可以使用多种不同的方法,在这里就将在Java中调用Python程序的方式做一个总结。
编程随笔
2019/09/11
5.1K0
在Java中调用Python
在Android中调用WebService
某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。 既然是调用WebService
全栈程序员站长
2022/07/05
1.9K0
在Android中调用WebService
某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。 既然是调用WebService
欢醉
2018/01/22
2.3K0
生产环境日志清理脚本
生产上有40多个微服务部署的应用,每个应用都会产生日志,随着时间的增长,日志量不断增大,现需要清理。有两个重要的应用日志需保留90天,其它应用保留20天。
loong576
2020/07/20
1.2K0
在C++中调用Python
虽然现在Python编程语言十分的火爆,但是实际上非要用一门语言去完成所有的任务,并不是说不可以,而是不合适。在一些特定的、对于性能要求比较高的场景,还是需要用到传统的C++来进行编程的。但是C++的一个缺点是比较难找到很好的轮子,这也是很多人专用Python的一个重要原因。这篇文章我们要介绍的是一个比较特殊的场景——用C++的代码去调用Python函数中实现的一些功能。这样的话,如果代码的主体还是用C++完成的,而部分功能为了简便,引入一些Python中已经封装好的函数,这样就可以很好的结合两种语言各自的特点。而另一种工作方式:通过Python来调用一些C++或者Fortran中实现的高性能函数,可以参考这一篇博客。这两种不同的使用方法各有优劣,但是如果以Python为主导,就很难避开GIL的问题,这里我们就不过多的展开。
DechinPhy
2021/05/27
4.1K0
在.NET中调用存储过程
因为做项目要用到数据库,因此存储过程是必不可少的,看了一点如何在.NET中调用存储过程的资料,颇有点心得,觉得这个东西是当用到数据库的时候必须要会的一项技术。下面是它的定义:
SAP梦心
2022/05/07
2.2K0
清理垃圾bat代码
rd /s /q %windir%\temp & md %windir%\temp
全栈程序员站长
2022/07/04
1K0
清理垃圾bat代码
在Oracle中,如何定时清理INACTIVE状态的会话?
今天小麦苗给大家分享的是在Oracle中,如何定时清理INACTIVE状态的会话?
AiDBA宝典
2019/09/29
2.7K0
Docker 环境清理的常用方法
如果你使用 docker 进行大规模开发,但是没有清理策略,那么你的磁盘马上就会被填满,当你真的必须因为产品火爆而要立即交付一些东西时,你就无法交付。
用户2781897
2021/04/02
6550
Docker 环境清理的常用方法
如果你使用 docker 进行大规模开发,但是没有清理策略,那么你的磁盘马上就会被填满,当你真的必须因为产品火爆而要立即交付一些东西时,你就无法交付。
xcbeyond
2021/04/11
5780
Docker 环境清理的常用方法
如果你使用 docker 进行大规模开发,但是没有清理策略,那么你的磁盘马上就会被填满,当你真的必须因为产品火爆而要立即交付一些东西时,你就无法交付。
xcbeyond
2021/04/22
3.5K0
在OrderStatusActor构造方法中调用StartTimerAsync
TimerCallbackAsync方法以二进制形式接收用户状态。 在示例中,回调在将状态写入日志之前将状态 string 解码回 。
用户7108768
2021/09/26
1.9K0
Go语言在模版中调用函数
如果希望调用自定义函数,需要借助html/template包下的FuncMap进行映射
IT工作者
2022/03/31
2.8K0
如何成功清理重建CloudStack环境
很多玩过 CloudStack的童鞋,或多或少在刚刚入门 CloudStack的时候,对一个搭建环境需要做N多次的创建,删除才能最终运行好一个云环境,但是在这个过程中,如果遇到问题,找不出其他方法解决的话,很多新手暂时能够想到的就是重新创建环境,在这个过程中,有几项注意点需要提醒各位,否则即使重建好了环境,也会由于某些配置的残留而导致新的环境出现新的问题。
星哥玩云
2022/06/28
5770
点击加载更多

相似问题

共享环境中的mod_perl调试

10

在mod_perl环境中使用共享内存

22

如何使用maven调用插件清理构建环境

12

mod_perl 2环境中的WebApp配置

10

清理Anaconda中的基础环境

144
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文