Java十六进制浮点文字

我如何遇到十六进制浮点数

我正在Java :: Geci中开发一种新功能,以减少代码重新格式化的可能性。 如果重新格式化,当前版本的代码将覆盖原本相同的代码。 这很烦人,因为按下重新格式化键的快捷键相当容易,而且许多项目甚至要求开发人员将其编辑器设置为在保存时自动格式化代码。 在这种情况下,不能使用Java :: Geci,因为一旦重新格式化了代码,生成器就会认为生成的代码与源文件中已经存在的代码不同,会对其进行更新并发出代码更改失败的信号。单元测试。

我正在设计的解决方案首先将Java源文件进行比较,然后将其转换为词汇元素列表。 这样,只要代码保持不变,您甚至可以重新格式化插入换行符,空格等的代码。 为此,我需要一个简化的Java词法分析器。 编写词法分析器没什么大不了的,自从我在1987年首次阅读《 龙书》以来,我出于不同的原因创建了多个词法分析器。我真正需要的唯一是精确定义字符串,字符,数字文字,关键字和以此类推。 简而言之:Java语言在词汇级别上的定义是什么以及如何处理。 幸运的是,对此有一个精确的定义,即Java语言规范 ,它不仅精确而且可读,并带有示例。 因此,我开始阅读相应的章节。

令我感到困惑的是,我可以看到Java语言中有可能用十六进制表示浮点数。 奇怪吗 由于我从未见过它,所以我首先以为这是Java 12中引入的新内容,但我的调查表明它可能是在Java 1.5中引入的。那是我真正喜欢的第一个Java版本,但不是因为十六进制浮点数。 所以这就是我面对面遇到这只野兽的方式。 我开始怀疑这头野兽是否可以在野外找到,还是只能在JLS文本范围内被俘虏的东西。 所以…

我在Twitter上投票

如您所见,九个人面的人回答了这个问题,主要是说他们对这个功能一无所知。

在lambda和流之后,可能十六进制浮点数是Java语言中鲜为人知和使用最少的功能(开个玩笑……十六进制浮点数很重要,对吗?)

即使我过去做过一些科学研究,也看不到十六进制浮点字面量的任何使用。

什么是浮点数?

我们将使用十六进制浮点数,但要了解我们必须首先知道什么是浮点数。

浮点数具有尾数和指数。 尾数具有整数和小数部分,例如iii.ffff 。 指数是整数。 例如,31.415926E-1是浮点数,是圆的直径和周长之比的近似值。

Java内部将float存储在32位上 ,将double float数存储在64位上 。 实际比特根据IEEE 754标准使用。

这样,这些位将符号存储在单个位上,然后将指数存储在8位或11位上,最后将尾数存储在23位或52位上,分别用于32位或64位浮点/双精度。 尾数是一个小数,其值在1到2之间。这可以用位流表示,其中第一位表示1,第二位表示1/2,依此类推。 但是,由于该数字始终以规范化存储,因此该数字始终在[1和2之间],因此第一位始终为1。无需存储它。 存储尾数,以便最高有效位表示1/2,下一个1/2 2以此类推,但是当我们需要该值时,将其加1。

尾数是无符号的(因此我们有一个单独的signum位)。 指数也是无符号的,但是计算出的实际移位数是从该值中减去127或1023以获得有符号数。 它指定尾数实际上应向左或向右移动多少位。 因此,当我们写31.415926E-1f ,指数将不是-1。 那是数字的十进制格式。

实际值为01000000010010010000111111011010 。 分解:

  • 0号,数字为正。 到目前为止,一切都很好。
  • 10000000 128,这意味着我们必须将尾数左移一位(该值乘以2)
  • 10010010000111111011010是
    。 该位流的十六进制表示为0x490FDA

这是

十六进制浮点文字

我们可以在Java中编写与0x0.C90FDAP2f相同的数字。 这是相同数字的十六进制浮点表示形式。

尾数0xC9aFDA应该熟悉0x490FDA以上数字的十六进制表示0x490FDA 。 不同之处在于,第一个字符是C而不是4 。 那是额外的一位,始终为1,不存储在二进制表示中。 C1100而原始40100 。 指数是将数字推到正确位置所需的实际位移的带符号十进制表示形式。

文字的格式并非无关紧要。 首先,您必须使用指数部分,并且指数的字符为pP 这与十进制表示形式有很大不同。 (更新:如果指数是可选的,则您无法确定例如0.55是十进制浮点还是十六进制浮点。十六进制数字偶然可以仅包含十进制字符,而仍然是十六进制。)

经过一番思考,很明显无法使用常规eE来表示指数,因为该字符是合法的十六进制数字,并且在数字(如0x2e3情况下可能会模棱两可。 这是十六进制整数还是。 这是整数,因为我们使用p而不是e

我只能猜测为什么指数部分是强制性的。 因为开发人员已经习惯使用eE作为指数来十进制浮点数,所以很容易将0xC90F.0e+3误读为单个浮点数,即使需要十六进制浮点p而不是e 。 如果指数不是强制性的,则此示例将是浮点数与整数的合法和。 同时看起来像一个数字,那不是很好。

另一个有趣的事情是指数是十进制。 这也是因为某些十六进制数字已被用于其他目的。 浮点数和双后缀。 如果要表示文字是浮点数,则可以将fF附加到末尾。 如果要表示此文字为double,则可以将dD附加到末尾。 这是默认设置,因此添加D是可选的。 如果指数是十六进制的,我们将不知道0x32.1P1f是浮点文字还是双精度数,并且具有很多大小不同的值。 这样,那个指数是十进制,它是一个浮点数。

Java和IEEE 754

Java在Java 1.2之前一直严格执行IEEE 754标准,该标准不仅定义了存储在内存中的数字格式,而且还定义了应如何执行计算的规则。 Java 1.2版(包括1.2版)之后,发布了该标准以使实现更加自由,从而允许使用更多的位来存储中间结果。 它曾经并且仍然可以在Intel CPU平台上使用,并且在诸如FORTRAN之类的其他语言的数值计算中被大量使用。 这是允许实现使用更高精度的逻辑步骤。

为了保持向后兼容性,同时在语言中添加了strictfp修饰符。 在类,接口或方法上使用此修饰符时,这些代码中的浮点计算将严格遵循IEEE 754标准。

带走

  • Java中有十六进制浮点文字。 记住它以及strictfp是什么,因为有人可能在Java采访中问您有关它的问题。 在企业编程中没有实际用途。
  • 除非使代码更具可读性,否则不要使用它们。 我几乎无法想象会发生这种情况的任何情况。 因此,简而言之:不要仅仅因为可以就使用它们。
  • 在Twitter @verhas上关注我,以获取有关新文章的通知。

关注@verhas

我认为仅此而已。 在本文发表时,我可能会和一万人一起在苏黎世湖中游泳。 这是一个大事件。

哦……是的:如果您曾经在Java中使用十六进制浮点文字来使其更具可读性,请在注释中分享知识。 我敢于以读者的名义说:我们很感兴趣。

更新:约瑟夫·达西(Joseph Darcy)(Oracle的工程师,OpenJDK开发人员,马拉松运动员,快步手,偶尔的摄影师,还有很多其他事情。)在Twitter上提供了反馈。 我将他的回复复制到这里,因为它绝对有价值,并为读者增加了价值,从而使读者受益:

十进制字符串和二进制浮点值的特定设置之间的映射通常是不明显的。 十六进制浮点文字在需要时(例如在测试中)提供了直接的文本到二进制fp映射。 参见https://blogs.oracle.com/darcy/hexadecimal-floating-point-literals


翻译自: https://www.javacodegeeks.com/2019/07/java-hexadecimal-floating-point-literal.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言对电脑做的事儿啊,总有那么一丝恐怖,C语言操盘电脑两例

C语言对自己电脑做的事儿啊,总有那么一丝恐怖,C语言与电脑两例开场先抱歉,偷懒好多天了。今天分享给大家的l两例比较短小精悍,都是针对于计算机屏幕处理的两例,有兴趣的可以放到自己电脑上运行哦。绝对无害&#xff0c…

servlets_jQuery Ajax – Servlets集成:构建完整的应用程序

servlets网上有很多教程,它们解释了有关使用servlet和JSP页面进行Java Web开发的一些知识,但是,我从未找到对于初学者来说足够简洁的教程。 这样的教程应该解释创建一个简单的Web应用程序的整个过程,包括前端,后端&…

mysql分库分表的缺点_MySQL分库分表会带来哪些问题?

分库分表能有效的环节单机和单库带来的性能瓶颈和压力,突破网络IO、硬件资源、连接数的瓶颈,同时也带来了一些问题。下面将描述这些技术挑战以及对应的解决思路。1、事务一致性问题分布式事务当更新内容同时分布在不同库中,不可避免会带来跨库…

C语言的恶趣味,胆小者莫入,以免入门到放弃,C语言夺命题十例!

前言这些问题测试了C语言的高级知识,包括一些很少使用的特性。有效的C编程需要对诸如未定义的行为,递归和指针算术等概念有深入的理解,但是这些故意复杂的例子并不代表现实世界的代码,当然也不会为了清晰和可维护性而获得任何奖励…

java学习里程碑_记录您的里程和社区运行情况:Java EE 7真实体验

java学习里程碑miles2run.org是跟踪跑步活动并与亲朋好友共享的简便方法。 可以创建然后跟踪基于天或基于距离的目标。 它还允许创建社区运行目标,并使多个跑步者参与并跟踪他们朝着该目标的活动。 您还可以找出本地跑步者并与他们联系。 该项目已开始,…

遇C语言条件编译就犯怵,不知什么意思,c语言头文件中的宏定义

前言看见头文件中的条件编译就犯怵,不知什么意思,但是,你老师说:”就得那么写“,你照做,但是知其然而不知其所以然。今天分享下是自己的理解~~~纯属个人献丑,新手可阅,老鸟绕道。代码…

pcie3.0一条通道带宽_小技巧|内存双通道提升性能

今天给大家分享一个小技巧,如果你的电脑有两条或以上的内存条,不同的内存插法也是会影响性能的哦,也就是内存双通道。什么是双通道?双通道内存说白了是两条内存由串联方式改良为并联方式,以得到更大的内存带宽&#xf…

C++简介源码讲解精辟版,C++入门级C++学习,C++与C的区别值得知晓

C简介源码讲解精辟版,C入门级C学习,C与C的区别值得知晓C语言和C基础区别C标准输入和输出命名空1.命名空间的定义 :namespace 标识符{ } 例:namespace my{int a1;}命名空间中的成员访问:作用域分辨符:: 例&a…

jbpm 和 drools_Drools和jBPM KIE A​​pps平台

jbpm 和 drools随着Drools和jBPM(KIE)6系列出现了一个新的工作台,并有望最终实现用户的可扩展性。 我终于有了一些预告片,以显示此工作原理以及所存储的内容。 确保选择1080p并全屏显示它们的最佳状态。 (点击放大&am…

mysql 1308_Mysql恢复数据报ERROR 1308 : LEAVE with no matching label_MySQL

赶紧看备份日志,日志如下:----------------------------------BEG:20151108 01:00:01FTP:20151108 01:00:05CLS:20151108 01:00:07OPT:20151108 01:00:08END:20151108 01:00:08----------------------------------日志并没有什么异常,既然说有…

真正的C与C++编程高手是什么?臭美的群体!如何编写高质量代码?

前 言软件质量是被大多数程序员挂在嘴上而不是放在心上的东西!除了完全外行和真正的编程高手外,初读本书,你最先的感受将是惊慌:“哇!我以前捏造的C/C程序怎么会有那么多的毛病?”别难过,作者只…

windows10安装mysql 8.0_手把手教你在Windows 10安装MySQL 8.0(详细图文)

出品丨TeacherWhat题图:Oracle MySQL 8.0关键字:新版本、Install、安装、MySQL、数据库入门、Database正文约1000字,建议阅读时间2分钟目录结构:1. 官网下载安装包2. 点击下载的程序包安装3. 安装数据库软件4. 安装成功后&#xf…

mysql降低数据库版本_三步10分钟搞定数据库版本的降迁 (将后台数据库SQL2008R2降为SQ...

三步10分钟搞定数据库版本的降迁 (将SQL2008R2降为SQL2005版本) 前思后想仍觉得实战数据库版本的降迁一文中的方式不仅老土而且低效,故有了下文三步搞定数据库从MSSQL2008R2 高版本降迁至SQL2005低版本。 整个过程如果思路清晰,数据量小,不过…

2017菜鸡C与C++工程师总结,撸码撸码,垃圾专科生撸码人生

前言年底了,对工作做一个总结。又要感叹那句话啊,时光流水,仿佛昨天才刚毕业,到今天不知不觉已经正式工作半年了。文章以po主自己的心理想法和所见所闻入手来写,垃圾专科生,文笔不好勿怪。开始正文吧。关于…

primefaces_PrimeFaces 5.0 DataTable列切换器

primefaces我有机会与PrimeFaces 5.0 DataTable一起工作,并且增强功能很棒。 今天,我只想展示其中的一项新功能……DataTable列切换器。 通过此功能,可以通过复选框列表选择显示哪些列。 要使用列切换器,只需添加一个commandButt…

Docker化Spring Boot应用程序

你好朋友, 在本教程中,我们将看到如何对Spring Boot应用程序进行Docker化。通过dockerizing意味着我们将以Docker容器的形式运行应用程序。 以下是涉及的步骤: 1.创建一个Spring Boot应用程序 2.在您的机器上安装Docker 3.在您的项目中创…

抱歉咯!今天偷个懒!!

今天偷个懒向大家推荐一个新建的C/C学习交流群。应为新建群人数不是很多,正在学习C/C或者正在寻求进阶的小伙伴都可以加下。作为群主会不时在群内分享学习资料的。

openshift_在WildFly和OpenShift上的WebSocket聊天

openshift聊天是解释WebSocket的最典型示例之一。 它是一个相当常用的界面,可以很容易地解释WebSocket的基本概念。 当然,Java EE 7 WebSocket也有一个, 在这里可用 ! 您可以使用以下步骤在WildFly上轻松运行它: curl…

linux 下脚本安装 mysql_linux(centos7)下编译安装mysql(数据库)一键安装详解+脚本文件...

一、下载源文件官网下载地址: https://downloads.mysql.com/archives/community/二、安装前准备(1)、开始之前先把虚拟机内存调大,避免安装时间过长和卡慢此处我调的内存为8个G(我的Windows内存为12G),如果你的电脑没有这么大运行内存可适度调小&#xf…

为什么学习C语言这么久,看的懂代码,做不出题,写不出来项目?

前言我看得懂别人的程序,可是我自己却写不出来,我应该怎么办啊?你了解这些嘛?你只是能从别人书写的代码知道每一步都做些什么吧?你明白别人的解题思路吗?你知道别人为什么要用那样的算法吗?如果…