Double和Float中的NaN、Infinite等常量字段详解

Python整数转浮点数:语义声明而非类型转换 在Python中,'整数转浮点数'并非底层内存类型的强制转换,而是创建具备IEEE 754浮点语义的新对象的过程。其本质是数据精度与数值表示域的主动声明,涉及对象生命周期、内存分配及精度边界等核心机制。这一操作直接影响科学计算(如Numpy数组dtype)、JSON序列化兼容性、除法语义一致性及外部API协议适配等关键场景。理解float()的不可变性、id变化特性及精度陷阱(如2**53+1失真),是规避AttributeError、ValueError和静默精度丢失的前提。本文聚焦Python原生flo 阅读详情

Double和Float中的NaN、Infinite等常量字段详解

在采用Java进行数值运算,特别是double和float时,经常会遇到需要判断某个数是否为一个数(NaN)、是否为无(Infinite)。一个数都已经是double或者float数据类型的了,为什么还说它不是一个数(Not a Number)呢?这就要从数学上来说了。

对于除法,一个数与另一个数的运算存在以下几种情况:

情形被除数除数结果
10非00
200非法
3非00非法
4非0非0非0

显然,在实际的Java数值运算中,以上四种情况都需要考虑到,并且实际使用中也确实是这样的。当遇到情形2以及情形3中除数是整数时,Java会抛出异常java.lang.ArithmeticException: / by zero。

当然,以上是初等数学的内容,高等数学中还会有“无穷”这种概念存在。在一般的数学学科中,无穷不是一个数,它是任意大的数,表示一种趋势。但是在实变函数中,无穷却是一个常量。同样的,在Java中,无穷同样不是一个数。

那么在Java中如何表示无穷呢?对于情形3,将被除数改为0.0即可得到无穷大(POSITIVE_INFINITY或者NEGATIVE_INFINITY)。那么无穷小呢?在Double和Float的常量字段值表中并没有无穷下这个常量字段,实际上0.0就代表了无穷下,并且一个数除以0.0是不会抛出异常的。

那么NaN是如何产生的呢?当将一个非数字转换为数字以及有非数字参与数值计算的时候就会产生NaN;另一种情形是,当除数为0或0.0,而被除数为0.0的时候,也会产生NaN。

以下是几种特殊的数值运算:

情形被除数除数结果
1number0ArithmeticException: / by zero
20或者0.00.0NaN
3非0的number0.0Infinity或者-Infinity
4MAX_VALUEMIN_VALUEInfinity

对于这几种情形,如何进行判断呢?

Java中提供了几种方法:

  1. isInfinite() 用于判断一个数是否为无穷大(包括正无穷大与负无穷大),以下为源码实现:
/**
     * Returns {@code true} if the specified number is infinitely
     * large in magnitude, {@code false} otherwise.
     *
     * @param   v   the value to be tested.
     * @return  {@code true} if the value of the argument is positive
     *          infinity or negative infinity; {@code false} otherwise.
     */
public static boolean isInfinite(double v) {
    return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
}
  1. isNaN() 用于判断一个数是否是一个数,如下源码:
/**
     * Returns {@code true} if the specified number is a
     * Not-a-Number (NaN) value, {@code false} otherwise.
     *
     * @param   v   the value to be tested.
     * @return  {@code true} if the value of the argument is NaN;
     *          {@code false} otherwise.
     */
public static boolean isNaN(double v) {
    return (v != v);
}
  1. isFinite() 用于判断一个数时候是一个可用的数字,当输入是Infinity时,返回false,如下源码:
/**
     * Returns {@code true} if the argument is a finite floating-point
     * value; returns {@code false} otherwise (for NaN and infinity
     * arguments).
     *
     * @param d the {@code double} value to be tested
     * @return {@code true} if the argument is a finite
     * floating-point value, {@code false} otherwise.
     * @since 1.8
     */
public static boolean isFinite(double d) {
    return Math.abs(d) <= DoubleConsts.MAX_VALUE;
}

注意:isFinite方法是java 8新加入的方法。

Cheat Engine 6.8.1源码深度解析:Windows内存调试工程范式 内存调试是Windows平台逆向分析、游戏修改与安全工具开发的核心能力,其本质依赖于进程内存枚举、跨权限读写、高效扫描匹配等底层机制。Cheat Engine作为经十年验证的开源标杆,其6.8.1版本源码完整封装了从Ring3到Ring0的工程实现路径,涵盖Delphi环境适配、Windows SDK与驱动签名协同、ScanEngine四层过滤架构、ce64.sys内核通信协议等关键技术环节。该源码不仅是可编译的项目,更是理解Windows内存管理子系统(如MmMapIoSpace、VirtualQuery 阅读详情

相关推荐

Ollama模型路径迁移实战:Windows/Mac/Linux三系统保姆级教程(附常见问题排查)

本文提供了一份详细的Ollama模型路径迁移教程,涵盖Windows、macOS和Linux三大操作系统。针对默认安装路径占用系统盘空间的问题,文章指导用户如何安全移动模型文件、配置环境变量、重启服务,并附有迁移后的验证步骤与常见问题排查方法,帮助用户高效管理本地AI模型存储。

gray5的博客 542

Double里边的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; 翻译过来: NaN是...

Morning Sunshine的IT技术博客 8505

五分钟搞懂游戏开发中的抗锯齿算法

常见抗锯齿算法总结锯齿由来抗锯齿算法SSAAMSAACSAA 锯齿由来 场景的定义在三维空间中是连续的,而最终显示的像素则是一个离散的二维数组,这是计算机屏幕产生锯齿的原因。在计算机处理图形的过程中(渲染管线了解一下),有一个非常重要的阶段,就是光栅化,光栅化主要的作用是将顶点数据的不连续性通过插值计算,将两个顶点之间不存在的点进行弥补,然后实现到屏幕像素点上的一一映射。如图,现在要在屏幕上绘制一...

绿洲守望者 1万+

Double类型出现的nan问题

最近在调查问题的时候,发现了一个double类型在打印时出现nan。在解决完后随手记下笔记。 1、什么时nan nan的意思是“Not a Number”,不是一个数值,或者无法表示的数值。 2、为什么会出现nan 主要有一下几点: a. 对负数开方 b. 对负数求对数,如:log(-1.0) c. 0为分母, 如3.0/0.0 d. 未对double类型初始化,使用的时候就是nan 我遇到的就是最后一种,未对double类型初始化,其在内存里的存值就是一个nan, 在之后的计算过程中

hybohehe的博客 1万+

实战:如何用MIPI CSI-2高效传输RAW10图像数据(附带宽优化技巧)

本文深入探讨了MIPI CSI-2协议在RAW10图像数据传输中的高效应用,详细解析了4像素5字节打包机制及其带宽优化技巧。通过动态Lane分配、位深度自适应压缩和虚拟通道交错传输等实战方法,显著提升传输效率,适用于IoT摄像头开发等低功耗场景。

css33的专栏 731

别再手动写用例了!用AI Agent自动生成测试用例的保姆级实战(附Python代码)

本文详细介绍了如何利用AI Agent技术自动生成测试用例,大幅提升测试工程师的工作效率。通过Python代码实战演示,从环境搭建到核心Agent构建(需求解析、场景挖掘、用例编排),再到与企业工具链(TestRail、Jira)的深度集成,帮助团队实现测试用例的智能化生成与管理。

weixin_30897233的博客 645

关于Double中的NaN问题

其中红框部分,是抛出的异常,条件为Double无穷大或NaN,以前对Double的认识停留在浅薄的表面,遇到问题,才发现还有这两种情况。Double提供了判断两种情况的方式,还有其他的判断方法,有兴趣的可以自己查阅。最近在写代码时,因为涉及到计算,当时用了Double作为返回值,后续转成BigDecimal,但在测试过程中,发现有事会报异常:NumberFormatException:Infinite or NaN。1.可以用加入对NaN的判断。

记录点点滴滴的成长。 1137

镜头调焦的 调整的是焦距还是像距?

在镜头 “调焦”(即日常拍照时的)中,调整的核心是,而非焦距。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 1350

Java中Double、Float类型的NaN和Infinity

Java在处理浮点数运算时,提供了NaN和Infinity两个常量。

qq_43842093的博客 1436

Stable Diffusion 模型分享:Indigo Furry mix(人类与野兽的混合)

Indigo Furry mix 是一个混合模型,出的图具有雄性人类的体型和野兽的形态。条目内容类型大模型基础模型SD 1.5来源CIVITAI作者indigowing文件名称文件大小1.99GB。

水滴的博客 1830

FC7300 SPI MCAL配置引导

Example - QMI8A01z外设:Example - QMI8A01z外设:

舊梦的博客 257

java double 常量_Double和Float中的NaN、Infinite等常量字段详解

在采用Java进行数值运算,特别是double和float时,经常会遇到需要判断某个数是否为一个数(NaN)、是否为无(Infinite)。一个数都已经是double或者float数据类型的了,为什么还说它不是一个数(Not a Number)呢?这就要从数学上来说了。对于除法,一个数与另一个数的运算存在以下几种情况:情形被除数除数结果10非00200非法3非00非法4非0非0非0显然,在实际的J...

weixin_39996096的博客 545

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

fast_float 源码深度解析:SciPy 中比 strtod 快 4 倍的 C++ 浮点解析库

fast_float 是 Daniel Lemire 等人开发的 C++ 浮点数字符串解析库,以 header-only 形式提供了对标 C++17 `std::from_chars` 的 `float`/`double` 解析实现,在同样保证 IEEE 精确舍入(含 round to even)的前提下,实测速度比标准库 `strtod` 快数倍。本文以 [fast_float 附带文档](ht

gitblog_00533的博客 260

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

详解 浮点数的规格化表示

《深入理解计算机系统》(兰德尔 E. 布莱恩特)中对浮点数的描述不容易懂,在这里记录一下,以加深理解。 1、IEEE浮点表示 IEEE(读作“eye-triple-ee”)浮点标准754中,用图1的形式来表示一个数: 图1 浮点数表示形式​​​ 符号(sign)——s决定这个数是负数(s=1)还是正数(s=0),而对于数值0的符号位解释,作为特殊情况处理; 尾数(significand...

Hello.Aaric的博客 4万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MuPDF 几何数学指南:fz_point、fz_rect、fz_matrix 与 fz_quad 类型及变换函数全解析

MuPDF 作为 SumatraPDF 的 PDF 渲染引擎,其内部的一切几何操作——页面布局、坐标变换、文字命中框、渲染裁剪——都建立在少量精悍的数学类型之上。本文以 MuPDF 官方参考文档 `ext/mupdf/docs/reference/c/fitz/math.md` 为核心骨架,逐层拆解 `fz_point`、`fz_rect`、`fz_irect`、`fz_matrix`、`fz_q

gitblog_00933的博客 690

Swift 浮点数近似相等比较:解读 SE-0259 的 isAlmostEqual 与 isAlmostZero 设计

SE-0259([Approximate Equality for Floating Point](https://link.gitcode.com/i/1dbc13ad21091dee607635bc2bc3013c))是 Swift Evolution 仓库中一份针对标准库 `FloatingPoint` 协议的增强提案,核心目标是为浮点数比较提供一组语义严谨、开箱即用的近似相等 API:`i

gitblog_00324的博客 1034

别让AI编程助手再翻车:一套完整的Harness工程方案

把真实仓库交给 AI 编程助手时,它经常在最后关头掉链子:漏掉一步、弄坏测试,还信心满满地宣布"已完成",一运行发现什么都不对。翻车的根源往往不在模型聪明与否,而在于它所处的的工作环境。开源课程 [Learn Harness Engineering](https://link.gitcode.com/i/340c2f6a75d24a3585b1c14c7ab37d48) 就是冲着这个问题来的:教你

gitblog_00979的博客 65

Swift 泛型数学函数协议设计全解析:SE-0246 的 ElementaryFunctions 与 Real 协议

SE-0246「Generic Math(s) Functions」是 Swift Evolution 流程中一份极具代表性的提案:它为 Swift 标准库设计了一套面向泛型编程的初等数学函数协议,试图终结 C 数学库函数在 Swift 中"按平台 import、按具体类型重载、无法泛型调用"的尴尬局面。本文以 [proposals/0246-mathable.md](https://link.g

gitblog_01162的博客 771

C标准库数学计算与文件操作深度解析:从math.h到io.h的实战指南

在C语言编程中,标准库函数是连接应用程序与操作系统底层功能的核心桥梁,其设计哲学深刻影响着代码的性能与健壮性。理解其原理,首先要掌握浮点数处理与错误检测机制,这直接关系到数值计算的精度与稳定性。现代C库通过fpclassify等分类宏进行高效错误检查,替代了传统的errno方式,提升了多线程环境下的安全性。在文件系统交互层面,目录遍历与二进制文件处理是系统编程的常见需求,涉及平台相关的API调用与可移植性设计。这些技术共同支撑了高性能数值计算核心与高效系统工具的构建。本文聚焦于math.h数学函数库的浮点数

weixin_34364071的博客 298

Minkowski距离p值调优实战:从空间直觉到高维稀疏数据优化

Minkowski距离是度量学习与相似性计算的基础范式,其核心参数p控制着距离函数对特征差异的敏感模式——p=1对应曼哈顿距离,强调各维度线性累加;p=2即欧氏距离,刻画整体几何偏离;p→∞收敛为切比雪夫距离,体现‘最大单维主导’逻辑。该原理直接决定k-NN、聚类与异常检测在高维稀疏数据(如TF-IDF文本向量、用户行为序列)中的鲁棒性。实践中,p值本质是模型对数据空间结构的信任声明:低p增强抗噪性与稀疏适应力,高p强化关键特征判别力。本文聚焦真实工程场景,解析p值如何重塑决策边界、为何必须与标准化协同、以

weixin_34396103的博客 307

Rust RFC 2476 解读:Clippy 1.0 的 lint 分类体系与稳定性路线

> 本文基于本仓库中的 [RFC 2476 原文](https://link.gitcode.com/i/8023a5489cb367cb6af5033b394b341b) 展开,结合仓库内 [RFC 2103(工具属性与工具 lint 命名空间)](https://link.gitcode.com/i/06976d7fac045875e7a25408cc763a77)、[RFC 1270(弃用属

gitblog_00926的博客 631

IIR滤波器从原理到STM32实现:SOS矩阵与直接I型实战指南

数字信号处理中,滤波器的选择直接影响系统的性能与资源开销。IIR滤波器凭借反馈结构,能以更低阶数实现陡峭的过渡带,在嵌入式场景中尤其擅长以极小计算量和内存占用换取高效滤波。其核心原理在于输出不仅取决于当前输入,还依赖历史输出,这种递归特性既带来了效率优势,也引入了稳定性与数值精度挑战。工程实现上,SOS矩阵(二阶节级联)与直接I型结构是两种最常用的方案,前者数值稳健,后者直观易调试。在STM32等资源受限的MCU上,合理选用IIR并配合CMSIS-DSP库,可显著降低CPU负载。本文从滤波器基础概念出发,剖

weixin_30256901的博客 342
上一篇: 将txt文本格式存储的词id表示的数据集存为matlab中的sparse格式
下一篇: 在Java中使用Lambda表达式统计词频
Subson
博客等级 码龄12年 31粉丝 21原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值