回 帖 发 新 帖 刷新版面

主题:请教几个有关计算机内存误差问题~~~!!!!

[em2][em2][em2][em2]


谢谢你的点击~~~~!!!


我在学习C语言中看到有内存误差的存在,我想请问一下,是否有什么规律来知道误差的结果!

比如:  1。        float f=123.456
                printf("%f",f);
                 
                结果为:123.456001




        2。      float y=-789.124
                 printf("%f",y);

                 结果为:-789.124023



    这两个例子中的后面小数中的误差是否可以预先算出什么的,方法是什么!?

  谢谢你的支持~~~~~~~~~~

回复列表 (共4个回复)

沙发


我以前还没有注意这个问题的。
这位仁兄很细心!!!
我猜可能与数据在内存中的存放有关吧,他是二进制阿
他会把你的十进制转化为二进制,可能有误差,有些在十进制里的有限小数在二进制里就是循环小数了,我又觉得机器会丢掉一部分了,你又用十进制输出的时候就可能不是原来的。
我猜的。

板凳

1楼有理

3 楼

奇妙ing

4 楼

建议楼主学习一下 IEEE 浮点型规则。可以 Baidu 搜索一下相关内容。

内存中用二进制表示浮点数。浮点数用 符号位 S,指数位 E,数据位 M 来表示。

符号位就是正负号啦。
指数位表示这个数的指数大小。
数据位的每一位表示一定的数,比如 1/2 , 1/4 , 1/8 ...这一位是 1 就加上,是 0 就不加。

最终的数据就是类似 ( 1/2 + 1/4 + 1/16 .... ) * ( 2^M ) * ( -1 )^S 这样的

也就是说,IEEE 浮点数是用很多小数来逼近的,毕竟浮点数是无穷多个,而我们计算机的二进制数是有限的。所以会产生截断误差。

我来回复

您尚未登录,请登录后再回复。点此登录或注册