First of all, you should settle on using "float" instead of "double" on Arduino's. If the question is about how to convert a "double" to an array of bytes and transmit them, then use memcpy:
double d = 3.141;
unsigned char b[sizeof(double)];
//Transmit
memcpy(b, &d, sizeof(double));
for (byte i = 0; i < sizeof(double); i++) someThing.write(b[i]);
//Receive
for (byte i = 0; i < sizeof(double); i++) b[i] = someThing.read();
memcpy(&d, b, sizeof(double));
Yes, it's almost two years old, but it has the exact Subject for this, so...
Here is what I cobbled together some time ago, using someone's non-working version as a starting point. I thank them for the incentive.
I have not put it through the ringer of extremes - it seems to work for my normal range of real-world needs so I leave it alone.
//Ex.) char cVal[10]; float fVal=((22.0 /7.0)*256)-46.85;
// dtoa(fVal,cVal,4); Serial.println (String(cVal));
//arguments...
// float-double value, char array to fill, precision (4 is .xxxx)
//and... it rounds last digit
char* dtoa(double dN, char *cMJA, int iP) {
char *ret = cMJA; long lP=1; byte bW=iP;
while (bW>0) { lP=lP*10; bW--; }
long lL = long(dN); double dD=(dN-double(lL))* double(lP);
if (dN>=0) { dD=(dD + 0.5); } else { dD=(dD-0.5); }
long lR=abs(long(dD)); lL=abs(lL);
if (lR==lP) { lL=lL+1; lR=0; }
if ((dN<0) & ((lR+lL)>0)) { *cMJA++ = '-'; }
ltoa(lL, cMJA, 10);
if (iP>0) { while (*cMJA != '\0') { cMJA++; } *cMJA++ = '.'; lP=10;
while (iP>1) { if (lR< lP) { *cMJA='0'; cMJA++; } lP=lP*10; iP--; }
ltoa(lR, cMJA, 10); } return ret; }