Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Николай Коперник
Guest
Всем привет.

Терзаясь смутными сомнениями, решил проверить сабж, т.е. что именно вернёт MS SQL (2005 Express) в качестве результата 2^62.
Точное значение этого числа равно (2^31)^2 = 2147483648 * 2147483648 = 4611686018427387904
А в студии последняя циферка меняется почему-то на 0:
select cast(power(2.,62) as numeric(38)),cast(power(2.,62) as bigint)
возвращает:
exp_aexp_a
46116860184273879004611686018427387900


Что я делаю неверно ?
Microsoft SQL Server 2005 - 9.00.3077.00 (Intel X86) Dec 17 2008 15:19:45 Copyright (c) 1988-2005 Microsoft Corporation Express Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
2 июн 09, 20:47    [7258140]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36807
2. - это флоат. А флоат - число неточное по определению
2 июн 09, 20:50    [7258146]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Николай Коперник
Guest
В догонку к предыдущему письму: киньте, плз, тынц на нормальный онлайн-калькулятор, где можно в ДЛИННОЕ текстовое поле записать арифм. выражение и чтобы он его подсчитал. Выражение может содержать только обычные арифм д-вия + возведение в степень и взятие остатка (mod). Но числа в нём могут быть весьма большими (до 10^20)
2 июн 09, 20:52    [7258149]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Николай Коперник
Guest
автор
А флоат - число неточное по определению
да, я это знаю; но как заставить всё-таки выводить ТОЧНОЕ значение, если оно в пределах BIGINT'a ?
2 июн 09, 20:53    [7258152]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36807
select power(cast(2 as bigint),62)
2 июн 09, 20:54    [7258154]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Николай Коперник
Guest
Спасибо!
2 июн 09, 20:56    [7258164]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> 2. - это флоат. А флоат - число неточное по определению

эээ, как это, float? - numeric должен быть.
select sql_variant_property(2., 'BaseType')

float выглядел бы так: 2.E0

Posted via ActualForum NNTP Server 1.4

2 июн 09, 21:45    [7258266]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

другое дело, что это power входное значение
к float приводит, а потом обратно к исходному типу.

Posted via ActualForum NNTP Server 1.4

2 июн 09, 22:04    [7258302]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> другое дело, что это power входное значение
> к float приводит, а потом обратно к исходному типу.

вот тут-то и получаем фокус:
select cast(cast(cast(4611686018427387904 as bigint) as float) as bigint)
        , cast(cast(cast(4611686018427387904 as numeric(38, 0)) as float) as numeric(38, 0))


зы: прошу прощения, что не одним постом излагаю - так уж получилось.

Posted via ActualForum NNTP Server 1.4

2 июн 09, 22:10    [7258315]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Николай Коперник
Guest
А что в SS подразумевается под NUMERIC ? Почему вот это вот:
select pow_bigint=power(cast(2 as bigint),62), pow_num38=power(cast(2 as numeric(38,0)),62)
приводит вот к этому вот:
pow_bigintpow_num38
46116860184273879044611686018427387900
3 июн 09, 17:54    [7262148]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> А что в SS подразумевается под NUMERIC ?

не понял - что вы имеете в виду?
про тип данных numeric можно в справке прочитать:
http://msdn.microsoft.com/ru-ru/library/ms187746.aspx

Posted via ActualForum NNTP Server 1.4

3 июн 09, 18:10    [7262241]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
cguest
Guest
А к чему приводит вот это:

select cast(cast(cast(461168601842738[b][color=red]7[/color][/b]704 as bigint) as float) as bigint)
        , cast(cast(cast(4611686018427387[b][color=red]7[/color][/b]04 as bigint) as float) as numeric(38, 0))
3 июн 09, 18:13    [7262260]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
cguest
Guest
Пардон, глюки с тегами

Может быть так понятнее:


select cast(cast(cast(4611686018427387704 as bigint) as float) as bigint)
, cast(cast(cast(4611686018427387704 as bigint) as float) as numeric(38, 0))
3 июн 09, 18:19    [7262292]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> А к чему приводит вот это:
>
> select cast(cast(cast(*461168601842738**7**704* as bigint) as float) as bigint)
> , cast(cast(cast(*4611686018427387**7**04* as bigint) as float) as numeric(*38*, *0*))

4611686018427387904 4611686018427387900

и? ну да - исходный тип не при чем, дело в самой функции power,
которая с float-ом работает.

Posted via ActualForum NNTP Server 1.4

3 июн 09, 18:34    [7262341]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Николай Коперник
Guest
автор
select cast(cast(cast(4611686018427387704 as bigint) as float) as bigint)
, cast(cast(cast(4611686018427387704 as bigint) as float) as numeric(38, 0))
у меня это привело к:
(No column name)(No column name)
46116860184273879044611686018427387900


daw
про тип данных numeric можно в справке прочитать
Читал. Но так и не понял, почему при возведении целого (bigint) числа 2 в степень 62 получается враньё в последней циферке. Потому и продолжил тему топика :-)
3 июн 09, 18:36    [7262347]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Николай Коперник
Guest
daw
дело в самой функции power
ёлки зелёные... что ж теперь, power'ом не пользоваться для случая, когда речь идёт о больших числах ?
3 июн 09, 18:38    [7262349]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> ёлки зелёные... что ж теперь, power'ом не пользоваться для случая, когда
> речь идёт о больших числах ?

типа того, если подобные "особенности" вас не устраивают.

Posted via ActualForum NNTP Server 1.4

3 июн 09, 18:47    [7262386]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Николай Коперник
Guest
автор
типа того, если подобные "особенности" вас не устраивают.
я ф шоке! а чем в степень-то возводить, например в 62-ю ? самоё на себя 62раз выписывать ?!
3 июн 09, 18:49    [7262391]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> я ф шоке! а чем в степень-то возводить, например в 62-ю ? самоё на себя
> 62раз выписывать ?!

всегда можно свою функцию нарисовать, если уж так надо.
в документации они прописали, что power принимает в качестве
параметра float_expression. сомневаюсь, что кто-то это менять будет.

Posted via ActualForum NNTP Server 1.4

3 июн 09, 18:56    [7262403]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Николай Коперник
Guest
[quote dawpower принимает в качестве параметра float_expression[/quote]я понял бы такое поведение флоата, если бы основанием было не 2, а другое число, которое нельзя ТОЧНО представить как два. Но у меня в примере основанием является СТРОГО двойка, т.е. в бинарном виде это число представляется БЕЗ потери точности, в какой бы флоатом или дабл его дальше не переводили.

Назревает вопрос, который давно хотел спросить, да всё как-то стеснялся :-) Где можно посмотреть ВНУТРЕННЮЮ реализацию функций SS ? если это великая тайна, то хотя бы прочитать подробно, что именно делается внутри, скажем, пресловутой power ? ведь он возводит в степень не только целые числа (и показатель тоже м.б. флоатом) - значит, юзает при этом какие-нибудь ряды Фурье (ЕМНИП) или что-то еще ?
3 июн 09, 19:19    [7262467]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36807
Николай Коперник
Назревает вопрос, который давно хотел спросить, да всё как-то стеснялся :-) Где можно посмотреть ВНУТРЕННЮЮ реализацию функций SS ? если это великая тайна, то хотя бы прочитать подробно, что именно делается внутри, скажем, пресловутой power ? ведь он возводит в степень не только целые числа (и показатель тоже м.б. флоатом) - значит, юзает при этом какие-нибудь ряды Фурье (ЕМНИП) или что-то еще ?
Дизассемблером.
3 июн 09, 19:44    [7262535]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Николай Коперник
Guest
автор
Дизассемблером
Это если знаешь asm (и то, здоровье надорвёшь). Неужели нутряное устройство штатных функций (особенно математических) есть величайший секрет ?
3 июн 09, 19:49    [7262545]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Николай Коперник
Но у меня в примере основанием является СТРОГО двойка, т.е. в бинарном виде это число представляется БЕЗ потери точности, в какой бы флоатом или дабл его дальше не переводили.
Вообще-то, после преобразования во FLOAT (внутри POWER) Ваша двойка уже не будет представлена "без потери точности"!
Она будет представлена в формате, описанном в стандарте IEEE-754.
Можете самостоятельно его изучить без проблем!
Тут как-то прикольная ссылка по этому поводу проскакивала
Может, паранойя, а может, нет!
3 июн 09, 20:00    [7262570]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
Николай Коперник
Guest
daw
Тут как-то прикольная ссылка по этому поводу проскакивала
там слишком много буков написано, к тому же сатану вспоминают несколько раз - аж страшно стало...
Вы мне скажите просто: что, число 2 после преобразования во флоат уже НЕ равно "00000...10b" - ?
3 июн 09, 20:25    [7262626]     Ответить | Цитировать Сообщить модератору
 Re: Почему SS XE 2005 возвращает 2^62 "немного неточно" ? :-)  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Николай Коперник
daw
Тут как-то прикольная ссылка по этому поводу проскакивала
там слишком много буков написано, к тому же сатану вспоминают несколько раз - аж страшно стало...
Вы мне скажите просто: что, число 2 после преобразования во флоат уже НЕ равно "00000...10b" - ?
Чего-то Вы меня неправильно называть начали...
Я думаю, что 2 продолжает-таки быть двойкой, но в вычислениях считается, что она равна двум лишь в некотором приближении.
Причем погрешность на каждом шаге вычислений может накапливаться.
Как только результат вычисления перестаёт помещаться в мантиссу, он без сомнения начинает быть неточным.
Но может, я не всё тут понимаю, и потеря точности начинается ещё раньше?
3 июн 09, 20:38    [7262654]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить