项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

今天在排除代码中的Bug的时候,在浮点数运算过程中遇到了NAN与INFINITY的问题。特此记录一下。
首先明确一点的是,java浮点数中有两个特殊情况:NAN,INFINITY

1.NAN

NAN是一个特殊的值。在JDK中,NAN是这么定义的:

    /*** A constant holding a Not-a-Number (NaN) value of type* {@code double}. It is equivalent to the value returned by* {@code Double.longBitsToDouble(0x7ff8000000000000L)}.*/public static final double NaN = 0.0d / 0.0;

特意将注释也copy下来。相信加上注释,同学们就都明白是什么意思了。Not-a-Number准确道出了NAN的含义。

    @Testpublic void testNan() {double NaN1 = Double.NaN;double NaN2 = 0.0 / 0.0;System.out.println(Double.isNaN(NaN1)); //trueSystem.out.println(Double.isNaN(NaN2)); //trueSystem.out.println(NaN1 == NaN1); //false}

NAN表示非数字,它与任何值都不相等,甚至不等于它自己,所以要判断一个数是否为NAN要用isNAN方法。

2.INFINITY

INFINITY主要是为了解决除数为0的情况。稍微有点数学基础的同学,都应该明白无限这个概念。

    /*** A constant holding the positive infinity of type* {@code double}. It is equal to the value returned by* {@code Double.longBitsToDouble(0x7ff0000000000000L)}.*/public static final double POSITIVE_INFINITY = 1.0 / 0.0;/*** A constant holding the negative infinity of type* {@code double}. It is equal to the value returned by* {@code Double.longBitsToDouble(0xfff0000000000000L)}.*/public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
    /*** A constant holding the positive infinity of type* {@code float}. It is equal to the value returned by* {@code Float.intBitsToFloat(0x7f800000)}.*/public static final float POSITIVE_INFINITY = 1.0f / 0.0f;/*** A constant holding the negative infinity of type* {@code float}. It is equal to the value returned by* {@code Float.intBitsToFloat(0xff800000)}.*/public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

这是JDK中的相关定义。很容易看出来,double与float中都有INFINITY的相关定义。

   @Testpublic void testInfinity() {double Inf1 = Double.POSITIVE_INFINITY;double Inf2 = Double.NEGATIVE_INFINITY;float Inf3 = Float.POSITIVE_INFINITY;float Inf4 = Float.NEGATIVE_INFINITY;System.out.println(Double.isInfinite(Inf1)); //trueSystem.out.println(Float.isInfinite(Inf3)); //trueSystem.out.println(Inf1 == Inf3); //trueSystem.out.println(Inf2 == Inf4); //trueSystem.out.println(Inf1 * 0); //NaNSystem.out.println(Inf1 + 1); //InfinitySystem.out.println(Inf1 * 0.4); //InfinitySystem.out.println(Inf1 / 0); //Infinity}

从测试代码中,可以得出如下结论:
1.double或者float判断是不是INFINITY都使用isInfinite方法。
2.double中的INFINITY与float中的INFINITY是相等的。
3.INFINITY乘以0得到NAN。
4.INFINITY做除了乘以0意外的任何四则运算,得到的结果仍然是INFINITY。

第三点跟第四点,结果INFINITY的数学性质,很容易理解。

Double 中的 NAN与INFINITY相关推荐

  1. java中的NAN和INFINITY

    2019独角兽企业重金招聘Python工程师标准>>> java浮点数运算中有两个特殊的情况:NAN.INFINITY. 1.INFINITY: 在浮点数运算时,有时我们会遇到除数为 ...

  2. -infinity java_java中的NAN和INFINITY

    java浮点数运算中有两个特殊的情况:NAN.INFINITY. 1.INFINITY: 在浮点数运算时,有时我们会遇到除数为0的情况,那java是如何解决的呢? 我们知道,在整型运算中,除数是不能为 ...

  3. Java中的NaN(非数)、Infinity(无穷大)

    直接上图: 为什么判断自己等于自己 结果还是 false? 先来说一下NaN 和 Infinity Java中提供了三个特殊的浮点数值:正无穷大.负无穷大.非数,用来表示溢出和出错.(只针对浮点数) ...

  4. Java中遭遇NaN

    虽然几乎每种处理器和编程语言都支持浮点运算,但大多数程序员很少注意它.这容易理解 ,我们中大多数很少需要使用非整数类型.除了科学计算和偶尔的计时测试或基准测试程序,其它情况下几乎都用不着它.同样,大多 ...

  5. Java 中的 NaN

    概述 简单来说可以认为 NaN 是一个数字数据类型变量值,这个类型变量被定义为 这不是一个数字. 在这篇文章中,我们对 Java 中的 NaN 进行一些简单的描述和说明和在那些操作的过程中可以尝试这个 ...

  6. java 判断 nan_关于java:如何测试double是否等于NaN?

    我在Java中有一个double,我想检查它是否为NaN. 做这个的最好方式是什么? 使用静态Double.isNaN(double)方法,或Double的.isNaN()方法. // 1. stat ...

  7. 报错NAN OR INFINITY

    今天遇到日志报错: INFINITY or NAN.排查代码后发现,是float做除法运算/0了. 在整型int运算中,除数是不能为0的,否则直接报异常.但是在浮点数运算中,是什么样呢?我们来看一下. ...

  8. javascript乘法和加法_Web前端:JavaScript中的NaN是什么?

    大家好,我来了,本期为大家带来的前端开发知识是"Web前端:JavaScript中的NaN是什么?",有兴趣做前端的朋友,一起来看看吧! JavaScript中的数字类型包含整数和 ...

  9. python unpack infinity_fit_转换出错:输入包含NaN、infinity或对dtype(“float64”)太大的值...

    我有一个形状的数据帧(144072564).尝试使用低方差函数删除低方差.但是,当我调用fit_transform时,我得到以下错误: ValueError:输入包含NaN.infinity或对dty ...

  10. 19【numpy中的nan和常用方法】01numpy中的nan和常用统计方法

    numpy中的nan和inf 什么是nan nan/NAN/Nan not a number 表示不是一个数字 什么时候会出现nan 当我们在做类似于0/0 无穷-无穷这种无意义的运算时 当我们读取本 ...

最新文章

  1. Sqlite3数据库之第三方库FMDB学习心得
  2. automation服务器不能创建对象是什么意思_从运营商角度来考虑为什么NAT不能搭建服务器?...
  3. 等比数列和的快速求法
  4. 【已解决】查看Python中已经安装的包
  5. MySQL数据库如何做好优化
  6. Branch management
  7. ORA-00600 [4194] 故障处理
  8. mysql重置所有表_Mysql脚本之清空当前数据库下的所有表中数据,并重置自增id
  9. Django Rest Framework源码剖析(七)-----分页
  10. 为什么我推荐你用Ubuntu开发?
  11. tp3.2.3 命令模式
  12. Spring学习(下)
  13. Python 解析百度,搜狗词库
  14. 大二英语单词(粗略)
  15. java object转为int_java中Object转换成int或String类型方法
  16. 一元非线性回归方程(matplotlib)
  17. 正大期货市场基础知识
  18. signature=5a522a8356f9906b0b775bdada02a4c6,合肥2016年4月29日至2016年5月12日交通违章查询...
  19. calcite mysql_jsqlparser和calcite和druid功能对比
  20. java int 比较大小_3个int整数比较大小?

热门文章

  1. 优化mysql数据库性能的十个参数
  2. JVM学习笔记(三)------内存管理和垃圾回收【转】
  3. css实现在一行显示多余部分显示省略号
  4. 线程间的同步和通信机制
  5. Wap Push Access Protocol(PAP)介绍-开放源码
  6. 锚点盒子随滚动条浮动
  7. tensorflow两种padding方式
  8. LeetCode OJ:Linked List Cycle(链表循环)
  9. 跨域访问JQuery+.NET实现的一种思路,以及极简单Demo
  10. IDEA 配置-XX:-RestrictContended参数