Tab.SumLine

From SunFlurry wiki
Revision as of 10:13, 17 August 2019 by Admin (talk | contribs) (Created page with "{{infobox function |name=SumLine |object=Таблица |caption=Операции над значениями |type=1 |status=2 |db=0 |exception=невозможно пр...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  SumLine (Операции над значениями)
Объект:Таблица
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:невозможно превратить в число
Визуальность:Нет

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

Синтаксис

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

Аргументы

  • <Индекс строки суммирования (INT)> - Индекс строки, сумму значений ячеек которой необходимо найти. Нумерация строк начинается с единицы.
  • <Строки превращать в числа (INT)> - (необязательный аргумент) Может принимать значения: 0 (по умолчанию) -- производить операции только над числовыми значениями (как над целыми, так и над вещественными числами), 1 -- производить операции над числовыми значениями и над строковыми значениями, предварительно превращая строки в числа (фактические значения ячеек при этом не будут изменены).
  • <Округление при суммировании (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);

aTab.Select();
While aTab.Next() Do
  Message("Сумма строки "+aTab.CurLine+": "+aTab.SumLine(aTab.CurLine));
EndDo;

//Будет выведено последовательно:
//"Сумма строки 1: 10"
//"Сумма строки 2: 40"
//"Сумма строки 3: 17"
//"Сумма строки 4: 13"
//"Сумма строки 5: 86"
//"Сумма строки 6: 14"

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

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

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