免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4904 | 回复: 14

请教一个C小程序在win和linux下运行结果不同的原因 [复制链接]

论坛徽章:
0
发表于 2007-01-14 23:09 |显示全部楼层
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

short int main()
{
  int i;
  char a[]="0.00000001";
  long double ld_a;
  char **endptr=NULL;
  
  printf("a is : %s\n",a);
  ld_a=strtod(a,endptr);
  printf("after calling strtod(),a becomes to: %20.15f\n",ld_a);
  scanf("%d",&i);
  return 1;
}



linux 下运行结果:
a is : 0.00000001
after calling strtod(),a becomes to:   -0.000000000000000
而 windows 下运行结果却是:
a is : 0.00000001
after calling strtod(),a becomes to:   0.000000010000000
请问这是为什么? 如何可以使得在linux下正常显示?

论坛徽章:
0
发表于 2007-01-14 23:19 |显示全部楼层

  1. long double ld_a;
  2. printf("after calling strtod(),a becomes to: %20.15f\n",ld_a);
复制代码

这里的应该用:
printf("after calling strtod(),a becomes to: %20.15lf\n",ld_a);

论坛徽章:
0
发表于 2007-01-14 23:25 |显示全部楼层
short int main() { -----> 这里main应该返回 int
        int i;
        char a[]="0.00000001";
        long double ld_a;
        char **endptr=NULL;    ----> 这里应该是char * endPtr,相应地下面用&endPtr
       
        printf("a is : %s\n",a);
        ld_a=strtod(a,endptr);
        printf("after calling strtod(),a becomes to: %20.15f\n",ld_a);  ------> long double类型 用 lf输出
        scanf("%d",&i);
        return 1;    ------> 一般情况下约定,返回0表示正常(一般都返回这个),返回非0表示程序出现了错误
}

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
发表于 2007-01-15 09:53 |显示全部楼层
ld_a=strtod(a,endptr);

是这个函数吗?

论坛徽章:
0
发表于 2007-01-15 11:38 |显示全部楼层
多谢tyc611细致的解答

但是我按你的说法修改了代码(将输出格式改为 %20.15lf),在linux 下的输出结果还是  -0.000000000000000

再将指针也修改(改为char *endptr , strtod(a,&endptr)),在linux 下的输出结果依然是  -0.000000000000000

当然,作这些修改后,在windows上运行输出正确

顺便说一下,我用的是虚拟机redhat linux9.0 ,这应该没什么影响吧?

论坛徽章:
0
发表于 2007-01-15 13:46 |显示全部楼层
原帖由 uclinuxboy 于 2007-1-15 11:38 发表于 5楼  
多谢tyc611细致的解答

但是我按你的说法修改了代码(将输出格式改为 %20.15lf),在linux 下的输出结果还是  -0.000000000000000

再将指针也修改(改为char *endptr , strtod(a,&endptr)),在lin ...

难道是编译器不支持long double?

要不你就用double吧,这的精度已经够用了

论坛徽章:
0
发表于 2007-01-15 17:58 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2007-01-16 04:13 |显示全部楼层
應該改成:

  1. printf("after calling strtod(),a becomes to: %20.15LF\n",ld_a);
复制代码


另外少了 #include <math.h> 內容。

--

论坛徽章:
0
发表于 2007-01-16 14:52 |显示全部楼层
原帖由 kenduest 于 2007-1-16 04:13 发表于 8楼  
應該改成:

printf("after calling strtod(),a becomes to: %20.15LF\n",ld_a);

另外少了 #include <math.h> 內容。

--

不需要这个头文件,strtod只需要<stdlib.h>

论坛徽章:
0
发表于 2007-01-16 15:51 |显示全部楼层
今天在GCC 4.1.0里给你运行了一下,结果完全正确:
[tyc@localhost C]$ ./out
a is : 0.00000001
after calling strtod(),a becomes to:         0.0000000100
(用了10位精度)

看来是你的编译器对long double支持不好
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP