文档章节

java中的NAN和INFINITY

丁佳辉
 丁佳辉
发布于 2017/02/07 10:41
字数 446
阅读 11
收藏 0

java浮点数运算中有两个特殊的情况:NAN、INFINITY。

1、INFINITY:

在浮点数运算时,有时我们会遇到除数为0的情况,那java是如何解决的呢?

我们知道,在整型运算中,除数是不能为0的,否则直接运行异常。但是在浮点数运算中,引入了无限这个概念,我们来看一下Double和Float中的定义。

Double:

public static final double POSITIVE_INFINITY = 1.0 / 0.0;

public static final double NEGATIVE_INFINITY = -1.0 / 0.0;

 

Float:

public static final float POSITIVE_INFINITY = 1.0f / 0.0f;

public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

 

那么这些值对运算会有什么影响呢?

我们先思考一下下面几个问题:

Float和Double中的无限有什么区别?

无限乘以0会是什么?

0除以0又会有什么结果?

 

再来看下面的示例:

复制代码

public static void main(String[] args) {

         float fPos=Float.POSITIVE_INFINITY;
         float fNeg=Float.NEGATIVE_INFINITY;
         double dPos=Double.POSITIVE_INFINITY;
         double dNeg=Double.NEGATIVE_INFINITY;
         
         //t1
         System.out.println(fPos==dPos);  //output: true
         System.out.println(fNeg==dNeg);  //output: true
         
         //t2
         System.out.println(fPos*0);  //output: NAN
         System.out.println(fNeg*0);  //output: NAN
         
         //t3
         System.out.println(fPos==(fPos+10000));  //output: true
         System.out.println(fPos==(fPos*10000));  //output: true
         System.out.println(fPos==(fPos/0));  //output: true

         //t4
         System.out.println(Double.isInfinite(dPos));  //output: true
         
    }

复制代码

从上面几组测试中我们可得出一些结论:

t1: Float中的无限和Double中的无限是相等的。

t2: 无限乘以0得到的值为NAN,即非数字。

t3: 除了乘以0外,对无限值做运算所得的值还是无限

要判断一个浮点数是否为INFINITY,可用t4中所示的isInfinite方法。

2、NAN

java中的NAN是这么定义的:

public static final double NaN = 0.0d / 0.0;

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

public static void main(String[] args) {
        double nan=Double.NaN;
        System.out.println(nan==nan);  //output: false
        System.out.println(Double.isNaN(nan));  //output: true
}

© 著作权归作者所有

共有 人打赏支持
丁佳辉
粉丝 19
博文 411
码字总数 196997
作品 0
浦东
程序员
AS3 基本数据类型 primitive data type

int(带符号,32位整型,-2147483648~2147483647), uint(无符号,32位整型,0~2147483647), Number(64位,双精度浮点型,-1.79e+308~-5e-324,0,5e-324~1.79e+308), String(UTF-16,Unicode), Boolea......

smilethat
2012/03/05
0
0
书薄记--JavaSctipt高级程序设计章三(基本概念)

语法 区分大小写 标识符:以 字母, ,$开头,其它字符可以是字母,,美元符号或数字。 命名方式:推荐驼峰大小写方式。 注释:// 单行 / 多行 / 语句:类C 关键字: break else new var c...

大东哥
2011/09/25
0
1
02-《深度拆解Java虚拟机》之Java的基本类型

一、问题引入 如果你了解面向对象语言的发展史,那你可能听说过 Smalltalk 这门语言。它的影响力之大,以至于之后诞生的面向对象语言,或多或少都借鉴了它的设计和实现。在 Smalltalk 中,所...

飞鱼说编程
09/11
0
0
How can I initialize a double variable to infinity

Q. How can I initialize a double variable to infinity? A. Java has built-in constants available for this purpose: Double.POSITIVEINFINITY and Double.NEGATIVEINFINITY. Q. Can you......

Oscarfff
2015/06/09
0
0
Javascript 基础知识之数据类型

javascript是一种弱类型的脚本语言 1)var param ;(根据所赋值的类型确定变量类型,变量类型可以随意改变) 全局变量 1)方法外的变量,或者是方法中未使用var声明的变量 局部变量 1)方法...

learn_more
2014/11/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day92-20180918-英语流利阅读-待学习

健身最大的敌人不是懒惰,而是逞强 Daniel 2018-09-19 1.今日导读 还记得 2008 年北京奥运会运动员刘翔的退赛风波吗?那天几乎所有中国人都将视线聚焦在了鸟巢体育馆 110 米栏的项目上,迫不...

飞鱼说编程
21分钟前
2
0
70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
3
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
6
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
56
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部