zoukankan      html  css  js  c++  java
  • 【转】为什么0.1无法被二进制小数精确表示?

    这个问题困扰了我不少时间,最近有个比较清晰的认识,和大家分享。

    这个问题首先要从数位表示法说起。今天我们看到的123这样的十进制数,是自然而然的理解其意义,但是有没有深究其内在的数学原理呢?

    所谓十进制是0~9十个基本符号为基础的一种数字表示法,数位表示法是将一串基本符号从左到右连续排列的一种方法。为什么12时表示一十二,而不是二十一,或者是一加二的意思呢?因为数字所处的位置是有特别意义的,最右边第一个数字符号,代表基本的数0~9,而第二位的意义并不是0~9,而是0*10~9*10。推而广之,百位是x*100,(x是符号),用简练的数学公式就是x*10^k , 个位k是0,十位是1,百位k是2,从右到左一直数下去。123的意思就是1*10^2+2*10^1+3*10^0。

    位置,进制,符号这三者的关系就是“123”这种数字表示法内在的数学原理。

    那么,0.1 是什么意思?是1*10^-1,向右数数的结果。小数点是为了区分个位的位置在哪里。

    一个数要用“数位表示法”表示出来,必然需要能够化为x*10^k的形式,而并不是任意数都能够做到。从数位法小数的定义看可以得知,一个数要能够被表示出来,需要能除尽10,才有若干个x*10^k 的数位组合表示它,否则就是无数个符号才能表示。如1/3这个数除以10等于1/3*1/10 = 0.0333333….循环小数。

    究竟哪些数可以用十进制表示哪些不可以?如分母是10的因子和因子的合数,如1,2,5,10,20,50等(整数分母为1,而任意大于1的数的因子都有1和自身,因此整数可以用任意数制精确表示)。

    回答题目,为什么0.1无法被二进制小数表示,0.1即1/10这个数要转换成二进制即x*2^k的组合数,必须要除尽2.要注意,2进制只有0,1两个符号,另一个需要注意,二进制被除数右移一位等于*2,而非10进制的*10。

    1/10*1/2 = 1/20

    1*2*2*2*2 = 32 右移4位

    -20 = 12        商1

    12*2 = 24 右移1位

    -20 = 4       商1

    4*2*2*2 =32 右移3位

    -20 = 12   商1  可见数字重复了,循环小数无疑

    即 0.00011001。

    那么2进制能够表示哪些十进制小数,5/10,因为能约成1/2,分母是2的因子。

    总结一点,就是位置表示法有其自身的缺陷,并不能在有限的数位,表示众多有理数,这个时候,需要借助分数来帮忙,来避免位置表示法以固定数作分母这个缺点。

    如果需要一个可以避免循环小数的数制,不妨试用210进制,因为因子比较多,2*3*5*7 =210.

    转自:http://www.cnblogs.com/Nobel/archive/2013/04/08/3009162.html

  • 相关阅读:
    解决VMwave下卡死的办法
    深度探索C++对象模型第四章:函数语义学
    cc
    tbb库的使用
    10内核同步方法
    哈希
    django 和restful framework 初始配置轻松搞定
    linux有趣动画--代码雨
    linux有趣开机图标--佛祖保佑
    Socket是什么,通俗易懂点说
  • 原文地址:https://www.cnblogs.com/scecit/p/5276943.html
Copyright © 2011-2022 走看看