pow()就不能整数使用吗?

cuihairu 2014-05-28 09:38:55

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
for (int i=2;i<10;i++)
{
for (int j=1;j<10;j++)
{
for (int k=0;k<10;k++ )
{
int num=pow((i*(j*10+3+k)),2);
//int num=i*(10*j+3+k)*i*(10*j+3+k);
if (num%10==9&&num/1000==8)
{
printf("[%d*(%d3+%d)]2=%d\n",i,j,k,num);
//goto Loop;

}
}
}
}
//Loop:
system("pause");
}




将int num=pow((i*(j*10+3+k)),2);
改为:
int num=i*(10*j+3+k)*i*(10*j+3+k);
就正确的,难道pow就不能使用int型的?

我知道 double pow (double,double),难道int 就不用?

...全文
4503 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
idzeta 2014-06-02
  • 打赏
  • 举报
回复
既然楼主选择的编程语言是“ C语言”,那么pow()就是没有整数重载的。遑论“函数模板”。
引用 16 楼 cuihairu 的回复:
我忘了说了,我用的是GCC4.8.1 版本,今天问老师的,发现在vs2010 ,vs2013 上测试正常。 我在gcc 上 测试如下代码:

#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
	int x=90;
	printf("%d\n",x);
	int sum=pow(x,2);
	printf("pow=%d, x*x=%d \n",sum,x*x);
	
	return 0;
}

结果: 之前的gcc环境是在windows 下的MINGW
楼主开帖时提出以及在#10追加的问题已经在#9解答了:在已知结果是整数时,为了避免细微误差的影响,应先用round()舍入再将double转换成int,而非直接截断。 #16中的精度问题同样可用round()解决(但即使截断,如此结果实属不该)。 我用的MinGW-W64-GCC 4.9.0 32位版并没有出现这种问题。 GCC的具体版本可以用看以下命令输出的最后一行:
gcc -v
或者以下命令输出的第一行:
gcc --version
lin5161678 2014-06-01
  • 打赏
  • 举报
回复
引用 6 楼 cdinten 的回复:
不管哪一个 都没有对 整型求幂的 long double double float
废玻璃渣 2014-06-01
  • 打赏
  • 举报
回复

其实无论pow哪个版本最终都是return (_Pow_int(_X, _Y));

_Pow_int 是一个函数模板,所以LZ不妨直接用_Pow_int替代pow
赵4老师 2014-06-01
  • 打赏
  • 举报
回复
-lm
cuihairu 2014-05-31
  • 打赏
  • 举报
回复
引用 6 楼 cdinten 的回复:


引用 11 楼 idzeta 的回复:
据我所知,C语言直到C11标准也没有整数用的pow()。


引用 14 楼 zhao4zhong1 的回复:
short int
int
long
__int64




引用 15 楼 u013163178 的回复:
那就强制转换把




我忘了说了,我用的是GCC4.8.1 版本,今天问老师的,发现在vs2010 ,vs2013 上测试正常。

我在gcc 上 测试如下代码:

#include <stdio.h>
#include <math.h>
int main(int argc, char *argv[])
{
int x=90;
printf("%d\n",x);
int sum=pow(x,2);
printf("pow=%d, x*x=%d \n",sum,x*x);

return 0;
}



结果:


之前的gcc环境是在windows 下的MINGW

我又测试了centos 6.5 + GCC 4.9



发现结果是正确的,求解释,不懂,根据现在的测试应该是MINGW的问题。
「已注销」 2014-05-31
  • 打赏
  • 举报
回复
那就强制转换把
赵4老师 2014-05-30
  • 打赏
  • 举报
回复
short int int long __int64
赵4老师 2014-05-30
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>

int main()
{
    for (int i = 2; i < 10; ++i)
    {
        for (int j = 1; j < 10; ++j)
        {
            for (int k = 0; k < 10; ++k)
            {
                unsigned long num = (unsigned long)(i * (j * 10 + 3 + k));
                num=num*num;
                if (num % 10ul == 9ul && num / 1000ul == 8ul)
                {
                    printf("[%d*(%d*10+3+%d)]2=%lu\n", i, j, k, num);
                    //goto Loop;
                }
            }
        }
    }
    //Loop: 
    system("pause");
}
赵4老师 2014-05-29
  • 打赏
  • 举报
回复
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { for (int i=2;i<10;i++) { for (int j=1;j<10;j++) { for (int k=0;k<10;k++ ) { int num=(int)pow(((double)i*(j*10+3+k)),(double)2); //int num=i*(10*j+3+k)*i*(10*j+3+k); if (num%10==9&&num/1000==8) { printf("[%d*(%d3+%d)]2=%d\n",i,j,k,num); //goto Loop; } } } } //Loop: system("pause"); }
cuihairu 2014-05-29
  • 打赏
  • 举报
回复
引用 11 楼 idzeta 的回复:
据我所知,C语言直到C11标准也没有整数用的pow()。
那平时 int型的怎么用?
idzeta 2014-05-29
  • 打赏
  • 举报
回复
据我所知,C语言直到C11标准也没有整数用的pow()。
cuihairu 2014-05-29
  • 打赏
  • 举报
回复
引用 9 楼 idzeta 的回复:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    for (int i = 2; i < 10; ++i)
    {
        for (int j = 1; j < 10; ++j)
        {
            for (int k = 0; k < 10; ++k)
            {
                int num = (int)round(pow((double)(i * (j * 10 + 3 + k)), 2.0)); 
                if (num % 10 == 9 && num / 1000 == 8)
                {
                    printf("[%d*(%d3+%d)]2=%d\n", i, j, k, num);
                    //goto Loop;
                }
            }
        }
    }
    //Loop: 
    system("pause");
}
C90中是没有重载函数的。 C90中的pow只有:
double pow(double base, double exponent);
这一种。C99中增加了:
      float powf(float base      , float exponent);
long double powl(long double base, long double exponent);
这两种,依然没有整数用的版本。
那int 就没有pow()可用?
idzeta 2014-05-29
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    for (int i = 2; i < 10; ++i)
    {
        for (int j = 1; j < 10; ++j)
        {
            for (int k = 0; k < 10; ++k)
            {
                int num = (int)round(pow((double)(i * (j * 10 + 3 + k)), 2.0)); 
                if (num % 10 == 9 && num / 1000 == 8)
                {
                    printf("[%d*(%d3+%d)]2=%d\n", i, j, k, num);
                    //goto Loop;
                }
            }
        }
    }
    //Loop: 
    system("pause");
}
C90中是没有重载函数的。 C90中的pow只有:
double pow(double base, double exponent);
这一种。C99中增加了:
      float powf(float base      , float exponent);
long double powl(long double base, long double exponent);
这两种,依然没有整数用的版本。
cuihairu 2014-05-29
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
for (int i=2;i<10;i++)
{
for (int j=1;j<10;j++)
{
for (int k=0;k<10;k++ )
{
int num=(int)pow(((double)i*(j*10+3+k)),(double)2);
//int num=i*(10*j+3+k)*i*(10*j+3+k);
if (num%10==9&&num/1000==8)
{
printf("[%d*(%d3+%d)]2=%d\n",i,j,k,num);
//goto Loop;

}
}
}
}
//Loop:
system("pause");
}


答案还是错误的。
C囧囧 2014-05-28
  • 打赏
  • 举报
回复
C囧囧 2014-05-28
  • 打赏
  • 举报
回复
cuihairu 2014-05-28
  • 打赏
  • 举报
回复
引用 2 楼 cdinten 的回复:
[quote=引用 1 楼 cdinten 的回复:]
pow有多个重载函数,不如你将pow中的第一个参数乘以1.0转换为double试试?

你可以看看math.h中,关于pow的函数有多个重载,double pow(double,double)只是其中的一种。我这边用你的代码根本不能通过编译器(VS2010),提示函数使用不明[/quote]

大神我在vs2013上只看到 double型的,怎么用int型的?
cuihairu 2014-05-28
  • 打赏
  • 举报
回复
引用 2 楼 cdinten 的回复:
[quote=引用 1 楼 cdinten 的回复:] pow有多个重载函数,不如你将pow中的第一个参数乘以1.0转换为double试试?
你可以看看math.h中,关于pow的函数有多个重载,double pow(double,double)只是其中的一种。我这边用你的代码根本不能通过编译器(VS2010),提示函数使用不明[/quote] 这代码是老师给的,在vs2013上编译的,我是在gcc 4.8.1上跑的。
C囧囧 2014-05-28
  • 打赏
  • 举报
回复
引用 1 楼 cdinten 的回复:
pow有多个重载函数,不如你将pow中的第一个参数乘以1.0转换为double试试?
你可以看看math.h中,关于pow的函数有多个重载,double pow(double,double)只是其中的一种。我这边用你的代码根本不能通过编译器(VS2010),提示函数使用不明
C囧囧 2014-05-28
  • 打赏
  • 举报
回复
pow有多个重载函数,不如你将pow中的第一个参数乘以1.0转换为double试试?

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧