fork download
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. #define M 251 // 4*(M-1)=小数点以下の桁数 (10 進)
  6. #define N 209 // 4*(N-1)=小数点以下の桁数 (16 進)
  7. // M-1≒1.204 (N-1)
  8.  
  9. void Add(unsigned a[], unsigned b[]);
  10. void Sub(unsigned a[], unsigned b[]);
  11. void Div(unsigned a[], unsigned d);
  12. void Mul(unsigned a[], unsigned d);
  13. void Dup(unsigned a[], unsigned b[]);
  14. void ATAN(unsigned x[], int m);
  15. int if_zero(unsigned a[]);
  16. void Display(unsigned a[]);
  17. void to_decimal(unsigned a[], unsigned w[]);
  18.  
  19.  
  20.  
  21. int main(){
  22. unsigned x[N], y[N];
  23.  
  24. ATAN(x, 5);
  25. Mul(x, 4);
  26.  
  27. ATAN(y, 239);
  28.  
  29. Sub(x, y);
  30. Mul(x, 4);
  31.  
  32. Display(x);
  33. return 0;
  34. }
  35.  
  36. void ATAN(unsigned x[], int m){
  37. int i, e;
  38. unsigned m2;
  39. unsigned y[N], z[N];
  40. for(i = 0; i < N; i++){ // 配列 x,y の初期化
  41. x[i] = 0;
  42. y[i] = 0;
  43. }
  44. y[0] = 1;
  45.  
  46. Div(y, m);
  47. Dup(y, x);
  48. m2 = m*m;
  49. i = 1;
  50. do {
  51. Div(y, m2);
  52. Dup(y, z);
  53. Div(z, 2*i+1);
  54. if( (i & 1) == 0 ){ // i が偶数のとき
  55. Add(x, z);
  56. } else { // i が奇数のとき
  57. Sub(x, z);
  58. }
  59. i++;
  60. e = if_zero(z); // z が 0 でないと -1
  61. } while (e == -1); // z が 0 でない限り継続
  62.  
  63. }
  64.  
  65. //足算, a + b を a に代入
  66. void Add(unsigned a[], unsigned b[]){
  67. int i,j;
  68. unsigned x;
  69. for(i = 0; i < N; i++){
  70. x = a[i] + b[i];
  71. if(x <= 0xffff){ // 桁上がりしないとき
  72. a[i] = x;
  73. } else { // 桁上がりするとき
  74. a[i] = x & 0xffff; // x の下位 2 バイト
  75. j = i-1; // 以下桁上がりの操作
  76. while(a[j] == 0xffff){ // 1 加えると更に桁が上がるとき
  77. a[j] = 0;
  78. j--;
  79. }
  80. a[j]++;
  81. }
  82. }
  83. }
  84.  
  85. //引き算, a - b を a に代入 (但し a>b)
  86. void Sub(unsigned a[], unsigned b[]){
  87. int i,j;
  88. for(i = 0; i < N; i++){
  89. if (a[i] >= b[i]){ // そのまま引けるとき
  90. a[i] = a[i] - b[i];
  91. } else { // 上の桁から借りるとき
  92. a[i] = 0x10000 + a[i] - b[i]; // 1 を上から借りる
  93. j = i-1;
  94. while(a[j] == 0){ // 上の桁が 0 であれば
  95. a[j] = 0xffff; // 更に上から借りる
  96. j--;
  97. }
  98. a[j]--;
  99. }
  100. }
  101.  
  102. }
  103.  
  104. //割り算, a/d を a に代入 (d <= 0xffff, 16 進 4桁)
  105. // 上の桁から順番に d で割り算。
  106. void Div(unsigned a[], unsigned d){
  107. int i;
  108. unsigned x, q, res;
  109. res = 0;
  110. for(i = 0; i < N; i++){
  111. res = res << 16; // 上の桁の余りを 16 進で4 桁ずらして
  112. x = a[i] + res; // 加える
  113. q = x/d; // d でわる
  114. a[i] = q; // 商
  115. res = x - q*d; // 余りは下の桁の割り算に加える
  116. }
  117. }
  118.  
  119. //かけ算, a*d を a に代入 (d <= 0xffff, 16 進 4 桁)
  120. // 下の桁から順番に d をかける。
  121. void Mul(unsigned a[], unsigned d){
  122. int i;
  123. unsigned x, q;
  124. q = 0;
  125. for(i = N-1; i >= 0; i--){
  126. x = a[i]*d + q; // 各桁の d 倍に桁上がりの部分を加える
  127. a[i] = x & 0xffff; // x の下位 2 バイト (16 進 4 桁)
  128. q = x >> 16; // x の上位 2 バイト (16 進 4 桁)
  129. } // 桁上がりの部分
  130. }
  131.  
  132. //a を b にコピー
  133. void Dup(unsigned a[], unsigned b[]){
  134. int i;
  135. for(i = 0; i < N; i++){
  136. b[i] = a[i];
  137. }
  138. }
  139.  
  140. // a = 0 のとき 0 を返し、そうでないとき -1 を返す関数
  141. int if_zero(unsigned a[]){
  142. int i, j;
  143. j = 0;
  144. for(i = 0; i < N; i++){
  145. if (a[i] != 0) { // 一箇所でも 0 でないとき
  146. j = -1; // j の値を -1 にする
  147. break;
  148. }
  149. }
  150. return j;
  151. }
  152.  
  153. // 10 進数に変換して表示
  154. void Display(unsigned a[]){
  155. int i,j;
  156. unsigned w[M];
  157. char buf[1000+1] = "";
  158. char tmp[16];
  159. to_decimal(a, w); // 16 進数 a を 10 進数 w に変換
  160. for(i = 1; i < M; i++){
  161. sprintf(tmp, "%4.4u", w[i]);// 4 桁ごとバッファに格納
  162. strcat(buf, tmp);
  163. }
  164. printf("%4.1u.",w[0]); // 小数点以上の表示
  165. for(i = 0; i < 1000/5; i++){
  166. printf("%.5s ", buf+i*5); // 5 桁ごと表示
  167. j = i%10; // j は i を 10 で割った余り
  168. if(j==10-1) printf("\n "); // 10 個表示したとき改行
  169. }
  170. printf("\n"); // 一番最後に改行
  171. }
  172.  
  173. // 10 進数への変換
  174. void to_decimal(unsigned a[], unsigned w[]){
  175. int i;
  176. unsigned b[N];
  177. for(i = 0; i < N; i++){
  178. b[i] = a[i];
  179. }
  180. w[0] = b[0];
  181. b[0] = 0;
  182. for(i = 1; i < M; i++){
  183. Mul(b, 10000); // b を 10000 倍して
  184. w[i] = b[0]; // 小数点以上を w[i] に代入
  185. b[0] = 0; // 小数点以上を 0 にする
  186. }
  187. }
  188.  
Success #stdin #stdout 0.02s 1720KB
stdin
Standard input is empty
stdout
   3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 
     58209 74944 59230 78164 06286 20899 86280 34825 34211 70679 
     82148 08651 32823 06647 09384 46095 50582 23172 53594 08128 
     48111 74502 84102 70193 85211 05559 64462 29489 54930 38196 
     44288 10975 66593 34461 28475 64823 37867 83165 27120 19091 
     45648 56692 34603 48610 45432 66482 13393 60726 02491 41273 
     72458 70066 06315 58817 48815 20920 96282 92540 91715 36436 
     78925 90360 01133 05305 48820 46652 13841 46951 94151 16094 
     33057 27036 57595 91953 09218 61173 81932 61179 31051 18548 
     07446 23799 62749 56735 18857 52724 89122 79381 83011 94912 
     98336 73362 44065 66430 86021 39494 63952 24737 19070 21798 
     60943 70277 05392 17176 29317 67523 84674 81846 76694 05132 
     00056 81271 45263 56082 77857 71342 75778 96091 73637 17872 
     14684 40901 22495 34301 46549 58537 10507 92279 68925 89235 
     42019 95611 21290 21960 86403 44181 59813 62977 47713 09960 
     51870 72113 49999 99837 29780 49951 05973 17328 16096 31859 
     50244 59455 34690 83026 42522 30825 33446 85035 26193 11881 
     71010 00313 78387 52886 58753 32083 81420 61717 76691 47303 
     59825 34904 28755 46873 11595 62863 88235 37875 93751 95778 
     18577 80532 17122 68066 13001 92787 66111 95909 21642 01988