|
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 |
|
|
start [/forum/search_topic.php?author=Tsahes&author_mode=last_topics&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 713ms |
total: | 867ms |
0 / 0 |