快速业务通道

Java Math 类中的新功能,第 2 部分: 浮点数 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
Elliotte Rusty Harol

最小的精度单位

实数是非常密集的。任意两个不同的实数中间都可以出现其他实数。但浮点数则不是这样 。对于浮点数和双精度数,也存在下一个浮点数;连续的浮点数和双精度数之间存在最小的 有限距离。nextUp() 方法返回比第一个参数大的最近浮点数。例如,清单 2 打印出所有在 1.0 和 2.0 之间的浮点数:

清单 2. 计算浮点数数量

public class FloatCounter {    public static void main(String[] args) {      float x = 1.0F;      int numFloats = 0;      while (x <= 2.0) {        numFloats++;        System.out.println(x);        x = Math.nextUp(x);      }      System.out.println(numFloats);    } }

结果是 1.0 和 2.0 之间包含 8,388,609 个浮点数;虽然很多,但还不至于是无穷多的 实数。相邻数字的距离为 0.0000001。这个距离称为 ULP,它是最小精度单位(unit of least precision) 或最后位置单位(unit in the last place)的缩略。

如果需要向后查找小于指定数字的最近浮点数,则可以改用 nextAfter() 方法。第二个 参数指定是否查找在第一个参数之上或之下的最近数字:

public static double nextAfter(float start, float direction) public static double nextAfter(double start, double direction)

如果 direction 大于 start,则 nextAfter() 返回在 start 之上的下一个数字。如果 direction 小于 start,则 nextAfter() 返回在 start 之下的下一个数字。如果 direction 等于 start,则 nextAfter() 返回 start 本身。

这些方法在某些建模或图形工具中是非常有用的。从数字上来说,您可能需要在 a 和 b 之间的 10,000 个位置上提取样例值,但如果您具备的精度仅能识别 a 和 b 之间的 1,000 个独立的点,那么有十分之九的工作是重复的。您可以只做十分之一的工作,但又获得相同 的结果。

当然,如果一定需要额外的精度,则可以选择具有高精度的数据类型,比如 double 或 BigDecimal。例如,我曾经在 Mandelbrot 集合管理器看见过这种情况。在其中可以放大曲 线图,让其落在最近的两个双精度数之间。Mandelbrot 集合在各个级别上都是非常细微和复 杂的,但是 float 或 double 可以在失去区分相邻点的能力之前达到这个细微的级别。

Math.ulp() 返回一个数字和距其最近的数字之间的距离。清单 3 列出了 2 的各种幂次 方的 ULP:

Java Math 类中的新功能,第 2 部分: 浮点数(4)

时间:2011-04-30 IBM Elliotte Rusty Harol

清单 3. 浮点数 2 的幂次方的 ULP

public class UlpPrinter {     public static void main(String[] args) {         for (float x = 1.0f; x <= Float.MAX_VALUE; x *= 2.0f) {             System.out.println(Math.getExponent(x) + "\t" + x + "\t" + Math.ulp(x));         }     }  }

下面给出了一些输出:

0 1.0 1.1920929E-7 1 2.0 2.3841858E-7 2 4.0 4.7683716E-7 3 8.0 9.536743E-7 4 16.0 1.9073486E-6 ... 20 1048576.0 0.125 21 2097152.0 0.25 22 4194304.0 0.5 23 8388608.0 1.0 24 1.6777216E7 2.0 25 3.3554432E7 4.0 ... 125 4.2535296E37 5.0706024E30 126 8.507059E37 1.0141205E31 127 1.7014118E38 2.028241E31

可以看到,对于比较小的 2 的幂次方,浮点数是非常精确的。但是在许多应用程序中, 在数值约为 220 时,这一精度将出现问题。在接近浮点数的最大极限时,相邻 的值将被 千的七乘方(sextillions)隔开(事实上可能更大一点,但我找不到词汇来表达 )。

如清单 3 所示,ULP 的大小并不是固定的。随着数字变

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号