Автор Тема: Перевод десятичного числа во float (32 битный формат IEEE 754)  (Прочитано 1103 раз)

0 Пользователей и 1 Гость просматривают эту тему.

ya12

  • Активный участник
  • ***
  • Сообщений: 160
    • Просмотр профиля
Здравствуйте.
Помогите с переводом десятичного числа во float (32 битный формат IEEE 754).

ps: Хочу научить бота запрыгивать на камни.
ps2: Dramster формула по переводу float в десятичное число отлично работает.

dramster

  • Герой форума
  • *****
  • Сообщений: 1130
    • Просмотр профиля
Как это тебе может помочь?  :o Но все равно, интересно было узнать как это работает  :). Статей в интернете достаточно, мне более понятной показалась вот эта http://alexanderkobelev.blogspot.com/2013/05/ieee-754.html

Код: Clickermann
  1. $num = 185.4375 // наше десятичное число для перевода
  2.  
  3.  
  4. print(" ")
  5. print("десятичное число - ", $num)
  6.  
  7. //бит знака
  8. IF($num > 0)
  9.   $sign = 0
  10. ELSE
  11.   $sign = 1
  12.   $num = abs($num)
  13. END_IF
  14.  
  15.  
  16. $int = int($num)    //целая часть
  17. $fraction = $num - $int  //дробная
  18.  
  19.  
  20. //перевод целой части в двоичную строку
  21. $str_int_b = ""
  22. WHILE($int > 0)
  23.   $int = $int/2
  24.   IF($int > int($int))
  25.      $str_int_b = STRCONCAT("1", $str_int_b)
  26.   else
  27.      $str_int_b = STRCONCAT("0", $str_int_b)
  28.   END_IF
  29.   $int = int($int)
  30. END_CYC
  31. IF($str_int_b = "")
  32.   print("целая часть в двоичном - ", 0)
  33. ELSE
  34.   print("целая часть в двоичном - ", $str_int_b)
  35. END_IF
  36.  
  37.  
  38.  
  39. //перевод дробной части в двоичную строку (только наоборот)
  40. $str_fraction_b = ""
  41. WHILE(($fraction > 0)&(strlen(STRCONCAT($str_int_b,$str_fraction_b))<50)) //рассчет до 50 знаков (бит), я даже и не в курсе сколько нужно, чтобы и точность была, и зря не нагружать проц.
  42.   $str_fraction_b = strconcat($str_fraction_b,int($fraction*2))
  43.   $fraction = $fraction*2 - int($fraction*2)
  44. END_CYC
  45. print("дробная часть в двоичном - ",$str_fraction_b)
  46.  
  47.  
  48. //рассчет мантиссы
  49. $mantissa = STRCONCAT($str_int_b,$str_fraction_b)
  50. WHILE(STRCUT($mantissa, 1, 1)=0)  //если число меньше единицы
  51.   $mantissa = STRCUT($mantissa, 2, strlen($mantissa)-1)
  52. END_CYC
  53. $mantissa = STRCUT($mantissa, 2, strlen($mantissa)-1) //убираем последнюю единицу
  54. IF(strlen($mantissa)<23)
  55.   WHILE(strlen($mantissa) < 23) //дописываем недостающие нули, mantissa = 23 бита
  56.      $mantissa = STRCONCAT($mantissa, 0)
  57.   END_CYC
  58. ELSE
  59.   $mantissa = STRCUT($mantissa, 1, 23) //если больше 23 бит, то убираем лишнее
  60. END_IF
  61. print("мантисса - ",$mantissa)
  62.  
  63.  
  64. //рассчет экспоненты
  65. IF($str_int_b = "")  //если число меньше единицы
  66.   $exponent_dec = 1
  67.   WHILE(STRCUT($str_fraction_b, $exponent_dec,1) = 0)
  68.      $exponent_dec = $exponent_dec + 1
  69.   END_CYC
  70.   $exponent_dec = 127 - $exponent_dec
  71. ELSE      //если больше
  72.   $exponent_dec = 126 + strlen($str_int_b)
  73. END_IF
  74.  
  75. print("экспонента в десятичном - ",$exponent_dec)
  76.  
  77. $exponent = ""   //перевод экспоненты в двоичную строку
  78. WHILE($exponent_dec > 0)
  79.   $exponent_dec = $exponent_dec/2
  80.   IF($exponent_dec > int($exponent_dec))
  81.      $exponent = STRCONCAT("1", $exponent)
  82.   else
  83.      $exponent = STRCONCAT("0", $exponent)
  84.   END_IF
  85.   $exponent_dec = int($exponent_dec)
  86. END_CYC
  87. WHILE(strlen($exponent) < 8) //дописываем недостающие нули, exponent = 8 бита
  88.   $exponent = STRCONCAT(0, $exponent)
  89. END_CYC
  90.  
  91. print("экспонента в двоичном - ",$exponent)
  92.  
  93. //соединяем все вместе
  94. $IEEE_754_bin = STRCONCAT($sign, $exponent, $mantissa)
  95.  
  96. print("IEEE_754 в бинарном виде - ", $IEEE_754_bin)
  97.  
  98. //пересчет из бинарной строки в десятичное число
  99. $pow = 1
  100. FOR($b=32,$b>0, -1)
  101.   $IEEE_754_dec = $IEEE_754_dec + STRCUT($IEEE_754_bin, $b, 1) * $pow
  102.   $pow = $pow * 2
  103. END_CYC
  104. print("IEEE_754 в десятичном виде - ", $IEEE_754_dec)
  105.  
  106.  
  107. //пересчет из бинарной строки в шестнадцатеричный вид
  108. SUB(bin_to_hex, $bin)
  109.   $hex = 0
  110.   $pow = 1
  111.   FOR($bn=4,$bn>0, -1)
  112.      $hex = $hex + STRCUT($bin, $bn, 1) * $pow
  113.      $pow = $pow * 2
  114.   END_CYC
  115.  
  116.   IF($hex > 9)
  117.      SWITCH($hex)
  118.         CASE(10)
  119.            $hex = "A"
  120.         CASE(11)
  121.            $hex = "B"
  122.         CASE(12)
  123.            $hex = "C"
  124.         CASE(13)
  125.            $hex = "D"
  126.         CASE(14)
  127.            $hex = "E"
  128.         CASE(15)
  129.            $hex = "F"
  130.      END_SWITCH
  131.   END_IF
  132. END_SUB
  133.  
  134. $IEEE_754_hex = ""
  135. FOR($b=1, $b<33, 4)
  136.   bin_to_hex(STRCUT($IEEE_754_bin, $b, 4))
  137.   $IEEE_754_hex = STRCONCAT($IEEE_754_hex, $hex)
  138. END_CYC
  139. print("IEEE_754 в шестнадцатеричном виде - 0x",$IEEE_754_hex)
  140.  
  141.  
  142. halt
  143.  
  144.  

Лог:
Код: Text
  1. 00:06:24 десятичное число - 185.4375
  2. 00:06:24 целая часть в двоичном - 10111001
  3. 00:06:24 дробная часть в двоичном - 0111
  4. 00:06:24 мантисса - 01110010111000000000000
  5. 00:06:24 экспонента в десятичном - 134
  6. 00:06:24 экспонента в двоичном - 10000110
  7. 00:06:24 IEEE_754 в бинарном виде - 01000011001110010111000000000000
  8. 00:06:24 IEEE_754 в десятичном виде - 1127837696
  9. 00:06:24 IEEE_754 в шестнадцатеричном виде - 0x43397000


« Последнее редактирование: Ноябрь 03, 2019, 12:29:40 am от dramster »

ya12

  • Активный участник
  • ***
  • Сообщений: 160
    • Просмотр профиля
Нашел в клиенте координаты(float) модели перса. Можно двигать модель в клиенте. Серверные координаты разумеется неизменны и за пределами радиуса обзора мир статичен.
Фича в том, что если стоять рядом с камнем, изменить Z координаты на выше камня, то локальная модель на камень спуститься, а серверная запрыгнет. Таким образом можно собрать дроп упавший на не доступной местности.