免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1620 | 回复: 6
打印 上一主题 下一主题

很奇怪,sqrt的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-14 19:54 |只看该作者 |倒序浏览
在两个不同的代码里面,一个找不到sqrt,而另外一个可以找到,不知道是为什么?
第一个代码是:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

struct Point {
&nbsp;&nbsp;&nbsp;&nbsp;int x;
&nbsp;&nbsp;&nbsp;&nbsp;int y;
};
typedef struct Point point;

double distance(point a, point b) {
&nbsp;&nbsp;&nbsp;&nbsp;int x,y;
&nbsp;&nbsp;&nbsp;&nbsp;x = abs(a.x - b.x);
&nbsp;&nbsp;&nbsp;&nbsp;y = abs(a.y - b.y);
&nbsp;&nbsp;&nbsp;&nbsp;printf("%d,%d", x, y);
&nbsp;&nbsp;&nbsp;&nbsp;return sqrt(x*x + y*y);
}

int main(void) {
&nbsp;&nbsp;&nbsp;&nbsp;point a,b;
&nbsp;&nbsp;&nbsp;&nbsp;a.x = 0;
&nbsp;&nbsp;&nbsp;&nbsp;a.y = 0;
&nbsp;&nbsp;&nbsp;&nbsp;b.x = 3;
&nbsp;&nbsp;&nbsp;&nbsp;b.y = 4;
&nbsp;&nbsp;&nbsp;&nbsp;printf("%f", distance(a,b));
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

编译起来报错:
gcc -Wall -o "distance" "distance.c" (in directory: /home/tux)
Compilation failed.
/tmp/ccouoVK5.o: In function `distance':
distance.c.text+0x83): undefined reference to `sqrt'
collect2: ld returned 1 exit status

第二个代码是:
#include <stdio.h>
#include <math.h>

int main(void) {
&nbsp;&nbsp;&nbsp;&nbsp;return sqrt(4);
}

第二个缺没有问题.

论坛徽章:
0
2 [报告]
发表于 2009-05-14 20:02 |只看该作者
貌似sqrt是支持这四种形式的:
long double sqrt(long double)
float sqrt(float)
double sqrt(double)

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2009-05-14 20:38 |只看该作者

回复 #1 ccbobocat 的帖子

这个问题不是第一次出现了
http://bbs.chinaunix.net/viewthr ... p;page=1#pid7563783

论坛徽章:
0
4 [报告]
发表于 2009-05-14 21:05 |只看该作者
原帖由 daybreakcx 于 2009-5-14 20:02 发表
貌似sqrt是支持这四种形式的:
long double sqrt(long double)
float sqrt(float)
double sqrt(double)

参数传进去后,int会向上转换成double或者float的

论坛徽章:
0
5 [报告]
发表于 2009-05-14 21:18 |只看该作者
原帖由 MMMIX 于 2009-5-14 20:38 发表
这个问题不是第一次出现了
http://bbs.chinaunix.net/viewthr ... p;page=1#pid7563783

谢谢,解决了.
原来在编译含有数学函数的程序时,需要加上-lm,指定连接系统的数学库libm.a
见:
http://topic.csdn.net/t/20021008/13/1078408.html
不过里面提到的gcc -l* distance.c
这种编译方法能运行通过吗?

论坛徽章:
0
6 [报告]
发表于 2009-05-14 22:21 |只看该作者
我奇怪的是你第二个程序怎么没问题

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2009-05-14 23:13 |只看该作者
原帖由 吃烤鱼 于 2009-5-14 22:21 发表
我奇怪的是你第二个程序怎么没问题

对 sqrt 的调用被 gcc 优化掉了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP