Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Игра с числами  [new]
BagaBaga
Member

Откуда: прекрасное далеко
Сообщений: 667
Что у вас выдаст

select power(10,log10(50)) from t

?
Как это подправить, чтобы выдавало 50 (в общем случае - как повысить точность)?
7 ноя 13, 23:35    [15094515]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
o-o
Guest
BagaBaga,
select power(10.0,log10(50.0))
------------------------------
50.0
7 ноя 13, 23:37    [15094527]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
BagaBaga
Member

Откуда: прекрасное далеко
Сообщений: 667
Картинка с другого сайта.
7 ноя 13, 23:44    [15094566]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
BagaBaga
Member

Откуда: прекрасное далеко
Сообщений: 667
почему-то картинка не показалась

http://www.tiikoni.com/tis/view/image.php?id=b47af63
7 ноя 13, 23:46    [15094570]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
Dmitry Gurianov
Member

Откуда:
Сообщений: 651
и у меня 49

BagaBaga
Как это подправить, чтобы выдавало 50?


select power(10.0,log10(50.0))

не знаю, чисто эмпирически...
7 ноя 13, 23:52    [15094587]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
Dmitry Gurianov
Member

Откуда:
Сообщений: 651
я не тормоз(
7 ноя 13, 23:54    [15094592]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
BagaBaga
Member

Откуда: прекрасное далеко
Сообщений: 667
Проблема в том, что там может быть и не 50 (а что угодно в поле)... 50 просто иллюстрирует проблему :(
8 ноя 13, 00:09    [15094668]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
Dmitry Gurianov
Member

Откуда:
Сообщений: 651
BagaBaga
Проблема в том, что там может быть и не 50 (а что угодно в поле)... 50 просто иллюстрирует проблему :(


ну дык приведите к числам с плавающей точкой
8 ноя 13, 00:12    [15094679]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
BagaBaga
Member

Откуда: прекрасное далеко
Сообщений: 667
Ок. Есть столбец чисел. Приведу его, например, к NUMERIC(38,16). Затем попробую получить последовательное произведение всех этих чисел. Для это можно взять логарифм этих чисел, к полученным значениям применить SUM() OVER() и потом возвести основание логарифма в полученное число. Так вот, получается нехилая такая погрешность (вариант просто рекурсивно последовательно перемножить - не предлагать. Для решаемой задачи он не подходит, хотя и подходит для приведённого здесь упрощения), т.е. оказывается A*B <> 10**(log10(A) + log10(B)) из-за округлений... Причем ошибка попадае в первый-второй знак после запятой.
8 ноя 13, 00:22    [15094703]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
Престарелый заяц
Guest
Да ну ладно. Все там подходит.
8 ноя 13, 00:26    [15094714]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
Dmitry Gurianov
Member

Откуда:
Сообщений: 651
а зачем эта игра с логарифмами (сорри, если туплю - не спал)?
8 ноя 13, 00:29    [15094734]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
Престарелый заяц
Guest
Потому что видимо у СКЛя нет агрегата произведение но есть агрегат сумма.
8 ноя 13, 00:31    [15094736]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
Dmitry Gurianov
Member

Откуда:
Сообщений: 651
Раз пошла такая пьянка, режь последний CTE.

Наковырялось тут...

CREATE TABLE Foo(Id int, Val int)
INSERT INTO Foo VALUES(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)

;WITH cte AS 
(
    SELECT Id, Val AS Multiply, row_number() over (order by Id) as rn
    FROM Foo
    WHERE Id=1
    UNION ALL
    SELECT ff.Id, cte.multiply*ff.Val as multiply, ff.rn FROM
	(SELECT f.Id, f.Val, (row_number() over (order by f.Id)) as rn
    FROM Foo f) ff
        INNER JOIN cte
        ON ff.rn -1= cte.rn
)
SELECT * FROM cte
8 ноя 13, 01:00    [15094818]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
o-o
Guest
BagaBaga
Проблема в том, что там может быть и не 50 (а что угодно в поле)... 50 просто иллюстрирует проблему :(

домножьте это "все что угодно" на 1.0

Dmitry Gurianov
а зачем эта игра с логарифмами (сорри, если туплю - не спал)?

судя по картинке, это упражнения с sql-ex.ru (может уже название поменялось).
каждая задачка "тыкает носом" в какие-то грабли.
может, на этот раз грабли называются "точность"?

select SQL_VARIANT_PROPERTY(power(10.0,log10(50)), 'precision'),
       SQL_VARIANT_PROPERTY(power(10,log10(50)), 'precision')
-------------------------------------------------------------
38	10
8 ноя 13, 02:41    [15094923]     Ответить | Цитировать Сообщить модератору
 Re: Игра с числами  [new]
BagaBaga
Member

Откуда: прекрасное далеко
Сообщений: 667
o-o,
это "аналог" задачки от sql-ex. Оригинал-то ни-ни :)

В исходной задаче пара граблей: потеря точности (накопление ошибки вследсвие округлейний); переполнение. Собственно, из-за второй причины решение рукурсией "в лоб" и не годится.
8 ноя 13, 19:56    [15099704]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить