// The core Mandelbrot calculation function in double precision
inline int CalcMandelbrotDS(const dfloat xPos, const dfloat yPos, 
							const dfloat xJParam, const dfloat yJParam, const int crunch, const bool isJulia)
{
    dfloat x, y, xx, yy, sum;
    int i = crunch;

	dfloat xC, yC ;
	if(isJulia) {
		dseq(xC, xJParam) ;     // xC0 = xJParam ;
		dseq(yC, yJParam) ;     // yC0 = yJParam ;
		dseq(y, yPos);      // y = yPos;
		dseq(x, xPos);      // x = xPos;
		dsmul(yy, y, y);    // yy = y * y;
		dsmul(xx, x, x);	// xx = x * x;
		dsadd(sum, xx, yy); // sum = xx + yy;
	}
	else {
		dseq(xC, xPos) ;     // xC = xPos ;
		dseq(yC, yPos) ;     // yC = yPos ;
		dsdeq(y, 0.0) ;	// y = 0 ;
		dsdeq(x, 0.0) ;	// x = 0 ;
		dsdeq(yy, 0.0) ;   // yy = 0 ;
		dsdeq(xx, 0.0) ;   // xx = 0 ;
		dsdeq(sum, 0.0) ;   // sum = 0 ;
	}
    while (--i && (sum[0] < 4.0f)) {
        dsmul(y, x, y);     // y = x * y * 2.0f + yC ;
        dsadd(y, y, y);
        dsadd(y, y, yC);

        dssub(x, xx, yy);   //  x = xx - yy + xC ;
        dsadd(x, x, xC);

        dsmul(yy, y, y);    // yy = y * y;
        dsmul(xx, x, x);    // xx = x * x;
        dsadd(sum, xx, yy); // sum = xx + yy;
    }
    return i;
} // CalcMandelbrotDS
示例#2
0
/**
 * Subtraction by assignment
 */
inline HALMD_GPU_ENABLED dsfloat& operator-=(dsfloat& v, dsfloat const& w)
{
    dssub(v.hi, v.lo, v.hi, v.lo, w.hi, w.lo);
    return v;
}