convert_int_to_char函数在使用时出现过一个BUG。

当使用值是13200020099时,返回的字符串是"13200020111",结果是错误的。

在gcc编译器里,使用32位整型时对一个数value除于100时会默认优化成先将value乘以0x51eb851f再右移37位;而使用long long类型时就不做任何优化,即便做除于100的value实际是小于32位整型的最大值也是如此。

在函数covert_int_to_char函数里有部份代码有除以100的逻辑,使用了相同的优化方式。在代码中限制value小于0x31fffffff时使用乘以0x51eb851f再右移37位的优化方式。这里使用0x31fffffff这个值是为了避免value乘以0x51eb851f时造成溢出。

乘以0x51eb851f再右移37位的做法,等价于先乘以1374389535再除以137438953472,也等价乘以一个比0.01稍大一点点数。

通过二分法去探测边界,可以找到。

>>> print (4908533999 * 1374389535/ 137438953472)
49085339
>>> print (4908534098 * 1374389535/ 137438953472)
49085340
>>> print (4908534099 * 1374389535/ 137438953472)
49085341

当value大于4908534098时,尾数为99的数字乘以这个比0.01稍大一点点的数字就会产生进位导致结果错误。在4908534098到0x31fffffff这个区间内直接使用这种优化,尾数是99的整型结果一定是错误。

在value小于4908534098才使用将value乘以0x51eb851f再右移37位的优化能保证结果的正确。

最新文章

  1. ASP.NET MVC中,怎么使用jquery/ajaxForm上传文件
  2. 基于D3JS绘制中国地图
  3. ES6生成器基础
  4. 【HDOJ】3727 Jewel
  5. Android 框架修炼-自己开发高效异步图片加载框架
  6. HTML5新特性之Canvas+drag(拖拽图像实现图像反转)
  7. php对数组中指定键值排序
  8. thinkphp3.2
  9. CSS3之动画Animation特效
  10. div定位
  11. 针对iOS10的各种问题的解决方法
  12. React Native的WebStorm基本设置
  13. 7、Dockerfile详解
  14. TCP连接异常:broken pipe 和EOF
  15. RESTful API 设计指南(转)
  16. 本地jar包安装到本地仓库
  17. 前端-JavaScript1-2——JavaScript建立认知
  18. crontab自动失效注意事项
  19. WebStorm Error : program path not specified
  20. mongodb之 非正常关闭启动报错处理

热门文章

  1. Hadoop集群日常运维 分类: A1_HADOOP 2015-03-01 21:26 502人阅读 评论(0) 收藏
  2. Longest Increasing Subsequences(最长递增子序列)的两种DP实现
  3. 【44.10%】【codeforces 723B】Text Document Analysis
  4. 【29.27%】【hdu 5908】Abelian Period
  5. fortran 函数的调用标准
  6. <Linux> Xen虚拟机镜像的安装
  7. Smarty3.1.8 安装
  8. Android BlueDroid(一):BlueDroid概述
  9. wpf datagrid 的单元格内容超出列宽度
  10. 并发新特性—Executor 框架与线程池