C语言warning C4244: '*=' : conversion from 'double ' to 'float ', possible loss of data
#include<stdio.h>#defineCORPUS100intmain(void){intyears;constfloatSIMPLE_INTEREST=0.1...
#include<stdio.h>
#define CORPUS 100
int main(void)
{
int years;
const float SIMPLE_INTEREST = 0.1;
const float COMPOUND_INTEREST = 0.05;
float sum_Dephne,sum_Deirdre;
sum_Dephne=sum_Deirdre=CORPUS;
for(years=1;sum_Dephne>=sum_Deirdre;years++){
sum_Dephne += (sum_Dephne*SIMPLE_INTEREST);
sum_Deirdre *= (1.00+COMPOUND_INTEREST);
printf("%.2f,%.2f\n",sum_Dephne,sum_Deirdre);
}
printf("After %d years Deirdre will have more money than Dephne,then,Dephne have $%.2f,Deirdre have $%.2f.\n",years,sum_Dephne,sum_Deirdre);
return(0);
}
这边给出:
warning C4305: 'initializing' : truncation from 'const double ' to 'const float '
warning C4305: 'initializing' : truncation from 'const double ' to 'const float '
warning C4244: '*=' : conversion from 'double ' to 'float ', possible loss of data
三条警告,课时是在看不出来WHY? 展开
#define CORPUS 100
int main(void)
{
int years;
const float SIMPLE_INTEREST = 0.1;
const float COMPOUND_INTEREST = 0.05;
float sum_Dephne,sum_Deirdre;
sum_Dephne=sum_Deirdre=CORPUS;
for(years=1;sum_Dephne>=sum_Deirdre;years++){
sum_Dephne += (sum_Dephne*SIMPLE_INTEREST);
sum_Deirdre *= (1.00+COMPOUND_INTEREST);
printf("%.2f,%.2f\n",sum_Dephne,sum_Deirdre);
}
printf("After %d years Deirdre will have more money than Dephne,then,Dephne have $%.2f,Deirdre have $%.2f.\n",years,sum_Dephne,sum_Deirdre);
return(0);
}
这边给出:
warning C4305: 'initializing' : truncation from 'const double ' to 'const float '
warning C4305: 'initializing' : truncation from 'const double ' to 'const float '
warning C4244: '*=' : conversion from 'double ' to 'float ', possible loss of data
三条警告,课时是在看不出来WHY? 展开
展开全部
double型精度比float精度高,编译器默认生成或运算的小数都是double型
警告的意思都是由double转换到float时可能会有精度损失,只是警告
建议所有float都使用double型数据
当然如果确信自己的运算都在精度范围内,可以忽略这个警告。
警告的意思都是由double转换到float时可能会有精度损失,只是警告
建议所有float都使用double型数据
当然如果确信自己的运算都在精度范围内,可以忽略这个警告。
追问
我的for循环有问题吗?貌似永远算不出来。。。
追答
的确永远也算不出来
sum_Dephne += (sum_Dephne*SIMPLE_INTEREST);
也就是
sum_Dephne = sum_Dephne + (sum_Dephne*SIMPLE_INTEREST);
也就是
sum_Dephne = sum_Dephne *(1 + SIMPLE_INTEREST);
两个表达式一样
你的意思应该是:
sum_Dephne是线性增长的,应该是这样的吧:
sum_Dephne +=CORPUS*SIMPLE_INTEREST;
这样结果是28年……
2015-04-04
展开全部
0.1编译器认为是double类型的,而你把它赋给float类型的,可能存在精度上的不准确,可以试一试const float SIMPLE_INTEREST = 0.1f。
追问
我的for循环有问题吗?貌似永远算不出来。。。
追答
因为浮点数有精度问题所以一般不用像sum_Dephne>=sum_Deirdre这样的条件作为结束循环的条件。你可以试一试sum_Dephne-sum_Deirdre>=10^-6这样的方式试一试。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C语言中浮点常数都是double类型的,编译器认为用float会丢失精度,
可以在常数后加一个F,指定为float型
可以在常数后加一个F,指定为float型
追问
我的for循环有问题吗?貌似永远算不出来。。。
追答
for循环有问题
sum_Dephne += (sum_Dephne*SIMPLE_INTEREST);
也就是:sum_Dephne= sum_Dephne + sum_Dephne*SIMPLE_INTEREST
也即是:sum_Dephne *= (SIMPLE_INTEREST+1)
// sum_Dephne=100*1.1 , sum_Dephne越来越大
sum_Deirdre *= (1.00+COMPOUND_INTEREST);
// sum_Deirdre=100*0.05 //越来越小
所以,sum_Dephne>=sum_Deirdre这个永远成立
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询