首页 > 编程知识 正文

浮点数隐藏位,解决浮点数计算的精度问题

时间:2023-05-06 18:26:04 阅读:153693 作者:627

1浮点数的定义提到浮点数,大脑中一定会联想到固定点数。 首先来看看两者的定义吧。

在计算机中,数据有两种表示方法。 分别是定点数浮点数。 请注意,这只是数的两种表示方式,而不是两个数。

1、积分数:

定数点是指小数点在数中的位置一定,通常有定点整数和定点小数。 选择小数点位置后,运算中的所有数统一为定点整数或定点小数,运算中可以不考虑小数问题。

(1)定义)数据中小数点位置一定的数量

)2)种类:定点整数

)3)小数点位于符号位和有效位之间。

注:定点数受字长限制,超出范围时会溢出。

2、浮点数:

浮点数的位置是固定的,用步代码和尾数表示。 通常,尾数是纯小数,阶码是整数,尾数和阶码都是有符号的数。 尾数符号表示数的正负,步号符号表示小数点的实际位置。

)1)形式: N=M2E

)2) m )尾数

(3)步骤代码

)4) m和e在计算机中的表现形式是

步码尾数符号尾数

把这个和数学中的科学记数法进行比较。

注意:浮点数的精度取决于尾数,而数字的范围取决于步长代码。

2使用浮点数的理由点数的显示范围是固定的、有限的。 例如,使用8位十进制表示整数。

最大(999999999最小) 000000000如果想表示更大的数,那就无从下手了。 因此数学中一般采用科学的计数法进行简化表示。

计算机也可以用同样的方法,用科学的计数法表示实数。 浮点数的科学计数法的表达有IEEE的标准,它定义了两种基本的格式。 一种是用32位表示单精度的浮点数,也就是我们常说的float或float32类型。 另一个是用64位表示双精度的浮点数,也就是我们平时说的double和float64类型。 双精度型和单精度型几乎相同。 现在,让我们来看看单精度类型。 当然也知道双精度。

3 32位浮点数的显示范围就是在这样的浮点数的表示下,如果不考虑符号的话,浮点数能够显示的最小数和最大数大约为1.1710381.1710 ^ {-38 } 1.171038

3.40 1 0 38 3.4010^{38} 3.401038。

关于最小数量和最大数量的显示,第一次学习时分的时候,有点不理解。

最大数举例

阶数e由8位表示,取值范围为0-255,排除0和255 (均为0和均为1 )的特殊情况,指数e的取值范围为1-127=-126到254-127=127。

因此,单精度浮点数最大正数值的符号位S=0、层编号e=254(1111110 )、指数e=254-127=127

浮点数获取正数的最大值。 1.1111111111111111111111 *2^ 127

)1.后面23个1是尾数的范围1~2,由于其最高位总是1,所以只访问小数部分即可,所以小数为23位1 ),

约等于

2127=3.410382 *2^ { 127 }=3.4 * 10 ^ { 38 } 22127=3.41038

注:理解的重点是尾数及其对应的二进制指数将转换为十进制表示。

4浮点数的精度为32位浮点数的有效位长共有23位,如果两个数的指数位错位23位,则小的数向右错位24位后,所有的有效位都将丢失。 也就是说,浮点数可以表示上升到3.40 1 0 38 3.4010^{38} 3.401038,下降到1.1710381.1710^{38}1.171038的数值范围。 但是,在实际计算中,只有两个数,相差2 24 2^{24} 224,也就是约1600万倍。 即使把这两个数加在一起,结果也完全没有变化。 请试试看。 我试着用简单的Java程序,把值为2000万的32位浮点数和1相加。 可以看出,1这个过程因为精度的损失而“完全抛弃”。

publicclassfloatprecision { publicstaticvoidmain [ ] args } { floata=20000000.0 f; float b=1.0f; float c=a b; system.out.println(cis ) c; float d=c - a; system.out.println(dis ) d; }对应的输出结果如下。

c is 2.0E7d is 0.0可以使用Kahan Summation算法使结果更准确,以解决精度下降的问题。

相关链接:

数和小数的合计算法

IEEE754 32位浮点数显示范围

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。