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

关于类型的转换-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 于安徽
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值