关于类型的转换-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,将可以完美的解决。这样将省掉 中间的放大和放小的运算。
蛋炒饭最简单,也最困难。有些基础的东西还是很重要的。
那么 只需要将 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;
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 于安徽
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 于安徽