# 10進数128ビット浮動小数点数をIEEE754内部表現の2進数と16進数に変換する関数
def decimal_to_binary_ieee754_128(x):
# 符号ビットを決定する
if x < 0:
sign = "1"
x = -x
else:
sign = "0"
# 指数部と仮数部を求める
# xを2進数に変換する
binary = bin(int(x))[2:]
# 小数点以下の部分を2進数に変換する
fraction = x - int(x)
fraction_binary = ""
while fraction > 0 and len(fraction_binary) < 128:
fraction *= 2
fraction_binary += str(int(fraction))
fraction -= int(fraction)
# xが整数の場合は小数点を追加する
if fraction_binary == "":
binary += "."
else:
binary += "." + fraction_binary
# xが0の場合は特殊なケースとして扱う
if x == 0:
exponent = "0" * 15
mantissa = "0" * 112
else:
# xが正規化されている場合
if binary[0] == "1":
# 小数点の位置を調整する
point_index = binary.index(".")
# 指数部を求める
exponent = bin(16383 + point_index - 1)[2:]
# 指数部が15ビットになるように0を補う
exponent = "0" * (15 - len(exponent)) + exponent
# 仮数部を求める
mantissa = binary[1:].replace(".", "")
# 仮数部が112ビットになるように0を補うか切り捨てる
if len(mantissa) < 112:
mantissa += "0" * (112 - len(mantissa))
else:
mantissa = mantissa[:112]
# xが非正規化されている場合
else:
# 1が現れる位置を探す
one_index = binary.index("1")
# 指数部を求める
exponent = "0" * 15
# 仮数部を求める
mantissa = binary[one_index + 1:].replace(".", "")
# 仮数部の先頭に0を補う
mantissa = "0" * (one_index - 1) + mantissa
# 仮数部が112ビットになるように0を補うか切り捨てる
if len(mantissa) < 112:
mantissa += "0" * (112 - len(mantissa))
else:
mantissa = mantissa[:112]
# 符号ビット、指数部、仮数部を結合して返す
return sign + exponent + mantissa
def decimal_to_binary_and_hexadecimal_ieee754_128(x):
# 10進数を2進数に変換する関数を呼び出す
binary = decimal_to_binary_ieee754_128(x)
# 2進数を16進数に変換する
hexadecimal = hex(int(binary, 2))
# 2進数と16進数を返す
return binary, hexadecimal
print(decimal_to_binary_and_hexadecimal_ieee754_128(1E+1))