PLaSK library

Loading...
Searching...
No Matches
math.cpp
Go to the documentation of this file.
1/*
2 * This file is part of PLaSK (https://plask.app) by Photonics Group at TUL
3 * Copyright (c) 2022 Lodz University of Technology
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, version 3.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 */
14#include "math.hpp"
15
16 namespace plask {
17
18 template std::complex<double> parse_complex<double>(std::string str_to_parse);
19
20 AccurateSum &AccurateSum::operator=(double v) {
21 s = v;
22 c = 0.0;
23 return *this;
24}
25
26//Kahan and Babuska summation, Neumaier variant.
27//(better than Kahan method? https://github.com/JuliaLang/julia/issues/199)
28/*AccurateSum& AccurateSum::operator+=(double v) {
29 const double t = s + v;
30 if (std::abs(s) >= std::abs(v))
31 c += (s - t) + v;
32 else
33 c += (v - t) + s;
34 s = t;
35 return *this;
36}
37
38 operator double() const { return s + c; }
39
40 AccurateSum& AccurateSum::operator+=(const AccurateSum& other) {
41 *this += other.s;
42 *this += other.c;
43 return *this;
44}*/
45
46 AccurateSum &AccurateSum::operator+=(const AccurateSum &other) {
47 *this += -other.c;
48 *this += other.s;
49 return *this;
50}
51
52 AccurateSum &AccurateSum::operator+=(double v) {
53 const double y = v - c; // compensed value to add
54 const double news = s + y; // new sum
55 c = (news - s) - y; // news is to hight by c (algebraically, c should always be zero, typically c is negative)
56 s = news; // we will substract c from sum next time
57 return *this;
58}
59
60} // namespace plask