Java Math 类中的新功能,第 2 部分: 浮点数 - 编程入门网
Elliotte Rusty Harol
最小的精度单位 实数是非常密集的。任意两个不同的实数中间都可以出现其他实数。但浮点数则不是这样 。对于浮点数和双精度数,也存在下一个浮点数;连续的浮点数和双精度数之间存在最小的 有限距离。nextUp() 方法返回比第一个参数大的最近浮点数。例如,清单 2 打印出所有在 1.0 和 2.0 之间的浮点数: 清单 2. 计算浮点数数量
结果是 1.0 和 2.0 之间包含 8,388,609 个浮点数;虽然很多,但还不至于是无穷多的 实数。相邻数字的距离为 0.0000001。这个距离称为 ULP,它是最小精度单位(unit of least precision) 或最后位置单位(unit in the last place)的缩略。 如果需要向后查找小于指定数字的最近浮点数,则可以改用 nextAfter() 方法。第二个 参数指定是否查找在第一个参数之上或之下的最近数字:
如果 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)); } } } 下面给出了一些输出:
可以看到,对于比较小的 2 的幂次方,浮点数是非常精确的。但是在许多应用程序中, 在数值约为 220 时,这一精度将出现问题。在接近浮点数的最大极限时,相邻 的值将被 千的七乘方(sextillions)隔开(事实上可能更大一点,但我找不到词汇来表达 )。 如清单 3 所示,ULP 的大小并不是固定的。随着数字变 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |