Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Пятничная задчка - для настоящих математиков!  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Глупый Телевизор,

Можно же использовать особенности представления действительных чисел при помощи number ?
19 мар 11, 18:56    [10396844]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
Глупый Телевизор
Member

Откуда: телевизор больше не смотреть (с)
Сообщений: 679
_Nikotin,
Ну почему бы и нет. Тем более задачка хоть как-то будет приплетена к тематике Оракл. :)
19 мар 11, 19:05    [10396876]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Глупый Телевизор,

Я к тому что ограничение размеров мантиссы и экспоненты, это ОЧЕНЬ сильное органичение действительных и даже рациональных чисел :)

P.S. попробую без деления получить sign для number из [-10^10, 10^10]
19 мар 11, 23:46    [10397627]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
Глупый Телевизор
Member

Откуда: телевизор больше не смотреть (с)
Сообщений: 679
_Nikotin,
Я в курсе про то, как хранятся числа, и про дискретность диапазонов и про то, что 3*1/3<>1 и прочее...
К Вам просьба продемонстрировать хотя бы решение без функции.
20 мар 11, 14:31    [10398540]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Без деления как-то так, конечно это не совсем то что нужно - множество где даёт верный результат меньше требуемого, но думаю идея понятна. С делением шире поле для аппроксимаций.

with D as
     (
       select 5 a, 7 b from dual
       union all select 7 a, 5 b from dual
       union all select 6 a, 6 b from dual
       union all select -5 a, -7 b from dual
       union all select -7 a, -5 b from dual
       union all select 7 a, -5 b from dual
       union all select -5 a, 7 b from dual
       union all select -7 a, 5 b from dual
       union all select 5 a, -7 b from dual
       union all select 1 a, 0 b from dual
       union all select 0 a, 1 b from dual
       union all select 0 a, -1 b from dual
       union all select -1 a, 0 b from dual
       union all select 0 a, 0 b from dual
       union all select 0 a, 1/3 b from dual
       union all select 1/3 a, 0 b from dual
     ),     
     I0  as (select a, b, ((a - b) / 40) + 0.61 x from D),
     I1  as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I0),
     I2  as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I1),
     I3  as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I2),
     I4  as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I3),
     I5  as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I4),
     I6  as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I5),
     I7  as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I6),
     I8  as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I7),
     I9  as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I8),
     I10 as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I9),
     I11 as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I10),
     I12 as (select /*+ materialize */ a, b, 1-(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x)))*(1-(1-(1-x*x)*(1-x*x))*(1-(1-x*x)*(1-x*x))) x from I11)
select a, b, a*x + b*(1-x) from I12
21 мар 11, 01:05    [10400029]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
Новичок в оракуле
Guest
Глупый Телевизор
_Nikotin,
про то, что >>>3*1/3<>1<<< и прочее...


а где про это почитать можно ?
21 мар 11, 09:51    [10400411]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
Новичок в оракуле
Глупый Телевизор
_Nikotin,
про то, что >>>3*1/3<>1<<< и прочее...

а где про это почитать можно ?

Не верю )
21 мар 11, 09:59    [10400434]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Глупый Телевизор
Ну что ж... получается пока никто других решений не предложил - я чемпион.

Все врут, даже с ограничнием про 10^10
SELECT a, b, greatest(a,b) c,
      (a+b+(a-b)*(1-2*((3*(a-b)-MOD((3*(a-b)),(3*(a-b)+1)))/(3*(a-b)+1))))/2 x0,
      ((a+b)+(a-b)*(1-2*BITAND((a-b),power(2,34))/power(2,34)))/2 x1,
      ((a+b)-(a-b)*(1-2*((1+(a-b)/((a-b)*(a-b)+1))-mod((1+(a-b)/((a-b)*(a-b)+1)),1))))/2 x2

FROM
(
SELECT 1E-41 a, 2E-41 b FROM dual
);
21 мар 11, 10:11    [10400477]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
Новичок в оракуле
Guest
ORA__SQL,

таки я тоже. так под сомнение все основы математики можно :-\
21 мар 11, 10:44    [10400702]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
__vvp_
Member

Откуда: Санкт-Петербург
Сообщений: 1158
Новичок в оракуле
ORA__SQL,

таки я тоже. так под сомнение все основы математики можно :-\


select case when 3*1/3 = 1 then 1
                           else 0
       end,
       case when 3*(1/3) = 1 then 1
                           else 0
       end
from dual
21 мар 11, 10:51    [10400757]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
Новичок в оракуле
Guest
__vvp_,

таки понятно что действия в скобках выполняется первым и 3 * 0,333333333333333 != 1

сабж был про 3*1/3<>1
21 мар 11, 10:57    [10400795]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
Новичок в оракуле
Guest
вернее сабж другой :) извините что вклинился не по тематике :)
21 мар 11, 10:58    [10400800]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
__vvp_
Новичок в оракуле
ORA__SQL,

таки я тоже. так под сомнение все основы математики можно :-\


select case when 3*1/3 = 1 then 1
                           else 0
       end,
       case when 3*(1/3) = 1 then 1
                           else 0
       end
from dual

Во втором случае ты уже умножаешь 3 не на 1/3, а на 0.3333333
21 мар 11, 10:58    [10400801]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
select a,
         b,
         greatest(a,b) c,
         a*(TRUNC((a-b)/POWER(2,64)+1,0))+b*(TRUNC((b-a)/POWER(2,64)+1,0))
         -a*(TRUNC((a-b)/POWER(2,64)+1,0)*(TRUNC((b-a)/POWER(2,64)+1,0))) my_greatest
from
(
select 5 a, 7 b from dual
union all select 7 a, 5 b from dual
union all select 5 a, 5 b from dual
union all select -5 a, -5 b from dual
union all select -5 a, -7 b from dual
union all select -7 a, -5 b from dual
union all select 7 a, -5 b from dual
union all select -5 a, 7 b from dual
union all select -7 a, 5 b from dual
union all select 5 a, -7 b from dual
union all select 1 a, 0 b from dual
union all select 0 a, 1 b from dual
union all select 0 a, -1 b from dual
union all select -1 a, 0 b from dual
union all select 0 a, 0 b from dual
)
21 мар 11, 11:05    [10400842]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
samatom
Member

Откуда: Москва
Сообщений: 367
ORA__SQL
select a,
         b,
         greatest(a,b) c,
         a*(TRUNC((a-b)/POWER(2,64)+1,0))+b*(TRUNC((b-a)/POWER(2,64)+1,0))
         -a*(TRUNC((a-b)/POWER(2,64)+1,0)*(TRUNC((b-a)/POWER(2,64)+1,0))) my_greatest
from
(
select 5 a, 7 b from dual
union all select 7 a, 5 b from dual
union all select 5 a, 5 b from dual
union all select -5 a, -5 b from dual
union all select -5 a, -7 b from dual
union all select -7 a, -5 b from dual
union all select 7 a, -5 b from dual
union all select -5 a, 7 b from dual
union all select -7 a, 5 b from dual
union all select 5 a, -7 b from dual
union all select 1 a, 0 b from dual
union all select 0 a, 1 b from dual
union all select 0 a, -1 b from dual
union all select -1 a, 0 b from dual
union all select 0 a, 0 b from dual
)


Не работает для числе 1E-41 a, -2E-41 b
21 мар 11, 11:34    [10401107]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
+ первый вариант
with t as (
              select 5 a, 7 b from dual
        union all select 7 a, 5 b from dual
        union all select 6 a, 6 b from dual
        union all select -5 a, -7 b from dual
        union all select -7 a, -5 b from dual
        union all select 7 a, -5 b from dual
        union all select -5 a, 7 b from dual
        union all select -7 a, 5 b from dual
        union all select 5 a, -7 b from dual
        union all select 1 a, 0 b from dual
        union all select 0 a, 1 b from dual
        union all select 0 a, -1 b from dual
        union all select -1 a, 0 b from dual
        union all select 0 a, 0 b from dual
)
,sqrt_line as (
      select a,b,v,x
      from 
      (select a,b,v,x,row_number() over(partition by a,b order by i desc) rn
       from (
                select a,b,i,v,x
                from (select a,b,(a-b)*(a-b) v from t)
                model return updated rows
                     partition by (a,b)
                     dimension by (0 i)
                     measures(v x, v)
                     rules iterate(4000000) until(abs(x[iteration_number]-x[iteration_number-1])<1e-10) (
                         x[iteration_number] = case when cv(i)=0 then v[0]
                                                    when x[cv(i)-1]=0 then x[cv(i)-1]
                                                    else ( x[cv(i)-1] +  v[0] / x[cv(i)-1] )/2
                                               end,
                         v[iteration_number] = v[0]
                     )
            ) tt
      )
      where rn=1
)
select a,b,(a+b)/2+x/2
from sqrt_line
21 мар 11, 11:43    [10401168]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
samatom
Не работает для числе 1E-41 a, -2E-41 b

Для целых чисел работает корректно :)
21 мар 11, 11:51    [10401226]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
samatom
Member

Откуда: Москва
Сообщений: 367
Глупый телевизор
Кто найдет без функции мод - вообще гениальный парень.

Это невозможно, доказано местными алхимиками =)

Глупый телевизор
То есть если перевести выражение на ассемблер - то чтоб не было команды cmp

Хотел посмотреть, как работает эта команда, но не нашел. Может есть у кого инфа? Возможно, это ещё один ключ к решению задачи - а-ля реверс-инжиниринг.
21 мар 11, 11:52    [10401235]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
samatom
Не работает для числе 1E-41 a, -2E-41 b

+ повысил точность для таких чисел
with t as (
              select 5 a, 7 b from dual
        union all select 7 a, 5 b from dual
        union all select 6 a, 6 b from dual
        union all select -5 a, -7 b from dual
        union all select -7 a, -5 b from dual
        union all select 7 a, -5 b from dual
        union all select -5 a, 7 b from dual
        union all select -7 a, 5 b from dual
        union all select 5 a, -7 b from dual
        union all select 1 a, 0 b from dual
        union all select 0 a, 1 b from dual
        union all select 0 a, -1 b from dual
        union all select -1 a, 0 b from dual
        union all select 0 a, 0 b from dual
        union all select 1E-41 a, -2E-41 b from dual
)
,sqrt_line as (
      select a,b,v,x
      from 
      (select a,b,v,x,row_number() over(partition by a,b order by i desc) rn
       from (
                select a,b,i,v,x
                from (select a,b,(a-b)*(a-b) v from t)
                model return updated rows
                     partition by (a,b)
                     dimension by (0 i)
                     measures(v x, v)
                     rules iterate(4000000) until(abs(x[iteration_number]-x[iteration_number-1])<1e-50) (
                         x[iteration_number] = case when cv(i)=0 then v[0]
                                                    when x[cv(i)-1]=0 then x[cv(i)-1]
                                                    else ( x[cv(i)-1] +  v[0] / x[cv(i)-1] )/2
                                               end,
                         v[iteration_number] = v[0]
                     )
            ) tt
      )
      where rn=1
)
select a,b,(a+b)/2+x/2,greatest(a,b)
from sqrt_line
21 мар 11, 12:10    [10401360]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
samatom
Это невозможно, доказано местными алхимиками =)

То что там доказано и так очевидно, и это никак не связано с наличием решения для number.
21 мар 11, 12:57    [10401817]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
samatom
Глупый телевизор
То есть если перевести выражение на ассемблер - то чтоб не было команды cmp
вполне возможно, что вместо CMP там что-нить вроде XOR, а потом JZ
:)
21 мар 11, 13:35    [10402184]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
Глупый Телевизор
Member

Откуда: телевизор больше не смотреть (с)
Сообщений: 679
_Nikotin
но думаю идея понятна
А можно ссылочку не теоретическую часть?
Новичок в оракуле
а где про это почитать можно ?
По-моему Вы новичек не только в Оракле а в компьютерах воообще. Изучайте способы хранения чисел в памяти ЭВМ.
ORA__SQL
select a,
         b,
         greatest(a,b) c,
         a*(TRUNC((a-b)/POWER(2,64)+1,0))+b*(TRUNC((b-a)/POWER(2,64)+1,0))
         -a*(TRUNC((a-b)/POWER(2,64)+1,0)*(TRUNC((b-a)/POWER(2,64)+1,0))) my_greatest
from
...
Если б Вы внимательнее посмотрели на мое решение, то заметили бы, что:
SELECT a, b, greatest(a,b) c
,      ((a+b)-(a-b)*(1-2*((1+(a-b)/((a-b)*(a-b)+1))-mod((1+(a-b)/((a-b)*(a-b)+1)),1))))/2 x2
,      ((a+b)-(a-b)*(1-2*trunc(1+(a-b)/((a-b)*(a-b)+1))))/2 xx2
,      ((a+b)-(a-b)*(1-2*floor(1+(a-b)/((a-b)*(a-b)+1))))/2 xxx2            
FROM
...
Являются по сути одним и тем же. Только если внимательнее читать условие можно заметить, что упоминается несколько иная функция:
Глупый телевизор
С помощью операторов +,-,*,/ и функции mod найти максимальное. Кто найдет без функции мод - вообще гениальный парень.
Если же так тяжело прочесть условие, почему бы Вам уже не преподнести как откровение такое выражение:
(a+b+abs(a-b))/2 super_puper
которое работает и для "SELECT 1E-41 a, 2E-41 b FROM dual".
xtender
повысил точность для таких чисел
case when
Раз уж Вы себя позиционируете в своем блоге как любителя сложных задач, то необходимо быть хоть немного вниматльнее.
Во-первых это ни разу не выражение.
Во-вторых специально для Вас усовершенствование:
case when a>b then a else b end super_puper2
21 мар 11, 14:43    [10402839]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
Глупый Телевизор
Member

Откуда: телевизор больше не смотреть (с)
Сообщений: 679
samatom
Хотел посмотреть, как работает эта команда, но не нашел. Может есть у кого инфа? Возможно, это ещё один ключ к решению задачи - а-ля реверс-инжиниринг.
А где смотрели? Инфа есть: Ассемблер для начинающих.
Глупый Телевизор
Во-первых это ни разу не выражение.
Под "это" понимается не case, а именно ваше "решение".
21 мар 11, 14:48    [10402887]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
Глупый Телевизор
_Nikotin
но думаю идея понятна
А можно ссылочку не теоретическую часть?

Я просто взял первую попавшуюся последовательность многочленов сходящуюся к ступеньке:
f_0(x) = 1-x*N;
f_i(x) = f_0(f_{i-1}(x)), i>0;
Ступенька будет возникать в районе корня уравнения x = 1 - x^N, для N = 2 это sqrt((3-sqrt(5))/2). Задачка по мат.анализу для первого курса.
Можно улучшить решение заменив I0 на
I0  as (select a, b, ((a-b)/(1+(a-b)*(a-b))) + 0.6180339887498948482045868343656381177205 x from D)
И добавив итераций.
21 мар 11, 15:08    [10403085]     Ответить | Цитировать Сообщить модератору
 Re: Пятничная задчка - для настоящих математиков!  [new]
samatom
Member

Откуда: Москва
Сообщений: 367
Глупый Телевизор
samatom
Хотел посмотреть, как работает эта команда, но не нашел. Может есть у кого инфа? Возможно, это ещё один ключ к решению задачи - а-ля реверс-инжиниринг.
А где смотрели? Инфа есть: Ассемблер для начинающих.

Про то, что, цитирую, "Команда CMP производит практически те же действия, что и команда SUB, только она не записывает результат вычитания на место первого операнда, а просто устанавливает флаги" - нашел, но на каким макаром эта команда определяет какое из чисел больше/меньше или равны друг-другу - об этом упоминаний не нашел.
21 мар 11, 16:13    [10403695]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Oracle Ответить