Tab.Compute

From SunFlurry wiki
Jump to: navigation, search
  Compute (Операции над значениями)
Объект:Таблица
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Неверное имя столбца, невозможно превратить в число, строку, неверная операция
Визуальность:Нет

Функция выполняет одну из следующих операций на значениях указанного столбца таблицы в указанном диапазоне строк таблицы: сумма, минимум, максимум, среднее, количество значений. Значения, представленные строками, могут быть превращены в числа при сложении, если необходимо. Для исключения накопления неточности при сложении вещественных чисел, можно указать требуемое количество цифр после точки.

Синтаксис

Tab.Compute(<Наименование или индекс столбца (INT,STRING)>,<Тип операции (STRING)>="SUM",<Строки превращать в числа (INT)>=0,<Индекс начальной строки (INT)>=0,<Индекс конечной строки (INT)>=<Последняя строка таблицы>,<Округление при суммировании или нахождении среднего (INT)>=-1):<Результат вычисления (NUMBER)>

Аргументы

  • <Наименование или индекс столбца (INT,STRING)> - Строковое значение аргумента задает наименование столбца, сумму значений ячеек которого необходимо получить, числовое значение задает номер этого столбца (нумерация столбца происходит с единицы).
  • <Тип операции (STRING)> - (необязательный аргумент) Задает тип выполняемой операции. Доступны следующие значения:
    • SUM (по умолчанию) -- нахождение суммы значений
    • AVG -- нахождение среднего значения (значения, которые не участвуют в операции (не числа) в нахождении среднего не участвуют).
    • MAX -- нахождение максимального значения.
    • MIN -- нахождение максимального значения.
    • COUNT -- нахождение количества значений, участвующих в операции (исключаются не числовые значения (и не строковые, при наличии параметра превращения строк в числа)).
  • <Строки превращать в числа (INT)> - (необязательный аргумент) Может принимать значения: 0 (по умолчанию) -- производить операции только над числовыми значениями (как над целыми, так и над вещественными числами), 1 -- производить операции над числовыми значениями и над строковыми значениями, предварительно превращая строки в числа (фактические значения ячеек при этом не будут изменены).
  • <Индекс начальной строки (INT)> - (необязательный аргумент) Задает индекс первой строки операции. Если аргумент опущен, будет использована первая строка таблицы.
  • <Индекс конечной строки (INT)> - (необязательный аргумент) Задает индекс последней строки операции. Если аргумент опущен, будет использована последняя строка таблицы.
  • <Округление при суммировании или нахождении среднего (INT)> - (необязательный аргумент) Задает количество знаков после десятичной точки для округления значения на каждом этапе операции (по умолчанию -1, опция отключена). При нахождении суммы большого числа вещественных чисел (даже если каждое число округлено до определенного количества знаков после точки), может накопиться неточность (см. Числа). Обычно такие неточности невелики и не имеют никакого значения при расчетах. Однако, для случаев, когда необходима высокая точность при вычислениях чисел с известным количеством знаков после точки, можно использовать эту опцию, которая позволяет автоматически производить округление полученного значения после каждой операции, тем самым исключив накопление неточности. Пример см. ниже.

Возвращаемое значение

Возвращается результат операции.

Примеры

//Создается и заполняется таблица значений
aTab:=Tab.Create("b1,b2,b3,b4");

aTab.AddLine("b1,b2,b3,b4",1,2,3,4);
aTab.AddLine("b1,b2,b3,b4",2,2,3,33);
aTab.AddLine("b1,b2,b3,b4",3,5,5,4);
aTab.AddLine("b1,b2,b3,b4",4,2,3,4);
aTab.AddLine("b1,b2,b3,b4",4,2,3,77);
aTab.AddLine("b1,b2,b3,b4",5,2,3,4);

For i:=1 To aTab.Columns Do
  Message("Среднее значение среди значений столбца "+aTab.GetColumnName(i)+": "+aTab.Compute(i,"AVG"));
EndDo;

//Будет выведено последовательно:
//"Среднее значение среди значений столбца B1: 3.16666666666666667"
//"Среднее значение среди значений столбца B2: 2.5"
//"Среднее значение среди значений столбца B3: 3.33333333333333333"
//"Среднее значение среди значений столбца B4: 21"

Пример, показывающий работу опции по исключению накопления неточности

Данный пример показывает, как можно избежать накопления неточности при суммировании большого количества вещественных чисел, если известна точность их представления (количество знаков в мантиссе).

aTab:=Tab.Create("b1");
For i:=1 To 1000000 Do
  aTab.AddLine("b1",1.33552);
EndDo;

Message(NumberToStr(aTab.Sum("b1"),1));
Message(NumberToStr(aTab.Sum("b1",0,1,aTab.Size(),5),1));
//В первом случае будет выведено: "1335519.99999998508"
//Во втором случае будет выведено: "1335520"
//Сложение миллиона чисел (подобранных с целью увеличения неточности) дает неточность большую, чем 1E-8, при этом, сами числа имеют точность 1E-5, 
//  эти значения уже сравнимы между собой, поэтому при очень большом количестве операций над числами с длинными но точными мантиссами можно получить ошибку в последних знаках результата.
//Для вещественных чисел с мантиссами любой точности это не имеет большого значения, так как такие числа в основном используются для нахождения статистических, 
//  средних значений или при рисовании графиков, где точность результата ограничивается условием и обычно не превышает нескольких знаков после точки.
//По времени выполнения: функция сложения без округления была выполнена (i5) за 9.8 мс., с округлением 23.1 мс., т.е. разница по времени выполнения чуть больше 2 раз, 
//  что не очень много, учитывая высокую скорость работы таких функций.