Вернуться к статье
Листинг 1. Сценарий создания функции cxValid.
CREATE FUNCTION dbo.cxValid(
@cx AS complex)
RETURNS bit
AS
BEGIN
SET @cx = RTRIM(LTRIM(@cx))
IF RIGHT(@cx, 1) <> `i`
RETURN 0
SET @cx = LEFT(@cx, LEN(@cx) - 1)
DECLARE @signpos AS int
SET @signpos = PATINDEX(`%_[-+]%`, @cx) + 1
IF @signpos = 0
RETURN 0
IF IsNumeric(LEFT(@cx, @signpos - 1)) = 0
RETURN 0
IF IsNumeric(RIGHT(@cx, LEN(@cx) - @signpos + 1)) = 0
RETURN 0
RETURN 1
END
GO
Листинг 2. Cоздание правила complex_valid и связывание его с типом Complex.
CREATE rule complex_valid
AS
- Check whether last character is `i`.
RIGHT(RTRIM(@cx), 1) = `i` AND
IsNumeric(LEFT(LTRIM(@cx),
PATINDEX(`%_[-+]%`, LTRIM(@cx)))) = 1 AND
IsNumeric(SUBSTRING(LTRIM(@cx),
PATINDEX(`%_[-+]%`, LTRIM(@cx)) + 1,
LEN(RTRIM(LTRIM(@cx))) -
PATINDEX(`%_[-+]%`, LTRIM(@cx)) - 1)) = 1
GO
EXEC sp_bindrule `complex_valid`, `complex`
GO
Вернуться к статье
Листинг 3. Сценарий создания функции cxStandardize.
CREATE FUNCTION dbo.cxStandardize(
@cx AS complex)
RETURNS complex
AS
BEGIN
SET @cx = REPLACE(@cx, ` `, ``)
DECLARE @real AS varchar(25)
SET @real = LEFT(@cx, PATINDEX(`%_[-+]%`, @cx))
IF CHARINDEX(`.`, @real) > 0 AND PATINDEX
(`%.%[1-9]%`, @real) = 0
SET @real = LEFT(@real, CHARINDEX(`.`, @real) - 1)
IF PATINDEX(`%.%0`, @real) > 0
SET @real = LEFT(@real, LEN(@real) - PATINDEX
(`%[^0]%.%`, REVERSE(@real)) + 1)
DECLARE @imaginary AS varchar(25)
SET @imaginary = SUBSTRING(@cx, PATINDEX
(`%_[-+]%`, @cx) + 1,CHARINDEX(`i`, @cx) -
PATINDEX(`%_[-+]%`, @cx) - 1)
IF CHARINDEX(`.`, @imaginary) > 0
AND PATINDEX(`%.%[1-9]%`, @imaginary) = 0
SET @imaginary = LEFT(@imaginary, CHARINDEX(`.`,
@imaginary) - 1)
IF PATINDEX(`%.%0`, @imaginary) > 0
SET @imaginary = LEFT(@imaginary,
LEN(@imaginary) - PATINDEX(`%[^0]%.%`,
REVERSE(@imaginary)) + 1)
SET @cx = @real + @imaginary + `i`
SET @cx = STUFF(@cx, PATINDEX(`%_[-+]%`,
@cx) + 1, 0, ` `)
SET @cx = STUFF(@cx, PATINDEX(`%_[-+]%`,
@cx) + 2, 0, ` `)
IF LEFT(@cx, 1) = `+`
SET @cx = STUFF(@cx, 1, 1, ``)
RETURN @cx
END
GO
Вернуться к статье
Листинг 4. Сценарий создания функций cxGetReal и cxGetImaginary.
CREATE FUNCTION dbo.cxGetReal(
@cx AS complex)
RETURNS decimal(19, 9)
AS
BEGIN
SET @cx = REPLACE(@cx, ` `, ``)
RETURN CAST(LEFT(@cx,
PATINDEX(`%_[-+]%`, @cx)) AS decimal(19,9))
END
GO
CREATE FUNCTION dbo.cxGetImaginary(
@cx AS complex)
RETURNS decimal(19,9)
AS
BEGIN
SET @cx = REPLACE(@cx, ` `, ``)
RETURN CAST(
SUBSTRING(
@cx,
PATINDEX(`%_[-+]%`, @cx) + 1,
CHARINDEX(`i`, @cx) -
PATINDEX(`%_[-+]%`, @cx) - 1)
AS decimal(19,9))
END
GO
Вернуться к статье
Листинг 5. Сценарий создания функции cxStrForm.
CREATE FUNCTION dbo.cxStrForm(@real AS decimal(19,9),
@imaginary AS decimal(19,9))
RETURNS complex
AS
BEGIN
RETURN dbo.cxStandardize(
CAST(@real AS varchar(21)) +
CASE SIGN(@imaginary)
WHEN -1 THEN `-`
ELSE `+`
END +
CAST(ABS(@imaginary) AS varchar(21)) + `i`)
END
GO
Вернуться к статье
Листинг 6. Сценарий создания функции cxAdd.
CREATE FUNCTION dbo.cxAdd(@cx1 as complex,
@cx2 as complex)
RETURNS complex
AS
BEGIN
IF dbo.cxValid(@cx1) = 0 OR dbo.cxValid(@cx2) = 0
RETURN NULL
DECLARE @a1 AS decimal(19,9),
@b1 AS decimal(19,9),
@a2 AS decimal(19,9),
@b2 AS decimal(19,9)
DECLARE @real AS decimal(19,9),
@imaginary AS decimal(19,9)
SET @a1 = dbo.cxGetReal(@cx1)
SET @a2 = dbo.cxGetReal(@cx2)
SET @b1 = dbo.cxGetImaginary(@cx1)
SET @b2 = dbo.cxGetImaginary(@cx2)
- z1 + z2 = (a1 + a2) + (b1 + b2)i
SET @real = @a1 + @a2
SET @imaginary = @b1 + @b2
RETURN dbo.cxStrForm(@real, @imaginary)
END
GO
Вернуться к статье
Листинг 7. Сценарий создания функции cxSubstract.
CREATE FUNCTION dbo.cxSubtract(@cx1 as complex,
@cx2 as complex)
RETURNS complex
AS
BEGIN
IF dbo.cxValid(@cx1) = 0 OR dbo.cxValid(@cx2) = 0
RETURN NULL
DECLARE @a1 AS decimal(19,9),
@b1 AS decimal(19,9),
@a2 AS decimal(19,9),
@b2 AS decimal(19,9)
DECLARE @real AS decimal(19,9),
@imaginary AS decimal(19,9)
SET @a1 = dbo.cxGetReal(@cx1)
SET @a2 = dbo.cxGetReal(@cx2)
SET @b1 = dbo.cxGetImaginary(@cx1)
SET @b2 = dbo.cxGetImaginary(@cx2)
SET @real = @a1 - @a2
SET @imaginary = @b1 - @b2
RETURN dbo.cxStrForm(@real, @imaginary)
END
GO
Вернуться к статье
Листинг 8. Сценарий создания функции cxMult.
CREATE FUNCTION dbo.cxMult(
@cx1 AS complex,
@cx2 AS complex)
RETURNS complex
AS
BEGIN
IF dbo.cxValid(@cx1) = 0 OR dbo.cxValid(@cx2) = 0
RETURN NULL
DECLARE @a1 AS decimal(19,9),
@b1 AS decimal(19,9),
@a2 AS decimal(19,9),
@b2 AS decimal(19,9)
DECLARE @real AS decimal(19,9),
@imaginary AS decimal(19,9)
SET @a1 = dbo.cxGetReal(@cx1)
SET @a2 = dbo.cxGetReal(@cx2)
SET @b1 = dbo.cxGetImaginary(@cx1)
SET @b2 = dbo.cxGetImaginary(@cx2)
SET @real = @a1*@a2 - @b1*@b2
SET @imaginary = @a1*@b2 + @a2*@b1
RETURN dbo.cxStrForm(@real, @imaginary)
END
GO
Вернуться к статье
Листинг 9. Сценарий создания функции cxDivide.
CREATE FUNCTION dbo.cxDivide
(@cx1 as complex,
@cx2 as complex)
RETURNS complex
AS
BEGIN
IF dbo.cxValid(@cx1) = 0 OR dbo.cxValid(@cx2) = 0
RETURN NULL
DECLARE @a1 AS decimal(19,9),
@b1 AS decimal(19,9),
@a2 AS decimal(19,9),
@b2 AS decimal(19,9)
DECLARE @real AS decimal(19,9),
@imaginary AS decimal(19,9)
SET @a1 = dbo.cxGetReal(@cx1)
SET @a2 = dbo.cxGetReal(@cx2)
SET @b1 = dbo.cxGetImaginary(@cx1)
SET @b2 = dbo.cxGetImaginary(@cx2)
SET @real = (@a1*@a2 + @b1*@b2)/
(@a2*@a2 + @b2*@b2)
SET @imaginary = (@a2*@b1 - @a1*@b2)/
(@a2*@a2 + @b2*@b2)
RETURN dbo.cxStrForm(@real, @imaginary)
END
GO
Вернуться к статье
Листинг 10. Сценарий создания функции cxVectorSize.
CREATE FUNCTION dbo.cxVectorSize(
@cx as complex)
RETURNS decimal(19,9)
AS
BEGIN
IF dbo.cxValid(@cx) = 0
RETURN NULL
DECLARE @real AS decimal(19,9),
@imaginary AS decimal(19,9)
SET @real = dbo.cxGetReal(@cx)
SET @imaginary = dbo.cxGetImaginary(@cx)
RETURN SQRT(@real*@real + @imaginary*
@imaginary)
END
GO
Вернуться к статье
Листинг 11. Наполнение таблицы комплексными числами.
CREATE TABLE ComplexNumbers ( key_col int NOT NULL PRIMARY KEY, cx1 complex NOT NULL, cx2 complex NOT NULL ) INSERT INTO ComplexNumbers VALUES(1, `5 + 2i`, `2 + 4i`) INSERT INTO ComplexNumbers VALUES(2, `2 + 9i`, `4 + 5i`) INSERT INTO ComplexNumbers VALUES(3, `7 + 4i`, `3 + 2i`) INSERT INTO ComplexNumbers VALUES(4, `3 + 2i`, `6 + 3i`) INSERT INTO ComplexNumbers VALUES(5, `4 + 3i`, `7 + 2i`) INSERT INTO ComplexNumbers VALUES(6, `1 + 4i`, `4 + 3i`) INSERT INTO ComplexNumbers VALUES(7, `7 + 2i`, `8 + 1i`) INSERT INTO ComplexNumbers VALUES(8, `2 + 3i`, `3 + 6i`) INSERT INTO ComplexNumbers VALUES(9, `3 + 6i`, `2 + 8i`) INSERT INTO ComplexNumbers VALUES(10, `2 + 1i`, `3 + 2i`)
Вернуться к статье
Листинг 12. Использование комплексных функций в запросе.
SELECT key_col, cx1, cx2, dbo.cxAdd(cx1, cx2) AS cxAdd, dbo.cxSubtract(cx1, cx2) AS cxSubtract, dbo.cxMult(cx1, cx2) AS cxMult, dbo.cxDivide(cx1, cx2) AS cxDivide FROM ComplexNumbers
Вернуться к статье
Листинг 13. Выполнение вычислений с помощью комплексных функций.
DECLARE @sumproduct AS complex
SET @sumproduct = `0 + 0i`
SELECT @sumproduct = dbo.cxAdd
(@sumproduct, dbo.cxMult(cx1, cx2))
FROM
ComplexNumbers
PRINT `The sum product of the vectors is: `
+ @sumproduct
The sum product of the vectors is: 8 + 252i.
Вернуться к статье