fixpttest.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:3k
源码类别:

Symbian

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TIMING 1
  4. #include "math64.h"
  5. int NTESTS = 100000 ;
  6. #define N 1024
  7. int a[N], b[N], c[N] ;
  8. int tests, i;
  9. void randomize(int a[])
  10. {
  11. int i ;
  12. for (i=0; i < N; i++)
  13. a[i] = (rand() << 16) ;
  14. }
  15. int test_window(void)
  16. {
  17. for (i = 0; i < N; i++)
  18. {
  19. c[i] = MulShift32(a[i], b[i]) ;
  20. }
  21. for (i = 0; i < N; i++)
  22. {
  23. if (c[i] != (a[i] >> 16) * (b[i] >> 16))
  24. {
  25. return 1 ;
  26. }
  27. }
  28. return 0 ;
  29. }
  30. void time_window(void)
  31. {
  32. printf("time window: ");
  33. TICK() ;
  34. for (tests=0; tests < NTESTS; tests++)
  35. {
  36. for (i = 0; i < N; i++)
  37. {
  38. c[i] = MulShift32(a[i], b[i]) ;
  39. }
  40. }
  41. TOCK(N*NTESTS) ;
  42. return ;
  43. }
  44. int test_commutator(void)
  45. {
  46. for (i = 0; i < N; i++)
  47. {
  48. c[i] = MulShift32(a[i], b[i]) - MulShift32(b[i],a[i]) ;
  49. }
  50. for (i = 0; i < N; i++)
  51. {
  52. if (c[i] != 0)
  53. {
  54. return 1 ;
  55. }
  56. }
  57. return 0 ;
  58. }
  59. void time_commutator(void)
  60. {
  61. printf("time commutator: ");
  62. TICK() ;
  63. for (tests=0; tests < NTESTS; tests++)
  64. {
  65. for (i = 0; i < N; i++)
  66. {
  67. c[i] = MulShift32(a[i], b[i]) - MulShift32(b[i],a[i]) ;
  68. }
  69. }
  70. TOCK(N * NTESTS) ;
  71. }
  72. int test_smul(void)
  73. {
  74. for (tests=0; tests < NTESTS; tests++)
  75. {
  76. int b = rand() << 16 ;
  77. for (i = 0; i < N; i++)
  78. {
  79. c[i] = MulShift32(a[i], b) ;
  80. }
  81. for (i = 0; i < N; i++)
  82. {
  83. if (c[i] != (a[i] >> 16) * (b >> 16))
  84. {
  85. return 1 ;
  86. }
  87. }
  88. }
  89. return 0 ;
  90. }
  91. void time_smul(void)
  92. {
  93. printf("time left mul: ");
  94. TICK() ;
  95. for (tests=0; tests < NTESTS; tests++)
  96. {
  97. int b = rand() << 16 ;
  98. for (i = 0; i < N; i++)
  99. {
  100. c[i] = MulShift32(a[i], b) ;
  101. }
  102. }
  103. TOCK(NTESTS * N) ;
  104. printf("time right mul: ");
  105. TICK() ;
  106. for (tests=0; tests < NTESTS; tests++)
  107. {
  108. int b = rand() << 16 ;
  109. for (i = 0; i < N; i++)
  110. {
  111. c[i] = MulShift32(b, a[i]) ;
  112. }
  113. }
  114. TOCK(NTESTS * N) ;
  115. }
  116. int test_mulshiftN(void)
  117. {
  118. for (tests=0; tests < NTESTS; tests++)
  119. {
  120. int a = (rand() & 0xffff) << 15 ;
  121. int b = (rand() & 0xffff) << 14 ;
  122. int a32 = MulShift32(a,b) ;
  123. int a31 = MulShift31(a,b) ;
  124. int a30 = MulShift30(a,b) ;
  125. int b32 = MulShiftN(a,b,32) ;
  126. int b31 = MulShiftN(a,b,31) ;
  127. int b30 = MulShiftN(a,b,30) ;
  128. if (a32 != a30 >> 2 || a31 != a30 >> 1 ||
  129.     (b30 ^ a30) > 3 || (b31 ^ a31) > 3)
  130. return 1 ;
  131. }
  132. return 0 ;
  133. }
  134. void time_muldiv(void)
  135. {
  136. printf("time MulDiv64: ");
  137. TICK() ;
  138. for (tests=0; tests < NTESTS; tests++)
  139. {
  140. for (i = 0; i < N; i++)
  141. {
  142. c[i] = MulDiv64(a[i],b[i],(1UL<<31)-1) ;
  143. }
  144. }
  145. TOCK(NTESTS * N) ;
  146. }
  147. int main(int ac, char *av[])
  148. {
  149. char *msg[2] = {"passed","failed"} ;
  150. int err ;
  151. randomize(a) ;
  152. randomize(b) ;
  153. printf("commutator test: %sn", msg[err = test_commutator()]);
  154. if (err)
  155. return 20 ;
  156. printf("smul test: %sn", msg[err = test_smul()]);
  157. if (err)
  158. return 20 ;
  159. printf("window test: %sn", msg[err = test_window()]);
  160. if (err)
  161. return 20 ;
  162. printf("mulshiftN test: %sn", msg[err = test_mulshiftN()]);
  163. if (err)
  164. return 20 ;
  165. time_commutator() ;
  166. time_smul() ;
  167. time_window() ;
  168. time_muldiv() ;
  169. return 0 ;
  170. }