MinGW GCC 4.7.2 32-bit
#include<stdio.h>
#include<math.h>
int main()
{
int n=5;
int s=0;
s=pow(n,3);//参数和结果均为int
printf("%d",s);
}
输出:124
#include<stdio.h>
#include<math.h>
int main()
{
int n=5;
double s=0;
s=pow(n,3);//参数为int,结果为double
printf("%.0f",s);
}
输出:125
#include<stdio.h>
#include<math.h>
int main()
{
int n=5;
int s=0;
s=pow(5,3);//参数未赋类型,结果为double
printf("%d",s);
}
输出:125
#include<stdio.h>
#include<math.h>
int main()
{
int n=1;//可用在取值范围内任意非五的倍数替换
int s=0;
s=pow(n,1);//可用在取值范围内任意整数替换
printf("%d",s);
}
输出:1//输出均正确
#include<stdio.h>
#include<math.h>
int main()
{
int n=5;//以5为例进行观察
int s=0;
s=pow(n,2);//在取值范围内(2,3,4,6,7,8,9,12,13)
printf("%d",s);
}
输出:24//(输出精度均丢失1)
#include<stdio.h>
#include<math.h>
int main()
{
int n=1000;
int s=0;
s=pow(n,3);//参数和结果均为int
printf("%d",s);
}
输出:999999999
#include<stdio.h>
#include<math.h>
int main()
{
double n=1000;
int s=0;
s=pow(n,3);//参数为double,结果均为int
printf("%d",s);
}
输出:999999999
#include<stdio.h>
#include<math.h>
int main()
{
double n=1000;
double s=0;
s=pow(n,3);//参数和结果均为double,double范围比int大
printf("%.0f",s);
}
输出:1000000000
#include<stdio.h>
#include<math.h>
int main()
{
int n=1000;
int s=0;
s=pow(1000,3);//参数未赋类型,结果为double
printf("%d",s);
}
输出:1000000000
总结**:用编译器MinGW GCC 4.7.2 32-bit编译**
- 当参数和结果均为整型,当参数涉及到五的倍数,输出结果精度可能会丢失1
- 当参数和结果均为整型,当结果无限逼近int的存储范围,输出结果精度丢失1
原因猜想:
- 编译器的配置问题
- pow函数为double类型,返回值采用数值逼近的方法得到的,强制类型转换发生截断,精度丢失1
解决方法:
- 四舍五入:
s=(int)round(pow(n,3));
s=(int)(pow(n,3)+0.5);
2.将pow函数 结果 换成浮点型