C++ 中浮点数精度丢失问题

必知概念

  1. 浮点数由阶码和尾数两部分组成。
    在这里插入图片描述
    E 为阶码,M 为尾数。
  2. 浮点数默认保存为 double 类型,就像整数默认为 int 型一样。
  3. float 的十进制精度为 7 位。
  4. double 的十进制精度为 16 位。
  5. 所以浮点数在计算机中存储时,可能出现 精度丢失 问题。
  6. 所以编程时一般都用 double 而不用 float,以免造成难以发现的 bug。

下面来看编译结果及代码(浮点数规格化就是对非规格化浮点数进行的处理,包括溢出处理)在这里插入图片描述

源码:

#include<iostream>
#include<bitset>

int main() {
	std::cout << "1.0 == 1.00000001 ? " << (1.0 == 1.00000001) << '\n';
	std::cout << std::endl;
	 
	std::cout << "1.0f == 1.00000001f ? " << (1.0f == 1.00000001f) << "  丢失小数点后第八位 1 (浮点数规格化处理)" << '\n';
	std::cout << "1.00000001f 的 36 位二进制表示 " << bitset<32>(1.00000001f)<< std::endl;
	std::cout << std::endl;
	
	std::cout << "1.0f == 0.99999998f ? " << (1.0f == 0.99999998f) << "  丢失小数点后第八位 8 (浮点数规格化处理)" << '\n';
	std::cout << "0.99999998f 的 32 位二进制表示 " << bitset<32>(0.99999998f) << std::endl;
	std::cout << std::endl;
	
	std::cout << "2.0f == 1.99999995f ? " << (2.0f == 1.99999995f) << "  丢失小数点后第八位 5 (浮点数规格化处理)" << '\n';
	std::cout << "1.99999995f 的 32 位二进制表示 " << bitset<32>(1.99999995f) << std::endl;
	std::cout << std::endl;
	
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值