浮点数字取整的方法_浮点数字

Java™语言规范的版本5向java.lang.Mathjava.lang.StrictMath添加了10个新方法,而Java 6添加了另外10 个方法 。本两篇系列文章的第1部分介绍了在数学上有意义的新方法。 也就是说,它们提供了计算机时代以前的数学家会熟悉的功能。 在第2部分中,我着重介绍仅当您意识到它们被设计用于浮点数而不是抽象实数时才有意义的功能。

正如我在第1部分中提到的那样,实数(例如e或0.2)与其计算机表示形式(例如Java double )之间的区别是重要的。 该数字的柏拉图式理想是无限精确的,而Java表示仅具有固定数量的位数( float为32, double float数为64)。 float的最大值约为3.4 * 10 38 ,对于某些您可能希望表示的事物(例如宇宙中的电子数)而言,还不够大。

double精度数最多可以表示1.8 * 10 308的数字 ,几乎涵盖了我能想到的任何物理量。 但是,在对抽象数学量进行计算时,可能会超过这些值。 例如,仅171个! (171 * 170 * 169 * 168 * ... * 1)足以超出double的范围。 float仅35点就超出范围! 小数字(即接近零的数字)也可能会产生问题,并且涉及大数字和小数字的计算都可能具有正危险性。

要解决此问题,用于浮点数学运算的IEEE 754标准(请参阅参考资料 )添加了特殊值Inf表示Infinity和NaN表示“ Not a Number”。 IEEE 754还定义了正零和负零。 (在常规数学中,零既不是正数也不是负数。在计算机数学中,它既可以是负数也可以是负数。)这些值在经典证明中造成严重破坏。 例如,当使用NaN时,排除的中间定律不再成立。 x == y或x!= y不一定是正确的。 如果x(或y)为NaN,则两者都可能为假。

除了数量级问题之外,精度甚至是更实际的问题。 我们都已经看到了这样的循环,您将其加0.1一百次,最后得到9.99999999999998而不是10:

for (double x = 0.0; x <= 10.0; x += 0.1) {
    System.err.println(x);
}

对于简单的应用程序,通常只要求java.text.DecimalFormat将最终输出格式化为最接近的整数,然后将其命名为day。 但是,在不确定工程是否可以使用整数的科学和工程应用中,您需要格外小心。 如果要互相减去大数得到一个小数,则需要非常小心。 如果要除以那个小数目,则仍然需要更加小心。 当将答案应用到物理世界中时,此类操作甚至可以将微小的错误急剧放大为大错误,从而产生明显的后果。 有限精度浮点数引起的小的舍入误差会严重歪曲数学上精确的计算结果。

浮点数和双精度数的二进制表示

用Java语言实现的IEEE 754浮点数有32位。 第一位是符号位,0表示正,1表示负。 接下来的八位是指数,可以保存-125至+127的值。 最后的23位保留尾数(有时称为有效尾数),范围从0到33554554。 将它们放在一起,浮点数将解释为sign * mantissa * 2 exponent

细心的读者可能会注意到,这些数字并没有完全相加。 首先,指数的八位应代表-128至127,就像带符号的字节一样。 但是,指数有126的偏差。即,您从无符号值(0到255)开始,然后减去126得到真实的指数,现在是-126到128。好吧,除了128和-126是特殊的价值观。 当指数全为1位(128)时,表示该数字为Inf,-Inf或NaN。 要弄清楚哪个,您必须查看尾数。 当指数全为零位(-126)时,即表示该信号已被非规格化 (更多有关这的含义),但指数仍为-125。

尾数基本上是一个23位无符号整数-很简单。 23位可以容纳0到2 24 -1之间的数字,即16,777,215。 等一下,我不是说尾数从0到33,554,431不等吗? 那是2 25 -1。 多余的钱从哪里来?

事实证明,您可以使用指数来判断第一位是什么。 如果指数全为零,则第一位为零。 否则,第一位为1。 因为您始终知道第一位是什么,所以不必将其包括在数字中。 您可以免费获得一点额外费用。 偷偷摸摸的吧?

尾数的第一位为1的浮点数已标准化 。 即,尾数始终具有介于1和2之间的值。即使指数始终为-125,尾数的第一位为零的浮点数也被归一化,并且可以表示更小的数字。

除了使用52位尾数和11位指数以提高精度外,双精度码的编码方式几乎相同。 双精度指数的偏差为1023。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 点转整数IEEE 743算法是一种用于将点数表示转换为整数的算法。 首先,我们需要了解点数的表示方式。IEEE 743标准定义了点数的表示为一个符号位、一个指数位和一个尾数位。符号位表示正负号,指数位表示数值的数量级,尾数位表示数值的精度。 在点转整数的算法中,我们需要首先判断点数是否为正数还是负数。如果是负数,则将其符号位设为负号。 接下来,我们需要判断点数的指数位,用于确定点数的数量级。如果指数位大于0,则说明点数的整数部分位于小数点右边。我们可以将点数乘以相应的数量级(10的指数位次方),然后进行整操作,得到整数部分。如果指数位小于等于0,则说明整数部分位于小数点左边,我们可以直接整操作得到整数部分。 最后,我们需要处理点数的尾数位,以确定点数的精度。通常情况下,我们可以将点数的尾数单位化,即将其乘以10的尾数位次方。 以上就是点转整数IEEE 743算法的基本步骤。需要注意的是,该算法只适用于标准的点数表示,不适用于特殊情况(如NaN或无穷大)的处理。在实际应用中,我们还需要考虑一些边界情况和异常处理。 ### 回答2: IEEE 743点转整数算法是一种将点数转换为整数的标准算法。以下是该算法的步骤: 1. 首先确定点数的符号位。如果点数为正,则符号位为0;如果为负,则符号位为1。 2. 然后确定点数的阶码。根据IEEE标准,在单精度点数中,阶码位于第1位到第8位。在双精度点数中,阶码位于第1位到第11位。将阶码转换为一个整数。 3. 确定点数的尾数。在单精度点数中,尾数位于第9位到第31位。在双精度点数中,尾数位于第12位到第63位。 4. 根据点数的阶码,将尾数进行右移或左移操作。右移操作将尾数向右移动,左移操作将尾数向左移动。移动的位数为阶码的绝对值。 5. 如果点数的阶码为正,则执行左移操作。如果阶码为负,则执行右移操作。 6. 将移动后的尾数转换为整数。这可以通过将尾数的每一位乘以2的幂来实现。例如,如果尾数的二进制表示为1010,则将其转换为整数时,可以计算1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0 = 8 + 0 + 2 + 0 = 10。 7. 根据符号位确定整数的正负。 8. 最后,将整数的符号位、阶码和尾数组合起来,得到最终的整数值。 需要注意的是,如果点数不在整数的表示范围内(例如,超出了32位或64位整数的值范围),则无法进行准确的转换,将会出现截断或溢出情况。 ### 回答3: 点转整数的IEEE 743算法,是通过将点数的小数部分截断,将结果转换为整数。根据IEEE 743的规定,截断操作应该向0方向进行,即不进行四舍五入。以下是这个算法的步骤: 1. 首先,判断点数的符号位(正数为0,负数为1),并将其保留。 2. 然后,将点数的指数部分减去偏移量(通常为2的n-1次方-1,n为指数的位数),得到一个无偏指数。 3. 判断无偏指数是否大于等于小数点前第一个非零数字的位置(即点数的有效位数),如果是,则直接将点数的小数部分截断,得到一个整数。 4. 如果无偏指数小于有效位数的位置,则需要进行舍入操作。 - 如果小数位数的位置小于等于无偏指数+1,则直接将小数部分截断,得到一个整数。 - 如果小数位数的位置大于无偏指数+1,则根据无偏指数+1位置上的数字进行判断: - 如果无偏指数+1位置上的数字大于等于5,则将小数部分截断,并将整数部分加1。 - 如果无偏指数+1位置上的数字小于5,则直接将小数部分截断,得到一个整数。 5. 最后,根据步骤1中的符号位,加上步骤4中得到的整数部分,即为点数转换为整数的结果。 这就是点转整数的IEEE 743算法的步骤。需要注意的是,这个算法会产生截断误差,因为截断操作无法精确地表示点数的小数部分。因此,在进行点转整数时,需要根据实际问题的要求,选择合适的舍入方式,以尽量减小截断误差的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值