html5网站单页模板,凡科互动官网登陆,page n wordpress,设计一个电商网站的首页我如何遇到十六进制浮点数 我正在Java :: Geci中开发一种新功能#xff0c;以减少代码重新格式化的可能性。 如果重新格式化#xff0c;当前版本的代码将覆盖原本相同的代码。 这很烦人#xff0c;因为按下重新格式化键的快捷键相当容易#xff0c;而且许多项目甚至要求开发… 我如何遇到十六进制浮点数 我正在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不存储在二进制表示中。 C是1100而原始4是0100 。 指数是将数字推到正确位置所需的实际位移的带符号十进制表示形式。 文字的格式并非无关紧要。 首先您必须使用指数部分并且指数的字符为p或P 这与十进制表示形式有很大不同。 更新如果指数是可选的则您无法确定例如0.55是十进制浮点还是十六进制浮点。十六进制数字偶然可以仅包含十进制字符而仍然是十六进制。 经过一番思考很明显无法使用常规e或E来表示指数因为该字符是合法的十六进制数字并且在数字如0x2e3情况下可能会模棱两可。 这是十六进制整数还是。 这是整数因为我们使用p而不是e 。 我只能猜测为什么指数部分是强制性的。 因为开发人员已经习惯使用e或E作为指数来十进制浮点数所以很容易将0xC90F.0e3误读为单个浮点数即使需要十六进制浮点p而不是e 。 如果指数不是强制性的则此示例将是浮点数与整数的合法和。 同时看起来像一个数字那不是很好。 另一个有趣的事情是指数是十进制。 这也是因为某些十六进制数字已被用于其他目的。 浮点数和双后缀。 如果要表示文字是浮点数则可以将f或F附加到末尾。 如果要表示此文字为double则可以将d或D附加到末尾。 这是默认设置因此添加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 DarcyOracle的工程师OpenJDK开发人员马拉松运动员快步手偶尔的摄影师还有很多其他事情。在Twitter上提供了反馈。 我将他的回复复制到这里因为它绝对有价值并为读者增加了价值从而使读者受益 十进制字符串和二进制浮点值的特定设置之间的映射通常是不明显的。 十六进制浮点文字在需要时例如在测试中提供了直接的文本到二进制fp映射。 参见https://blogs.oracle.com/darcy/hexadecimal-floating-point-literals 翻译自: https://www.javacodegeeks.com/2019/07/java-hexadecimal-floating-point-literal.html