Advertisement
uaa

[wip:20230104] my_fcvt(), my_gcvt() test

uaa
Jan 4th, 2023
85
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 <millert@openbsd.org>
  5. *
  6. * Modified for my_fcvt() and my_gcvt()
  7. * by SASANO Takayoshi <uaa@cvs.openbsd.org>
  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, s;
  109. static char buf[FCVT_BUFFER_SIZE];
  110. char tmp[FCVT_BUFFER_SIZE], *p = tmp, *q;
  111.  
  112. s = m = n = 0;
  113.  
  114. if (ndigit == 0) {
  115. *p = '\0';
  116.  
  117. } else if (ndigit > 0) {
  118. snprintf(tmp, sizeof(tmp), "%#+.*f", ndigit, value);
  119. s = (*p == '-');
  120. p++;
  121.  
  122. if (value == 0.0f) {
  123. p += 2;
  124. } else if (*p == '0') {
  125. p += 2;
  126. for (n = 0; *p == '0'; p++, n--);
  127. } else {
  128. q = strchr(p, '.');
  129. m = q - p;
  130. memcpy(buf, p, m);
  131. p += m + 1;
  132. }
  133.  
  134. } else {
  135. // XXX ndigit < 0 not supported
  136. return NULL;
  137.  
  138. }
  139.  
  140. if (sign != NULL) *sign = s;
  141. if (decpt != NULL) *decpt = m + n;
  142.  
  143. strcpy(buf + m, p);
  144. return buf;
  145. }
  146.  
  147. static int
  148. dotest_gcvt(struct test_vector *tv)
  149. {
  150. char buf0[256], buf1[256];
  151.  
  152. gcvt(tv->d, tv->ndig, buf0);
  153. my_gcvt(tv->d, tv->ndig, buf1);
  154. if (strcmp(buf0, buf1)) {
  155. fprintf(stderr, "%g @ %d: expected %s got %s\n",
  156. tv->d, tv->ndig, buf0, buf1);
  157. return 1;
  158. }
  159. return 0;
  160. }
  161.  
  162. static int
  163. dotest_fcvt(struct test_vector *tv)
  164. {
  165. char *p, buf0[256], buf1[256];
  166. int decpt0, decpt1, sign0, sign1;
  167.  
  168. decpt0 = sign0 = 0;
  169. memset(buf0, 0, sizeof(buf0));
  170. p = fcvt(tv->d, tv->ndig, &decpt0, &sign0);
  171. if (p != NULL)
  172. strcpy(buf0, p);
  173.  
  174. decpt1 = sign1 = 0;
  175. memset(buf1, 0, sizeof(buf1));
  176. p = my_fcvt(tv->d, tv->ndig, &decpt1, &sign1);
  177. if (p != NULL)
  178. strcpy(buf1, p);
  179.  
  180. if (strcmp(buf0, buf1) || decpt0 != decpt1 || sign0 != sign1) {
  181. fprintf(stderr, "%g @ %d: expected %s %d %d got %s %d %d\n",
  182. tv->d, tv->ndig,
  183. buf0, decpt0, sign0, buf1, decpt1, sign1);
  184. return 1;
  185. }
  186.  
  187. return 0;
  188. }
  189.  
  190. int
  191. main(int argc, char *argv[])
  192. {
  193. int i, failures = 0;
  194.  
  195. for (i = 0; i < NTESTVEC; i++) {
  196. failures += dotest_gcvt(&test_vectors[i]);
  197. }
  198.  
  199. for (i = 0; i < NTESTVEC; i++) {
  200. failures += dotest_fcvt(&test_vectors[i]);
  201. }
  202.  
  203. return failures;
  204. }
  205.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement