关于类型的转换-2015-01-09

来源:互联网 发布:巴贝拉网络订餐 编辑:程序博客网 时间:2024/05/12 19:12
关于类型的转换-2015-01-09
 
     多年以前,在一本书上看到 “对图片的缩小在放大,图片会变模糊” 当时并没细想。

PART 1:
 
      最近遇到一个问题,运算的数据太大,导致的异常。去掉其他的一些参数的 最后精简就是  D=A*B/C
 

    int A、D、B、C      其中 A能够达到3300万,B能够达到1万,C能够达到2万。  D算出来能够达到 1100万(一个32位的数据长度之内).一切看似完全合理。但是实际得到的结果,却完全不是想要的。可能只有几百 或者 几十 。

     初步假设是因为A*B,超过了一个范围 。 

           从运算结果看,数据完全是在范围内。完全合理。D 完全能够存储的下。 那么可能出现问题的地方,应该是在计算的过程中出现的。

    验证这个假设
          在运算开始前,把数据对应的先缩小, 再进行计算,计算完后,再进行放到。事实证明 这个方法真的可行。

          有个缺陷,就是在缩小之后再放大的时候,原来的精度就丢失了。不过3300万大小,精确度确实没那么高的必要。

    因此这个方法是可行的



    故事这样结束了,却还是有个疑问。 没什么在计算的过程中,数据会溢出?


 

   PART 2:
     虽然用一种方式把问题解决了。却没看到在什么情况下,会再次引发这类情况。
        终于在书籍中找到了解释:
            如果在运算的过程中,最长的为int,只会转换成int。
        也就是说,计算公式一直在以int的大小,进行运算。
 
     ( 在印象中,计算时会自动放大,int *int 会转换成double
 
      问题的关键终于找到了。(found the key .找到了一把钥匙)

      那么 只需要将 a,b,c,d 全部换成 double,将可以完美的解决。这样将省掉 中间的放大和放小的运算。 


      蛋炒饭最简单,也最困难。有些基础的东西还是很重要的。

 附上:图片 
  



 
 
    
#include"stdio.h"

int  main(){
 int intt;
unsigned int a,c;
double d,b;

 a=30000000;    
 b=10000;
 c=20000;
 d=a*b/c;
 
printf("double %d\n",sizeof(double));
printf("float %d\n",sizeof(float));
printf("int %d\n",sizeof(int));
printf("unsigned short int %d\n",sizeof(short int));
printf("unsigned long %d\n",sizeof(long int));
printf("%.0f",d); 
  }  
thxy
zhjmyx@qq.com
2015-01-09 17:01:30 于安徽
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑中韩文内容显示乱码怎么办 入驻shopee没身份证怎么办 液相色谱柱柱压降低怎么办 c18色谱柱堵了怎么办 色谱柱进空气了怎么办 宫颈评分只有3分怎么办 淘宝鞋子售后退货商家拒收怎么办 退货申通cp原因怎么办 运费险赔的少怎么办 淘宝卖游戏账号恶意退款怎么办 淘宝账号体检虚拟违规怎么办 京东虚拟单被骗怎么办 网络公选课挂科怎么办 淘宝评论被商家关闭怎么办? 皇冠车钥匙丢了怎么办 皇冠行李箱钥匙丢了怎么办 淘宝主推产品扣两分怎么办 淘宝直通车宝贝排查下架怎么办 滴滴车龄超过8年怎么办 购物车超120了怎么办 没发货申请退款卖家不处理怎么办 淘宝卖家帐号被骗了怎么办 淘宝网下单忘了用返利网怎么办 该地域无法观看此直播怎么办 宝宝喝了有活虫的奶粉怎么办 淘宝商家店铺状态异常怎么办 淘宝购物提示买家信息错误怎么办 苹果淘宝占用空间大怎么办 苹果手机淘宝占内存太大怎么办 苹果手机淘宝图标找不到了怎么办 苹果手机看淘宝很卡怎么办 苹果手机淘宝忘了密码怎么办 苹果手机更新后淘宝打不开怎么办 淘宝买到苹果翻新机怎么办 淘宝网密码忘了怎么办 淘宝改密码要拍摄脸部怎么办 苹果一体机键盘没反应怎么办 淘宝买东西退货卖家拒绝怎么办? 淘宝被限制下单怎么办 淘宝扫码登录后怎么办 花呗选项被隐藏怎么办