Fix preferred serialization of subnormals (#192)

Preferred Serialization now fully supports conversion to/from half, single and double subnormals. This includes NaN payloads.

The tests for floating-point are much better organized and give greater coverage. 

IEEE 754 code is better organized and cleaner.



* Fix preferred serialization of subnormals (checkpoint)

* Check point progress

* Preferred float mostly working and tests passing

* added NaN tests

* Fix up ieee754.h; a few other compiler warnings

* decoding NaN payloads fix; rework half-double; tests

* Code tidyness

* indent to 3, not 4

* TODO's are done in other test; code tidy

* test running with float HW use disabled

* Remove / rearrange float tests

* Fix full float ifdef test fan out

* Code tidiness; sort out final TODO's

---------

Co-authored-by: Laurence Lundblade <lgl@securitytheory.com>
diff --git a/src/qcbor_encode.c b/src/qcbor_encode.c
index 53df657..f52692a 100644
--- a/src/qcbor_encode.c
+++ b/src/qcbor_encode.c
@@ -768,9 +768,9 @@
 void QCBOREncode_AddDouble(QCBOREncodeContext *me, double dNum)
 {
 #ifndef QCBOR_DISABLE_PREFERRED_FLOAT
-   const IEEE754_union uNum = IEEE754_DoubleToSmallest(dNum);
+   const IEEE754_union uNum = IEEE754_DoubleToSmaller(dNum, true);
 
-   QCBOREncode_AddType7(me, uNum.uSize, uNum.uValue);
+   QCBOREncode_AddType7(me, (uint8_t)uNum.uSize, uNum.uValue);
 #else /* QCBOR_DISABLE_PREFERRED_FLOAT */
    QCBOREncode_AddDoubleNoPreferred(me, dNum);
 #endif /* QCBOR_DISABLE_PREFERRED_FLOAT */
@@ -794,9 +794,9 @@
 void QCBOREncode_AddFloat(QCBOREncodeContext *me, float fNum)
 {
 #ifndef QCBOR_DISABLE_PREFERRED_FLOAT
-   const IEEE754_union uNum = IEEE754_FloatToSmallest(fNum);
+   const IEEE754_union uNum = IEEE754_SingleToHalf(fNum);
 
-   QCBOREncode_AddType7(me, uNum.uSize, uNum.uValue);
+   QCBOREncode_AddType7(me, (uint8_t)uNum.uSize, uNum.uValue);
 #else /* QCBOR_DISABLE_PREFERRED_FLOAT */
    QCBOREncode_AddFloatNoPreferred(me, fNum);
 #endif /* QCBOR_DISABLE_PREFERRED_FLOAT */