diff --git a/BSP_1_D/bsp_1_d.cbp b/BSP_1_D/bsp_1_d.cbp new file mode 100644 index 0000000..b750014 --- /dev/null +++ b/BSP_1_D/bsp_1_d.cbp @@ -0,0 +1,40 @@ + + + + + + diff --git a/BSP_1_D/bsp_1_d.cpp b/BSP_1_D/bsp_1_d.cpp new file mode 100644 index 0000000..6125d10 --- /dev/null +++ b/BSP_1_D/bsp_1_d.cpp @@ -0,0 +1,34 @@ +#include "bsp_1_d.h" + +#include // assert() +#include + +using namespace std; + +double scalar(vector const &x, vector const &y) +{ + assert(x.size() == y.size()); // switch off via compile flag: -DNDEBUG + size_t const N = x.size(); + double sum = 0.0; + for (size_t i = 0; i < N; ++i) + { + sum += x[i] * y[i]; + } + return sum; +} + +double Kahan_skalar(vector const &x, vector const &y) +{ + assert(x.size() == y.size()); // switch off via compile flag: -DNDEBUG + size_t const N = x.size(); + double sum = 0.0; + double c = 0.0; + for (size_t i = 0; i < N; ++i) + { + double z = x[i]*y[i] - c; + double t = sum + z; + c = (t - sum) - z; + sum = t; + } + return sum; +} diff --git a/BSP_1_D/bsp_1_d.h b/BSP_1_D/bsp_1_d.h new file mode 100644 index 0000000..097ba0c --- /dev/null +++ b/BSP_1_D/bsp_1_d.h @@ -0,0 +1,25 @@ +#ifndef BSP_1_D_H_INCLUDED +#define BSP_1_D_H_INCLUDED + +#include + +/** \brief Berechnet das Skalarprodukt zweier Vektoren + * + * \param[in] x erster Vektor + * \param[in] y zweiter Vektor + * \return Skalarprodukt von @x und @y + * + */ +double scalar(std::vector const &x, std::vector const &y); + + +/** \brief Berechnet das Skalarprodukt zweier Vektoren unter Anwendung der Kahan-Summation + * + * \param[in] x erster Vektor + * \param[in] y zweiter Vektor + * \return Skalarprodukt von @x und @y + * + */ +double Kahan_skalar(std::vector const &x, std::vector const &y); + +#endif // BSP_1_D_H_INCLUDED diff --git a/BSP_1_D/main.cpp b/BSP_1_D/main.cpp new file mode 100644 index 0000000..d57d121 --- /dev/null +++ b/BSP_1_D/main.cpp @@ -0,0 +1,28 @@ +#include "bsp_1_d.h" +#include +#include +// BSP 1_D +using namespace std; + +int main() +{ + vector nvec{100,500,1000,10000,100000,1000000,10000000,100000000}; // Vektor mit verschiedene n zum Testen + double exact = M_PI*M_PI/6; + for(size_t k = 0; k x; + for(int i = 0; i