Tab.Sum

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

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

Синтаксис

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

Аргументы

  • <Наименование или индекс столбца (INT,STRING)> - Строковое значение аргумента задает наименование столбца, сумму значений ячеек которого необходимо получить, числовое значение задает номер этого столбца (нумерация столбца происходит с единицы).
  • <Строки превращать в числа (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.Sum(i));
EndDo;

//Будет выведено последовательно:
//"Сумма столбца B1: 19"
//"Сумма столбца B2: 15"
//"Сумма столбца B3: 20"
//"Сумма столбца B4: 126"

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

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

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 раз, 
//  что не очень много, учитывая высокую скорость работы таких функций.