掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28566

2進数
投稿者---kemi(2006/10/26 14:54:51)


#include<stdio.h>
#define N 24
int main(void)
{
double x=0.01;
int a[N];
int i;
int g;
int b[g];
for(i=2;i<N;i++)
{
x*=2;
if(x>=1)
{
a[i]=1;
x-=1;
}
else
{
a[i]=0;
}
}
for(i=2;i<N;i++)
{
printf("%d",a[i]);

}

}
この二進数を100回たすようなプログラムを作りたいんですが・・・


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:2進数 28567 Blue 2006/10/26 15:06:06
<子記事> Re:2進数 28568 通りすがり 2006/10/26 15:16:59
<子記事> Re:2進数 28569 nano 2006/10/26 16:10:06
<子記事> Re:2進数 28585 shu 2006/10/27 14:20:10


No.28567

Re:2進数
投稿者---Blue(2006/10/26 15:06:06)


>この二進数を100回たすようなプログラムを作りたいんですが・・・
作ればいいのでは?


質問になっていませんよ。
インデントされていないソースを載せても呼んでくれる人はカナリ稀です。
(私は読む気がなくなりましたけど。)
掲示板利用の規則にもあるとおり「HTML変換ツール」を使ってコードを載せてください。
それと、そのほかにも掲示板利用の規則に違反していることがあるので、
きちんと読んで理解した後、どんなことを聞きたいのかわかるように質問してください。



この投稿にコメントする

削除パスワード

No.28568

Re:2進数
投稿者---通りすがり(2006/10/26 15:16:59)


字下げ代行&エラー・警告対応

#include<stdio.h>

#define N 24

int main(void)
{
    double x=0.01;
    int a[N];
    int i;
/*  int g;    */
/*  int b[g]; */

    for (i = 2; i < N; i++) {
        x *= 2;
        if (x >= 1) {
            a[i] = 1;
            x -= 1;
        } else {
            a[i] = 0;
        }
    }
    for (i = 2; i < N; i++) {
        printf("%d", a[i]);
    }
    printf("\n");

    return 0;
}


-- 実行結果 --
0000001010001111010111



この投稿にコメントする

削除パスワード

No.28569

Re:2進数
投稿者---nano(2006/10/26 16:10:06)


こういうことがしたかったのでしょうか?

#include <stdio.h>

#define N (24)

int main(void)
{
    double x = 0.01;
    int a[N];
    int i;
    int n;
    //int g;
    //int b[g];
    
    for (i = 2; i < N; i++) {
        x *= 2;
        if (x >= 1) {
            a[i] = 1;
            x -= 1;
        }
        else {
            a[i] = 0;
        }
    }
    
    for (n = 0, i = 2; i < N; i++) {
        printf("%d", a[i]);
        n = n * 2 + a[i];
    }
    printf("を10進数に直すと、%d\n", n);
    printf("それを100回足しあわせると、%d\n", n * 100);
    return 0;
}




この投稿にコメントする

削除パスワード

No.28576

Re:2進数
投稿者---円零(2006/10/27 11:03:11)


いや、100倍ではなく100回加算したいのでは?
まあ整数の100倍と整数の100回加算の間に誤差は生じないかもしれませんが…
それに、Nが整数型の幅を越えることもあり得ますし。
#include <stdio.h>
#define N 24

int *dtob(int *xb, double x){  /* double型を「二進数」に変換 */
    int i;
    for(i = 2; i < N; i++){
        x *= 2;
        x -= xb[i] = x >= 1;
    }
    return xb;
}
    
double btod(int *xb){  /* 「二進数」をdouble型に変換 */
    int i;
    double x = 0, div = 2;
    for(i = 2; i < N; i++){
        x += xb[i] / div;
        div *= 2;
    }
    return x;
} 

int *b_addasgn(int *xb, int *yb){  /* 加算代入 */
    int i, carry = 0, tmp;
    for(i = N - 1; i >= 2; i--){
        tmp = xb[i]^ yb[i] ^ carry;
        carry = carry & (xb[i] | yb[i]) | xb[i] & yb[i];
        xb[i] = tmp;
    }
    return xb;
}

char *btos(char *str, int *xb, int prec){  /* 「二進数」を文字列に変換 */
    int i;
    for(i = 0; i < prec; i++) *str++ = '1' - !xb[i];
    return str - prec;
}

int main(void){
    double x = 0.01, z;
    int i, xb[N], yb[N], zb[N];
    char buf[N + 1] = {'0', '0'};
    
    printf("0.01 --- %s\n", btos(buf, dtob(xb, x), N) + 2);
    printf("0.0 --- %s\n", btos(buf, dtob(yb, 0), N) + 2);
    printf("1.0 --- %s\n", btos(buf, dtob(zb, 1), N) + 2);
    for(i = 0; i < 100; i++) b_addasgn(yb, xb);
    printf("0.01x100 --- %s\n", btos(buf, yb, N) + 2);
    printf("         ---> %.*f", N / 3 + 1, btod(yb));
    return 0;
}



この投稿にコメントする

削除パスワード

No.28585

Re:2進数
投稿者---shu(2006/10/27 14:20:10)


Nが24だったり、iが2からはじまるのはなぜかわかりませんでした。

//
//	100回たす「ような」プログラム
//

#include <stdio.h>

#define CHAR_BITS	8
#define MSB	0x80
#define N	100

int main(void)
{
    double x = 0.01;
    unsigned char *p = (unsigned char *) &x;
    int i, j, k;
    
    for (i = 0; i < N; i++) {
        printf("%.2f: ", x);
        for (j = 0; j < sizeof(x); j++) {
            for (k = 0; k < CHAR_BITS; k++) {
                putchar(p[j] & MSB >> k ? '1' : '0');
            }
            putchar(' ');
        }
        putchar('\n');
        
        x += 0.01;
    }
    
    return 0;
}



この投稿にコメントする

削除パスワード

No.28599

Re:2進数
投稿者---shu(2006/10/28 01:35:56)


//
//	足し算と掛け算の誤差
//

//
#include <stdio.h>

#define CHAR_BITS	8
#define	MSB	0x80
#define N	100

int main(void)
{
    double x = 0.01, y;
    unsigned char *p = (unsigned char *) &x;
    unsigned char *q = (unsigned char *) &y;
    int i, j, k;
    
    for (i = 0; i < N; i++) {
        printf("%.2f: ", x);
        for (j = 0; j < sizeof(x); j++) {
            for (k = 0; k < CHAR_BITS; k++) {
                putchar(p[j] & MSB >> k ? '1' : '0');
            }
            putchar(' ');
        }
        putchar('\n');
        
        x += 0.01;
        
        printf("%.2f: ", y = 0.01 * (i + 1));
        for (j = 0; j < sizeof(y); j++) {
            for (k = 0; k < CHAR_BITS; k++) {
                putchar(q[j] & MSB >> k ? '1' : '0');
            }
            putchar(' ');
        }
        putchar('\n');
    }
    
    return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧