powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Вычисление: экспоненты, квадратного корня и разницы между датами в месяцах
2 сообщений из 2, страница 1 из 1
Вычисление: экспоненты, квадратного корня и разницы между датами в месяцах
    #39218687
serezgik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Прошу помочь.
Проблема в том, что функции: вычисления корня и вычисления экспоненты работают медленно.
Алгоритм должен будет обрабатывать большие объёмы данных, и производительность - болезненный вопрос.
Может, кто-то знает варианты для увеличения скорости? К примеру, какая-то готовая реализация. Также буду рад, если кто подскажет возможность подсчёта количества именно месяцев между датами.

Язык XQuery
Документ запускал через Altova 2011 и 2013 года (не знаю: есть ли разница, - эта область для меня новая).

Реализованный алгоритм:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
xquery version "1.0" encoding "UTF-8";

declare variable $accuracy := 0.000001;

(:Функция вычисления корня:)
declare function local:sqrt_fun($n, $k)
{ 
	if (abs(($k * $k - $n) div $accuracy) < 1)
	then $k
	else local:sqrt_fun($n, (($k + $n div $k)div 2))
};

(:Пусковая функция для вычисления корня:)
declare function local:sqrt($n)
{ 
	local:sqrt_fun($n, 1)
};


(:Функция вычисление экспоненты:)
declare function local:exp_fun($x, $i, $add, $res){
	if (abs(($add) div $accuracy) < 1)
	then $res
	else local:exp_fun($x, $i+1, $add * $x div $i, $res+$add)
};

(:Пусковая функция вычисление экспоненты:)
declare function local:exp($x){
	local:exp_fun($x, 1, 1, 0)
};

declare variable $today := xs:date("2003-01-01");

(:Функция нахождения количества месяцев от date0 и до контрольной даты:)
declare function local:age_in_month($date0)
{
	let
		$difference := xs:int(fn:replace(xs:string($today - $date0), "P(\d+)D", "$1")),
		$res := ($difference div (365.2425 div 12))
	
	return 
		if($res - xs:int($res) < 0.2) 
		then xs:int($res) 
		else xs:int($res)+1
};


<result>
	exp 0 = {round(100*local:exp(0))div 100}
	exp 1 = {round(100*local:exp(1))div 100}
	exp 2 = {round(100*local:exp(2))div 100}
	exp 3 = {round(100*local:exp(3))div 100}
	exp 4 = {round(100*local:exp(4))div 100}
	
	sqrt 0 = {round(100*local:sqrt(0))div 100}
	sqrt 1 = {round(100*local:sqrt(1))div 100}
	sqrt 2 = {round(100*local:sqrt(2))div 100}
	sqrt 3 = {round(100*local:sqrt(3))div 100}
	sqrt 4 = {round(100*local:sqrt(4))div 100}
	
	today = {$today}
	age_in_month from "2000-01-01" = {local:age_in_month(xs:date("2000-01-01"))}
	
	end
</result>
...
Рейтинг: 0 / 0
Вычисление: экспоненты, квадратного корня и разницы между датами в месяцах
    #39218766
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serezgik Может, кто-то знает варианты для увеличения скорости?Поменять средство реализации. Большие объемы математики не для XQuery.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Вычисление: экспоненты, квадратного корня и разницы между датами в месяцах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]