IE 2016

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

Опубликовал гру анд (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 Скачать

См. также

Лучшие комментарии

4. agrustny 19.04.2014 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 до запуска запроса, не правда ли? Ну а если вдруг придут фашисты ее отменят - уйдем в лес напишем ее сами по образу и подобию крепкого орешка математической изюминки.

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

топ-топ-топ
+ 3 [ DAnry; AlexSunS; Pavl0; ]
# Ответить

Комментарии

1. Яковлев Денис (iceflash) 18.04.2014 19:02
А написать в статье о методике/алгоритме "жадность" не позволяет? ;)
Ответили: (2)
# Ответить
2. гру анд (agrustny) 19.04.2014 01:52
(1) iceflash, ну Вы страшно торопите события. Маркетинг же ведь ;).
Не, парни, а что, кому-то действительно интересно, как оно работает?
# Ответить
3. гру анд (agrustny) 19.04.2014 01:55
Почем, значит, сейчас фунт изюма?
http://infostart.ru/profile/purse/stockexchange/
# Ответить
4. гру анд (agrustny) 19.04.2014 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 до запуска запроса, не правда ли? Ну а если вдруг придут фашисты ее отменят - уйдем в лес напишем ее сами по образу и подобию крепкого орешка математической изюминки.

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

топ-топ-топ
+ 3 [ DAnry; AlexSunS; Pavl0; ]
# Ответить
5. гру анд (agrustny) 19.04.2014 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.2014 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.2014 04:08
Нельзя так издеваться над старым больным человеком!
# Ответить
9. Овсянкин Андрей (Evil Beaver) 24.04.2014 12:42
Я что-то не понял, или agrustny разговаривает сам с собой? А где комментарии остальных? Инфостарт глючит чтоле...
Ответили: (10)
# Ответить
10. гру анд (agrustny) 24.04.2014 15:14
(9) я интроверт)))
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл