На суд публики предлагается математическая изюминка: обработка с обычным (не СКД) запросом, извлекающим корни нужной степени с относительной точностью в 6 разрядов.
Скачать файл
ВНИМАНИЕ:
Файлы из Базы знаний - это исходный код разработки.
Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы.
Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных.
Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Мотивы использования в запросах несколько более сложных числовых функций, чем +-/*, могут быть разными. Такое, хотя и редко, но бывает нужно, и в светлых головах исследователей 1С, не обладающей подобными возможностями, родилось решение для извлечения в запросе квадратного корня: //infostart.ru/public/204916/. Это решение обладает определенными ограничениями по диапазону входных данных, выходной точности, ну и самое главное - умеет извлекать только квадратный корень. А если уж он Вам понадобился, то может пригодиться и кубический, и что же теперь, всю "арифметику" заново переписывать?
Нет уж, лучше вспомнить про алгебру и начала анализа и реализовать более совершенный алгоритм, не без использования, конечно, динамического принципа формирования текста запроса. Все уложилось на 65 строчках, из которых половина - вспомогательно-интерфейсные. Считать умеет с относительной погрешностью 1/1000000, что обусловлено ограничением со стороны арифметики СУБД в 9 разрядов после запятой (по крайней мере, в моей скромной файловой версии 1С 8.2.) Ограничения на диапазон происходят оттуда же: если Вы решите использовать данный запрос/обработку для возведения в 15 (или -15, почему нет!) степень, числа больше 10 не подойдут - соответствующие поля будут заполнены NULLнулями чтобы предотвратить ошибку исполнения запроса.
Ну что, хоть немножко заинтриговались? Тогда прошу оценить мой скромный труд, буду рад полезным комментариям!
На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL.
Я же покажу как можно сократить объем данных в 49.9 раз при этом:
1. Сохранить значения локальных экстремумов
2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.
Что ж... лучше поздно, чем никогда.
Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.
В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.
Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса
Поскольку 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 до запуска запроса, не правда ли? Ну а если вдруг придут фашисты ее отменят - уйдем в лес напишем ее сами по образу и подобию крепкого орешка математической изюминки.
Очнувшись, дон Кихот видит врагов числом более двух сотен, которым они с Санчо противостоят вдвоем. Однако трусливый слуга убегает, а рыцарь вызывает разбойников на бой именем Дульсинеи. В одно мгновение он повержен и связан. Разбойники бьют его и по приказу главаря разжигают костер, вокруг которого затевают пляску. Дон Кихот не отвечает на их насмешки и угрозы сжечь или повесить его. Он обращается к Творцу с мольбой принять его душу. Главарь разбойников взволнован и просит дон Кихота рассказать о себе. Тот видит долг странствующего рыцаря в защите слабых, борьбе со злом. Разорвав путы, он требует вернуть колье обожаемой дамы. Разбойники тронуты, главарь, сняв шляпу и встав на колени, вручает колье дон Кихоту. Рыцарь благословляет разбойников.
Все плохо есть нечего Что за фигня с "меньше"? СП читать?
-----------------------------------------------------------------------
Поскольку 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 до запуска запроса, не правда ли? Ну а если вдруг придут фашисты ее отменят - уйдем в лес напишем ее сами по образу и подобию крепкого орешка математической изюминки.
Очнувшись, дон Кихот видит врагов числом более двух сотен, которым они с Санчо противостоят вдвоем. Однако трусливый слуга убегает, а рыцарь вызывает разбойников на бой именем Дульсинеи. В одно мгновение он повержен и связан. Разбойники бьют его и по приказу главаря разжигают костер, вокруг которого затевают пляску. Дон Кихот не отвечает на их насмешки и угрозы сжечь или повесить его. Он обращается к Творцу с мольбой принять его душу. Главарь разбойников взволнован и просит дон Кихота рассказать о себе. Тот видит долг странствующего рыцаря в защите слабых, борьбе со злом. Разорвав путы, он требует вернуть колье обожаемой дамы. Разбойники тронуты, главарь, сняв шляпу и встав на колени, вручает колье дон Кихоту. Рыцарь благословляет разбойников.
Поскольку 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 до запуска запроса, не правда ли? Ну а если вдруг придут фашисты ее отменят - уйдем в лес напишем ее сами по образу и подобию крепкого орешка математической изюминки.
Очнувшись, дон Кихот видит врагов числом более двух сотен, которым они с Санчо противостоят вдвоем. Однако трусливый слуга убегает, а рыцарь вызывает разбойников на бой именем Дульсинеи. В одно мгновение он повержен и связан. Разбойники бьют его и по приказу главаря разжигают костер, вокруг которого затевают пляску. Дон Кихот не отвечает на их насмешки и угрозы сжечь или повесить его. Он обращается к Творцу с мольбой принять его душу. Главарь разбойников взволнован и просит дон Кихота рассказать о себе. Тот видит долг странствующего рыцаря в защите слабых, борьбе со злом. Разорвав путы, он требует вернуть колье обожаемой дамы. Разбойники тронуты, главарь, сняв шляпу и встав на колени, вручает колье дон Кихоту. Рыцарь благословляет разбойников.