请从原理上进行推导
另外请解释为什么 2 / 10 - 0.1 * 2 就会等于0
注C语言中 前面的 2 和 6 写成 2.0 和 6.0 不伤大雅
或者说在Matlab 以及任何编程语言中 为什么当 n / 10.0 - 0.1 * n 这个算式 当 n取 3 6 7 时并不等于0 这是为什么?
不信大家可以去试试
请通过计算机存储浮点数的原理进行推导。本人大概明白为什么 就好比0.1这个数用2进制表示是一个无限循环小数 所以存储时必定有截断误差,我大概只知道如何推到这个答案 但是太懒了 所以想请各位高手帮我推到下。
可能是我表述的不好 你完全没有理解我的问题。
你可以试试 1 / 10 - 1 * 0.1 = 0 , 2 /10 - 2 * 0.1 = 0 , 3 / 10 - 3 * 0.1 不等于0 4 / 10 - 4 * 0.1 = 0, 5 / 10 - 5 * 0.1 = 0 , 6 / 10 - 0.1 * 6 不等于0 7 / 10 - 0.1 * 7 不等于0 8 / 10 - 8 * 0.1 =0 , 9 / 10 - 9 * 0.1 =0
你用就用Matlab和百度的计算器试试就行如果你不嫌麻烦你可以用任何编程语言试一试不过得输成1.0 / 10 - 1 * 0.1 的形式我想推倒为什么
是什么?
追答是楼上回答的
追问现在问题不是这个 是这个结果是怎么出来的 我当然懂得这些数据结构在电脑中的存储方式了 也知道 整型下 2/10会等于0 楼上的回答说数据会转换类型 我当然是知道这个道理。我遇到的这个问题并不是由于数据类型转换而导致的 而是关乎计算机本质上二进制存储浮点数所存在的固有问题 我希望知道的是这个由于浮点数存储的局限性是如何导致上述算式在计算机中会得到如此的计算结果。
对不起 我表述的不太清楚 你可以看看我对楼下的追问 也许你就明白我想问什么了
追答好
为什么计算机中 6 \/ 10 - 0.1 * 6 = -1.1102e-016?
那么fl(n\/10)就是n\/10的浮点表示,但fl(fl(0.1)*n)=fl(0.1(1+t)*n)所以一来要看n*t\/10的影响有多大,二来还有f(n\/10)本身的表示误差有多大 显然n=1,2,4,8,...的时候结果为0,因为n=2^k时fl(0.1*n)=fl(0.1)*n=fl(1\/10)*n=fl(n\/10)对于n=3,fl(0.3)=2^{-...