C语言pow()函数问题。
8个回答
展开全部
朋友,pow函数的原型是double pow(double x,double y),返回值是double型的x的y次方的值。对于形参x、y,传入比double型“短”的实参是正常的且不告警。这是因为,C/C++有约定,当一个“短”型值赋给一个“长”型值时,自动将“短”型值提升为“长”型值。所以你这里用两个int型的变量a、b充当pow的实参是完全合理合法的。但是,把pow(a,b)的返回值赋给int型变量c就不完全合法了,因为这是把“长”型值赋给一个“短”型值,会有精度损失,所以系统要提醒你是否出错了,就要警告。解决办法当然是把c声明为double型;但如果逻辑上只需要返回值的整数部分的话也可以c=(int)pow(a,b);。这样系统就知道你是有意取整,而不是疏忽,就不会告警了。仅供参考……
追问
也就是说,占字节少的类型值可以赋给占字节多的类型的变量,而占字节多的类型的值赋给占字节少的类型的变量,比如double a=3.000000;int b;b=a;这样的就会报错是吧?
追答
理解OK!不过不error,只是warning……
推荐于2017-12-16
展开全部
应该可以的,不过如果从浮点型到整型,小数点后面的数据会丢失的,造成精度不准确。你的程序里实参a,b,c都是整型,所以会有warning,数据精度丢失。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
//楼下的说的都对,那我给你提供一个另外的方法的,直接不使用math头文件里的函数,利用其原理自己编写一个可以随意改变类型的函数。
//↓↓↓这是int的。
#include<stdio.h>
int pow(int x,int y)
{
int z=1;
for(;y>0;y--)
z*=x;
return z;
}
void main()
{
int a=2,b=3;
printf("%d",pow(a,b));
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个是不行的,但你可以强制转化为int
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2023-06-28
展开全部
在计算很大的数时程序会有计算损失
例如pow(10,2)在某些情况下计算出来可能是99.9999999990之类的数,比100小一点,当你强转为int时会变成99,类似这种情况,在计算大数时更可能发生。
解决办法是加一个小数,比如(int)(pow(10,2)+0.1),结果就正常了,当然也可能因为这个小数出现大一的问题,原因同上
例如pow(10,2)在某些情况下计算出来可能是99.9999999990之类的数,比100小一点,当你强转为int时会变成99,类似这种情况,在计算大数时更可能发生。
解决办法是加一个小数,比如(int)(pow(10,2)+0.1),结果就正常了,当然也可能因为这个小数出现大一的问题,原因同上
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询