|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Внезапно потребовался алгоритм нахождения most significant bit на pl/sql Хотелось бы, чтобы он надежно и быстро работал в диапазоне чисел: 0 - 170141183460469231731687303715884105727 (power(2,127)-1) К сожалению, стандартный Log(2,x) не пригоден к использованию на всем диапазоне, он быстро перестает различать Log(2,x) и Log(2, x-1), и трюками сорта Round(L,20) это не вылечишь. Деление в цикле с наращиванием счётчика сразу отбрасываем. На поверхности сейчас вижу либо явный двоичный поиск в массиве на 126 элементов, либо его реализацию последовательностью явных If-ов. Что к этому делу еще можно было бы приспособить, работающего хотя бы за логарифм от максимальной разрядности? Может кто покажет прямые трюки со значениями utl_raw.cast_from_number. Наверно что-то понятное и легко проверяемое там можно получать, стартуя с HexToRaw, но меня пока смущает необходимость приведения числа к строковому представлению в таком варианте... Что присоветуете, коллеги? а вдруг где-то в стандартных пакетах стандартная функция зашита... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 12:45 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
msb применительно к какому типу данных? За логарифм от разрядности - можно, полагаю, делением с двоичным поиском. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 12:55 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, неотрицательный number, укладывающийся в набор значений до максимального беззнакового 126-битного целого. (диапазон я указал в первом посте) Двоичный поиск я вижу.. Сейчас думаю,как понизить его глубину. Вроде вдвое она должна разделяться в смысле максимального размера массива 63 а не 126, но пока не сообразил, как это точно выписать. Мне пока верится, что может найтись что-то чуть умнее/хитрее чем двоичный поиск. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 13:04 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
boobyДеление в цикле с наращиванием счётчика сразу отбрасываем. А почему, собственно? Делишь, например, на 65536 пока значение не войдёт в диапазон целого или хотя бы область определения логарифма. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 13:05 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby хитрее чем двоичный поиск. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 13:15 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, понял, 4 деления, на 64-битных значениях Log уже какие-то признаки жизни показывает вроде. Спасибо. Положил на ум. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 13:17 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Elic booby хитрее чем двоичный поиск. to_char(…, 'fmXXX…') - такого сорта начало мне понятно, дальше что-то про utl_raw. Что про цену to_char по отношению к логарифму можно сказать? Как-то to_char меня пока пугает, побаиваюсь я его.... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 13:24 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby дальше что-то про utl_raw. Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 13:40 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Elic, над raw код такого типа будет за "константу" отрабатывать, на varchar2 - время length, например, окажется функцией текущей кодировки бд. я подумаю. msb - это фрагмент задачи. Может быть, внутреннее представление данных в ней целиком и правда разумно будет перевести в raw, отдавая только конечный результат в виде числа. Поток входного to_char, мне пока всё равно не нравится. Но, может быть... ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 14:28 |
|
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 14:36 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, вау, красота-то какая. Пойду глаза промою, а то слепит, аж невмоготу. Премного благодарен. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 15:06 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, Еще раз спасибо. И ведь я видел этот вариант в интернете, перед тем как писать, в виде кода на C, но целиком просклизил мимо него, теперь даже досадно. В частичное оправдание под капот кладу рядом с твоим, то, что получается после линеаризации и возвращения к "классическому" виду. Задача почти не встречается, но вдруг кому-то полезным окажется, поэтому оставил в коде комментарий для итересующихся, как оно работает. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 18:31 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby слепит, аж невмоготу. Это от отсутствия bitOr :( ...кстати, я там накосячил с порядками. Рекурсия не n+1, а n*2 плюс поправить кондиции ...а если немного вспомнить алгебру, то можно и чуть попроще... Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 19:12 |
|
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.
...на pl/sql аналогично используется ассоциативный массив, но там чуть сложнее - надо бить number на 4 binary_integer, в pl/sql оно 32-битное. Ну или длинный case сгенерить. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 19:37 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, как bitor получить я понимал, как и то, почему в нём сначала минус кошерно риовать, а не плюс последний член. проскользил я мимо того обстоятельства, что между 32 разрядами и 128ю всего два шага алгоритма. то, что ты сейчас показываешь понятно, но общее число шагов вроде не уменьшает.. может быть, if-ы переставляются. про хранение поднабора степеней в массиве на небольшое число элементов я может быть посмотрю. PS я как раз агрегатный bitor сочиняю. и msb мне нужен, чтобы корректно обыгрывать случай применения в качестве аналитической функции. Так что в кишках чистый pl/sql будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 19:53 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby я как раз агрегатный bitor сочиняю. и msb мне нужен, чтобы корректно обыгрывать случай применения в качестве аналитической функции. Так что в кишках чистый pl/sql будет. Ну дык bitor(a,b) - он жеж -bitand(-a-1,-b-1)-1 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 20:19 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby, > Деление в цикле с наращиванием счётчика сразу отбрасываем. На C это был бы наверное самый быстрый способ (после разбивания по размеру слова архитектуры, по 32/64), т.к. цикл из двух-трех инструкций повтором в 30-60 выполняется быстрее чем вызов функции и возврат. Поиск в дереве - это всего 7 сравнений (но 128 бит, считаем как 14 сравнений машинных слов) тоже очень быстро если машинный код генерится хороший. Лукап по таблице еще не обсуждали? В сях это коротко и быстро. PL/SQL проверяет индексы, поэтому вряд ли. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Больше таблица - больше скорость. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 20:29 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, мне лично bitor(a,b) = a - bitand(a, b) + b намного приятнее. Такой я на автомате, с закрытыми глазами и не задумываясь, писать умею. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 20:32 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby про хранение поднабора степеней в массиве на небольшое число элементов я может быть посмотрю. Так что в кишках чистый pl/sql будет. Про BitOr я уже вроде сказал - если делать агрегатку, то зачем следить за msb я не очень понимаю. Про решение на pl/sql - всё достаточно просто, но ограничения на индексы ассоциативных массивов требуют либо уходить в строку, либо заниматься такой хренотенью: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 20:47 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby andrey_anonymous, мне лично bitor(a,b) = a - bitand(a, b) + b намного приятнее. Ну я бы потестил по производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 20:48 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous ... если делать агрегатку, то зачем следить за msb я не очень понимаю. ... Если задумывать честное применение в качестве аналитической функции, то полезно под рукой иметь честный способ частичного извлечения данных устаревшего окна и добавления данных нового без переиницализации состояния агрегата. Имея годный по скорости msb это можно поддержать. Правда может состоять в том, что это, на самом деле, всего лишь замедляющее агрегат излишество. Пока я еще не вполне понимаю, останется поддержка такого сорта кода, или нет в окончательном варианте. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 20:56 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
про "медленную проверку индекса массива". Ну, эта проверка все равно идет на атрибутах экземпляра типа, так что смертельно медленной она не будет. И, если уж смерть как хочется, чтобы "как в C по смещению" - извлечение подстроки из raw всегда есть, правда за счет работы с вызовом функции на стеке. (Может быть, так я и сделаю счетчик занятых битов в агрегате, пока не знаю еще, пока все это - ковыряния в носу.) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 21:02 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby Имея годный по скорости msb это можно поддержать. С ходу что-то не соображу как, было бы интересно при случае взглянуть. ...и вот еще, если данные изначально лежат в raw, то utl_raw умеет и or, и xor и даже complement :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 21:02 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous booby Имея годный по скорости msb это можно поддержать. С ходу что-то не соображу как, было бы интересно при случае взглянуть. ...и вот еще, если данные изначально лежат в raw, то utl_raw умеет и or, и xor и даже complement :) вторую часть вопроса я потенциально держу в голове. Но тогда либо сам агрегат должен сразу работать с raw, а не с number, либо откуда-то надо брать тайные знания. Для number понятные мне продолжения в таком написании стартуют с hextoRaw. А to_char-у, который тот hex должен получить, я не доверяю в плане производительности. По первой части: потенциально одни и те же значения могут попадать в агрегат произвольное число раз. При оговоренной максимальной разрядности думаю держать счетчик попаданий в соответствующий бит счётчика-абака, Дальше, пока "разряд" абака больше единицы, он уменьшается на единицу, а если равен единице, то вместе с уменьшением значения в разряде абака, обнуляется бит агрегата. Для поданного на удаление из агрегата числа работа с ним должна начинаться с msb этого удаляемого числа. Вот всё. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 21:20 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby либо откуда-то надо брать тайные знания. Хранение number в oracle не предполагает его прозрачную конвертацию в бинарное целое и, соответственно, в raw - там банально десятичная степень, а не двоичная - т.е. мантисса не сохраняется при умножении/делении на степени 2. Потому и написал - "если данные хранятся в raw" hextoRaw принимает на вход только Hex, т.е. без to_char не обойтись (явно или неявно). Есть вариант cast_from_number, но он тоже потребует битовых операций - выделить мантиссу, степень, как-то домножить одно на другое но уже в виде целого - затем уже компоновать целевой целочисленный raw. booby Для поданного на удаление из агрегата числа работа с ним должна начинаться с msb этого удаляемого числа. Насколько я понимаю, в описанном варианте достаточно все равно с какого байта браться дерибанить число на биты (дабы вычитать побитовый абак). Если справа и делением - то окончание по достижению 0 и не требуется никакой msb... Впрочем, хозяин-барин, я не настаиваю :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 21:37 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, возможно я не понял последнюю ремарку. Начиная справа я должен проверить все разряды (126 по задуманному дизайну). Начиная с msb и двигаясь вниз по разрядам, я смогу останавливаться только на выставленных в 1 разрядах, игнорируя нулевые. У меня такая идея была - я не знаю, как двигаясь с младшего разряда, проскакивать в анализируемом числе нулевые. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 21:46 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby Начиная с msb и двигаясь вниз по разрядам, я смогу останавливаться только на выставленных в 1 разрядах, игнорируя нулевые. Должно быть я не догоняю. Пропускать нулевые двигаясь слева - это ведь опять вычисление msb? Если да, то не дешевле тупо делить на два или даже пройтись по строке? Если нет - то как пропустить нулевой бит и почему не выполнить ту же операцию над исходным числом вместо вычисления msb? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 21:51 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Вообще я бы попробовал сразу разделить число на целые покороче (бит по 16, к примеру) и обрабатывать ненулевые, это +-константное время. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 21:55 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
...промеждупрочим, а для зачем вообще на биты уходить? Можно же обойтись десятичными разрядами. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 22:02 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous booby Начиная с msb и двигаясь вниз по разрядам, я смогу останавливаться только на выставленных в 1 разрядах, игнорируя нулевые. Должно быть я не догоняю. Пропускать нулевые двигаясь слева - это ведь опять вычисление msb? Если да, то не дешевле тупо делить на два или даже пройтись по строке? Если нет - то как пропустить нулевой бит и почему не выполнить ту же операцию над исходным числом вместо вычисления msb? В общем, все да. msb выглядит полезным при любом варианте - он даёт верхнюю оценку размера цикла и разряд, за которым "битов нет". если в исследуемом числе биты сильно разрекжены, то bitand(x, msb-1) даст возможность пропустить "много разрядов". Как дальше этим воспользоваться наилучшим образом - пока открыто.. Утром мне казалось, что я уже вроде знаю как, а сейчас забыл. Не помню, может быть мне так казалось потому, что поначалу я верил в то, что смогу обойтись просто стандартной реализацией логарифма. Даже если двигаться по каждому разряду - при наличии msb я могу обойтись простым делением в цикле, и мне не потребуется сравнение на превышении степени значения анализируемого числа на каждом шаге, как это было бы при движении от младшего разряда. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 22:18 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous ...промеждупрочим, а для зачем вообще на биты уходить? Можно же обойтись десятичными разрядами. Там всего 16 байтов. Начиная со старшего, пропускаем все нулевые (допустим, байты 15,14,13 нулевые, 12й-ненулевой). сузили ответ до 88 -95 (0-based). Допустим в байте 12 число 66 - это бит номер 6, посчитать или сдвигом вправо, не более 7 раз, или в таблице посмотреть. 88 +6 = 94й бит. Скан снизу вверх займет дольше, т.к. надо посмотреть все байты. Скан сверху вниз останавливается найдя первый неноль. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 22:19 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous ...промеждупрочим, а для зачем вообще на биты уходить? Можно же обойтись десятичными разрядами. ну, я десятичной арифметики не знаю. Может и не знал никогда, я в школе уже давно учился. И вообще - это голландские методы. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.09.2020, 22:19 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby голландские методы. Применительно к number с его bcd-мантиссой и десятичным порядком самое оно, деление на 10 - то же что деление на 2 в сях ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 00:12 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, по поводу 22199621 - цикл м.б. я бы case-ом сравнения заменил, но массивы тут не самое главное, принципиально интересна манипуляция показателями степени. как смутная пока идея - идеально было бы получать два соседних показателя степени для заполненных разрядов в числе, стартуя с некоторого заданного (в общем - не важно даже, в каком обязательно направлении двигаясь). Тогда стартуя с msb (или даже lsb, в расчете, что он "где-то рядом"), можно было бы быстро и точно вставать только на значимые разряды. Думаю, для обоих вариантов (право/лево, msb/lsb) подходящий код должен обнаружиться и быть сходной степени сложности. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 00:13 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous booby голландские методы. Применительно к number с его bcd-мантиссой и десятичным порядком самое оно, деление на 10 - то же что деление на 2 в сях Уговорил, обращусь к изучению наследия Симона Стевина - изобретателя десятичного поиска. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 00:16 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous ...промеждупрочим, а для зачем вообще на биты уходить? Можно же обойтись десятичными разрядами. Действительно, я только что для себя обнаружил что NUMBER хранится в десятичном виде, с основанием 100. поэтому любые битовые операции приводят к медленным преобразованиям в обе стороны. Зато центнерная ордината хранится прямо в числе - ничего не надо считать. Код: plaintext 1. 2. 3. 4.
В первом байте хранится центнерная ордината 19 для 100^19 (там надо 193 вычесть) а по следующему байту сразу видна самая старшая десятичная цифра. Это значит что все арифметические операции с NUMBER выполняются практически в столбик, без привлечения скоростных возможностей процессора, а с делением таких чисел вообще атас. Зато их удобно хранить и печатать. И еще log10 наверное быстро работает. Ради любопытства, посчитал простую арифметику миллион раз на PL/SQL и на сях. Разница в скорости около 300 раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 00:19 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous booby голландские методы. Применительно к number с его bcd-мантиссой и десятичным порядком самое оно, деление на 10 - то же что деление на 2 в сях Лучше делить на 100 (декремент мантиссы на 1), иначе будет все число двигать на полбайта. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 00:22 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
У меня впечатление, что тема, по крупному, исчерпана. Спасибо всем, кто так или иначе участвовал. Минимальная реализация действительно не требует ведения "счетчиков попадания". И, в любом случае, для настолкько быстрой работы, насколько это вообще возможно при реализации "в лоб", например на 30 разрядах, того, что есть в топике, более чем достаточно. Не даром говорят - всегда проси больше, тогда есть надежда, что получишь точно то, что тебе надо. Ещё раз всем спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 01:23 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
НеофитSQL Действительно, я только что для себя обнаружил что NUMBER хранится в десятичном виде НеофитSQL Зато центнерная ордината хранится прямо в числе - ничего не надо считать. Код: plaintext
https://docs.oracle.com/en/database/oracle/oracle-database/19/lnoci/data-types.html#LNOCI-GUID-91151345-2C67-41BC-A782-AD4816B89BCF НеофитSQL Ради любопытства, посчитал простую арифметику миллион раз на PL/SQL и на сях. Разница в скорости около 300 раз. andrey_anonymous, почему в PL/SQL с NUMBER, а не simple_double? a в SQL c binary_double? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 02:02 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender почему в PL/SQL с NUMBER, а не simple_double? a в SQL c binary_double? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 02:06 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender, Number заказывал я как топикстартер. У binary_double другой диапазон, да и для него нет самостоятельного определения bitand в pl/sql. Он быстрый, но в этой задаче - не нужный. Думаю, что всё-таки ты pls_integer подразумевал. это хороший короткий вариант. Но тут уж точно поле состояния агрегата в объекте будет raw. С учетом его знаковости - я не проверял, правильно ли он держит 31 бит в процессе вычисления. Но то, что на 30 битах с ним можно работать без опасений и быстро - это очевидно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 02:52 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
booby У binary_double другой диапазон booby Думаю, что всё-таки ты pls_integer подразумевал. booby для него нет самостоятельного определения bitand в pl/sql. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 04:16 |
|
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. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 04:22 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender, ff + 1 = 0, просто лень допилить ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 04:25 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Ну и чем это предпочтительнее to_char с прямым подсчетом? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 11:45 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, Код: plsql 1.
to_char(x,'fmXXXXXXXXXXXXXXXX') + что именно? хардкодинг через decode от substr + length * 8? или to_number от substr(to_char(x,'fmXXXXXXXXXXXXXXXX'),1,1) + что? Покажи, что именно ты имеешь ввиду? сравним ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 12:00 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, или 22199578 предпочтительнее чем простой короткий to_number(replace(substr(dump(x,16), 17,3),','),'XX')+1 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 12:02 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender andrey_anonymous, или 22199578 предпочтительнее чем простой короткий to_number(replace(substr(dump(x,16), 17,3),','),'XX')+1 А в чем тут проблема, короткий поиск по крошечному наглухо закэшированному индексу без преобразований типов - вполне себе вариант на мой взгляд для sql-решения. Твой метод предполагает: 1. расходы на cast (сопоставимо с to_char) 2. dump-преобразование double в строку 2.1 нештатное использование dump (где-то гарантируется формат его выдачи?) 3. строчные операции над результатом dump (особенно regexp) 4. to_number Метод Elic: 1. to_char 2. substr 1-го байта и его decode. 3. обратный to_number Если уж идти в строчку - я бы предпочел вариант Виталия уже ввиду отсутствия рисков side-effect. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 12:26 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, ну закодь - посмотрим, сравним ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 12:27 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, вот как точка отсчета: Код: plsql 1. 2. 3. 4. 5. 6. 7.
Этих двух я не дождался: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 12:39 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender Код: plsql 1.
booby на pl/sql ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 13:32 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender andrey_anonymous, вот как точка отсчета: Ну держи: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 13:36 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender т.к. ищется только старший бит, то погрешностью младших разрядов в binary_double можно спокойно пренебречь Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 13:52 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
[quote Elic#22199957]Точно? Код: plsql 1. 2. 3. 4. 5.
и? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:03 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender Код: plsql 1.
Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:04 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender Этих двух я не дождался: Не, ну так кто угодно "победит". Сказано же - трюк от Elic, тестить надо соответственно. Это решение вполне сопоставимо с твоим: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:09 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender и? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:12 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Elic xtender и? Саян не конвертит обратно в number, он прямо использует показатель степени binary_double. Но очень много операций + решение на side-effect по сути банят этот вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:16 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous, да, длинно, но шустро. andrey_anonymous 2.1 нештатное использование dump (где-то гарантируется формат его выдачи?) andrey_anonymous 2. dump-преобразование double в строку Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:23 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Можно, наверное, заморочиться и попробовать брать показатель из scientific-нотации с последующей трансформацией в двоичную степень :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:25 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:26 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender andrey_anonymous 2.1 нештатное использование dump (где-то гарантируется формат его выдачи?) Он не предназначен для машинного разбора, потому я бы не рискнул - возьмут и "улучшат", а у тебя система завалится... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:28 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender ну...зависит... Код: plsql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:29 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous заморочиться ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:30 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender andrey_anonymous заморочиться Ага, и прилинковал бы ее к оракелю как когда-то Бегун тут выделывался :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:32 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous Elic пропущено... msb разве не "съехал"? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:35 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Elic, Msb не съезжает... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:37 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Elic andrey_anonymous пропущено... Саян не конвертит обратно в number, он прямо использует показатель степени binary_double. Ну если покажешь разницу в вычисленном msb по методу Саяна и строчной реализацией... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:38 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous xtender пропущено... если уж совсем заморочиться, я бы сделал сишную функцию доставания экспоненты для любых типов Ага, и прилинковал бы ее к оракелю как когда-то Бегун тут выделывался :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:40 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender И не какую-нибудь, а экспоненту... Ну это значило бы благословить в потрохах ковыряться. Лучше бы просто сделали целочисленный бинарный тип большой разрядности. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:46 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous Лучше бы просто сделали целочисленный бинарный тип большой разрядности. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:52 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
andrey_anonymous Ну если покажешь разницу в вычисленном msb по методу Саяна Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 14:57 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
Elic, ах, я думал он округляет в большую сторону... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 15:05 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
xtender ах, я думал он округляет в большую сторону... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 15:20 |
|
msb (most significant bit) на pl/sql есть готовый?
|
|||
---|---|---|---|
#18+
погонял то, что adrey_anonymous наваял по заветам Elic-а против прямой манипуляции битами. получилось 56/69 в пользу заветов Elic-а. Вот такая она, прямая манипуляция. Как-то надо это пережить. Пора объявлять пятницу. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.09.2020, 16:24 |
|
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?all=1&fid=52&tid=1880837]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
32ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
159ms |
get tp. blocked users: |
1ms |
others: | 311ms |
total: | 536ms |
0 / 0 |