Pythonで10進数をIEEE754形式に変換するプログラムの作成

# はじめに
こんにちは！今回はPythonを使って、10進数をIEEE754形式に変換するプログラムを作成したので、その内容を紹介します。
# IEEE 754とは？
IEEE 754は浮動小数点数を表現するための標準形式です。浮動小数点数は符号部(Sign)、指数部(Exponent)、仮数部(Mantissa)の3つで構成されており、32ビット(単精度)または64ビット(倍精度)形式が主に使用されています。
### 単精度(32ビット)
・符号部(S):1ビット
・指数部(e):8ビット
・仮数部(f):23ビット
### 倍精度(64ビット)
・符号部(S):1ビット
・指数部(e):11ビット
・仮数部(f):52ビット
# プログラムの概要
以下のPythonプログラムでは、入力された数値をIEEE 754形式に変換する方法を説明します。

・ decimal_to_binary(num, precision)
　10進数を2進数形式に変換します。
・ to_ieee754(num, precision)
　2進数の結果を元にIEEE 754形式のビット列を生成します。
# プログラムコード
```py:IEEE754.py
def decimal_to_binary(num, precision='single'):
    # 整数部分と小数部分を分離
    integer_part = int(abs(num))
    fractional_part = abs(num) - integer_part

    # 整数部分を2進数に変換
    binary_int = ''
    if integer_part == 0:
        binary_int = '0'
    while integer_part > 0:
        binary_int = str(integer_part % 2) + binary_int
        integer_part //= 2

    # 小数部分を2進数に変換（精度に応じて桁数を調整）
    binary_frac = ''
    max_precision = 23 if precision == 'single' else 52
    while fractional_part > 0 and len(binary_frac) < max_precision:
        fractional_part *= 2
        bit = int(fractional_part)
        binary_frac += str(bit)
        fractional_part -= bit

    return binary_int + ('.' + binary_frac if binary_frac else '')

def to_ieee754(num, precision='single'):
    if precision not in ['single', 'double']:
        raise ValueError("精度は'single'か'double'を指定してください")

    # 形式に応じたパラメータを設定
    params = {
        'single': {'bias': 127, 'exp_bits': 8, 'mantissa_bits': 23},
        'double': {'bias': 1023, 'exp_bits': 11, 'mantissa_bits': 52}
    }[precision]

    # 符号ビットの決定
    sign = '1' if num < 0 else '0'

    # 2進数に変換
    binary = decimal_to_binary(abs(num), precision)

    # 正規化して指数を求める
    if '.' not in binary:
        binary += '.'
    point_pos = binary.find('.')
    first_one = binary.find('1')

    if first_one == -1:  # 0の場合
        exponent = 0
        mantissa = '0' * params['mantissa_bits']
    else:
        # 指数の計算
        exponent = point_pos - first_one - 1
        if first_one > point_pos:
            exponent = point_pos - first_one

        # バイアスの追加
        exponent += params['bias']

        # 仮数部の作成
        binary_normalized = binary.replace('.', '')
        mantissa = binary_normalized[first_one+1:]
        mantissa = mantissa + '0' * params['mantissa_bits']  # 必要な長さまで0で埋める
        mantissa = mantissa[:params['mantissa_bits']]

    # 指数部のビット表現
    exponent = bin(exponent)[2:].zfill(params['exp_bits'])

    return {
        'sign': sign,
        'exponent': exponent,
        'mantissa': mantissa,
        'ieee754': sign + exponent + mantissa,
        'format': precision
    }
```
# 使用例
以下のコードでプログラムを試すことができます。
```py:IEEE754.py
number = -83625.7
for format in ['single', 'double']:
    result = to_ieee754(number, format)
    print(f"\n{format.capitalize()}精度形式:")
    print(f"10進数: {number}")
    print(f"符号部S: {result['sign']}")
    print(f"指数部e: {result['exponent']}")
    print(f"仮数部f: {result['mantissa']}")
    print(f"IEEE 754: {result['ieee754']}")
```
# 実行結果
```
Single精度形式:
10進数: -83625.7
符号部S: 1
指数部e: 10000100110
仮数部f: 01000101111010111111010
IEEE 754: 11000010011001000101111010111111010

Double精度形式:
10進数: -83625.7
符号部S: 1
指数部e: 10000110111
仮数部f: 0001000010111101011111101101010000000000000000000000
IEEE 754: 1100001101110001000010111101011111101101010000000000000000000000
```
# まとめ
このプログラムを使うことで、任意の10進数を簡単にIEEE 754形式に変換できます。浮動小数点数の仕組みを理解するための役立つツールになると思います。最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！