C言語関係掲示板

過去ログ

No706 0〜1の間の小数を2進数で表すプログラム

[戻る] [ホームページ]
No.8435

2進数??
投稿者---たかし(2003/07/16 18:09:04)


0〜1の間の小数を2進数で表すプログラムをC++で作りたいと思っているんですが数字を2進数で表すプログラムの作り方からわかりません。どなたか教えて頂けないでしょうか?

No.8437

Re:2進数??
投稿者---とおりかかり(2003/07/16 18:31:09)


たかしさんこんにちは

>0〜1の間の小数を2進数で表すプログラムをC++で作りたいと思っているんですが数字を2進数で表すプログラムの作り方からわかりません。どなたか教えて頂けないでしょうか?

別の掲示板に、たかしさんと同じ学校の人でしょうか
SUNさんという人が同じような質問を出しています。

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200307/03070068.txt

そこではアドバイスが投稿されています。
参考になると思います。




No.8440

Re:2進数??
投稿者---かずま(2003/07/16 19:29:25)


> 0〜1の間の小数を2進数で表すプログラムをC++で作りたいと思って
> いるんですが数字を2進数で表すプログラムの作り方からわかりません。

なぜ、C ではなくて、C++ なんですか?

1未満の小数なら次のプログラムでよいでしょうが、1 も含めると修正が
必要です。それを書いて、ここに挙げてください。
#include <iostream>

void printbin(double x)
{
    std::cout << "0.";
    for (int i = 0; i < 53; i++) {
        x *= 2;
        int n = static_cast<int>(x);
        std::cout << n;
        x -= n;
        if (x == 0) break;
    }
    std::cout << std::endl;
}

int main()
{
    double a;
    while (std::cin >> a && a >= 0 && a < 1)
        printbin(a);
}


No.8452

Re:2進数??
投稿者---たかし(2003/07/16 21:28:33)


>> 0〜1の間の小数を2進数で表すプログラムをC++で作りたいと思って
>> いるんですが数字を2進数で表すプログラムの作り方からわかりません。
>
>なぜ、C ではなくて、C++ なんですか?
>
>1未満の小数なら次のプログラムでよいでしょうが、1 も含めると修正が
>必要です。それを書いて、ここに挙げてください。
><pre>
#include <iostream>

void printbin(double x)
{
std::cout << "0.";
for (int i = 0; i < 53; i++) {
x *= 2;
int n = static_cast<int>(x);
std::cout << n;
x -= n;
if (x == 0) break;
}
std::cout << std::endl;
}

int main()
{
double a;
while (std::cin >> a && a >= 0 && a < 1)
printbin(a);
}
</pre>

とおりかかり様、かずま様
ありがとうございます。そちらの意見を参考にして作って見たいと思います。
ちなみにC++でと言う理由は、C++しか習っていないからと言う感じです。
すいません

No.8492

Re:2進数??
投稿者---たかしB(2003/07/18 00:14:49)


こんにちは、たかしBと申します。
「2進数??」の質問者のたかしさんと、ハンドルネームが
重なってしまったのでBを付けています。

>1未満の小数なら次のプログラムでよいでしょうが、1 も含めると修正が
>必要です。それを書いて、ここに挙げてください。

#include <iostream>

void printbin(double x)
{
	if (x >= 1)
		return;
    std::cout << ".";
    for (int i = 0; i < 53; i++) {
        x *= 2;
        int n = static_cast<int>(x);
        std::cout << n;
        x -= n;
        if (x == 0) break;
    }
    std::cout << std::endl;
}

void printint(unsigned long x)
{
    int k = sizeof(unsigned long) * CHAR_BIT - 1;
    for ( ; k >= 0; --k)
        if (x >> k & 0x01)
            break;
    for ( ; k >= 0; --k)
        std::cout << (x >> k & 0x01);
}

int main()
{
    double a;
    while (std::cin >> a && a >= 0) {
        if (a >= 1)
            printint(static_cast<unsigned long>(a));
        printbin(a - static_cast<int>(a));
    }
    return 0;
}



No.8515

Re:2進数??
投稿者---たかしB(2003/07/19 21:03:56)


以下のプログラムでは、小数のみを入力すると
入力--> 0.5
結果--> .1
となってしまい、整数部1桁目の'0'が表示されませんでした。
また、小数部がdouble型の精度を持っているのに対して
整数部がunsigned long型の精度までしか対応していませんでした。
修正します。

  OS   : Windows Me
コンパイラ : Visual C++6.0
で動作確認しました。

><pre>#include <iostream>
>
>void printbin(double x)
>{
>	if (x >= 1)
>		return;
>    std::cout << ".";
>    for (int i = 0; i < 53; i++) {
>        x *= 2;
>        int n = static_cast<int>(x);
>        std::cout << n;
>        x -= n;
>        if (x == 0) break;
>    }
>    std::cout << std::endl;
>}
>
>void printint(unsigned long x)
>{
>    int k = sizeof(unsigned long) * CHAR_BIT - 1;
>    for ( ; k >= 0; --k)
>        if (x >> k & 0x01)
>            break;
>    for ( ; k >= 0; --k)
>        std::cout << (x >> k & 0x01);
>}
>
>int main()
>{
>    double a;
>    while (std::cin >> a && a >= 0) {
>        if (a >= 1)
>            printint(static_cast<unsigned long>(a));
>        printbin(a - static_cast<int>(a));
>    }
>    return 0;
>}</pre>

<修正後>

#include <iostream>
#include <math.h>

void printbin(double x)
{
    unsigned char bin[53];
    int k;
    double wx;
/* 整数部表示 */
    if (x >= 1) {
        wx = floor(x);
        for (k = 0; wx != 0 ; k++) {
            (fmod(wx, 2)) ? bin[k] = '1' : bin[k] = '0';
            wx = floor(wx / 2);
        }
        for (k--; k >= 0; k--)
            putchar(bin[k]);
    } else
        putchar('0');
/* 小数部表示 */
    x -= floor(x);
    std::cout << ".";
    for (int i = 0; i < 53; i++) {
        x *= 2;
        int n = static_cast<int>(x);
        std::cout << n;
        x -= n;
        if (x == 0) break;
    }
    std::cout << std::endl;
}

int main()
{
    double a;
    while (std::cin >> a && a >= 0)
        printbin(a);
    return 0;
}

<実行結果>
入力--> 0.5
結果--> 0.1
入力--> 10.75
結果--> 1010.11

問題点、お気づきの点がありましたら
ご指摘、お願い致します。