| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
大量收QQ微信精准粉/交友粉,非诚勿扰千里之行 始于足下
共有 533 人关注过本帖, 1 人收藏
标题:2进制转换为10进制(含有小数负数情况)
只看楼主 加入收藏
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:355
专家分:800
注 册:2013-4-18
结帖率:80.43%
  已结贴   问题点数:20  回复次数:4   
2进制转换为10进制(含有小数负数情况)
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
int main()
{
    char jzf[100];
    printf("请输入一个要转换的二进制数据串\n");
    scanf("%s",jzf);
    int i,k=0,j=0,t=0,z=1,cd;
    float zsum=0,xsum=0.0,jg=0.0;
    cd=strlen(jzf);
    for(i=0;jzf[i];i++)
        if(jzf[i]=='.') k=i;
    if(k>0)
        if(jzf[0]=='-')
          {
            for(i=k-1;i>=1;i--)
                {zsum+=(jzf[i]*1-48)*pow(2,t);
                t++;}
            for(i=k+1;jzf[i];i++)
                {xsum+= (jzf[i]*1-48)*pow(2,-z);
                 z++; }
            jg=zsum+xsum;
            printf("%c%f",'-',jg);
          }
          else
          {
            for(i=k-1;i>=0;i--)
                {zsum+=(jzf[i]*1-48)*pow(2,t);
                t++;}
            for(i=k+1;jzf[i];i++)
                {xsum+= (jzf[i]*1-48)*pow(2,-z);
                 z++; }
            jg=zsum+xsum;
            printf("%f",jg);   
          }
    else
          if(jzf[0]=='-')
          {
            for(i=cd-1;i>=1;i--)
                {zsum+= (jzf[i]*1-48)*pow(2,t);
                 t++; }
            jg=zsum;
            printf("%c%f\n",'-',jg);
          }
          else
          {
            for(i=cd-1;i>=0;i--)
                {zsum+= (jzf[i]*1-48)*pow(2,t);
                 t++;
                }
            jg=zsum;
            printf("%f\n",jg);   
          }   
    system("pause");
    return 0;
}

请大神帮忙优化下

[此贴子已经被作者于2018-4-17 11:13编辑过]

2018-04-16 17:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:266
帖 子:5837
专家分:33347
注 册:2011-1-18
  得分:20 
顺便一试,就是错的,输入 11.111,应该输出 3.875,实际输出 4.75

另外,看待根本不是转十进制,而是转成double
2018-04-17 08:36
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:266
帖 子:5837
专家分:33347
注 册:2011-1-18
  得分:0 
随手写的,仅供参考

程序代码:
#include <ctype.h>
#include <errno.h>

double bin2f( const char* s )
{
    const char* p = s;
    for( ; isspace(*p); ++p );

    int sign = +1;
    if( *p == '+' )
        sign=+1, ++p;
    else if( *p == '-' )
        sign=-1, ++p;

    double intpart = 0; // of the decimal
    for( ; *p && *p!='.'; ++p )
    {
        if( *p == '0' )
            intpart = intpart*2 + 0;
        else if( *p == '1' )
            intpart = intpart*2 + 1;
        else
        {
            errno = ERANGE;
            return 0;
        }
    }

    if( *p == '.' )
        ++p;

    double decpart = 0;
    for( double tmp=0.5; *p; tmp/=2, ++p )
    {
        if( *p == '0' )
            ;
        else if( *p == '1' )
            decpart += tmp;
        else
        {
            errno = ERANGE;
            return 0;
        }
    }

    return sign * (intpart + decpart);
}

#include <stdio.h>
#include <assert.h>

int main( void )
{
    assert( bin2f("0") == 0 );
    assert( bin2f("+0") == +0 );
    assert( bin2f("-0") == -0 );

    assert( bin2f("01011100") == 92 );
    assert( bin2f("+01011100") == +92 );
    assert( bin2f("-01011100") == -92 );

    assert( bin2f("  01011100.01011100") == 92.359375 );
    assert( bin2f(" +01011100.01011100") == +92.359375 );
    assert( bin2f(" -01011100.01011100") == -92.359375 );

    assert( (bin2f("012"), errno==ERANGE) );
}

收到的鲜花
  • 九转星河 于 2018-04-17 11:40 送鲜花  1朵   附言:标记一下~
2018-04-17 09:04
dzy123
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:355
专家分:800
注 册:2013-4-18
  得分:0 
回复 3楼 rjsp
刚学到指针我认真研究下谢谢。
另外我这儿11.111显示是4.75,不知道错在哪儿了,明白了小数部分错了。
版主的环境是什么我这儿不能测试,不好意思。

[此贴子已经被作者于2018-4-17 10:22编辑过]

2018-04-17 10:07
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:266
帖 子:5837
专家分:33347
注 册:2011-1-18
  得分:0 
以下是引用dzy123在2018-4-17 10:07:30的发言:

版主的环境是什么我这儿不能测试,不好意思。
我有洁癖,从来只用标准C。所以,只要是符合C语言标准的编译器,都能编译我的代码。

2018-04-17 12:01







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036453 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved