C语言pow()函数问题。

请问pow()函数的参数不定义成double类型,而定义成其他类型到底可不可以呢?

朋友,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……

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-12-16
应该可以的,不过如果从浮点型到整型,小数点后面的数据会丢失的,造成精度不准确。你的程序里实参a,b,c都是整型,所以会有warning,数据精度丢失。本回答被提问者采纳
第2个回答  2014-03-06
//楼下的说的都对,那我给你提供一个另外的方法的,直接不使用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));
}

第3个回答  2014-03-06
这个是不行的,但你可以强制转化为int
第4个回答  2023-06-28
在计算很大的数时程序会有计算损失
例如pow(10,2)在某些情况下计算出来可能是99.9999999990之类的数,比100小一点,当你强转为int时会变成99,类似这种情况,在计算大数时更可能发生。
解决办法是加一个小数,比如(int)(pow(10,2)+0.1),结果就正常了,当然也可能因为这个小数出现大一的问题,原因同上
相似回答