# 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("1.189731495357231765085759326628007016196469052641694045529698884212163579755312392324974012848462074E+4932"))
