为什么c++中,如下输出的浮点值不准确?
4.8923的平方应该是23.93459929啊,为什么不准确了?经常这样偏差一些,到底是什么原因?如何解决?...
4.8923的平方应该是23.93459929啊,为什么不准确了?经常这样偏差一些,到底是什么原因?如何解决?
展开
1个回答
展开全部
浮点数不能精确的代表所有实数,同时浮点操作也不能精确的表示真正的算术运算,这导致了很多奇怪情形的产生。这种问题的产生与计算机通常代表的数字是有限精度( finite precision )有关。
比如,0.1和0.01(用二进制存储时)“不可表示”的意思是:当你试图求解0.1的平方时,结果既不是0.01也不是一个接近于0.01的可表示的数。在系统为24位(单精度)表示时,0.1(十进制)是被预先给定e = −4,s = 110011001100110011001101(e是指数,s是有效数位。0.1是正数,符号位为0,
0.00011001100110011…=1.100110011001…X2^(-4),
所以其指数是-4),转换为十进制是0.100000001490116119384765625。平方之后结果为0.010000000298023226097399174250313080847263336181640625 。
但实际上最接近0.01的可表示的数是0.009999999776482582092285156250。
同样的,π或者π/2是不可表示的意味着当你尝试计算tan(π/2)时不会得到一个有限的结果,或者结果甚至会导致溢出。因为π/2不能被精确的表示,所以对于标准的浮点硬件来说尝试计算tan(π/2)是不可能的。
比如,0.1和0.01(用二进制存储时)“不可表示”的意思是:当你试图求解0.1的平方时,结果既不是0.01也不是一个接近于0.01的可表示的数。在系统为24位(单精度)表示时,0.1(十进制)是被预先给定e = −4,s = 110011001100110011001101(e是指数,s是有效数位。0.1是正数,符号位为0,
0.00011001100110011…=1.100110011001…X2^(-4),
所以其指数是-4),转换为十进制是0.100000001490116119384765625。平方之后结果为0.010000000298023226097399174250313080847263336181640625 。
但实际上最接近0.01的可表示的数是0.009999999776482582092285156250。
同样的,π或者π/2是不可表示的意味着当你尝试计算tan(π/2)时不会得到一个有限的结果,或者结果甚至会导致溢出。因为π/2不能被精确的表示,所以对于标准的浮点硬件来说尝试计算tan(π/2)是不可能的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询