gifts2017

Математическая изюминка

Опубликовал анд гру (agrustny) в раздел Программирование - Практика программирования

На суд публики предлагается математическая изюминка: обработка с обычным (не СКД) запросом, извлекающим корни нужной степени с относительной точностью в 6 разрядов.

Мотивы использования в запросах несколько более сложных числовых функций, чем +-/*, могут быть разными. Такое, хотя и редко, но бывает нужно, и в светлых головах исследователей 1С, не обладающей подобными возможностями, родилось решение для извлечения в запросе квадратного корня: http://infostart.ru/public/204916/. Это решение обладает определенными ограничениями по диапазону входных данных, выходной точности, ну и самое главное - умеет извлекать только квадратный корень. А если уж он Вам понадобился, то может пригодиться и кубический, и что же теперь, всю "арифметику" заново переписывать?

Нет уж, лучше вспомнить про алгебру и начала анализа и реализовать более совершенный алгоритм, не без использования, конечно, динамического принципа формирования текста запроса. Все уложилось на 65 строчках, из которых половина - вспомогательно-интерфейсные. Считать умеет с относительной погрешностью 1/1000000, что обусловлено ограничением со стороны арифметики СУБД в 9 разрядов после запятой (по крайней мере, в моей скромной файловой версии 1С 8.2.) Ограничения на диапазон происходят оттуда же: если Вы решите использовать данный запрос/обработку для возведения в 15 (или -15, почему нет!) степень, числа больше 10 не подойдут - соответствующие поля будут заполнены NULLнулями чтобы предотвратить ошибку исполнения запроса.

Ну что, хоть немножко заинтриговались? Тогда прошу оценить мой скромный труд, буду рад полезным комментариям!

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Математическая изюминка: корень любой степени в запросе
.epf 8,35Kb
17.04.14
11
.epf 1.0 8,35Kb 11 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Денис Яковлев (iceflash) 18.04.14 19:02
А написать в статье о методике/алгоритме "жадность" не позволяет? ;)
2. анд гру (agrustny) 19.04.14 01:52
(1) iceflash, ну Вы страшно торопите события. Маркетинг же ведь ;).
Не, парни, а что, кому-то действительно интересно, как оно работает?
3. анд гру (agrustny) 19.04.14 01:55
4. анд гру (agrustny) 19.04.14 03:41
Поскольку Boxing iceflash припер меня к канатам и обещал нокаутировать, я страшно испугался и вынужден сообщить некоторые наводящие соображения.
Факты
1) x^m=1/(1/x)^m (детсад)
2) (1+y)^m=exp(m*ln(1+y))=1+m*y+... (школа)
3) ln(1+y) имеет бесконечнократную точку ветвления при y=-1 (универ)
4) Горилла в супермаркете! Лев в пустыне (клиника)
(http://infostart.ru/public/262300/ - профессор Эльдорадович!)
5) Ура, 1С 8.2. поддерживает УФ пакетные запросы (желтая пресса)
Следствия
1) Можно рассматривать только 2^0=1<x<2^64
(кстати, 2^64 - это больше, чем госдолг США согласно примечанию2 к статье http://infostart.ru/public/204916/ и бюджет раджи согласно притче о шахматах)
2) Для 1<x<2^{1/64}=1.01 получить точный результат можно, взяв 3-4 первых члена ряда.
3) Для x>2 ряд расходится, поэтому ничего не получится, даже с 10^8 членами ряда, черт побери (((
(на самом деле, вариант неплохой, бывает что радиус сходимости нулевой, тогда только Паде-Борель...)
4) Лёва-лёва, где твоя улыбка, полная задора и огня?
Короче, если 2^32<x<2^64, решаем задачу для x1=2^{-32}x, учтя, что x^m=(2^{32}*x1)^m=2^{32*m}*x1^m, иначе x1=x
Если 2^16<x1<2^32, вводим x2=2^{-16}x1, а x1^m=(2^{16}*x2)^m=2^{16*m}*x2^m, иначе x2=x1
Звер считается пойманным на 12 шаге, при 2^{1/64}.
Иначе говоря, время извлечения корня - ln(ln($100500$)), но поскольку доступа к мантиссе и порядку у нас нет, получается не 8, а 12, и не с машинной точностью, а похуже. На самом деле, извлечение корня и на уровне ЦРУ ЦП - достаточно затратная операция, и это иногда учитывается при выборе алгоритмов разложения матриц.
5) Всю эту клинику можно реализовать в желтом конфигураторе, и легко. Основную часть текста запроса формируем в цикле "Для Ы=1 По 12 Цикл", переведя Если из п.4 в КАДА-ТАДА и скидывая данные по цепочке временных таблиц Табл0->Табл1->Табл2->...->Табл12. Но! Откуда ж возьмутся в запросе 2^32 и тем более 2^{32*m} из п.4? Это будут параметры, дорогие товарищи, ведь никто не запрещал использовать функцию Pow до запуска запроса, не правда ли? Ну а если вдруг придут фашисты ее отменят - уйдем в лес напишем ее сами по образу и подобию крепкого орешка математической изюминки.

Очнувшись, дон Кихот видит врагов числом более двух сотен, которым они с Санчо противостоят вдвоем. Однако трусливый слуга убегает, а рыцарь вызывает разбойников на бой именем Дульсинеи. В одно мгновение он повержен и связан. Разбойники бьют его и по приказу главаря разжигают костер, вокруг которого затевают пляску. Дон Кихот не отвечает на их насмешки и угрозы сжечь или повесить его. Он обращается к Творцу с мольбой принять его душу. Главарь разбойников взволнован и просит дон Кихота рассказать о себе. Тот видит долг странствующего рыцаря в защите слабых, борьбе со злом. Разорвав путы, он требует вернуть колье обожаемой дамы. Разбойники тронуты, главарь, сняв шляпу и встав на колени, вручает колье дон Кихоту. Рыцарь благословляет разбойников.

топ-топ-топ
DAnry; AlexSunS; Pavl0; +3 Ответить
5. анд гру (agrustny) 19.04.14 03:57
Все плохо есть нечего Что за фигня с "меньше"? СП читать?
-----------------------------------------------------------------------
Поскольку Boxing iceflash припер меня к канатам и обещал нокаутировать, я страшно испугался и вынужден сообщить некоторые наводящие соображения.
Факты
1) x^m=1/(1/x)^m (детсад)
2) (1+y)^m=exp(m*ln(1+y))=1+m*y+... (школа)
3) ln(1+y) имеет бесконечнократную точку ветвления при y=-1 (универ)
4) Горилла в супермаркете! Лев в пустыне (клиника)
(http://infostart.ru/public/262300/ - профессор Эльдорадович!)
5) Ура, 1С 8.2. поддерживает УФ пакетные запросы (желтая пресса)
Следствия
1) Можно рассматривать только
2^0=1<x<2^64

(кстати, 2^64 - это больше, чем госдолг США согласно примечанию2 к статье http://infostart.ru/public/204916/ и бюджет раджи согласно притче о шахматах)
2) Для
1<x<2^{1/64}=1.01
получить точный результат можно, взяв 3-4 первых члена ряда.
3) Для
x>2
ряд расходится, поэтому ничего не получится, даже с 10^8 членами ряда, черт побери (((
(на самом деле, вариант неплохой, бывает что радиус сходимости нулевой, тогда только Паде-Борель...)
4) Лёва-лёва, где твоя улыбка, полная задора и огня?
Короче, если
2^32<x<2^64
, решаем задачу для x1=2^{-32}x, учтя, что x^m=(2^{32}*x1)^m=2^{32*m}*x1^m, иначе x1=x
Если
2^16<x1<2^32
, вводим x2=2^{-16}x1, а x1^m=(2^{16}*x2)^m=2^{16*m}*x2^m, иначе x2=x1
Звер считается пойманным на 12 шаге, при 2^{1/64}.
Иначе говоря, время извлечения корня - ln(ln($100500$)), но поскольку доступа к мантиссе и порядку у нас нет, получается не 8, а 12, и не с машинной точностью, а похуже. На самом деле, извлечение корня и на уровне ЦРУ ЦП - достаточно затратная операция, и это иногда учитывается при выборе алгоритмов разложения матриц.
5) Всю эту клинику можно реализовать в желтом конфигураторе, и легко. Основную часть текста запроса формируем в цикле "Для Ы=1 По 12 Цикл", переведя Если из п.4 в КАДА-ТАДА и скидывая данные по цепочке временных таблиц Табл0->Табл1->Табл2->...->Табл12. Но! Откуда ж возьмутся в запросе 2^32 и тем более 2^{32*m} из п.4? Это будут параметры, дорогие товарищи, ведь никто не запрещал использовать функцию Pow до запуска запроса, не правда ли? Ну а если вдруг придут фашисты ее отменят - уйдем в лес напишем ее сами по образу и подобию крепкого орешка математической изюминки.

Очнувшись, дон Кихот видит врагов числом более двух сотен, которым они с Санчо противостоят вдвоем. Однако трусливый слуга убегает, а рыцарь вызывает разбойников на бой именем Дульсинеи. В одно мгновение он повержен и связан. Разбойники бьют его и по приказу главаря разжигают костер, вокруг которого затевают пляску. Дон Кихот не отвечает на их насмешки и угрозы сжечь или повесить его. Он обращается к Творцу с мольбой принять его душу. Главарь разбойников взволнован и просит дон Кихота рассказать о себе. Тот видит долг странствующего рыцаря в защите слабых, борьбе со злом. Разорвав путы, он требует вернуть колье обожаемой дамы. Разбойники тронуты, главарь, сняв шляпу и встав на колени, вручает колье дон Кихоту. Рыцарь благословляет разбойников.

топ-топ-топ
7. анд гру (agrustny) 19.04.14 04:06
Поскольку Boxing iceflash припер меня к канатам и обещал нокаутировать, я страшно испугался и вынужден сообщить некоторые наводящие соображения.
Факты
1) x^m=1/(1/x)^m (детсад)
2) (1+y)^m=exp(m*ln(1+y))=1+m*y+... (школа)
3) ln(1+y) имеет бесконечнократную точку ветвления при y=-1 (универ)
4) Горилла в супермаркете! Лев в пустыне (клиника)
(http://infostart.ru/public/262300/ - профессор Эльдорадович!)
5) Ура, 1С 8.2. поддерживает УФ пакетные запросы (желтая пресса)
Следствия
1) Можно рассматривать только 2^0=1<x<2^64
(кстати, 2^64 - это больше, чем госдолг США согласно примечанию2 к статье http://infostart.ru/public/204916/ и бюджет раджи согласно притче о шахматах)
2) Для 1<x<2^{1/64}=1.01 получить точный результат можно, взяв 3-4 первых члена ряда.
3) Для x>2 ряд расходится, поэтому ничего не получится, даже с 10^8 членами ряда, черт побери (((
(на самом деле, вариант неплохой, бывает что радиус сходимости нулевой, тогда только Паде-Борель...)
4) Лёва-лёва, где твоя улыбка, полная задора и огня?
Короче, если 2^32<x<2^64, решаем задачу для x1=2^{-32}x, учтя, что x^m=(2^{32}*x1)^m=2^{32*m}*x1^m, иначе x1=x
Если 2^16<x1<2^32, вводим x2=2^{-16}x1, а x1^m=(2^{16}*x2)^m=2^{16*m}*x2^m, иначе x2=x1
Звер считается пойманным на 12 шаге, при 2^{1/64}.
Иначе говоря, время извлечения корня - ln(ln($100500$)), но поскольку доступа к мантиссе и порядку у нас нет, получается не 8, а 12, и не с машинной точностью, а похуже. На самом деле, извлечение корня и на уровне ЦРУ ЦП - достаточно затратная операция, и это иногда учитывается при выборе алгоритмов разложения матриц.
5) Всю эту клинику можно реализовать в желтом конфигураторе, и легко. Основную часть текста запроса формируем в цикле "Для Ы=1 По 12 Цикл", переведя Если из п.4 в КАДА-ТАДА и скидывая данные по цепочке временных таблиц Табл0->Табл1->Табл2->...->Табл12. Но! Откуда ж возьмутся в запросе 2^32 и тем более 2^{32*m} из п.4? Это будут параметры, дорогие товарищи, ведь никто не запрещал использовать функцию Pow до запуска запроса, не правда ли? Ну а если вдруг придут фашисты ее отменят - уйдем в лес напишем ее сами по образу и подобию крепкого орешка математической изюминки.

Очнувшись, дон Кихот видит врагов числом более двух сотен, которым они с Санчо противостоят вдвоем. Однако трусливый слуга убегает, а рыцарь вызывает разбойников на бой именем Дульсинеи. В одно мгновение он повержен и связан. Разбойники бьют его и по приказу главаря разжигают костер, вокруг которого затевают пляску. Дон Кихот не отвечает на их насмешки и угрозы сжечь или повесить его. Он обращается к Творцу с мольбой принять его душу. Главарь разбойников взволнован и просит дон Кихота рассказать о себе. Тот видит долг странствующего рыцаря в защите слабых, борьбе со злом. Разорвав путы, он требует вернуть колье обожаемой дамы. Разбойники тронуты, главарь, сняв шляпу и встав на колени, вручает колье дон Кихоту. Рыцарь благословляет разбойников.

топ-топ-топ
8. анд гру (agrustny) 19.04.14 04:08
Нельзя так издеваться над старым больным человеком!
9. Андрей Овсянкин (Evil Beaver) 24.04.14 12:42
Я что-то не понял, или agrustny разговаривает сам с собой? А где комментарии остальных? Инфостарт глючит чтоле...
10. анд гру (agrustny) 24.04.14 15:14
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа