Advertisement
uaa

[wip:20221231] my_fcvt(), my_gcvt() test2

uaa
Dec 30th, 2022
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.77 KB | None | 0 0
  1. /* $OpenBSD: gcvt_test.c,v 1.5 2019/01/25 00:19:26 millert Exp $ */
  2.  
  3. /*
  4. * Public domain, 2010, Todd C. Miller <[email protected]>
  5. *
  6. * Modified for my_fcvt() and my_gcvt()
  7. * by SASANO Takayoshi <[email protected]>
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13.  
  14. static struct test_vector {
  15. double d;
  16. int ndig;
  17. } test_vectors[] = {
  18. /* adapted from perl's Configure test */
  19. { 0.1, 8, },
  20. { 0.01, 8, },
  21. { 0.001, 8, },
  22. { 0.0001, 8, },
  23. { 0.00009, 8, },
  24. { 1.0, 8, },
  25. { 1.1, 8, },
  26. { 1.01, 8, },
  27. { 1.001, 8, },
  28. { 1.0001, 8, },
  29. { 1.00001, 8, },
  30. { 1.0, 8, },
  31. { 0.0, 8, },
  32. { -1.0, 8, },
  33. { 100000, 8, },
  34. { -100000, 8, },
  35. { 123.456, 8, },
  36. { 1e34, 8, },
  37. /* adapted from emx */
  38. { 0.0, -1, },
  39. { 0.0, 0, },
  40. { 0.0, 1, },
  41. { 0.0, 2, },
  42. { 1.0, -1, },
  43. { 1.0, 0, },
  44. { 1.0, 2, },
  45. { 1.0, 10, },
  46. { 1.236, -1, },
  47. { 1.236, 0, },
  48. { 1.236, 1, },
  49. { 1.236, 2, },
  50. { 1.236, 3, },
  51. { 1.236, 4, },
  52. { 1.236, 5, },
  53. { 1.236, 6, },
  54. { 12.36, -1, },
  55. { 12.36, 0, },
  56. { 12.36, 1, },
  57. { 12.36, 2, },
  58. { 12.36, 3, },
  59. { 12.36, 4, },
  60. { 12.36, 5, },
  61. { 12.36, 6, },
  62. { 123.6, -1, },
  63. { 123.6, 0, },
  64. { 123.6, 1, },
  65. { 123.6, 2, },
  66. { 123.6, 3, },
  67. { 123.6, 4, },
  68. { 123.6, 5, },
  69. { 123.6, 6, },
  70. { 1236, -1, },
  71. { 1236.0, 0, },
  72. { 1236.0, 1, },
  73. { 1236.0, 2, },
  74. { 1236.0, 3, },
  75. { 1236.0, 4, },
  76. { 1236.0, 5, },
  77. { 1236.0, 6, },
  78. { 1e100, 10, },
  79. { 1e100, 20, },
  80. { 0.01236, -1, },
  81. { 0.01236, 0, },
  82. { 0.01236, 1, },
  83. { 0.01236, 2, },
  84. { 0.01236, 3, },
  85. { 0.01236, 4, },
  86. { 1e-100, 20, },
  87. { 1e-100, -1, },
  88. { -1.2, 5, },
  89. { -0.03, 5, },
  90. { 0.1, 1, },
  91. { 0.1, 0, },
  92. { 0.099999, 10, },
  93. { 0.99999, 10, },
  94. };
  95.  
  96. #define NTESTVEC (sizeof(test_vectors) / sizeof(test_vectors[0]))
  97.  
  98. char *my_gcvt(double value, int ndigit, char *buf)
  99. {
  100. sprintf(buf, "%.*g", ndigit, value);
  101. return buf;
  102. }
  103.  
  104. char *my_fcvt(double value, int ndigit, int *decpt, int *sign)
  105. {
  106. #define FCVT_BUFFER_SIZE 512
  107.  
  108. int m, n;
  109. static char buf[FCVT_BUFFER_SIZE];
  110. char tmp[FCVT_BUFFER_SIZE], *p = tmp, *q;
  111.  
  112. if (ndigit < 0) {
  113. fprintf(stderr, "my_fcvt: ndigit %d\n", ndigit);
  114. return NULL;
  115. }
  116.  
  117. snprintf(tmp, sizeof(tmp), "%#+.*f", ndigit, value);
  118. if (sign != NULL) *sign = (*p == '-');
  119. p++;
  120. if (ndigit == 0) {
  121. *p = '\0';
  122. m = n = 0;
  123. } else if (value == 0.0f) {
  124. p += 2;
  125. m = n = 0;
  126. } else if (*p == '0') {
  127. p += 2;
  128. m = 0;
  129. for (n = 0; *p == '0'; p++, n--);
  130. } else {
  131. q = strchr(p, '.');
  132. m = q - p;
  133. memcpy(buf, p, m);
  134.  
  135. p += m + 1;
  136. n = 0;
  137. }
  138.  
  139. strcpy(buf + m, p);
  140. if (decpt != NULL) *decpt = m + n;
  141. return buf;
  142. }
  143.  
  144. static int
  145. dotest_gcvt(struct test_vector *tv)
  146. {
  147. char buf0[256], buf1[256];
  148.  
  149. gcvt(tv->d, tv->ndig, buf0);
  150. my_gcvt(tv->d, tv->ndig, buf1);
  151. if (strcmp(buf0, buf1)) {
  152. fprintf(stderr, "%g @ %d: expected %s got %s\n",
  153. tv->d, tv->ndig, buf0, buf1);
  154. return 1;
  155. }
  156. return 0;
  157. }
  158.  
  159. static int
  160. dotest_fcvt(struct test_vector *tv)
  161. {
  162. char *p, buf0[256], buf1[256];
  163. int decpt0, decpt1, sign0, sign1;
  164.  
  165. decpt0 = sign0 = 0;
  166. memset(buf0, 0, sizeof(buf0));
  167. p = fcvt(tv->d, tv->ndig, &decpt0, &sign0);
  168. if (p != NULL)
  169. strcpy(buf0, p);
  170.  
  171. decpt1 = sign1 = 0;
  172. memset(buf1, 0, sizeof(buf1));
  173. p = my_fcvt(tv->d, tv->ndig, &decpt1, &sign1);
  174. if (p != NULL)
  175. strcpy(buf1, p);
  176.  
  177. if (strcmp(buf0, buf1) || decpt0 != decpt1 || sign0 != sign1) {
  178. fprintf(stderr, "%g @ %d: expected %s %d %d got %s %d %d\n",
  179. tv->d, tv->ndig,
  180. buf0, decpt0, sign0, buf1, decpt1, sign1);
  181. return 1;
  182. }
  183.  
  184. return 0;
  185. }
  186.  
  187. int
  188. main(int argc, char *argv[])
  189. {
  190. int i, failures = 0;
  191.  
  192. for (i = 0; i < NTESTVEC; i++) {
  193. failures += dotest_gcvt(&test_vectors[i]);
  194. }
  195.  
  196. for (i = 0; i < NTESTVEC; i++) {
  197. failures += dotest_fcvt(&test_vectors[i]);
  198. }
  199.  
  200. return failures;
  201. }
  202.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement