Adjust need size for locale radix.
Whitespace only: line breaks before elses.
Zero is better longdblkind for "no long double" than -1.

(zero = long double is double, -1 = unknown long double)
Use XDIGIT_VALUE().
Comment tweaks.
On literal hexadecimal floats use uquad, not UV.

Since it is possible to have quads but not use64bitint.
Big endian frexp+ldexp byte extraction was wrong.
In frexp+ldexp path simply prefer Uquad_t to UV.
Try preparing for weird UVSIZE or NV_MANT_DIG.

(UVSIZE=4 and no quad, or NV_MANT_DIG=106, where quad would not help.)