java 十六进制浮点_Java十六进制浮点文字

java 十六进制浮点

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

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

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

令我感到困惑的是,我可以看到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

java 十六进制浮点

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

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

相关文章

python时间倒计时显示屏厂家_python 实现倒计时功能(gui界面)

运行效果:完整源码:##import libraryfrom tkinter import *import timefrom playsound import playsound## display windowroot tk()root.geometry(400x300)root.resizable(0,0)root.config(bg blanched almond)root.title(techvidvan - countdown cloc…

IntelliJ IDEA中Maven操作窗口的命令详解/Maven命令详解/Maven生命周期命令详解

文章目录生命周期命令简介命令详解testpackage命令演示verifyinstall将当前项目放到 Maven 的本地仓库中,供其他项目使用将自己打包或者下载的 jar/war 文件复制到本地仓库中,供其他模块使用sitedeploy生命周期命令简介 在 Maven 中,项目构建…

基于Apache POI 向xlsx写入数据

【0】写在前面 0.1) these codes are from 基于Apache POI 的向xlsx写入数据0.2) this idea is from http://cwind.iteye.com/blog/2187670 , adding some comments for easy understanding proves to be my work. package com.cwind.poi; import jav…

javafx 打开新窗口_新的JMetro JavaFX 11兼容版本

javafx 打开新窗口你好,我们又见面了! 这次,新版本与JavaFX 11兼容。 继续阅读以获取详细信息。 JMetro 8.5.7和11.5.7版本 JMetro代码已分为2个分支。 master分支具有Java 8兼容的JMetro版本,“ 11”分支具有Java 11兼容的版本…

后勤管理系统_充满“智慧”的后勤管理系统是什么样的?

▲2020年4月7日,亿力信息公司部署的后勤管理系统二期上线试运行,技术人员在现场指导用户进行系统的基本操作后勤管理系统二期全面提升管理效能近日,亿力信息公司承接部署的后勤管理系统二期已上线试运行,通过贯穿资产全寿命周期的…

Final Cut Pro 在视频的多个地方同时打马赛克

文章目录使用风格化效果中的像素化或者模糊效果使用风格化效果中的删减效果让马赛克显示一段时间后消失使用风格化效果中的像素化或者模糊效果 像素化和模糊效果是将整个视频画面都像素化和模糊化,所以如果你要将画面中的某个部分打马赛克,其实这样的效…

亚麻纤维截面形态_天然丝纤维蚕丝

点击蓝字 关注我们我国是蚕丝的发源地。近年来,对出土文物的考古研究指出,蚕丝在我国已有六千多年的历史。柞蚕丝也起源于我国,根据历史记载,已有三千多年的历史。远在汉、唐时代,我国的丝绸就畅销于中亚和欧洲各国&am…

jep122_JEP 358:有用的NullPointerExceptions

jep122在文章“ 更好的默认NullPointerException消息是否会传入Java? ”,我总结了当时与JEP 草案有关的背景细节,有关使某些类型的NullPointerException (NPE)消息更有用。 上周很高兴看到该JEP现在是候选 JEP &#x…

目录、文件夹、文件三者的区别

目录也是文件,是一种特殊文件,叫目录文件,简称目录。 目录是文件系统对象,属于文件系统的概念 术语目录指的是文档文件和文件夹的结构化列表存储在计算机上的方式。它与包含姓名、号码和地址列表的电话簿相当,并且不包…

基于Apache POI 从xlsx读出数据

【0】写在前面 0.1) these codes are from 基于Apache POI 的从xlsx读出数据0.2) this idea is from http://cwind.iteye.com/blog/2187670 , adding some comments for easy understanding proves to be my work. package com.cwind.poi; import jav…

toarray方法_机器学习中类别变量的编码方法总结

作者:louwill;转载自:机器学习实验室在做结构化数据训练时,类别特征是一个非常常见的变量类型。机器学习中有多种类别变量编码方式,各种编码方法都有各自的适用场景和特点。本文就对机器学习中常见的类别编码方式做一个…

java实现可选形参_Java:可选的可选实现

java实现可选形参类java.util.Optional被实现为单个不可变的具体类,该类在内部处理两种情况。 一个有元素,一个没有元素。 让Optional作为一个接口并让两个不同的实现代替实现该接口不是更好的选择吗? 毕竟,这就是我们通常被教导要…

MySQL数据库的JSON数据类型详解

文章目录JSON 数据类型意义存储JSON串修改JSON串中指定字段的值查询 JSON 串中的数据查询 JSON 串中指定字段的值特殊语法精确查询嵌套精确查询模糊查询优化 JSON 查询处理 JSON 数据的常用函数JSON_CONTAINS_PATHJSON_PRETTY总结参考资料JSON 数据类型意义 其实,没…

高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)

【0】写在前面 0.1)本代码旨在演示 从 ring0 转移到 ring3(即,从高特权级 转移到 低特权级)0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅;0.3)文末的个人总结是干货&#…

aws 删除ec2实例_如何在AWS中启动EC2实例

aws 删除ec2实例你好朋友, 在本教程中,我们将看到如何立即在AWS中旋转EC2实例。 您应该有权访问AWS控制台。如果您还没有AWS账户,则可以单击此处并在AWS上创建免费套餐。 如何在AWS中启动EC2实例 第1步 : 使用您的凭证登录到您…

python足球射门小游戏_足球射门游戏教案

足球射门游戏教案【篇一:足球射门游戏教案】足球游戏教案任课教师:张旭授课班级:初二(1)班第1次课上课时间:2008-12-1人数:50男(30)女(20)指导教师:彭老师1.运球接力1.足球运球类游戏{ 2.传球射门3.足球打靶…

jQuery 1.9版本之后函数toggle()的轮流执行事件监听器功能被舍弃掉了

文章目录实现隐藏与显示相互切换的效果可以恢复函数 toggle 轮流执行事件监听器的功能toggle()方法主要有两个功能,一是用于绑定两个或多个事件处理器函数,在元素被点击时轮流执行;二是切换元素的显隐状态,如果元素是可见的&#…

不同特权级间代码段的跳转{ 门 + 跳转(jmp + call) + 返回(ret) }

【0】写在前面 0.1)我们讲 CPU的保护机制,它是可靠的多任务运行环境所必须的;0.2) CPU保护机制:分为段级保护 页级保护; 0.2.1)段级保护分为:段限长 limit 检查、段类型 type 检查…

精打细算油盐_Java:ChronicleMap第1部分,精打细算

精打细算油盐用数百万个对象填充HashMap会很快导致诸如内存使用效率低下,性能低下和垃圾回收等问题。 了解如何使用堆外CronicleMap ,其中可以包含数十亿个对象,而对堆的影响很小或没有。 当我们要使用中小型数据集时,内置的Map实…

日志服务器搭建及配置_[ELK入门到实践笔记] 一、通过rsyslog搭建集中日志服务器...

ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案,这是我在ELK学习和实践过程写下的笔记,整理成了一个ELK入门到实践的系列文章,分享出来与大家共勉。本文为该系列文章的第一篇,通过rsyslog搭建集中日志服务器&#…