Chinaunix首页 | 论坛 | 博客
  • 博客访问: 77599
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 161
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-03 12:32
文章分类

全部博文(14)

文章存档

2016年(1)

2015年(7)

2014年(6)

我的朋友

分类: LINUX

2015-10-03 19:35:18

    问题起源于对于吃饭时间的讨论,主角是程序员甲(我),程序员乙(more),对话如下:

    乙:今天打个桌球打的饿了,下午吃饭去早点吧
    甲:(惊恐状)你工作不饱和啊(我内心其实是赞成的)
    乙:25?(5:25)
    甲:35?(5:35)
    乙:30?
    甲:32.5?
    乙:31.25?
    甲:31.875?
    甲:我有计算器(哈哈,微软自带)
    乙:我写个程序,比你快~
    ……
    20分钟过去了
    路人丙叫吃饭,
    甲,乙:程序还没写完呢
    偷笑,原来两人都在写……
    写完两人答案一对,瞬间石化,来上图:
    
    为什么?31.66666667是什么???
    怎么除2,除着除着除个3出来了?(0.6666666667*3=2)
    刚开始没在意,不过越想越不对劲,这明明是在除2啊,哪里来的3?
    隐约觉得我们发现了什么(心中暗喜),我两煞有介事的拿出本子,想通过数学办法证明这中间发生了什么,乙君发现了等比数列的规律,(1/2+1/4+1/8+1/16+……+1/2^n = 1/3)@某人 请仔细算算这个公式这说服不了我,自己用笨办法一步步带入计算,结果中,分母始终是2的次幂啊,没有3出现,这里面有问题。
   
    看着我的代码,看到了double,眼前一亮,哈哈~
    子曰:慎用double!!!
    
在代码中尝试把打印的double的精度变高,结果如下:
    
    3不见了~
    但是,在将递归次数增加后,同时增加double的打印精度,结果如下:
    
    可以看到,刚开始的几个答案,最后两位25 75 25 75的交替,这也符合除以2的特点,但是超过一定次数后,答案就不是我们想的那样了。OK,答案找到了,是double的精度问题
    使用double还是要慎重啊~
    不过还是程序员欢乐多啊~
    学好数学很重要!!!
阅读(1621) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~