This function works incorrectly in case when argument is of long double type and precision is set to zero. For example, call printf( "%.0LA", ( long double ) 0x0.FFFFp+0 ); will output string "0XP+8" with character number 1 missing between "X" and "P" instead of "0X1P+0".
Actually, the output contains something between X and P. It's '\1', not '1'. That's fixed now.