C语言的数值溢出问题(中)

浮点数的数值溢出问题:

[注]整型数据的表示范围是连续的, 而浮点型数据的表示范围并不是连续的(严格来说): 这是因为浮点型数据在内存中以阶码(决定了数据的表示范围)+尾数(决定了表示精度)的形式存储. 

[注]当下溢出现象发生时, 系统会将结果处理成机器0(因为这个数已经小到足够接近0, 且无法用浮点数进行表示). 

数值溢出的危害:

解决对策:

从小范围数据到大范围数据:

从高精度数据向低精度数据转换时, 会损失什么信息?

数值精度损失举例:

问题:浮点数在内存中是如何存储的呢?

    浮点数在内存中是以阶码(决定浮点数的表示范围)+尾数(决定浮点数的表示精度)的形式存储的.

IEEE754规定的浮点数标准格式:

[注]在IEEE754规定的格式下, float类型可精确表示6~7位数据, double类型可精确表示16位数据.

精度损失分析实例:

问题:为什么长整型的数据不能用单精度浮点型数据精确保存?

    由于浮点型数据在内存中以阶码+尾数的形式存储, 而尾数所占的位数决定了浮点数的精度, 虽然长整型数据和单精度浮点型数据在内存中都占4个字节, 但是单精度浮点型数据的4个字节并没有全部用来存储尾数, 其中有部分位用来存储阶码, 因此单精度浮点型数据的尾数在内存中所占的位数要小于长整型数据在内存中所占的位数. 因此将长整型数据123456789赋值给单精度浮点型变量后, 就会损失长整型数据第七位以后的数据精度. 

问题:为什么浮点数的输出结果也不准确呢?

    (输出c)在输出双精度实型数据时, 我们发现只有数据的前十六位是准确的, 这是因为双精度实型能精确表示的数据位数只有16位, 因此第十六位之后的数据是不准确的.

    (输出b)在输出单精度实型数据时, 我们发现只有数据的前七位是准确的, 这是因为单精度实型能精确表示的数据位数只有7位, 因此第七位之后的数据是不准确的.

[注]虽然我们如此书写 double c=123456789123.456765, 但实际能精确存储的数据位数只有16位, 根据输出结果, 变量c中实际存储的数值为123456789123.456770, 在将双精度实型变量c赋值给单精度实型变量b后, b精确存储c变量存储数据的前七位, 所以b变量中实际存储的数据为123456790528.000000(根据输出结果).

问题:什么是有效数字?

 

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好梦成真Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值