再问关于浮点的比较...我卡这儿了.
在老谭书上,一道 "给出二次方程各项系数求解 "的变成题目.我对于那个判断△=0用
if(fab(disc) <=1e-6)实在不太理解,问了别人说1e-6是容许的误差,那为什么要把一个需要判断是否为零的数与一个容许误差的值比较.为什么这样就能判断数是否为零?希望有人能点拨我,希望详细点.谢谢!(题目中的disc是float型,disc=b*b-4ac)
[解决办法]
如果想深入了解一下浮点数的格式,可以翻翻计算机组成原理方面的书。
当然,不深入了解也可以。只需要想想,为什么一个float能用32个bit表示到10的38次方,同样是32个bit,为啥int只能表示到21亿,也就是10的10次方。float获得了更大的表示范围,但牺牲了精确度。
[解决办法]
if(fab(disc) <=1e-6)实在不太理解,问了别人说1e-6是容许的误差,那为什么要把一个需要判断是否为零的数与一个容许误差的值比较
==================
如果 disc 是一个明确的 0 值,
那么可以使用 if(disc == 0.0) 这样比较。
但是,
如果不是一个简单的 0 值,
那么就不能这么比较了。
因为 浮点数 参与运算,
都是有 精度的。
以float 为例子,
它可以从运算中获得 十几位 的数据,
但是这些数据中, 只有前面6-7 位是有效数据,
后面的数值都是垃圾,完全是随机的内容。
因此, 当disc由复杂运算获得时候,
需要考虑数据精度,
根据 6-7 位有效数据,
if(fab(disc) <=1e-6) 就是disc 的精度极限,
以此作为判断disc是否为 0 是比较精确的。
[解决办法]
你的那个判别式△=b*b -4*a*c > =0 因为△值是赋的float类型,实际是就是求float值什么情况下去和0做比较,1/e的6次方实际上就是一个无限接近于0的float数,当两者精度相等时也就可以做比较了