2 bdsd -- 実験のための小プログラム

double データのビット・パターンを $0$, $1$ からなる文字列 (型名を bdsd) に変換する関数 void double_to_bdsd(double, bdsd) と、 bsds データを表示する void print_bdsd(bdsd) を用意した。

bdsd.h

/*
 * bdsd.h
 */

#define NUM_BIN_DIGITS_DOUBLE 64
typedef char bin_digit_string_double[NUM_BIN_DIGITS_DOUBLE+1];
typedef bin_digit_string_double bdsd;

void double_to_bin_digits(double, bdsd);
void print_bdsd(bdsd);
bdsd.c

/*
 * bdsd.c
 */

#define NUM_BIN_DIGITS_INT 32
typedef char bds_int[NUM_BIN_DIGITS_INT+1];

#include <stdio.h>
#include "bdsd.h"

static void int_to_bin_digits(int x, bds_int s)
{
  int keta;
  s[NUM_BIN_DIGITS_INT - 1] = '0' + (x & 1);
  x = (x >> 1) & 0x7fffffff;
  for (keta = NUM_BIN_DIGITS_INT - 2; keta >= 0; keta--) {
    s[keta] = '0' + (x & 1);
    x = x >> 1;
  }
  s[NUM_BIN_DIGITS_INT] = 0;
}

void double_to_bin_digits(double x, bdsd bds)
{
  union {
    double x;
    int xa[2];
  } data;
  data.x = x;
  int_to_bin_digits(data.xa[1], bds);
  int_to_bin_digits(data.xa[0], bds+NUM_BIN_DIGITS_INT);
}

void print_bdsd(bdsd a_bdsd)
{
  int i;
  printf("%c ", a_bdsd[0]);
  for (i = 1; i <= 11; i++)
    putchar(a_bdsd[i]);
  printf(" %s", a_bdsd + 12);
}

桂田 祐史
2019-01-20