|
以下のプログラムでは、小数のみを入力すると
入力--> 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
問題点、お気づきの点がありましたら
ご指摘、お願い致します。
|