杂谈:关于浮点数的精度问题

本文探讨了浮点数在计算机中的表示方式,解释了Float类中MIN_VALUE和MIN_NORMAL常量的区别,以及为何double类型在进行算术运算时会出现精度丢失的现象。深入解析了浮点数转换为内存存储格式的过程,揭示了浮点运算不精确的根本原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1)包装类Float中为什么有两个常量来表示最小值:MIN_VALUE和
MIN_NORMAL?
个人理解:既然有两个常量,说明两个常量表示的数值不一样,查阅资料后发现,MIN_VALUE:值为
3.4E-45 的常量,它表示 float 类型能够表示的最小值。MIN_NORMAL:保存 float 类型数值的最小标
准值的常量,即 2-126。                                        
                               2)double a = 1.0-0.9的结果不精确等于0.1,为什么?编
程语言精度丢失是老生常谈的话题,这也是从c语言等遗留下来的问题。为何浮点数可能丢失精度浮点十
进制值通常没有完全相同的二进制表示形式。 这是 CPU 所采用的浮点数据表示形式的副作用。为此,
可能会经历一些精度丢失,并且一些浮点运算可能会产生意外的结果。
将一个float型转化为内存存储格式的步骤为:

        (1)先将这个实数的绝对值化为二进制格式,注意实数的整数部分和小数部分的二进制方法在
上面已经探讨过了。
     (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。
     (3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。
     (4)如果实数是正的,则在第31位放入“0”,否则放入“1”。
     (5)如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第
30位放入“0”。
     (6)如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第
23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第
29到第23位。
简单点的说,浮点运算(小数运算)计算结果不准确的原因正是以上过程中出现了问题。
本次回答参考的资料:https://blog.youkuaiyun.com/aosica321/article/details/53536928

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值