fork download
  1. # 10進数128ビット浮動小数点数をIEEE754内部表現の2進数と16進数に変換する関数
  2. def decimal_to_binary_ieee754_128(x):
  3. # 符号ビットを決定する
  4. if x < 0:
  5. sign = "1"
  6. x = -x
  7. else:
  8. sign = "0"
  9. # 指数部と仮数部を求める
  10. # xを2進数に変換する
  11. binary = bin(int(x))[2:]
  12. # 小数点以下の部分を2進数に変換する
  13. fraction = x - int(x)
  14. fraction_binary = ""
  15. while fraction > 0 and len(fraction_binary) < 128:
  16. fraction *= 2
  17. fraction_binary += str(int(fraction))
  18. fraction -= int(fraction)
  19. # xが整数の場合は小数点を追加する
  20. if fraction_binary == "":
  21. binary += "."
  22. else:
  23. binary += "." + fraction_binary
  24. # xが0の場合は特殊なケースとして扱う
  25. if x == 0:
  26. exponent = "0" * 15
  27. mantissa = "0" * 112
  28. else:
  29. # xが正規化されている場合
  30. if binary[0] == "1":
  31. # 小数点の位置を調整する
  32. point_index = binary.index(".")
  33. # 指数部を求める
  34. exponent = bin(16383 + point_index - 1)[2:]
  35. # 指数部が15ビットになるように0を補う
  36. exponent = "0" * (15 - len(exponent)) + exponent
  37. # 仮数部を求める
  38. mantissa = binary[1:].replace(".", "")
  39. # 仮数部が112ビットになるように0を補うか切り捨てる
  40. if len(mantissa) < 112:
  41. mantissa += "0" * (112 - len(mantissa))
  42. else:
  43. mantissa = mantissa[:112]
  44. # xが非正規化されている場合
  45. else:
  46. # 1が現れる位置を探す
  47. one_index = binary.index("1")
  48. # 指数部を求める
  49. exponent = "0" * 15
  50. # 仮数部を求める
  51. mantissa = binary[one_index + 1:].replace(".", "")
  52. # 仮数部の先頭に0を補う
  53. mantissa = "0" * (one_index - 1) + mantissa
  54. # 仮数部が112ビットになるように0を補うか切り捨てる
  55. if len(mantissa) < 112:
  56. mantissa += "0" * (112 - len(mantissa))
  57. else:
  58. mantissa = mantissa[:112]
  59. # 符号ビット、指数部、仮数部を結合して返す
  60. return sign + exponent + mantissa
  61.  
  62. def decimal_to_binary_and_hexadecimal_ieee754_128(x):
  63. # 10進数を2進数に変換する関数を呼び出す
  64. binary = decimal_to_binary_ieee754_128(x)
  65. # 2進数を16進数に変換する
  66. hexadecimal = hex(int(binary, 2))
  67. # 2進数と16進数を返す
  68. return binary, hexadecimal
  69.  
  70. print(decimal_to_binary_and_hexadecimal_ieee754_128(1E+1))
Success #stdin #stdout 0.03s 9552KB
stdin
Standard input is empty
stdout
('01000000000000100100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', '0x40024000000000000000000000000000')