做乘法的时候,数据溢出的问题
以下是我的一段测试代码,大家看看如何解决?
谢谢!
#include <iostream>
unsigned long int speed;
void SetSpeed(unsigned long int s)
{
speed = s;
}
unsigned long int GetSpeed(){
return speed;
}
int main()
{
SetSpeed(2500*1000000);
std::cout < <GetSpeed() < <std::endl;
SetSpeed(10000*1000000);
std::cout < <GetSpeed() < <std::endl;
}
编译提示是:
overflow.cpp: In function `int main() ':
overflow.cpp:12: warning: integer overflow in expression
overflow.cpp:14: warning: integer overflow in expression
用的是cygwin。如果是VS2005,那么是:
warning C4307: '* ' : integral constant overflow
[解决办法]
用float或者double,不过都有精度限制
-------------------------
float表示的数一般在10的正负38次方左右,6到7位有效数字
double表示的数一般在10的正负308次方左右,15到16位有效数字
当然不同平台可能稍微不同
-------------------------
对于科学计算问题,一般精度要求不十分高(超过20位有效数字)的话,用double是不错的选择,如果要求绝对精度的问题,那么只能是用数组方式处理大数运算了
[解决办法]
数据溢出用科学记数法.
[解决办法]
用__int64
[解决办法]
long long吧.
再不行, 只能自己定义类来模拟了.