Float - platform-dependent most precise float type available, e.g. an alias of
Extended on x86, which takes up 10 bytes (80 bits); supported only via the old x87 instructions (not vectorizable, inefficient) - use only if you have concrete (measurable) evidence that
Double doesn't have enough precision for your use case
Double - takes up 8 bytes (64 bits); very good precision that IMO far outweighs its larger memory footprint compared to
Single; most scalar instructions (multiply, add) are as fast as the corresponding
Single versions
Single - takes up 4 bytes (32 bits); good for very large amounts of data where precision isn't the main concern (such as 3D model data)
Real - platform-dependent alias of either
Double (if an FPU is available) or
Single (if floating-point support must be emulated in software); de facto equivalent to
Double on x86 and ARM (A-profile)
Personally I'd stick to
Double almost everywhere.