Linux C语言pow函数问题?

Linux C语言pow函数问题?,第1张

像 pow(10,2) 这种调用,gcc 在编译时就可以将其替换为对应的值(gcc 优化的一部分),从而不需要链接 pow 所在的数学库 libm;而像 pow(x,2)这种调用,一般无法做这种替换,因此需要链接 libm。或者编译时加上-O2参数。

要包含头文件:#include <math.h>

pow() 函数用来求 x 的 y 次幂(次方),其原型为:

    double pow(double x, double y)

pow()用来计算以x 为底的 y 次方值,然后将结果返回。设返回值为 ret,则 ret = xy。

可能导致错误的情况:

如果底数 x 为负数并且指数 y 不是整数,将会导致 domain error 错误。

如果底数 x 和指数 y 都是 0,可能会导致 domain error 错误,也可能没有;这跟库的实现有关。

如果底数 x 是 0,指数 y 是负数,可能会导致 domain error 或 pole error 错误,也可能没有;这跟库的实现有关。

如果返回值 ret 太大或者太小,将会导致 range error 错误。

有两个问题,

1. 第三个输出格式错误了!!!:printf(" 3 %%0.1f %0.3f %0.3f\n",100*a3[i],b3[i],tx3[i]),多了一个 %,正确格式:

printf(" 3 %0.1f %0.3f %0.3f\n",100*a3[i],b3[i],tx3[i])

2. 编译不会自动链接math的库,

gcc strange.c

/tmp/ccMYdgve.o: In function `main':

strange.c:(.text+0x87e): undefined reference to `pow'

strange.c:(.text+0x947): undefined reference to `pow'

strange.c:(.text+0xa0a): undefined reference to `pow'

strange.c:(.text+0xa9a): undefined reference to `pow'

collect2: ld returned 1 exit status

解决办法,加上 -lm 编译选项。

qunengrong@qunengrong-laptop ~/test

$gcc strange.c -lm

qunengrong@qunengrong-laptop ~/test

编译成功了,运行可得结果:

./a.out

0 100.0 100.0 100.00 1 100.0 1.061 14.142 14.142 5414.21 1.062

2 100.0 0.707 0.000

3 100.0 0.000 1.062

1 1502.5 100.0 1502.51 1 1502.5 0.071 0.941 0.941 4094.12 1.005

2 100.0 0.047 0.000

3 1502.5 -1.755 1.005

2 1420.8 100.0 1420.82 1 1420.8 0.075 0.995 0.995 4099.54 1.005

2 100.0 0.050 0.000

3 1420.8 0.000 1.005

3 1421.2 100.0 1421.23 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 -0.000 1.005

4 1421.2 100.0 1421.24 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

5 1421.2 100.0 1421.25 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 -0.000 1.005

6 1421.2 100.0 1421.26 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 -0.000 1.005

7 1421.2 100.0 1421.27 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

8 1421.2 100.0 1421.28 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

9 1421.2 100.0 1421.29 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 -0.000 1.005

10 1421.2 100.0 1421.210 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

11 1421.2 100.0 1421.211 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

12 1421.2 100.0 1421.212 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 -0.000 1.005

13 1421.2 100.0 1421.213 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 -0.000 1.005

14 1421.2 100.0 1421.214 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

15 1421.2 100.0 1421.215 1 1421.2 0.075 0.995 13073.374 53858472.00 1.000

2 100.0 0.050 1.000

3 1421.2 13073.374 1.000

16 18579631.2 1307337.4 18579631.216 1 18579631.2 0.000 0.000 0.000 4099.51 1.005

2 1307337.4 0.000 0.000

3 18579631.2 0.000 1.005

17 1421.2 100.0 1421.217 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

18 1421.2 100.0 1421.218 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

19 1421.2 100.0 1421.219 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

20 1421.2 100.0 1421.220 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

21 1421.2 100.0 1421.221 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

22 1421.2 100.0 1421.222 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

23 1421.2 100.0 1421.223 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

24 1421.2 100.0 1421.224 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

25 1421.2 100.0 1421.225 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

26 1421.2 100.0 1421.226 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

27 1421.2 100.0 1421.227 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

28 1421.2 100.0 1421.228 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

29 1421.2 100.0 1421.229 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

30 1421.2 100.0 1421.230 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

31 1421.2 100.0 1421.231 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

32 1421.2 100.0 1421.232 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

33 1421.2 100.0 1421.233 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

34 1421.2 100.0 1421.234 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

35 1421.2 100.0 1421.235 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

36 1421.2 100.0 1421.236 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

37 1421.2 100.0 1421.237 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

38 1421.2 100.0 1421.238 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

39 1421.2 100.0 1421.239 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

40 1421.2 100.0 1421.240 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

41 1421.2 100.0 1421.241 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

42 1421.2 100.0 1421.242 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

43 1421.2 100.0 1421.243 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

44 1421.2 100.0 1421.244 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

45 1421.2 100.0 1421.245 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

46 1421.2 100.0 1421.246 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

47 1421.2 100.0 1421.247 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

48 1421.2 100.0 1421.248 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

49 1421.2 100.0 1421.249 1 1421.2 0.075 0.995 0.995 4099.51 1.005

2 100.0 0.050 0.000

3 1421.2 0.000 1.005

后记: pow 函数,计算时默认对double类型进行运算,float也可以会自动转换的,小数也没问题,在linux下你可以参看原型:

$man 3 pow

SYNOPSIS

#include <math.h>

double pow(double x, double y)

float powf(float x, float y)

long double powl(long double x, long double y)

Link with -lm.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7264908.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存