user-0 提问: pow()就不能整数使用吗？

回复:
user: user-1
content: 既然楼主选择的编程语言是“ 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

user: user-2
content: 引用 6 楼 cdinten 的回复:不管哪一个 都没有对 整型求幂的 long double double float

user: user-3
content: 其实无论pow哪个版本最终都是return (_Pow_int(_X, _Y));  _Pow_int 是一个函数模板，所以LZ不妨直接用_Pow_int替代pow

user: user-4
content: -lm

user: user-0
content: 引用 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的问题。

user: user-5
content: 那就强制转换把

user: user-4
content: short int int long __int64

user: user-4
content: #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"); }

user: user-4
content: #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"); }

user: user-0
content: 引用 11 楼 idzeta 的回复:据我所知，C语言直到C11标准也没有整数用的pow()。  那平时 int型的怎么用？

user: user-1
content: 据我所知，C语言直到C11标准也没有整数用的pow()。

user: user-0
content: 引用 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（）可用？

user: user-1
content: #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); 这两种，依然没有整数用的版本。

user: user-0
content: 引用 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"); }  答案还是错误的。

user: user-6

user: user-6

user: user-0
content: 引用 2 楼 cdinten 的回复:[quote=引用 1 楼 cdinten 的回复:] pow有多个重载函数，不如你将pow中的第一个参数乘以1.0转换为double试试？ 你可以看看math.h中，关于pow的函数有多个重载，double pow(double,double)只是其中的一种。我这边用你的代码根本不能通过编译器（VS2010），提示函数使用不明[/quote]  大神我在vs2013上只看到 double型的，怎么用int型的？

user: user-0
content: 引用 2 楼 cdinten 的回复:[quote=引用 1 楼 cdinten 的回复:] pow有多个重载函数，不如你将pow中的第一个参数乘以1.0转换为double试试？ 你可以看看math.h中，关于pow的函数有多个重载，double pow(double,double)只是其中的一种。我这边用你的代码根本不能通过编译器（VS2010），提示函数使用不明[/quote] 这代码是老师给的，在vs2013上编译的，我是在gcc 4.8.1上跑的。

user: user-6
content: 引用 1 楼 cdinten 的回复:pow有多个重载函数，不如你将pow中的第一个参数乘以1.0转换为double试试？ 你可以看看math.h中，关于pow的函数有多个重载，double pow(double,double)只是其中的一种。我这边用你的代码根本不能通过编译器（VS2010），提示函数使用不明

user: user-6
content: pow有多个重载函数，不如你将pow中的第一个参数乘以1.0转换为double试试？