易错点:浮点数在计算机中的存储精度问题

题目:下列代码中,输出结果是( )

#include<iostream>
using namespace std;
int main()
{
	double a = 0.9;
	double b = 1.0;
	if (((b - a) == 0.1))
	{
		cout << "Equal" << endl;
	}
	else
	{
		cout << "Not equal" << endl;
	}

}

A.Equal
B.Not equal
C.程序不能正确执行
D.没有输出

解答

  1. 分析浮点数的存储特性
    • 在计算机中,浮点数(如double类型)是以二进制形式存储的。由于浮点数的表示存在精度限制,很多十进制小数无法精确地用二进制表示。
    • 例如,0.1在十进制中是一个简单的小数,但它在二进制中是一个无限循环小数((0.0001100110011\cdots_2))。同样,0.91.0转换为二进制后在存储时也会有精度问题。
  2. 分析代码中的比较操作
    • 代码中定义了double a = 0.9;double b = 1.0;,然后进行(b - a) == 0.1的比较。
    • 由于0.91.0以及0.1在计算机中存储都存在精度问题,b - a的结果在计算机中存储的二进制值并不一定与0.1存储的二进制值完全相同。
    • 尽管从数学上看1.0 - 0.9应该等于0.1,但在计算机实际存储和运算中,因为精度问题,它们的二进制表示有差异。
  3. 得出结论
    • 所以(b - a) == 0.1这个比较结果为假,程序会执行else分支。
    • 因此,输出结果是Not equal,答案选B。

总结:这道题主要考查了浮点数在计算机中的存储精度问题,不能简单地像数学运算那样直接比较浮点数是否相等,因为计算机对浮点数的存储和运算存在精度限制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值