diff --git a/src/Makefile.am b/src/Makefile.am index da5d88e799c9d4b1d328092f5abccec32668deb9..cd100392ac7fd1712c04e64681edf6d0a2de517e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -44,7 +44,7 @@ AM_SOURCES = space.c runner.c queue.c task.c cell.c engine.c \ kernel.c tools.c part.c # Include files for distribution, not installation. -noinst_HEADERS = atomic.h cycle.h error.h inline.h kernel.h vector.h \ +noinst_HEADERS = approx_math.h atomic.h cycle.h error.h inline.h kernel.h vector.h \ runner_doiact.h runner_doiact_grav.h units.h intrinsics.h \ hydro.h hydro_io.h gravity.h hydro/*/*.h gravity/*/*.h diff --git a/src/approx_math.h b/src/approx_math.h new file mode 100644 index 0000000000000000000000000000000000000000..ef93ea63c383c74caa3eaff65446962872389a35 --- /dev/null +++ b/src/approx_math.h @@ -0,0 +1,33 @@ +/******************************************************************************* + * This file is part of SWIFT. + * Copyright (c) 2016 Matthieu Schaller matthieu.schaller@durham.ac.uk) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + ******************************************************************************/ +#ifndef SWIFT_APPROX_MATH_H +#define SWIFT_APPROX_MATH_H + +/** + * @brief Approximate version of expf(x) using a 4th order Taylor expansion + * + * The absolute error is of order 10^-6 for -0.2 < x < 0.2. + * + * @param x The number to take the exponential of. + */ +__attribute__((always_inline)) INLINE static float approx_expf(float x) { + return 1.f + x * (1.f + x * (0.5f + x * (1.f / 6.0f + 1.f / 24.0f * x))); +} + +#endif /* SWIFT_APPROX_MATH_H */