corn_love_chun corn_love_chun
关注数: 4 粉丝数: 14 发帖数: 6,375 关注贴吧数: 8
zhuanfa: some info about digital and IEEE754 使用浮点数和小数中的技巧和陷阱 作者:cuiyingfeng 来源:不详 (2006-07-14 11:45:52) 虽然几乎每种处理器和编程语言都支持浮点运算,但大多数程序员很少注意它。这容易理解 ― 我们中大多数很少需要使用非整数类型。除了科学计算和偶尔的计时测试或基准测试程序,其它情况下几乎都用不着它。同样,大多数开发人员也容易忽略 java.math.BigDecimal 所提供的任意精度的小数 ― 大多数应用程序不使用它们。然而,在以整数为主的程序中有时确实会出人意料地需要表示非整型数据。例如,JDBC 使用 BigDecimal 作为 SQL DECIMAL 列的首选互换格式。 IEEE 浮点Java 语言支持两种基本的浮点类型: float 和 double ,以及与它们对应的包装类 Float 和 Double 。它们都依据 IEEE 754 标准,该标准为 32 位浮点和 64 位双精度浮点二进制小数定义了二进制标准。 IEEE 754 用科学记数法以底数为 2 的小数来表示浮点数。IEEE 浮点数用 1 位表示数字的符号,用 8 位来表示指数,用 23 位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数 2)小数来表示,这意味着最高位对应着值 ?(2 -1),第二位对应着 ?(2 -2),依此类推。对于双精度浮点数,用 11 位表示指数,52 位表示尾数。IEEE 浮点值的格式如图 1 所示。 图 1. IEEE 754 浮点数的格式 因为用科学记数法可以有多种方式来表示给定数字,所以要规范化浮点数,以便用底数为 2 并且小数点左边为 1 的小数来表示,按照需要调节指数就可以得到所需的数字。所以,例如,数 1.25 可以表示为尾数为 1.01,指数为 0: (-1) 0*1.01 2*2 0 数 10.0 可以表示为尾数为 1.01,指数为 3: (-1) 0*1.01 2*2 3 特殊数字除了编码所允许的值的标准范围(对于 float ,从 1.4e-45 到 3.4028235e+38),还有一些表示无穷大、负无穷大、 -0 和 NaN(它代表“不是一个数字”)的特殊值。这些值的存在是为了在出现错误条件(譬如算术溢出,给负数开平方根,除以 0 等)下,可以用浮点值集合中的数字来表示所产生的结果。 这些特殊的数字有一些不寻常的特征。例如, 0 和 -0 是不同值,但在比较它们是否相等时,被认为是相等的。用一个非零数去除以无穷大的数,结果等于 0 。特殊数字 NaN 是无序的;使用 == 、 < 和 > 运算符将 NaN 与其它浮点值比较时,结果为 false 。如果 f 为 NaN,则即使 (f == f) 也会得到 false 。如果想将浮点值与 NaN 进行比较,则使用 Float.isNaN() 方法。表 1 显示了无穷大和 NaN 的一些属性。 表 1. 特殊浮点值的属性表达式 结果 Math.sqrt(-1.0) -> NaN 0.0 / 0.0 -> NaN 1.0 / 0.0 -> 无穷大 -1.0 / 0.0 -> 负无穷大 NaN + 1.0 -> NaN 无穷大 + 1.0 -> 无穷大 无穷大 + 无穷大 -> 无穷大 NaN > 1.0 -> false NaN == 1.0 -> false NaN < 1.0 -> false NaN == NaN -> false 0.0 == -0.01 -> true 基本浮点类型和包装类浮点有不同的比较行为使事情更糟的是,在基本 float 类型和包装类 Float 之间,用于比较 NaN 和 -0 的规则是不同的。对于 float 值,比较两个 NaN 值是否相等将会得到 false ,而使用 Float.equals() 来比较两个 NaN Float 对象会得到 true 。造成这种现象的原因是,如果不这样的话,就不可能将 NaN Float 对象用作 HashMap 中的键。类似的,虽然 0 和 -0 在表示为浮点值时,被认为是相等的,但使用 Float.compareTo() 来比较作为 Float 对象的 0 和 -0 时,会显示 -0 小于 0 。 浮点中的危险由于无穷大、NaN 和 0 的特殊行为,当应用浮点数时,可能看似无害的转换和优化实际上是不正确的。例如,虽然好象 0.0-f 很明显等于 -f ,但当 f 为 0 时,这是不正确的。还有其它类似的 gotcha,表 2 显示了其中一些 gotcha。
请关注那两辆开往春天的地铁 请关注那两辆开往春天的地铁 http://post.baidu.com/f?kz=275253929 我想很快就会有很多人看到那两列开往春天的地铁。车厢里,有很多很多春春的慈善广告。 准备开往春天的地铁并不难。最初,是心晴得到的一个信息。然后,她找到我,我找到很多玉米,大家一起联系到这辆地铁开通需要的方方面面。 一开始似乎也困难重重。有很多环节,有很多需要。但大家坚信:但做好事,莫问前程。遇到困难的时候,不要想“前面的事情白做了怎么办”,先解决面对的问题才是王道。成功了,是我们再次为慈善做了件事情。不成功,下次继续努力。 最终,钱的问题解决了。照片的问题解决了。广告版面制作和设计的问题都解决了。 感谢名单。 感谢心晴。她总怀有一种天真的热情,不放弃任何一个机会和可能。也许,换一个人得到这个消息,只当作和自己没有关系。这件事不会让她加薪,却会占用她很多时间和精力。但她还是第一时间想到:也许我们可以做点什么。这段时间她正在换工作,跳槽到一个全新的岗位。当事情遇到挫折,焦头烂额之际,她一直都没有放弃努力。 感谢阿凤。她是个情绪化的小女人。但她也是个有能力的小女人。谁都知道她有钱。但,其实,大多数时候,她解决问题并非用钱。要知道她的工作有多忙,“时间就是金钱”这句话,对她而言,并非一句比喻。虽然很多时候她可以用钱去解决问题,但她更愿意用心。 感谢Tmingsky。她第一次拿给我看的设计就让我惊喜:专业,守时。最重要的是,那份浓浓的情意。同时,我也意识到这样一位专业的广告设计人员工作强度会有多大。为工作熬夜之余,她把唯一一点休息时间用来设计版面。面对一次又一次的修改,她毫无怨言。她一个人义务完成了所有的版面设计。 感谢红基会的工作人员。几乎每天都要被我们催促,却始终非常耐心。在百忙之中抽出时间为这件事情奔忙。红基会每天那么多活动,我们的这件只是小小一桩。但在他们眼里,每一次慈善的行为,都是同样可贵。 感谢小乔。她和红基会积极配合,精心挑选图片。这次选的都是最新的美图。否则,这一次的图片,又不知道该找谁去要了。 感谢地铁广告公司对慈善的大力支持,在尽可能的条件下,给我们比较好的位置。 最后,感谢春春。让我们彼此相识。让更多的人关注慈善。她用自己的行为,唤起了更多人对慈善的关注。我想,很多人心中都存在善念,只是我们生活的太匆忙,忘掉了而已。 当开往春天的地铁进站,每个人都激动不已:原来,很多事情,并没有想象的那么难。 希望这两列地铁,还有那些通道中的慈善广告,能在这个深秋的冷风中,为大家带去一点春天的温暖,也为需要的人带来更多帮助的机会。 最后的最后,我想说,没想到事情这么巧,居然在大家刚刚听到飘浮地铁的时候,看到了这些广告。这样的巧合,是否预示着——春春的新专辑,也一定会有一个美好的未来呢? 作者: 神圣午睡 2007-10-15 16:22   回复此发言
1 下一页