File indexing completed on 2025-02-21 10:16:42
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #ifndef INV_H_
0026 #define INV_H_
0027
0028 #include "vdtcore_common.h"
0029 #include "sqrt.h"
0030 #include <cmath>
0031 #include <limits>
0032
0033 namespace vdt{
0034
0035
0036
0037
0038 inline double fast_inv_general(double x, const uint32_t isqrt_iterations) {
0039 const uint64_t sign_mask = details::getSignMask(x);
0040 const double sqrt_one_over_x = fast_isqrt_general(std::fabs(x),
0041 isqrt_iterations);
0042 return sqrt_one_over_x*(details::dpORuint64(sqrt_one_over_x , sign_mask ));
0043 }
0044
0045
0046
0047
0048 inline double fast_inv(double x) {return fast_inv_general(x,4);}
0049
0050
0051
0052
0053 inline double fast_approx_inv(double x) {return fast_inv_general(x,3);}
0054
0055
0056
0057
0058 inline double inv (double x) {return 1./x;}
0059
0060
0061
0062
0063
0064
0065
0066 inline float fast_invf_general(float x, const uint32_t isqrt_iterations) {
0067 const uint32_t sign_mask = details::getSignMask(x);
0068 const float sqrt_one_over_x = fast_isqrtf_general(std::fabs(x),
0069 isqrt_iterations);
0070 return sqrt_one_over_x*(details::spORuint32(sqrt_one_over_x , sign_mask ));
0071 }
0072
0073
0074
0075
0076 inline float fast_invf(float x) {return fast_invf_general(x,2);}
0077
0078
0079
0080
0081 inline float fast_approx_invf(float x) {return fast_invf_general(x,1);}
0082
0083
0084
0085
0086 inline float invf (float x) {return 1.f/x;}
0087
0088
0089
0090 void invv(const uint32_t size, double const * __restrict__ iarray, double* __restrict__ oarray);
0091 void fast_invv(const uint32_t size, double const * __restrict__ iarray, double* __restrict__ oarray);
0092 void fast_approx_invv(const uint32_t size, double const * __restrict__ iarray, double* __restrict__ oarray);
0093 void invfv(const uint32_t size, float const * __restrict__ iarray, float* __restrict__ oarray);
0094 void fast_invfv(const uint32_t size, float const * __restrict__ iarray, float* __restrict__ oarray);
0095 void fast_approx_invfv(const uint32_t size, float const * __restrict__ iarray, float* __restrict__ oarray);
0096
0097 }
0098
0099 #endif