powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / msb (most significant bit) на pl/sql есть готовый?
25 сообщений из 87, страница 3 из 4
msb (most significant bit) на pl/sql есть готовый?
    #40000246
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Код: plsql
1.
dump

booby
на pl/sql
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000247
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
SQL> with
  2    t(n) as (select level from dual connect by level<=5e3)
  3   ,s0(x) as (select t1.n*1e6 + t2.n as x from t t1,t t2) -- 5e3^2 - 38.7sec - 757085000
  4  select
  5     sum(to_number(replace(substr(dump(cast(x as binary_double),16), 17,3),','),'XX')+1) sum_msb
  6  from s0
  7  /

   SUM_MSB
----------
 757085000

Elapsed: 00:01:23.79
SQL>
SQL> with
  2    t(n) as (select level from dual connect by level<=5e3)
  3   ,s0(x) as (select t1.n*1e6 + t2.n as x from t t1,t t2) -- 5e3^2 - 38.7sec - 757085000 --94c
  4  select sum ( length(s)*4
  5             - case
  6                 when substr(s,1,1) >= '8' then 1
  7                 when substr(s,1,1) >= '4' then 2
  8                 when substr(s,1,1) >= '2' then 3
  9                 when substr(s,1,1) >= '1' then 4
 10               end
 11              ) msb_sum
 12  from(
 13  select to_char(x,'fmxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') s
 14  from s0 )
 15  /

   MSB_SUM
----------
 757085000

Elapsed: 00:00:16.95
SQL>
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000255
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
т.к. ищется только старший бит, то погрешностью младших разрядов в binary_double можно спокойно пренебречь
Точно?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> select to_char(n, 'fmXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
  2       , to_char(cast(cast(n as binary_double) as number), 'fmXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
  3    from (select power(2, 100) + power(2, 20) as n from dual);

TO_CHAR(N,FMXXXXXXXXXXXXXXXXXXXXXX
-----------------------------------
TO_CHAR(CAST(CAST(NASBINARY_DOUBLE)
-----------------------------------
10000000000000000000100000
FFFFFFFFFFFFFFEA385898000
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000256
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
[quote Elic#22199957]Точно?
Код: plsql
1.
2.
3.
4.
5.
[/SRC][/quote][SRC oracle]select n
     , to_char(n                       , 'fmXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
     , to_number(replace(substr(dump(cast(n as binary_double),16), 17,3),','),'XX')+1 msb
  from (select power(2, 100) + power(2, 20) as n from dual);
/

и?
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000258
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
xtender
Код: plsql
1.
dump

Код: plsql
1.
to_number(substr(utl_raw.cast_from_binary_double(d),2,2),'XX')+1
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000259
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
Этих двух я не дождался:

Не, ну так кто угодно "победит".
Сказано же - трюк от Elic, тестить надо соответственно.
Это решение вполне сопоставимо с твоим:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SQL> with
  2    t(n) as (select level from dual connect by level<=5e3)
  3   ,s0 (x) as (select t1.n*1e6 + t2.n as x from t t1,t t2) -- 5e3^2 - 38.7 - 757085000
  4   , powers as  (select /*+ materialize*/ power(2,level-1) msb, level-1 msb_pos from dual connect by level < 129 order by power(2,level-1) desc)
  5  select sum(Msb_pos)
  6  from s0
  7     , lateral(select * from (
  8              select msb_pos from dropme_powers where msb<=x order by msb desc
  9              ) where rownum =1
 10              )
 11  ;

SUM(MSB_POS)
------------
   757085000

Elapsed: 00:01:11.96
SQL>
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000261
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
и?
msb разве не "съехал"?
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000263
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
xtender
и?
msb разве не "съехал"?

Саян не конвертит обратно в number, он прямо использует показатель степени binary_double.
Но очень много операций + решение на side-effect по сути банят этот вариант.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000265
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andrey_anonymous,

да, длинно, но шустро.

andrey_anonymous
2.1 нештатное использование dump (где-то гарантируется формат его выдачи?)
ну формат же известен и документирован
andrey_anonymous
2. dump-преобразование double в строку
немного ускоряется обрезанием до первых 2 байтов:
Код: plsql
1.
dump(dd,16,1,2)
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000268
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, наверное, заморочиться и попробовать брать показатель из scientific-нотации с последующей трансформацией в двоичную степень :)
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000269
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andrey_anonymous
Код: plsql
1.
dropme_powers 

ну...зависит...
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000271
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
andrey_anonymous
2.1 нештатное использование dump (где-то гарантируется формат его выдачи?)
ну формат же известен и документирован

Он не предназначен для машинного разбора, потому я бы не рискнул - возьмут и "улучшат", а у тебя система завалится...
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000274
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
ну...зависит...

Код: plsql
1.
2.
3.
4.
create table dropme_powers(msb primary key, msb_pos) organization index
as 
select power(2,level-1) msb, level-1 msb_pos from dual connect by level < 129 order by power(2,level-1) desc
;
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000276
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andrey_anonymous
заморочиться
если уж совсем заморочиться, я бы сделал сишную функцию доставания экспоненты для любых типов
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000277
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
andrey_anonymous
заморочиться
если уж совсем заморочиться, я бы сделал сишную функцию доставания экспоненты для любых типов

Ага, и прилинковал бы ее к оракелю как когда-то Бегун тут выделывался :)
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000280
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Elic
пропущено...
msb разве не "съехал"?
Саян не конвертит обратно в number, он прямо использует показатель степени binary_double.
Я всего лишь визуализировал "съезд". А съезжает ещё при конвертации в binary_double.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000282
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Elic,

Msb не съезжает...
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000283
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
andrey_anonymous
пропущено...
Саян не конвертит обратно в number, он прямо использует показатель степени binary_double.
Я всего лишь визуализировал "съезд". А съезжает ещё при конвертации в binary_double.

Ну если покажешь разницу в вычисленном msb по методу Саяна и строчной реализацией...
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000285
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andrey_anonymous
xtender
пропущено...
если уж совсем заморочиться, я бы сделал сишную функцию доставания экспоненты для любых типов

Ага, и прилинковал бы ее к оракелю как когда-то Бегун тут выделывался :)
не ну самом деле, обидно, что достать пару полубайт так долго... И не какую-нибудь, а экспоненту...
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000288
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
И не какую-нибудь, а экспоненту...

Ну это значило бы благословить в потрохах ковыряться.
Лучше бы просто сделали целочисленный бинарный тип большой разрядности.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000291
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
andrey_anonymous
Лучше бы просто сделали целочисленный бинарный тип большой разрядности.
да, когда с фигней математической возился, приходилось в java лезть за biginteger, да и в целом такого типа многим не хватает, например в CERN где рассчеты в oracle гоняют
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000292
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous
Ну если покажешь разницу в вычисленном msb по методу Саяна
Два числа с очевидно разными msb дают этим методом одно и то же значение:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> with
  2    t as (select power(2, 100) + power(2, 20) as n from dual union all
  3          select power(2, 100) - power(2, 20) as n from dual
  4         )
  5  select to_char(n, 'fmXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
  6       , to_number(replace(substr(dump(cast(n as binary_double),16), 17,3),','),'XX')+1 msb
  7    from t;

TO_CHAR(N,FMXXXXXXXXXXXXXXXXXXXXXX         MSB
----------------------------------- ----------
10000000000000000000100000                 100
FFFFFFFFFFFFFFFFFFFF00000                  100
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000293
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Elic,

ах, я думал он округляет в большую сторону...
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000301
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtender
ах, я думал он округляет в большую сторону...
Неважно в какую, главное что округляет.
...
Рейтинг: 0 / 0
msb (most significant bit) на pl/sql есть готовый?
    #40000319
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
погонял то, что adrey_anonymous наваял по заветам Elic-а против прямой манипуляции битами.
получилось 56/69 в пользу заветов Elic-а.
Вот такая она, прямая манипуляция.

Как-то надо это пережить.
Пора объявлять пятницу.
...
Рейтинг: 0 / 0
25 сообщений из 87, страница 3 из 4
Форумы / Oracle [игнор отключен] [закрыт для гостей] / msb (most significant bit) на pl/sql есть готовый?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]