use double precision for large summations, #4408

This commit is contained in:
heckflosse 2018-02-21 14:28:54 +01:00
parent fc751a0cce
commit e69952d654
5 changed files with 13 additions and 14 deletions

View File

@ -42,7 +42,8 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl
}
//s is preconditionment of r. Without, direct to r.
float *s = r, rs = 0.0f;
float *s = r;
double rs = 0.0; // use double precision for large summations
if(Preconditioner != nullptr) {
s = new float[n];
@ -77,7 +78,7 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl
for(iterate = 0; iterate < MaximumIterates; iterate++) {
//Get step size alpha, store ax while at it.
float ab = 0.0f;
double ab = 0.0; // use double precision for large summations
Ax(ax, d, Pass);
#ifdef _OPENMP
#pragma omp parallel for reduction(+:ab)
@ -94,7 +95,7 @@ float *SparseConjugateGradient(void Ax(float *Product, float *x, void *Pass), fl
ab = rs / ab;
//Update x and r with this step size.
float rms = 0.0;
double rms = 0.0; // use double precision for large summations
#ifdef _OPENMP
#pragma omp parallel for reduction(+:rms)
#endif

View File

@ -70,7 +70,7 @@ void ImProcFunctions::PF_correct_RT(LabImage * src, LabImage * dst, double radiu
gaussianBlur (src->b, tmp1->b, src->W, src->H, radius);
}
float chromave = 0.0f;
double chromave = 0.0; // use double precision for large summations
#ifdef _OPENMP
#pragma omp parallel
@ -382,7 +382,7 @@ void ImProcFunctions::PF_correct_RTcam(CieImage * src, CieImage * dst, double ra
gaussianBlur (srbb, tmbb, src->W, src->H, radius);
}
float chromave = 0.0f;
double chromave = 0.0; // use double precision for large summations
#ifdef __SSE2__
@ -1042,7 +1042,7 @@ void ImProcFunctions::Badpixelscam(CieImage * src, CieImage * dst, double radius
// begin chroma badpixels
float chrommed = 0.f;
double chrommed = 0.0; // use double precision for large summations
#ifdef _OPENMP
#pragma omp parallel for reduction(+:chrommed)
#endif
@ -1646,7 +1646,7 @@ void ImProcFunctions::BadpixelsLab(LabImage * src, LabImage * dst, double radius
if(mode == 3) {
// begin chroma badpixels
float chrommed = 0.f;
double chrommed = 0.0; // use double precision for large summations
#ifdef _OPENMP
#pragma omp parallel for reduction(+:chrommed)
#endif

View File

@ -2002,8 +2002,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw
hist16Q.clear();
}
float sum = 0.f;
// float sumQ = 0.f;
double sum = 0.0; // use double precision for large summations
#ifdef _OPENMP
const int numThreads = min (max (width * height / 65536, 1), omp_get_max_threads());
@ -2023,7 +2022,6 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw
hist16Qthr.clear();
}
// #pragma omp for reduction(+:sum,sumQ)
#pragma omp for reduction(+:sum)

View File

@ -1271,7 +1271,7 @@ void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &aver
//find absolute mean
int countP = 0, countN = 0;
float averaP = 0.f, averaN = 0.f;
double averaP = 0.0, averaN = 0.0; // use double precision for large summations
float thres = 5.f;//different fom zero to take into account only data large enough
max = 0.f;
@ -1332,7 +1332,7 @@ void ImProcFunctions::Aver( float * RESTRICT DataList, int datalen, float &aver
void ImProcFunctions::Sigma( float * RESTRICT DataList, int datalen, float averagePlus, float averageNeg, float &sigmaPlus, float &sigmaNeg)
{
int countP = 0, countN = 0;
float variP = 0.f, variN = 0.f;
double variP = 0.0, variN = 0.0; // use double precision for large summations
float thres = 5.f;//different fom zero to take into account only data large enough
#ifdef _OPENMP
@ -1687,7 +1687,7 @@ void ImProcFunctions::WaveletcontAllL(LabImage * labco, float ** varhue, float *
float contrast = cp.contrast;
float multL = (float)contrast * (maxl - 1.f) / 100.f + 1.f;
float multH = (float) contrast * (maxh - 1.f) / 100.f + 1.f;
double avedbl = 0.f; // use double precision for big summations
double avedbl = 0.0; // use double precision for large summations
float max0 = 0.f;
float min0 = FLT_MAX;

View File

@ -276,7 +276,7 @@ float calculateGradients (Array2Df* H, Array2Df* G, int k, bool multithread)
const int width = H->getCols();
const int height = H->getRows();
const float divider = pow ( 2.0f, k + 1 );
float avgGrad = 0.0f;
double avgGrad = 0.0; // use double precision for large summations
#pragma omp parallel for reduction(+:avgGrad) if(multithread)