Квадратный корень в запросе 1С

17.04.14

Разработка - Математика и алгоритмы

Язык запросов 1С не позволяет вычислить квадратный корень 1С. Квадратный корень может пригодиться при вычислении среднеквадратического отклонения или геометрических вычислениях.

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

Наименование Файл Версия Размер
СКДКвадратныйКорень.xml
.xml 4,63Kb
10
.xml 4,63Kb 10 Скачать

Статья ценна комментариями, благодаря которым, с момента первоначальной публикации запрос претерпел значительные изменения. При активном участии сообщества была выполнена оптимизация запроса по быстродействию и уменьшению ошибок вычисления. Таким образом, проделанная работа – успешный опыт совместного решения проблем сообществом Инфостарт.

Важно: На Инфостарт появилась разработка от agrustny: Обработка с обычным (не СКД) запросом, извлекающим корни нужной степени

Язык запросов 1С не позволяет вычислить квадратный корень 1С. Квадратный корень может пригодиться при вычислении среднеквадратического отклонения или геометрических вычислениях. Предложенный метод имеет ограничение на верхнее значение.

Для вычисления квадратного корня в запросе предлагается использовать метод Герона, когда последовательно вычисляется формула



Проблемой является найти начальное значение. Предлагается взять его методом грубой оценки.
 принимается равным , а
Грубое значение будет вычислено как:

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

ВЫБРАТЬ	0.012345678 КАК Значение
ПОМЕСТИТЬ СписокЗначений
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ	1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ	9
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ	123.45
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ	12345678
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ	123456789012345678
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	SQRTS.X КАК Значение,
	(((SQRTS.Y + SQRTS.X / SQRTS.Y) / 2 + SQRTS.X / ((SQRTS.Y + SQRTS.X / SQRTS.Y) / 2)) / 2 + SQRTS.X / (((SQRTS.Y + SQRTS.X / SQRTS.Y) / 2 + SQRTS.X / ((SQRTS.Y + SQRTS.X / SQRTS.Y) / 2)) / 2)) / 2 КАК КореньКвадратный
ИЗ
	(ВЫБРАТЬ
		СписокЗначений.Значение КАК X,
		ВЫБОР
			КОГДА СписокЗначений.Значение < 0
				ТОГДА NULL
			КОГДА СписокЗначений.Значение < 0.000001
				ТОГДА 0.0005623413251903491
			КОГДА СписокЗначений.Значение < 0.00001
				ТОГДА 0.001778279410038923
			КОГДА СписокЗначений.Значение < 0.0001
				ТОГДА 0.005623413251903491
			КОГДА СписокЗначений.Значение < 0.001
				ТОГДА 0.01778279410038923
			КОГДА СписокЗначений.Значение < 0.01
				ТОГДА 0.05623413251903491
			КОГДА СписокЗначений.Значение < 0.1
				ТОГДА 0.1778279410038923
			КОГДА СписокЗначений.Значение < 1
				ТОГДА 0.5623413251903491
			КОГДА СписокЗначений.Значение < 10
				ТОГДА 1.778279410038923
			КОГДА СписокЗначений.Значение < 100
				ТОГДА 5.623413251903491
			КОГДА СписокЗначений.Значение < 1000
				ТОГДА 17.78279410038923
			КОГДА СписокЗначений.Значение < 10000
				ТОГДА 56.23413251903491
			КОГДА СписокЗначений.Значение < 100000
				ТОГДА 177.8279410038923
			КОГДА СписокЗначений.Значение < 1000000
				ТОГДА 562.3413251903491
			КОГДА СписокЗначений.Значение < 10000000
				ТОГДА 1778.279410038923
			КОГДА СписокЗначений.Значение < 100000000
				ТОГДА 5623.413251903491
			ИНАЧЕ NULL
		КОНЕЦ КАК Y
	ИЗ
		СписокЗначений КАК СписокЗначений) КАК SQRTS

См. также

Метод Дугласа-Пойкера для эффективного хранения метрик

Математика и алгоритмы Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    1754    stopa85    12    

33

Алгоритм симплекс-метода для решения задачи раскроя

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    4422    user1959478    50    

34

Регулярные выражения на 1С

Математика и алгоритмы Инструментарий разработчика Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    7464    4    SpaceOfMyHead    17    

56

Модель распределения суммы по базе

Математика и алгоритмы Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    7855    7    kalyaka    11    

44

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы Платформа 1С v8.3 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    4446    fishca    13    

36

Интересная задача на Yandex cup 2021

Математика и алгоритмы Бесплатно (free)

Мое решение задачи на Yandex cup 2021 (frontend). Лабиринт. JavaScript.

12.10.2021    8840    John_d    73    

46

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета Платформа 1С v8.3 Анализ и прогнозирование Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    7806    dusha0020    8    

70
Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4670 24.10.13 13:05 Сейчас в теме
2. Поручик 4670 24.10.13 13:11 Сейчас в теме
10^8 - это даже больше, чем государственный долг США
AllexSoft; bulpi; +2 Ответить
3. andrewks 1368 24.10.13 13:14 Сейчас в теме
люблю математические феньки. практической пользы почти никакой, но - приятно :)
4. glek 119 24.10.13 14:53 Сейчас в теме
Ага. Когда то (в пору динозавров, когда компютеров не было) высчитывал квадратный корень на бумажке. Метод уже не помню, к сожалению (лет 30 назад было)
5. Bukaska 140 24.10.13 15:07 Сейчас в теме
Молодцы))) Реальных математиков среди программеров ещё поискать)))
8. Abadonna 3958 25.10.13 02:23 Сейчас в теме
(5)
Реальных математиков среди программеров ещё поискать)))

Среди них и реальных программеров ещё поискать)))
1cWin; noknown; bulpi; Ks_83; Evil Beaver; +5 Ответить
14. Evil Beaver 8107 25.10.13 09:40 Сейчас в теме
(8) Abadonna, и тем не менее, математика научить программировать проще, чем программиста - круто матемачить :)
18. Elisy 948 25.10.13 10:53 Сейчас в теме
(14) Evil Beaver,
Не математик я )))). Все формулы элементарные и подсмотрены в wikipedia, в статье формулы-картинки из нее же. Любой, если задастся целью, может повторить опыт.
21. Evil Beaver 8107 25.10.13 11:55 Сейчас в теме
(18) а я и не говорил, что Вы математик :)
6. Famza 84 24.10.13 16:04 Сейчас в теме
(0) А через ряд разложить? )))
10. Elisy 948 25.10.13 07:27 Сейчас в теме
(6) Famza,
Через ряд не получается - можно разложить через ряд функцию вида SQRT(1+X), где 0<X<=1. Но как ее применить к данному случаю - непонятно.
7. chmv 24.10.13 17:11 Сейчас в теме
11. Elisy 948 25.10.13 07:31 Сейчас в теме
(7) Для использования в дальнейших вычислениях. В моем случае задача ставилась так: найти через сигму минимальную вероятную покупку по группам товаров и проанализировать склад на наличие этого количества в течение заданного периода. В вычислении сигмы используется квадратный корень. С ограничениями 1С решение предполагает выполнение запроса, вычисление корня в цикле, выполнение другого запроса. Я попытался вычислить квадратный корень в запросе.
13. AlX0id 25.10.13 08:49 Сейчас в теме
(11)
А просто в компоновку запихать и использовать какие хошь функции языка никак? ) Да и в самой компоновке поболе будет возможностей..
17. Elisy 948 25.10.13 10:51 Сейчас в теме
(13) AlX0id,
А просто в компоновку запихать и использовать какие хошь функции языка никак? ) Да и в самой компоновке поболе будет возможностей..

В данном случае не нужны "какие хошь" функции, нужен квадратный корень средствами языка запросов. Это два принципиально разных подхода: вычисление на уровне СУБД и вычисление на уровне 1С.
38. AlexO 135 14.02.14 00:47 Сейчас в теме
(17)
вычисление на уровне СУБД и вычисление на уровне 1С.

Это кто вам сказал такую глупость? Тот, кто показал, как в 1С "круто програмичить"?
Все вычисления в 1С идут через 1С. Через СУБД идет первоначальный накопление капитала сбор данных.
39. Elisy 948 14.02.14 07:31 Сейчас в теме
(38) AlexO,
Это кто вам сказал такую глупость? Тот, кто показал, как в 1С "круто програмичить"?
Все вычисления в 1С идут через 1С. Через СУБД идет первоначальный накопление капитала сбор данных.

Ваше утверждение весьма спорное. Не думаю, что элементарные операции плюс, минус, делить вынесены на сторону сервера 1С. Основные конструкции языка запросов 1С соотносятся с конструкциями SQL. Думаю, что они конвертируются в SQL один-в-один. Даже, если в текущем релизе 1С это не так (зная 1С, я допускаю это), то 1С не стоит на месте. И в следующих релизах элементарные операции могут быть вынесены на сервер СУБД. Скорость при этом вырастет, и в 1С-скриптах ничего менять не нужно.
40. agrustny 19 17.04.14 10:30 Сейчас в теме
(39) Уважаемый Elisy, прошу оценить мой труд http://infostart.ru/public/273699/ по мотивам Вашей разработки.
Solvolna; +1 Ответить
41. Elisy 948 17.04.14 14:06 Сейчас в теме
(40) agrustny,
Спасибо за разработку и ценную ссылку. Добавил вашу разработку в статье. Будет видна после утверждения модератором.
47. StaticUnsafe 22.04.14 17:25 Сейчас в теме
(38) AlexO, а кто вам сказал что это не так? )) Вас кто нибудь учил "круто программить" или вы менеджер или технарь не IT ?

Перехватите на СУБД профайлером оттранслированный в SQL 1сный запрос и посмотрите, что все вычисляется там. Если вы, конечно, понимаете о чем речь и язык SQL вам не чужд.
agrustny; +1 Ответить
48. agrustny 19 22.04.14 18:05 Сейчас в теме
(47) unsafe, нелепость высказывания AlexO была настолько очевидна, что на нее даже не обратили внимания.
Но!
Насколько быстро "считает" СУБД - вопрос интересный, я его задавал профессору Эльдорадовичу здесь
http://forum.infostart.ru/forum24/topic108581/#comm25 (21)
Вообще рекомендуют арифметику СУБД не использовать.
А Вы что думаете?
49. Elisy 948 23.04.14 14:22 Сейчас в теме
(48) agrustny,
Зависит от ситуации, объеме данных. Думаю, процессор не работает особенным медленным образом в режиме СУБД. И почему-то есть уверенность, что MSSQL постарается распараллелить вычислениями своими силами, что даст выигрыш в производительности. Параллельности вычислений от 1С ждать не приходится.
Бывают ситуации, что вынесение арифметики на сторону 1С приводит к нескольким последовательным обращениям к СУБД, задержки от которых буду намного выше, чем потенциальные замедления арифметики СУБД.
agrustny; +1 Ответить
51. alexsh76 170 03.03.15 15:02 Сейчас в теме
(49) (48), замерил на конкретных данных. ~13500 записей. Увеличение времени выполнения запроса ~300ms
9. Synoecium 778 25.10.13 06:16 Сейчас в теме
Баян, в теме уважаемого ildarovich http://infostart.ru/public/90367/?mid=971399, смотри комментарий 63.
Если есть необходимость вычислить квадратный корень в отчете на СКД, можно использовать вычисляемые поля, вызвав функцию из общего модуля, предварительно описав её там.
12. Elisy 948 25.10.13 07:42 Сейчас в теме
Баян, в теме уважаемого ildarovich http://infostart.ru/public/90367/?mid=971399, смотри комментарий 63.

(9) В приведенной Вами ссылке вычисление начального значения SQRT(S) как Значение/2 не выдерживает критики. Как следствие необходимо больше итерационных операций, чтобы увеличить точность вычисления корня. А так да - формула (Xn+S/Xn)/2 - это баян. Она придумана была не нами, а Героном в трактате «Метрика», I век н. э.
15. DAnry 8 25.10.13 09:49 Сейчас в теме
М-да, математика рулит...
16. nikolal 25.10.13 10:10 Сейчас в теме
В платформе 1С:Предприятие начиная с версии 8.3.1 в языке выражений системы компоновки данных реализована функция Sqrt(). Пользуйтесь на здоровье.
19. Elisy 948 25.10.13 11:03 Сейчас в теме
(16) nikolal,
В платформе 1С:Предприятие начиная с версии 8.3.1 в языке выражений системы компоновки данных реализована функция Sqrt(). Пользуйтесь на здоровье.

Опять одно и тоже. Понятно, что если нам нужно вычислить только сигму и отобразить ее, то можно добавить вычисляемое выражение. А если ее значение должно использоваться в следующем запросе пакета?
Все СУБД: MSSQL, Oracle, Postgree, db/2 содержат SQRT(N)-определение. Почему бы некоторые общие математические функции компании 1С не добавить в язык запросов? Не было бы извращений в виде этой статьи.
20. vasiliy_b 284 25.10.13 11:16 Сейчас в теме
Мне кажется, что лучше всего использовать не три итерации, а четыре т.к. именно на этом этапе большинство простых корней приводятся к целому числу 9 к 3 16 к 4 625 к 25 или 5476 к 74.
22. ildarovich 7850 25.10.13 13:37 Сейчас в теме
Хорошая статья, очень "нарядный" запрос.
В идеале в статье не хватает оценки точности метода: можно было бы взять все числа в диапазоне 1 - 1000 /10000/ и определить максимальную погрешность (в %, конечно). Понятно, что в задаче оценки страхового запаса высокая точность не нужна, но если предлагать это решение как универсальное, то тех, кто привык копипастить готовые фрагменты кода, нужно предупредить о погрешностях (а вдруг будут считать расход материала на изготовление медных труб?). Также нужно сказать, что данный запрос не подойдет для случаев Х<1 (будет большая погрешность - нужно другое начальное приближение).

Ну и что можно улучшить.
1) начальное приближение можно переписать компактнее. Для этого нужно понять, что метод грубой оценки - это не какая-то загадочная формула, которой нужно почему-то в точности следовать, а просто среднее значение корней из 1, 2, 3, 4, ... 10 - то есть 2,246827819 (примерно 2) или корней из 11, 12, 13, ..., 100 - 7,211051877 (примерно 6? - интересно поразмышлять почему не 7). То есть мы смотрим - в какой диапазон попадает аргумент и выбираем в качестве начального приближения корень середины этого диапазона. Тогда запрос в части табулирования начального приближения будет иметь вид:
ВЫБРАТЬ
СписокЗначений.Значение КАК Значение,
ВЫБОР
КОГДА СписокЗначений.Значение < 0
ТОГДА NULL
КОГДА СписокЗначений.Значение < 10
ТОГДА 2.246827819
КОГДА СписокЗначений.Значение < 100
ТОГДА 7.211051877
КОГДА СписокЗначений.Значение < 1000
ТОГДА 22.46827819
КОГДА СписокЗначений.Значение < 10000
ТОГДА 72.11051877
КОГДА СписокЗначений.Значение < 100000
ТОГДА 224.6827819
КОГДА СписокЗначений.Значение < 1000000
ТОГДА 721.1051877
КОГДА СписокЗначений.Значение < 10000000
ТОГДА 2246.827819
КОГДА СписокЗначений.Значение < 100000000
ТОГДА 7211.051877
ИНАЧЕ NULL
КОНЕЦ КАК КореньКвадратный
ИЗ
СписокЗначений КАК СписокЗначений
Показать
Можно не доверять собственным измышлениям и взять за основу 2 и 6, но делить диапазон 0 - 100 на 0 - 10 и 10 - 100 через ВЫРАЗИТЬ точно не нужно, как и проверять непопадание в проверенный диапазон.
2) в принципе, можно плотнее протабулировать начальные приближения в интересующем нас диапазоне и получать его не через ВЫБОР КОГДА ТОГДА КОНЕЦ, а соединением с таблицей известных корней (в свое время выпускались даже книжки с такими таблицами). Понятно, что по сути тут нужна логарифмическая линейка и плотность покрытия должна быть логарифмически равномерной. Я бы взял логарифм по основанию два.
3) Хотя итерации на основе вложенных запросов выглядят и красиво и понятно, возможно, стоит для скорости сразу выполнить подстановки и считать три (четыре?) итерации "за раз".
Предложения 2) и 3) - приведены как возможности альтернативных решений, а вот 1) можно было бы исправить непосредственно в данном решении.
Кстати, в статье Порождающий запрос приведено другое решение той же задачи (менее практичное), а в статье Как нарисовать граф на 1Сдля расчета расстояния между точками на плоскости применяется точно такой же метод как в данной статье, правда, с особенным для геометрии выбором начального приближения.
bulpi; CratosX; Elisy; Антон_ЭА; Synoecium; +5 Ответить
23. Elisy 948 26.10.13 09:31 Сейчас в теме
(22) ildarovich,
В вашем комментарии есть рациональная составляющая. Запрос выглядит красивее. Но не понятен выбор за основу 2,246827819 и 7,211051877. Если посмотреть расчет грубой оценки в
http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
Основа должна быть выбрана как
Sqrt(Sqrt(10)) = 1.778279410038923
Sqrt(Sqrt(1000)) = 5.623413251903491

Во вложении обработка с оценкой ошибки по 3м способам. Максимальная ошибка получилась при выборе метода из статьи, с уменьшением ошибки идет ваш способ и лучший результат показали основы 1.778279410038923 и 5.623413251903491.
Как только согласуем этот подход, можно будет перейти к п.3 вашего комментария. Думаю, оптимизация будет не лишней. Хотя всю нашу совместную работу перечеркнет добавление функции Sqrt в языке запросов ))). Пункт 2 - на любителя математики, и он может усложнить читаемость.
Прикрепленные файлы:
ГрубаяОценкаКвадратныйКорень.epf
CratosX; ildarovich; +2 Ответить
24. ildarovich 7850 26.10.13 10:27 Сейчас в теме
(22)(23) Я действительно поторопился взять за основу 2,246827819 и 7,211051877 - среднее арифметическое корней 1 и 10 и 11 и 100. Правда оказалась на стороне Википедии (как и следовало ожидать). Я также перепроверил: начальные приближения 1,77827941 и 5,623413252 оказались лучше всего (обработка проверки прилагается). Использование в качестве лучших начальных приближений не среднего арифметического (как я ошибочно думал первоначально), а СРЕДНЕГО ГЕОМЕТРИЧЕСКОГО концов отрезков объясняется тем, что начальное приближение должно быть ближе к истинному не по абсолютному Х-Х'->min, а по относительному значению X/X'->min. То есть среднее как и интервалы аппроксимации выбираются на логарифмической шкале.
Побочным результатом перепроверки является оценка точности метода. Она оказалась очень высокой! На интервале 1 - 100000 максимальная погрешность составила 0,0075844384 (семь с половиной тысячных) процента!
Такая высокая точность делает 2) совершенно ненужным. Тогда единственно, что меня еще беспокоит - это интервал 0-1, то есть отрицательные значения степеней 10. По-хорошему (для минимизации относительной погрешности), там тоже нужно для интервала 0.1-1 брать начальным приближением 0,5623413252, а для 0.01-0.1 брать 0,177827941 и так далее.
Прикрепленные файлы:
ПроверкаГрубойОценки.erf
Makushimo; Elisy; +2 Ответить
25. Elisy 948 28.10.13 16:09 Сейчас в теме
(24) ildarovich,
Тогда единственно, что меня еще беспокоит - это интервал 0-1, то есть отрицательные значения степеней 10. По-хорошему (для минимизации относительной погрешности), там тоже нужно для интервала 0.1-1 брать начальным приближением 0,5623413252, а для 0.01-0.1 брать 0,177827941 и так далее.

Долго думал про интервал 0-1. Не все так однозначно. Не понятно, почему пристальное внимание уделять именно этому интервалу. Ведь задача может требовать интервала 1-2 или 7-8. Если встанет задача работы с интервалом 0-1, можно будет умножить начальное значение на 10^2N, вычислить корень и разделить результат на 10^N. Как вы думаете?
26. ildarovich 7850 28.10.13 18:52 Сейчас в теме
(25) Мне кажется, что лучше будет полностью воспроизвести метод грубого приближения из Википедии. Там он определен и для отрицательных N. Для нас это означает, что нужно расширить правило на интервалы 1-0.1-0.01-0.001-0.0001-0.00001-... . Иначе ОТНОСИТЕЛЬНАЯ погрешность будет с приближением к 0 бесконтрольно расти. Относительная погрешность - это разница между точным значением корня и посчитанным в запросе, деленная на точное значение (а абсолютная - просто разница).
Иначе правило выбора начального приближения выглядит несимметрично: для степеней больше 8 запрос выдает NULL. Почему? - Видимо, потому, что не обеспечивается достаточная точность. Хотя, взяв в качестве начального значения 6000, запрос достаточно точно определит и корень из 1000 000 000 и корень из 10 000 000 000. Тогда почему для расчета корня из 0.1 и 0.01 мы разрешаем себе пользоваться приближением 2.0? ОТНОСИТЕЛЬНАЯ погрешность вычисления корня из 0.01 при начальном приближении 2.0 будет примерно той же, что и погрешность вычисления корня из 10 000 000 000 при начальном приближении 6000.
Другой вариант - не ограничивать интервал ни сверху, ни снизу, просто указав, что точность вычислений для чисел, больших 10^8 и меньших 1 будет уменьшаться при отдалении от этого интервала.
Прикрепленные файлы:
29. Elisy 948 30.10.13 12:31 Сейчас в теме
(26) ildarovich,
Добавим в запрос конструкцию для числе меньше 1?
				ВЫБОР
					КОГДА СписокЗначений.Значение < 0
						ТОГДА NULL
						
					КОГДА СписокЗначений.Значение < 0.00000001
						ТОГДА 0.00005623413251903491
					КОГДА СписокЗначений.Значение < 0.0000001
						ТОГДА 0.0001778279410038923
					КОГДА СписокЗначений.Значение < 0.000001
						ТОГДА 0.0005623413251903491
					КОГДА СписокЗначений.Значение < 0.00001
						ТОГДА 0.001778279410038923
					КОГДА СписокЗначений.Значение < 0.0001
						ТОГДА 0.005623413251903491
					КОГДА СписокЗначений.Значение < 0.001
						ТОГДА 0.01778279410038923
					КОГДА СписокЗначений.Значение < 0.01
						ТОГДА 0.05623413251903491
					КОГДА СписокЗначений.Значение < 0.1
						ТОГДА 0.1778279410038923
					КОГДА СписокЗначений.Значение < 1
						ТОГДА 0.5623413251903491
Показать
31. ildarovich 7850 30.10.13 14:14 Сейчас в теме
(29) Можно и так, а еще лучше
ВЫБОР
                    КОГДА СписокЗначений.Значение < 0
                        ТОГДА NULL
                    КОГДА СписокЗначений.Значение < 0.000001
                        ТОГДА 0.0005623413251903491
                    КОГДА СписокЗначений.Значение < 0.00001
                        ТОГДА 0.001778279410038923
                    КОГДА СписокЗначений.Значение < 0.0001
                        ТОГДА 0.005623413251903491
                    КОГДА СписокЗначений.Значение < 0.001
                        ТОГДА 0.01778279410038923
                    КОГДА СписокЗначений.Значение < 0.01
                        ТОГДА 0.05623413251903491
                    КОГДА СписокЗначений.Значение < 0.1
                        ТОГДА 0.1778279410038923
                    КОГДА СписокЗначений.Значение < 1
                        ТОГДА 0.5623413251903491
Показать
Учитывая то, что шесть знаков после запятой - стандартная точность вычислений в запросах. Ну и отсюда будет понятен принцип, что если "рабочий диапазон" значений аргумента корня другой, то нужно аналогично поменять часть запроса, отвечающую за начальное приближение.
32. Elisy 948 02.11.13 09:51 Сейчас в теме
(31) ildarovich,
Возразить ничего не могу против. Изменил запрос в статье согласно вашему коду. Думаю, проблему определения оптимального начального приближения решили.
Давайте поговорим теперь об итерационных шагах. 3х шагов достаточно?
34. ildarovich 7850 07.11.13 14:56 Сейчас в теме
(32)(33) Трех итераций хватает. Точность на всем диапазоне от 0.0000001 до 100000000 - семь с половиной тысячных процентов. Для трех итераций после подстановки результатов вложенных запросов в один запрос принимает вид:
ВЫБРАТЬ
	SQRTS.Х,
	(((SQRTS.У + SQRTS.Х / SQRTS.У) / 2 + SQRTS.Х / ((SQRTS.У + SQRTS.Х / SQRTS.У) / 2)) / 2 + SQRTS.Х / (((SQRTS.У + SQRTS.Х / SQRTS.У) / 2 + SQRTS.Х / ((SQRTS.У + SQRTS.Х / SQRTS.У) / 2)) / 2)) / 2 КАК КореньКвадратный
ИЗ
	(ВЫБРАТЬ
		СписокЗначений.Х КАК Х,
		ВЫБОР
			КОГДА СписокЗначений.Х < 0
				ТОГДА NULL
			КОГДА СписокЗначений.Х < 0.000001
				ТОГДА 0.0005623413251903491
			КОГДА СписокЗначений.Х < 0.00001
				ТОГДА 0.001778279410038923
			КОГДА СписокЗначений.Х < 0.0001
				ТОГДА 0.005623413251903491
			КОГДА СписокЗначений.Х < 0.001
				ТОГДА 0.01778279410038923
			КОГДА СписокЗначений.Х < 0.01
				ТОГДА 0.05623413251903491
			КОГДА СписокЗначений.Х < 0.1
				ТОГДА 0.1778279410038923
			КОГДА СписокЗначений.Х < 1
				ТОГДА 0.5623413251903491
			КОГДА СписокЗначений.Х < 10
				ТОГДА 1.778279410038923
			КОГДА СписокЗначений.Х < 100
				ТОГДА 5.623413251903491
			КОГДА СписокЗначений.Х < 1000
				ТОГДА 17.78279410038923
			КОГДА СписокЗначений.Х < 10000
				ТОГДА 56.23413251903491
			КОГДА СписокЗначений.Х < 100000
				ТОГДА 177.8279410038923
			КОГДА СписокЗначений.Х < 1000000
				ТОГДА 562.3413251903491
			КОГДА СписокЗначений.Х < 10000000
				ТОГДА 1778.279410038923
			КОГДА СписокЗначений.Х < 100000000
				ТОГДА 5623.413251903491
			ИНАЧЕ NULL
		КОНЕЦ КАК У
	ИЗ
		СписокЗначений КАК СписокЗначений) КАК SQRTS
Показать
Для сокращения записи первой строчки имя "КвадратныйКорень" заменено на "У". Вложенный запрос при этом понадобился всего один - для выбора начального приближения.
35. Elisy 948 15.11.13 11:49 Сейчас в теме
(34) ildarovich,
Проверил запрос - работает нормально. Обновил статью с учетом вашего последнего комментария.
27. ex-human 29.10.13 05:24 Сейчас в теме
квадратный корень числа = число в степени 0,5
30. Elisy 948 30.10.13 14:00 Сейчас в теме
(27) ex-human,
квадратный корень числа = число в степени 0,5

Очень ценная информация, правда, ума не приложу, как ее использовать.
28. Ish_2 1104 29.10.13 18:37 Сейчас в теме
(0) Квадратный корень в запросе - это , конечно, сила..
Сергей , скажи лучше что с "доминиканой" ?
33. Elisy 948 02.11.13 10:04 Сейчас в теме
Склеивание итерационных вычислений для 3, 2 и 1 итерации выглядит так:

ВЫБРАТЬ
	SQRTS.Значение,
	(((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2 + SQRTS.Значение / ((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2)) / 2 + SQRTS.Значение / (((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2 + SQRTS.Значение / ((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2)) / 2)) / 2 КАК КореньКвадратный
ИЗ
	(ВЫБРАТЬ
		SQRTS.Значение КАК Значение,
		((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2 + SQRTS.Значение / ((SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2)) / 2 КАК КореньКвадратный
	ИЗ
		(ВЫБРАТЬ
			SQRTS.Значение КАК Значение,
			(SQRTS.КореньКвадратный + SQRTS.Значение / SQRTS.КореньКвадратный) / 2 КАК КореньКвадратный
		ИЗ
			(ВЫБРАТЬ
				СписокЗначений.Значение КАК Значение,
				ВЫБОР
					КОГДА СписокЗначений.Значение < 0
						ТОГДА NULL
					КОГДА СписокЗначений.Значение < 0.000001
						ТОГДА 0.0005623413251903491
					КОГДА СписокЗначений.Значение < 0.00001
						ТОГДА 0.001778279410038923
					КОГДА СписокЗначений.Значение < 0.0001
Показать
36. Alexion 44 25.12.13 16:33 Сейчас в теме
Подскажите как можно сделать такой запрос в динамическом списке?
Динамический список не поддерживает пакетные запросы, никак не могу додуматься.
37. Elisy 948 06.01.14 13:18 Сейчас в теме
(36) Alexion,
Не понятно, что конкретно у вас вызывает затруднение. Вложенным запросом целиком в скобках можно заменить временную таблицу.
42. Yurcha62 78 18.04.14 16:53 Сейчас в теме
Гы... смешно ... и как все это относится к Бухгалтерии и Торговле?.. Такое ощущение что в 1С необходимо расчитывать ядерные реакторы ...
43. agrustny 19 18.04.14 18:50 Сейчас в теме
(42) Это для конкурса http://forum.infostart.ru/forum1/topic106618/, чтобы нас ФФФФ считали самыми-самыми!
45. Elisy 948 19.04.14 08:24 Сейчас в теме
(43) agrustny,
Спасибо за ссылку - интересный конкурс
44. Elisy 948 19.04.14 08:23 Сейчас в теме
(42) Yurcha62,
Когда у вас встанет задача расчетов по модной в определенной среде теории N-сигм, смех, думаю, пропадет )))))))
46. spetzpozh 22.04.14 12:12 Сейчас в теме
(42) Yurcha62, для развоза ИТС даже на инфостарт заходить не надо.
agrustny; +1 Ответить
50. alexsh76 170 03.03.15 14:53 Сейчас в теме
Еще некоторое дополнение, не использовать выбор а поместить во временную таблицу и использовать связь. Удобней, и правильней (особенно когда надо извлечь корень из нескольких полей)
ВЫБРАТЬ
	0.0005623413251903491 КАК Y,
	0.000001 КАК ВерхнееЗначение,
	0 КАК НижнееЗначение
ПОМЕСТИТЬ SQRTS

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	0.001778279410038923,
	0.00001,
	0.000001

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	0.005623413251903491,
	0.0001,
	0.00001

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	0.01778279410038923,
	0.001,
	0.0001

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	0.05623413251903491,
	0.01,
	0.001

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	0.1778279410038923,
	0.1,
	0.01

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	0.5623413251903491,
	1,
	0.1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	1.778279410038923,
	10,
	1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	5.623413251903491,
	100,
	10

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	17.78279410038923,
	1000,
	100

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	56.23413251903491,
	10000,
	1000

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	177.8279410038923,
	100000,
	10000

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	562.3413251903491,
	1000000,
	100000

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	1778.279410038923,
	10000000,
	1000000

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	5623.413251903491,
	100000000,
	10000000
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	100 КАК Поле1
ПОМЕСТИТЬ Набор

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	125

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	625

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	100000
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Набор.Поле1,
	SQRTS.Y,
	(((SQRTS.Y + Набор.Поле1 / SQRTS.Y) / 2 + Набор.Поле1 / ((SQRTS.Y + Набор.Поле1 / SQRTS.Y) / 2)) / 2 + Набор.Поле1 / (((SQRTS.Y + Набор.Поле1 / SQRTS.Y) / 2 + Набор.Поле1 / ((SQRTS.Y + Набор.Поле1 / SQRTS.Y) / 2)) / 2)) / 2 КАК Поле2
ИЗ
	Набор КАК Набор
		ЛЕВОЕ СОЕДИНЕНИЕ SQRTS КАК SQRTS
		ПО Набор.Поле1 < SQRTS.ВерхнееЗначение
			И Набор.Поле1 >= SQRTS.НижнееЗначение
Показать
Brawler; Elisy; +2 Ответить
53. Brawler 454 25.07.19 08:53 Сейчас в теме
(50) блин, пару экранов текста недолистал, сам аналог написал))
52. Zerling 04.07.19 14:30 Сейчас в теме
Оставьте свое сообщение