|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby прямая манипуляция. Прямая манипуляция битами над числом с плавающей точкой - нонсенс. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 16:55 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
точность формулировки не имеет значения. Значение имеет то, что bitand над number-ом "безумно дорог". ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 17:18 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous xtender пропущено... если уж совсем заморочиться, я бы сделал сишную функцию доставания экспоненты для любых типов Ага, и прилинковал бы ее к оракелю как когда-то Бегун тут выделывался :) И так можно? Интересно, как будет выглядеть передача параметра NUMBER переменной длины. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 17:48 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Если важна точность (т.е. чтоб 2^N-1 и 2^N различало), то вот самое короткое, что работает по 2^128 включительно. Код: plsql 1. 2. 3.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2020, 03:06 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
в выложенном мной коде была ошибка в шаге вычисления. выкладываю исправление, для порядка Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2020, 16:39 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Мне очень нравится решение Booby с развернутым циклом. Поигравшись с разными функциями и типами данных, мне удалось найти что-то быстрее. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Вопрос к знатокам - инициализация констант в декларациях функции занимает время, или это оптимизируется, т.к. константы? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2020, 22:00 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Итог пока такой: остановился промежуточно на комбинации захардкоженного двоичного поиска в комбинации с поиском по двум массивам на 256 значений в "последнем байте". (процедура возвращает и показатель степени и её значение). Не готов подтвердить "медленность массивов" - ровно то же время поиска по двум массивам, с оговоркой на погрешности измерений, что и прямой двоичный поиск на байте. Время против "классического" варианта с bitand-ом сократилось процентов на 40. В общем, теперь осталось только понять, пойдет ли оно в дело. 2НеофитSQL насколько быстро сможете найти ошибку в своем коде? (внимательно не смотрел, но подозреваю, что она на втором шаге). PS Вообще, "изящный код" и pl/sql - антонимы. Правильный для pl/sql девиз - "пишите проще, а лучше всего - как все ." ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2020, 19:24 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby, Я пока нашел у себя ошибку на 0 шаге (нет проверки на ноль). Пока не подсказывайте, я подумаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 01:50 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
НеофитSQL, Вы не подозревайте, что я знаю, где она точно. я просто вижу, что она есть и носит систематический и серийный характер. Так-то я сам не пишу код влёт без ошибок, и не могу показать пальцем, по крайней мере на лиц мужского пола, обладающих таким достоинством. Среди женщин-программистов такие вершины внимания и скурпулёзности допустимы, но и у них - такой недостаток большая редкость. (Последний раз что-то похожее на Аду Лавлейс я встречал уже очень много лет назад). Ошибка - обычное житейское дело. Как вы планируете жить с нею, с учётом того, что вы всех своих ошибок точно не выловите, и какие-то из них достанутся следующему товарищу, вот в чём вопрос. Хорошо, когда прямо глазом глядя в код, можно доказать его правильность. Если код настолько изящен, что методом чтения кода выявить ошибку не удается, то в дело вступают прогоны под отладчиком. Но по настоящему изящному коду и отладчик нипочем. Тогда остаётся действовать дедовскими способами. (В старину, кстати, программист опознавался не по наличию или отсутствию пиджака, свитера, или смешной шапочки на голове, а по наличию сразу нескольких точёных простых карандашей в нагрудном кармане.) Так вот дедовский способ заключается в использовании карандаша и листка бумаги, на котором рисуются загогулины, и после чего изящный код выбрасывается в помойку и заменяется на пригодный к сопровождению. Как-то так. По делу - проверьте, что возвращается для значений 101, 1001, 10001, 10...01 и соседних. В первой сотне лаг начинается с 96. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 02:55 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Нашел! Без использования trunc(), присваивание дробного числа целой переменной не обрезает дробную часть, а округляет, по всей видимости. Другими словами, int n := 127/64 даст двойку, а не единицу. Это важное отличие Pl/SQL от других мне известных языков. Добавил trunc() - функция заработала еще быстрее, и уже без ошибок :) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Меньше 4 микросекунд на вызов. Для сравнения, вызов пустой функции занимает около 0.8 микросекунд, т.е. инлайн ускорит еще процентов на 20, до < 3 мкс. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 03:00 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
в общем, поковыряв немного, решил в дело не пускать. Последнее, с чем игрался выглядит так: спецификация пакета Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
тело Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216.
тестовый запрос из топика Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
еще раз всем спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2020, 16:06 |
|
|
start [/forum/topic.php?fid=52&msg=40000531&tid=1880837]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 297ms |
total: | 440ms |
0 / 0 |