JCL : Thanks again for help and explainations. The reasons I was going wrong was several-fold.
1> Like bunsen, I was not aware that literal constants get "truncated" to ONLY 'float' or 'int' types.
2> I was (also?) under the MISTAKEN belief that by putting a re-cast operator, like (double), at the
start of the expression would then 'crowbar' any contstants, or intermediate values/results,
into that type, and therefore that level of precision. I WAS WRONG..!!

!! See, it can happen

3> Thanks for your reply to MMike giving us the list of precisions IN DIGITS of the different types.
I could never "decrypt" the manual for that information. Any chance that info could be added/clarified
to the manual as one simple sentence in the "Variables" page? And maybe mention constants are only float or int?
4> As for 'diag_var' truncation down to 9 digits, I WAS already aware.
Again, many thanks for your patience and knowledge.
MMike : I think your "CONV:DOUBLE::DOUBLE" problem is that you are using the (double) like this,
double xyz = 12345;
double abc = (double)xyz;You cant convert a double TO a double, cause it already is.
Whereas I was going from a constant to a double, which is OK.