double精度丢失

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. 当参数和结果均为整型,当参数涉及到五的倍数,输出结果精度可能会丢失1
  2. 当参数和结果均为整型,当结果无限逼近int的存储范围,输出结果精度丢失1

原因猜想:

  1. 编译器的配置问题
  2. pow函数为double类型,返回值采用数值逼近的方法得到的,强制类型转换发生截断,精度丢失1

解决方法:

  1. 四舍五入:
  • s=(int)round(pow(n,3));
  • s=(int)(pow(n,3)+0.5);

2.将pow函数 结果 换成浮点型

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值