RyanJsonBaseTestEqualityDouble.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "RyanJsonBaseTest.h"
  2. #define DoubleList \
  3. /* ========== 零值测试 ========== */ \
  4. X(0.0) \
  5. /* ========== 正负整数边界 ========== */ \
  6. X(1.0) \
  7. X(-1.0) \
  8. X(2.0) \
  9. X(-2.0) \
  10. X(10.0) \
  11. X(-10.0) \
  12. X(100.0) \
  13. X(1000.0) \
  14. X(10000.0) \
  15. X(100000.0) \
  16. /* ========== 简单小数(二进制精确表示) ========== */ \
  17. X(0.5) \
  18. X(-0.5) \
  19. X(0.25) \
  20. X(-0.25) \
  21. X(0.125) \
  22. X(0.0625) \
  23. X(0.03125) \
  24. X(0.015625) \
  25. /* ========== 常见小数 ========== */ \
  26. X(16.89) \
  27. X(-16.89) \
  28. X(123.456) \
  29. X(-123.456) \
  30. X(99.99) \
  31. X(-99.99) \
  32. X(1.5) \
  33. X(2.5) \
  34. X(3.5) \
  35. /* ========== 小于1的小数 ========== */ \
  36. X(0.001) \
  37. X(-0.001) \
  38. X(0.0001) \
  39. X(0.00001) \
  40. X(0.000001) \
  41. X(0.123456789) \
  42. X(0.987654321) \
  43. X(0.111111111111111) \
  44. /* ========== 大数测试 ========== */ \
  45. X(999999.999999) \
  46. X(-999999.999999) \
  47. X(12345678.9) \
  48. X(99999999.0) \
  49. X(123456789.123456) \
  50. X(9876543210.12345) \
  51. /* ========== 科学计数法 - 大数 ========== */ \
  52. X(1.5e10) \
  53. X(-1.5e10) \
  54. X(1.23e8) \
  55. X(9.99e12) \
  56. X(1.0e15) \
  57. X(1.0e18) \
  58. X(1.0e20) \
  59. X(5.55e15) \
  60. /* ========== 科学计数法 - 小数 ========== */ \
  61. X(1.5e-10) \
  62. X(-1.5e-10) \
  63. X(9.87e-5) \
  64. X(1.0e-15) \
  65. X(5.5e-8) \
  66. X(1.0e-18) \
  67. X(1.0e-20) \
  68. X(1.23e-3) \
  69. X(-9.87e-7) \
  70. /* ========== 数学常量 ========== */ \
  71. X(3.14159265358979) \
  72. X(2.71828182845904) \
  73. X(1.41421356237309) \
  74. X(1.73205080756888) \
  75. X(1.61803398874989) \
  76. X(0.69314718055994) \
  77. /* ========== 浮点精度经典测试 ========== */ \
  78. X(0.1) \
  79. X(0.2) \
  80. X(0.3) \
  81. X(0.6) \
  82. X(0.7) \
  83. X(0.9) \
  84. X(0.123456) \
  85. /* ========== 整数边界值 ========== */ \
  86. X(2147483647.0) \
  87. X(-2147483648.0) \
  88. X(4294967295.0) \
  89. X(9007199254740991.0) \
  90. X(-9007199254740991.0) \
  91. /* ========== 极端小值 ========== */ \
  92. X(1.0e-100) \
  93. X(-1.0e-100) \
  94. X(1.0e-200) \
  95. X(1.0e-300) \
  96. X(2.225073858507201e-308) \
  97. /* ========== 极端大值 ========== */ \
  98. X(1.0e100) \
  99. X(-1.0e100) \
  100. X(1.0e200) \
  101. X(1.0e300) \
  102. X(1.797693134862315e308) \
  103. /* ========== 特殊精度值 ========== */ \
  104. X(1.0000000000001) \
  105. X(0.9999999999999) \
  106. X(1.23456789012345) \
  107. X(9.87654321098765) \
  108. /* ========== 重复数字模式 ========== */ \
  109. X(1.1111111111111) \
  110. X(2.2222222222222) \
  111. X(9.9999999999999) \
  112. /* ========== 混合符号和指数 ========== */ \
  113. X(-1.23e-45) \
  114. X(-9.87e67) \
  115. X(1.11e-11) \
  116. X(-2.22e22)
  117. static const double DoubleValueTable[] = {
  118. #define X(a) a,
  119. DoubleList
  120. #undef X
  121. };
  122. static const char *DoubleStringTable[] = {
  123. #define X(a) "{\"double\":" #a "}",
  124. DoubleList
  125. #undef X
  126. };
  127. // 浮点数一致性测试
  128. RyanJsonBool_e RyanJsonBaseTestEqualityDouble(void)
  129. {
  130. for (uint32_t i = 0; i < sizeof(DoubleValueTable) / sizeof(DoubleValueTable[0]); i++)
  131. {
  132. const char *jsondoubleStr = DoubleStringTable[i];
  133. RyanJson_t jsonRoot = RyanJsonParse(jsondoubleStr);
  134. RyanJsonCheckCode(NULL != jsonRoot, {
  135. jsonLog("str: %s", jsondoubleStr);
  136. goto err;
  137. });
  138. RyanJsonCheckReturnFalse(NULL != jsonRoot);
  139. RyanJsonCheckReturnFalse(RyanJsonIsDouble(RyanJsonGetObjectToKey(jsonRoot, "double")));
  140. // 验证解析后的数值是否正确
  141. double doubleValue = RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(jsonRoot, "double"));
  142. RyanJsonCheckCode(RyanJsonCompareDouble(doubleValue, DoubleValueTable[i]), {
  143. jsonLog("str: %s, expected: %g, got: %g", jsondoubleStr, DoubleValueTable[i], doubleValue);
  144. RyanJsonDelete(jsonRoot);
  145. goto err;
  146. });
  147. // 验证序列化后再解析,然后判断double是否一致(往返测试)
  148. char *serializedStr = RyanJsonPrint(jsonRoot, 128, RyanJsonFalse, NULL);
  149. RyanJsonCheckCode(NULL != serializedStr, {
  150. printf("serializedStr: %s, doubleString: %s, doubleValue: %g\r\n", serializedStr, jsondoubleStr, doubleValue);
  151. goto err;
  152. });
  153. RyanJsonDelete(jsonRoot);
  154. RyanJson_t roundtripJson = RyanJsonParse(serializedStr);
  155. RyanJsonFree(serializedStr);
  156. RyanJsonCheckReturnFalse(NULL != roundtripJson);
  157. RyanJsonCheckReturnFalse(RyanJsonIsDouble(RyanJsonGetObjectToKey(roundtripJson, "double")));
  158. double roundtripValue = RyanJsonGetDoubleValue(RyanJsonGetObjectToKey(roundtripJson, "double"));
  159. RyanJsonCheckCode(RyanJsonCompareDouble(roundtripValue, DoubleValueTable[i]), {
  160. jsonLog("roundtrip failed: expected: %g, got: %g ", DoubleValueTable[i], roundtripValue);
  161. RyanJsonDelete(roundtripJson);
  162. goto err;
  163. });
  164. RyanJsonDelete(roundtripJson);
  165. }
  166. return RyanJsonTrue;
  167. err:
  168. return RyanJsonFalse;
  169. }