| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 435 人关注过本帖
标题:一个关于浮点数用二进制表达的问题,求指教
只看楼主 加入收藏
财蝎子
Rank: 1
等 级:新手上路
帖 子:6
专家分:4
注 册:2013-10-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
一个关于浮点数用二进制表达的问题,求指教
程序代码:
#include "stdio.h"
char a[32];
void changex(float x)//小数部分转换
{
  int w=(int)(x*2);
  if(x!=0)
  {
    if(w<10) printf("%d",w);
    else printf("%c",'A'+w-10);
    changex((x*2)-w);
  }
  else return;
}
change2(int a)//整数部分转换
{
    int j,k;
    if(a==0)
        return 0;
    else
    {
        j=a%2;
        k=a/2;
        change2(k);
        printf("%d",j);
    }
}
change()
{
    int k,z;
    float x,y;
    printf("请输入一个数字:");
    scanf("%f",&x);
    if(x<0)
        x=-x;
    k=(int)(x);
    change2(k);
    z=(int)x,y=x-z;
    if(y!=0)
    {
        printf(".");
        changex(y);
    }
}
void Init()//输入待转数的二进制数
{
    int i;
    printf("请输入您要转换的23位二进制数,位数不够的在前面补0:");
    for(i=9;i<32;i++)
    {
        scanf("%c",&a[i]);
    if(a[i]=='\n')
        break;
    }
}
void PrintYuanMa()
{
    int i;
    for(i=0;i<8;i++)
        printf("%c",a[i]);
}
void PrintFanMa()
{
    int i;
    for(i=9;i<32;i++)
    {
        if(a[i]=='1')
            printf("0");
        if(a[i]=='0')
            printf("1");
    }
    printf("\n");
}
void PrintBuMa()
{
    int j;
    if(a[0]=='1')
    {
        for(j=9;j<32;j++)
        {
            if(a[j]=='1')
                a[j]='0';
            else
                a[j]='1';
        }
        a[0]='1';
        int mark=0;int i;
        for(i=31;i>=9;i--)
        {
            if(mark==1||i==31)
            {
                a[i]=a[i]+1;
                if(a[i]=='2')
                {
                a[i]='0';
                mark=1;
                }
                else
                    mark=0;
            }             
        }
            PrintYuanMa();
    }
    else
    {
        if(a[0]=='0')
        {
            PrintYuanMa();
        }
        
    }
}
void main()
{
    char a[32];
    change();
    Init();
    PrintBuMa();
}


我想问的是,为什么我无法进行二次输入。就是当我的实数被转换成2进制后,为什么我的Init函数没有起到输入的功能。直接跳完了。
搜索更多相关主题的帖子: 二进制 color 
2013-10-14 22:25
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:5 
单步看看

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-10-15 06:26
在这里爬起
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:43
专家分:113
注 册:2013-8-9
收藏
得分:5 
程序代码:
void Init()//输入待转数的二进制数
{
    int i;
    printf("请输入您要转换的23位二进制数,位数不够的在前面补0:");
    for(i=9;i<32;i++)
    {
        scanf("%c",&a[i]);
    if(a[i]=='\n')
        break;
    }
}
你这里a[i]都没有定义。要先定义一个数组。
2013-10-15 09:55
zhaogay
Rank: 7Rank: 7Rank: 7
来 自:宫
等 级:黑侠
帖 子:151
专家分:586
注 册:2013-10-10
收藏
得分:5 
主函数那个数组a的定义没有意义;
不知道楼主是怎么输入的,但是应该都是会出现问题的,每次敲一个字符的话就会多了好多回车符放进数组a里,第一次就会break出。要是一次性输入23个数字字符,下次就会多一个回车符放到数组a里,init下面那个break第二次是一定会执行的

[ 本帖最后由 zhaogay 于 2013-10-15 10:27 编辑 ]

好好学习,天天想上
2013-10-15 10:23
财蝎子
Rank: 1
等 级:新手上路
帖 子:6
专家分:4
注 册:2013-10-14
收藏
得分:0 
回复 2楼 pauljames
在最前面已经定义了
2013-10-15 14:15
财蝎子
Rank: 1
等 级:新手上路
帖 子:6
专家分:4
注 册:2013-10-14
收藏
得分:0 
回复 3楼 在这里爬起
已经定义了的。在最前面
2013-10-15 14:15
财蝎子
Rank: 1
等 级:新手上路
帖 子:6
专家分:4
注 册:2013-10-14
收藏
得分:0 
回复 4楼 zhaogay
程序代码:
#include "stdio.h"
char a[23];
void changex(float x)//小数部分转换
{
  int w=(int)(x*2);
  if(x!=0)
  {
    if(w<10) printf("%d",w);
    else printf("%c",'A'+w-10);
    changex((x*2)-w);
  }
  else return;
}
change2(int a)//整数部分转换
{
    int j,k;
    if(a==0)
        return 0;
    else
    {
        j=a%2;
        k=a/2;
        change2(k);
        printf("%d",j);
    }
}
change(float x)//转换为二进制,提示下一次的输入
{
    int k,z;
    float y;
    if(x<0)
        x=-x;
    k=(int)(x);
    change2(k);
    z=(int)x,y=x-z;
    if(y!=0)
    {
        printf(".");
        changex(y);
    }
}
void PrintYuanMa()
{
    int i;
    for(i=0;i<23;i++)
        printf("%c",a[i]);
}
void PrintBuMa()
{
    int j;
        for(j=0;j<23;j++)
        {
            if(a[j]=='1')
                a[j]='0';
            else
                a[j]='1';
        }
        a[0]='1';
        int mark=0;int i;
        for(i=22;i>=0;i--)
        {
            if(mark==1||i==22)
            {
                a[i]=a[i]+1;
                if(a[i]=='2')
                {
                a[i]='0';
                mark=1;
                }
                else
                    mark=0;
            }             
        }
        PrintYuanMa();
}
fuhao(float a)//根据原数值的大小,判断符号位
{
    if(a>0)
        printf("  0");
    else
        printf("  1");
}
jiema(float a)//根据原数值的大小,判断其二进制的阶码,直接输出阶码,因为位数限制,目前只有正数,其他原理相通
{
    if(a>0&&a<2)
        printf(" 00000000 ");
    else if(a>=2&&a<=3)
        printf(" 00000001 ");
    else if(a>3&&a<=7)
        printf(" 00000010 ");
    else if(a>7&&a<=15)
        printf(" 00000011 ");
    else if(a>7&&a<=31)
        printf(" 00000100 ");
    else if(a>31&&a<=63)
        printf(" 00000101 ");
    else if(a>63&&a<=127)
        printf(" 00000110 ");
    else if(a>127&&a<=255)
        printf(" 00000111 ");
    else if(a>255&&a<=511)
        printf(" 00001000 ");
    else if(a>511&&a<=1023)
        printf(" 00001001 ");
    else if(a>1023&&a<=2047)
        printf(" 00001010 ");
    else if(a>2047&&a<=4095)
        printf(" 00001011 ");
    else if(a>4095&&a<=8191)
        printf(" 00001100 ");
    else if(a>8191&&a<=16383)
        printf(" 000001101 ");
    else if(a>16383&&a<=32767)
        printf(" 00001110 ");
    else if(a>32767&&a<=65535)
        printf(" 00001111 ");
    else if(a>65535&&a<=131071)
        printf(" 00010000 ");
    else if(a>131701&&a<=262143)
        printf(" 00010001 ");
    else if(a>262143&&a<=524287)
        printf(" 00010010 ");
    else if(a>524287&&a<=1058575)
        printf(" 00010011 ");
    else if(a>1048575&&a<=2097151)
        printf(" 00010100 ");
    else if(a>2097151&&a<=4194303)
        printf(" 00010101 ");
    else if(a>4194303&&a<=8388607)
        printf(" 00010110 ");
    else if(a>8388607&&a<=10777215)
        printf(" 00010111 ");
    else if(a>10777215&&a<=33554431)
        printf(" 00011000 ");
    else if(a>33554431&&a<=67108863)
        printf(" 00011001 ");
    else if(a>67108863&&a<=134217727)
        printf(" 00011010 ");
    else if(a>134217727&&a<=268435455)
        printf(" 00011011 ");
    else if(a>268435455&&a<=536870911)
        printf(" 00011100 ");
    else if(a>536870911&&a<=(1.073742e+9)-1)
        printf(" 00011101 ");
    else
        printf(" 00011110 ");
}
int main()
{
    float x;
    int i;
    printf("请输入一个实数:\n");
    scanf("%f",&x);
    printf("你输入数据的二进制是:");
    change(x);
    printf("\n");
    printf("请输入您要转换的23位二进制数,位数不够的在前面补0:\n");
    for(i=0;i<23;i++)
        scanf("%c",&a[i]);
    printf("符号  阶码   补码\n");
    fuhao(x);
    jiema(x);
    PrintBuMa();
    printf("\n");
    return 0;
}
已经修改好了。
2013-10-15 14:16
快速回复:一个关于浮点数用二进制表达的问题,求指教
数据加载中...
 
   



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

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