carray 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -1
  3. data/CHANGELOG.md +325 -3
  4. data/{NEWS.md → CHANGELOG.v1.md} +1 -1
  5. data/README.md +32 -32
  6. data/carray.gemspec +12 -8
  7. data/ext/ca_axis_group.c +55 -19
  8. data/ext/ca_binop_dispatch.c +5 -6
  9. data/ext/ca_binop_dispatch.h +0 -7
  10. data/ext/ca_categorical_iterator.c +13 -13
  11. data/ext/ca_for_each_element.h +6 -8
  12. data/ext/ca_group_iter.c +1 -1
  13. data/ext/ca_kernel_iterator.c +69 -23
  14. data/ext/ca_kernel_iterator.h +3 -10
  15. data/ext/ca_obj_bincmp.c +57 -27
  16. data/ext/ca_obj_binop.c +86 -30
  17. data/ext/ca_obj_const_string.c +3 -1
  18. data/ext/ca_obj_face.c +80 -0
  19. data/ext/ca_obj_face.h +33 -1
  20. data/ext/ca_obj_fake.c +11 -0
  21. data/ext/ca_obj_fixlen_string.c +3 -1
  22. data/ext/ca_obj_grid.c +11 -3
  23. data/ext/ca_obj_meld.c +13 -8
  24. data/ext/ca_obj_moncmp.c +33 -14
  25. data/ext/ca_obj_monop.c +19 -7
  26. data/ext/ca_obj_object.c +99 -4
  27. data/ext/ca_obj_record.c +3 -1
  28. data/ext/ca_obj_refer.c +30 -6
  29. data/ext/ca_obj_roll.c +13 -5
  30. data/ext/ca_obj_select_axis.c +16 -6
  31. data/ext/ca_obj_shift.c +3 -3
  32. data/ext/ca_obj_stride.c +106 -23
  33. data/ext/ca_obj_string.c +3 -1
  34. data/ext/ca_obj_tile.c +13 -5
  35. data/ext/ca_obj_time.c +3 -1
  36. data/ext/ca_obj_timedelta.c +3 -1
  37. data/ext/ca_obj_transpose.c +1 -1
  38. data/ext/ca_obj_triop.c +62 -23
  39. data/ext/ca_obj_window.c +86 -17
  40. data/ext/ca_op_cmplx64.h +123 -0
  41. data/ext/ca_op_ipower.c +0 -3
  42. data/ext/ca_sort_kernels.h +5 -5
  43. data/ext/ca_sweep_engine.c +78 -35
  44. data/ext/ca_sweep_engine.h +13 -4
  45. data/ext/ca_transform_common.c +7 -0
  46. data/ext/carray.h +127 -130
  47. data/ext/carray_access.c +56 -34
  48. data/ext/carray_bincount.c +8 -8
  49. data/ext/carray_broadcast.c +99 -6
  50. data/ext/carray_build_flags.h +3 -0
  51. data/ext/carray_call_cfunc.c +1491 -0
  52. data/ext/carray_call_cfunc.h +153 -0
  53. data/ext/carray_cast.c +69 -31
  54. data/ext/carray_conversion.c +22 -22
  55. data/ext/carray_copy.c +12 -2
  56. data/ext/carray_core.c +57 -10
  57. data/ext/carray_count.c +1 -1
  58. data/ext/carray_element.c +7 -7
  59. data/ext/carray_factorize.c +28 -28
  60. data/ext/carray_hold.c +1 -1
  61. data/ext/carray_index_classifier.c +7 -21
  62. data/ext/carray_internal.h +19 -3
  63. data/ext/carray_kernels_bincmp.c +1 -0
  64. data/ext/carray_kernels_binop.c +320 -298
  65. data/ext/carray_kernels_init.c +1095 -0
  66. data/ext/carray_kernels_map.c +1 -0
  67. data/ext/carray_kernels_moncmp.c +1 -0
  68. data/ext/carray_kernels_monop.c +412 -411
  69. data/ext/carray_kernels_reduce_aggregate.c +88 -87
  70. data/ext/carray_kernels_reduce_boolean.c +1 -0
  71. data/ext/carray_kernels_reduce_cumulative.c +54 -53
  72. data/ext/carray_kernels_reduce_extreme.c +51 -50
  73. data/ext/carray_kernels_reduce_variance.c +1 -0
  74. data/ext/carray_kernels_scan.c +1 -0
  75. data/ext/carray_kernels_search.c +93 -92
  76. data/ext/carray_kernels_sort.c +1 -0
  77. data/ext/carray_kernels_triop.c +1 -0
  78. data/ext/carray_lazy.c +175 -5
  79. data/ext/carray_mask.c +6 -5
  80. data/ext/carray_median_percentile.c +1 -1
  81. data/ext/carray_memory_view.c +46 -21
  82. data/ext/carray_operator.c +46 -49
  83. data/ext/carray_partition.c +4 -4
  84. data/ext/carray_random.c +7 -7
  85. data/ext/carray_scatter.c +1 -1
  86. data/ext/carray_sort.c +3 -3
  87. data/ext/carray_sort_kernel.c +10 -10
  88. data/ext/carray_test.c +1 -1
  89. data/ext/extconf.rb +18 -0
  90. data/ext/mk_call_cfunc.rb +243 -52
  91. data/ext/mkkernel.rb +354 -100
  92. data/ext/ruby_carray.c +18 -16
  93. data/ext/version.h +4 -4
  94. data/lib/carray/autoload_carray.rb +19 -0
  95. data/lib/carray/autoload_method_extension.rb +2 -1
  96. data/lib/carray/axis_group.rb +7 -7
  97. data/lib/carray/basics.rb +59 -59
  98. data/lib/carray/bincount_nd.rb +12 -12
  99. data/lib/carray/block_iterator.rb +24 -14
  100. data/lib/carray/categorical.rb +4 -4
  101. data/lib/carray/categorical_iterator.rb +98 -76
  102. data/lib/carray/conditional.rb +14 -14
  103. data/lib/carray/construct.rb +21 -0
  104. data/lib/carray/core_extensions.rb +62 -5
  105. data/lib/carray/data_type_extension.rb +18 -1
  106. data/lib/carray/frame/concat.rb +3 -3
  107. data/lib/carray/frame/convert.rb +1 -1
  108. data/lib/carray/frame/frame.rb +4 -11
  109. data/lib/carray/frame/io.rb +159 -2
  110. data/lib/carray/frame/sort.rb +1 -1
  111. data/lib/carray/frame/verbs.rb +18 -1
  112. data/lib/carray/fuse_source.rb +123 -0
  113. data/lib/carray/fusion.rb +218 -0
  114. data/lib/carray/histogram.rb +16 -16
  115. data/lib/carray/inspect.rb +1 -7
  116. data/lib/carray/iterator.rb +4 -3
  117. data/lib/carray/lazy.rb +125 -73
  118. data/lib/carray/meld_reduce.rb +2 -2
  119. data/lib/carray/methods/align_addr.rb +1 -1
  120. data/lib/carray/methods/composition.rb +1 -1
  121. data/lib/carray/methods/is_in.rb +12 -12
  122. data/lib/carray/methods/locate_addr.rb +6 -1
  123. data/lib/carray/methods/mask_duplicates.rb +1 -1
  124. data/lib/carray/methods/meshgrid.rb +4 -5
  125. data/lib/carray/methods/mode.rb +2 -2
  126. data/lib/carray/methods/nunique.rb +1 -1
  127. data/lib/carray/methods/snap.rb +7 -2
  128. data/lib/carray/methods/unique.rb +3 -3
  129. data/lib/carray/methods/value_counts.rb +2 -2
  130. data/lib/carray/runtime.rb +0 -19
  131. data/lib/carray/slab_iterator.rb +20 -7
  132. data/lib/carray/string_operation_extension.rb +5 -5
  133. data/lib/carray/time.rb +890 -491
  134. data/lib/carray/window_iterator.rb +285 -13
  135. data/lib/carray.rb +5 -5
  136. data/yard-stubs/ca_obj_array.rb +385 -0
  137. data/yard-stubs/ca_obj_bitarray.rb +38 -0
  138. data/yard-stubs/ca_obj_bitfield.rb +43 -0
  139. data/yard-stubs/ca_obj_block.rb +73 -0
  140. data/yard-stubs/ca_obj_byte_swap.rb +56 -0
  141. data/yard-stubs/ca_obj_fake.rb +31 -0
  142. data/yard-stubs/ca_obj_farray.rb +32 -0
  143. data/yard-stubs/ca_obj_field.rb +45 -0
  144. data/yard-stubs/ca_obj_grid.rb +35 -0
  145. data/yard-stubs/ca_obj_refer.rb +72 -0
  146. data/yard-stubs/ca_obj_roll.rb +45 -0
  147. data/yard-stubs/ca_obj_shift.rb +43 -0
  148. data/yard-stubs/ca_obj_stride.rb +181 -0
  149. data/yard-stubs/ca_obj_tile.rb +29 -0
  150. data/yard-stubs/ca_obj_transpose.rb +40 -0
  151. data/yard-stubs/ca_obj_window.rb +49 -0
  152. data/yard-stubs/carray_access.rb +131 -0
  153. data/yard-stubs/carray_attribute.rb +246 -0
  154. data/yard-stubs/carray_broadcast.rb +37 -0
  155. data/yard-stubs/carray_cast.rb +489 -0
  156. data/yard-stubs/carray_class.rb +65 -0
  157. data/yard-stubs/carray_conversion.rb +76 -0
  158. data/yard-stubs/carray_copy.rb +79 -0
  159. data/yard-stubs/carray_core.rb +114 -0
  160. data/yard-stubs/carray_count.rb +79 -0
  161. data/yard-stubs/carray_element.rb +108 -0
  162. data/yard-stubs/carray_generate.rb +66 -0
  163. data/yard-stubs/carray_lazy.rb +23 -0
  164. data/yard-stubs/carray_loop.rb +140 -0
  165. data/yard-stubs/carray_mask.rb +259 -0
  166. data/yard-stubs/carray_math.rb +132 -0
  167. data/yard-stubs/carray_mathfunc.rb +45 -0
  168. data/yard-stubs/carray_median_percentile.rb +89 -0
  169. data/yard-stubs/carray_memory_view.rb +163 -0
  170. data/yard-stubs/carray_order.rb +312 -0
  171. data/yard-stubs/carray_random.rb +89 -0
  172. data/yard-stubs/carray_scatter.rb +106 -0
  173. data/yard-stubs/carray_slab.rb +57 -0
  174. data/yard-stubs/carray_sort.rb +163 -0
  175. data/yard-stubs/carray_test.rb +85 -0
  176. data/yard-stubs/carray_undef.rb +64 -0
  177. data/yard-stubs/carray_utils.rb +97 -0
  178. data/yard-stubs/ruby_carray.rb +193 -0
  179. metadata +59 -10
  180. data/ext/ca_obj_unbound_repeat.c +0 -496
@@ -34,6 +34,7 @@ static inline VALUE BOOL2VAL (boolean8_t x) { return x ? Qtrue : Qfalse; }
34
34
  #endif
35
35
 
36
36
  #include "ca_op_powi.h"
37
+ #include "ca_op_cmplx64.h"
37
38
 
38
39
  /* ===== binop pmax ============================================ */
39
40
 
@@ -3860,7 +3861,7 @@ ca_binop_mul_cmplx64_t (ca_size_t n, boolean8_t *m,
3860
3861
  p1 = q1 + k*i1;
3861
3862
  p2 = q2 + k*i2;
3862
3863
  p3 = q3 + k*i3;
3863
- { (*p3) = (*p1) * (*p2); }
3864
+ { (*p3) = op_cmul_cmplx64((*p1), (*p2)); }
3864
3865
  }
3865
3866
  }
3866
3867
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -3874,13 +3875,13 @@ ca_binop_mul_cmplx64_t (ca_size_t n, boolean8_t *m,
3874
3875
  #pragma omp simd
3875
3876
  for (k=0; k<n; k++) {
3876
3877
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
3877
- { (*p3) = (*p1) * (*p2); }
3878
+ { (*p3) = op_cmul_cmplx64((*p1), (*p2)); }
3878
3879
  }
3879
3880
  } else {
3880
3881
  /* strided branch: numo-shape `p += s` increment form. */
3881
3882
  cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3;
3882
3883
  for (k=0; k<n; k++) {
3883
- { (*p3) = (*p1) * (*p2); }
3884
+ { (*p3) = op_cmul_cmplx64((*p1), (*p2)); }
3884
3885
  p1 += i1; p2 += i2; p3 += i3;
3885
3886
  }
3886
3887
  }
@@ -4029,7 +4030,14 @@ ca_binop_div_int8_t (ca_size_t n, boolean8_t *m,
4029
4030
  p1 = q1 + k*i1;
4030
4031
  p2 = q2 + k*i2;
4031
4032
  p3 = q3 + k*i3;
4032
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4033
+ {
4034
+ if ((*p2)==0) {ca_zerodiv();};
4035
+ {
4036
+ int8_t _q = (*p1) / (*p2);
4037
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4038
+ (*p3) = _q;
4039
+ }
4040
+ }
4033
4041
  }
4034
4042
  }
4035
4043
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -4043,13 +4051,27 @@ ca_binop_div_int8_t (ca_size_t n, boolean8_t *m,
4043
4051
  #pragma omp simd
4044
4052
  for (k=0; k<n; k++) {
4045
4053
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
4046
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4054
+ {
4055
+ if ((*p2)==0) {ca_zerodiv();};
4056
+ {
4057
+ int8_t _q = (*p1) / (*p2);
4058
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4059
+ (*p3) = _q;
4060
+ }
4061
+ }
4047
4062
  }
4048
4063
  } else {
4049
4064
  /* strided branch: numo-shape `p += s` increment form. */
4050
4065
  int8_t *p1 = q1, *p2 = q2, *p3 = q3;
4051
4066
  for (k=0; k<n; k++) {
4052
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4067
+ {
4068
+ if ((*p2)==0) {ca_zerodiv();};
4069
+ {
4070
+ int8_t _q = (*p1) / (*p2);
4071
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4072
+ (*p3) = _q;
4073
+ }
4074
+ }
4053
4075
  p1 += i1; p2 += i2; p3 += i3;
4054
4076
  }
4055
4077
  }
@@ -4119,7 +4141,14 @@ ca_binop_div_int16_t (ca_size_t n, boolean8_t *m,
4119
4141
  p1 = q1 + k*i1;
4120
4142
  p2 = q2 + k*i2;
4121
4143
  p3 = q3 + k*i3;
4122
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4144
+ {
4145
+ if ((*p2)==0) {ca_zerodiv();};
4146
+ {
4147
+ int16_t _q = (*p1) / (*p2);
4148
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4149
+ (*p3) = _q;
4150
+ }
4151
+ }
4123
4152
  }
4124
4153
  }
4125
4154
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -4133,13 +4162,27 @@ ca_binop_div_int16_t (ca_size_t n, boolean8_t *m,
4133
4162
  #pragma omp simd
4134
4163
  for (k=0; k<n; k++) {
4135
4164
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
4136
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4165
+ {
4166
+ if ((*p2)==0) {ca_zerodiv();};
4167
+ {
4168
+ int16_t _q = (*p1) / (*p2);
4169
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4170
+ (*p3) = _q;
4171
+ }
4172
+ }
4137
4173
  }
4138
4174
  } else {
4139
4175
  /* strided branch: numo-shape `p += s` increment form. */
4140
4176
  int16_t *p1 = q1, *p2 = q2, *p3 = q3;
4141
4177
  for (k=0; k<n; k++) {
4142
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4178
+ {
4179
+ if ((*p2)==0) {ca_zerodiv();};
4180
+ {
4181
+ int16_t _q = (*p1) / (*p2);
4182
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4183
+ (*p3) = _q;
4184
+ }
4185
+ }
4143
4186
  p1 += i1; p2 += i2; p3 += i3;
4144
4187
  }
4145
4188
  }
@@ -4209,7 +4252,14 @@ ca_binop_div_int32_t (ca_size_t n, boolean8_t *m,
4209
4252
  p1 = q1 + k*i1;
4210
4253
  p2 = q2 + k*i2;
4211
4254
  p3 = q3 + k*i3;
4212
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4255
+ {
4256
+ if ((*p2)==0) {ca_zerodiv();};
4257
+ {
4258
+ int32_t _q = (*p1) / (*p2);
4259
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4260
+ (*p3) = _q;
4261
+ }
4262
+ }
4213
4263
  }
4214
4264
  }
4215
4265
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -4223,13 +4273,27 @@ ca_binop_div_int32_t (ca_size_t n, boolean8_t *m,
4223
4273
  #pragma omp simd
4224
4274
  for (k=0; k<n; k++) {
4225
4275
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
4226
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4276
+ {
4277
+ if ((*p2)==0) {ca_zerodiv();};
4278
+ {
4279
+ int32_t _q = (*p1) / (*p2);
4280
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4281
+ (*p3) = _q;
4282
+ }
4283
+ }
4227
4284
  }
4228
4285
  } else {
4229
4286
  /* strided branch: numo-shape `p += s` increment form. */
4230
4287
  int32_t *p1 = q1, *p2 = q2, *p3 = q3;
4231
4288
  for (k=0; k<n; k++) {
4232
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4289
+ {
4290
+ if ((*p2)==0) {ca_zerodiv();};
4291
+ {
4292
+ int32_t _q = (*p1) / (*p2);
4293
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4294
+ (*p3) = _q;
4295
+ }
4296
+ }
4233
4297
  p1 += i1; p2 += i2; p3 += i3;
4234
4298
  }
4235
4299
  }
@@ -4299,7 +4363,14 @@ ca_binop_div_int64_t (ca_size_t n, boolean8_t *m,
4299
4363
  p1 = q1 + k*i1;
4300
4364
  p2 = q2 + k*i2;
4301
4365
  p3 = q3 + k*i3;
4302
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4366
+ {
4367
+ if ((*p2)==0) {ca_zerodiv();};
4368
+ {
4369
+ int64_t _q = (*p1) / (*p2);
4370
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4371
+ (*p3) = _q;
4372
+ }
4373
+ }
4303
4374
  }
4304
4375
  }
4305
4376
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -4313,13 +4384,27 @@ ca_binop_div_int64_t (ca_size_t n, boolean8_t *m,
4313
4384
  #pragma omp simd
4314
4385
  for (k=0; k<n; k++) {
4315
4386
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
4316
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4387
+ {
4388
+ if ((*p2)==0) {ca_zerodiv();};
4389
+ {
4390
+ int64_t _q = (*p1) / (*p2);
4391
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4392
+ (*p3) = _q;
4393
+ }
4394
+ }
4317
4395
  }
4318
4396
  } else {
4319
4397
  /* strided branch: numo-shape `p += s` increment form. */
4320
4398
  int64_t *p1 = q1, *p2 = q2, *p3 = q3;
4321
4399
  for (k=0; k<n; k++) {
4322
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) / (*p2); }
4400
+ {
4401
+ if ((*p2)==0) {ca_zerodiv();};
4402
+ {
4403
+ int64_t _q = (*p1) / (*p2);
4404
+ if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4405
+ (*p3) = _q;
4406
+ }
4407
+ }
4323
4408
  p1 += i1; p2 += i2; p3 += i3;
4324
4409
  }
4325
4410
  }
@@ -4479,7 +4564,7 @@ ca_binop_div_cmplx64_t (ca_size_t n, boolean8_t *m,
4479
4564
  p1 = q1 + k*i1;
4480
4565
  p2 = q2 + k*i2;
4481
4566
  p3 = q3 + k*i3;
4482
- { (*p3) = (*p1) / (*p2); }
4567
+ { (*p3) = op_cdiv_cmplx64((*p1), (*p2)); }
4483
4568
  }
4484
4569
  }
4485
4570
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -4493,13 +4578,13 @@ ca_binop_div_cmplx64_t (ca_size_t n, boolean8_t *m,
4493
4578
  #pragma omp simd
4494
4579
  for (k=0; k<n; k++) {
4495
4580
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
4496
- { (*p3) = (*p1) / (*p2); }
4581
+ { (*p3) = op_cdiv_cmplx64((*p1), (*p2)); }
4497
4582
  }
4498
4583
  } else {
4499
4584
  /* strided branch: numo-shape `p += s` increment form. */
4500
4585
  cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3;
4501
4586
  for (k=0; k<n; k++) {
4502
- { (*p3) = (*p1) / (*p2); }
4587
+ { (*p3) = op_cdiv_cmplx64((*p1), (*p2)); }
4503
4588
  p1 += i1; p2 += i2; p3 += i3;
4504
4589
  }
4505
4590
  }
@@ -5177,7 +5262,7 @@ ca_binop_rcp_mul_cmplx64_t (ca_size_t n, boolean8_t *m,
5177
5262
  p1 = q1 + k*i1;
5178
5263
  p2 = q2 + k*i2;
5179
5264
  p3 = q3 + k*i3;
5180
- { (*p3) = (*p2) / (*p1); }
5265
+ { (*p3) = op_cdiv_cmplx64((*p2), (*p1)); }
5181
5266
  }
5182
5267
  }
5183
5268
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -5191,13 +5276,13 @@ ca_binop_rcp_mul_cmplx64_t (ca_size_t n, boolean8_t *m,
5191
5276
  #pragma omp simd
5192
5277
  for (k=0; k<n; k++) {
5193
5278
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5194
- { (*p3) = (*p2) / (*p1); }
5279
+ { (*p3) = op_cdiv_cmplx64((*p2), (*p1)); }
5195
5280
  }
5196
5281
  } else {
5197
5282
  /* strided branch: numo-shape `p += s` increment form. */
5198
5283
  cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3;
5199
5284
  for (k=0; k<n; k++) {
5200
- { (*p3) = (*p2) / (*p1); }
5285
+ { (*p3) = op_cdiv_cmplx64((*p2), (*p1)); }
5201
5286
  p1 += i1; p2 += i2; p3 += i3;
5202
5287
  }
5203
5288
  }
@@ -5346,7 +5431,14 @@ ca_binop_mod_int8_t (ca_size_t n, boolean8_t *m,
5346
5431
  p1 = q1 + k*i1;
5347
5432
  p2 = q2 + k*i2;
5348
5433
  p3 = q3 + k*i3;
5349
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5434
+ {
5435
+ if ((*p2)==0) {ca_zerodiv();};
5436
+ {
5437
+ int8_t _r = (*p1) % (*p2);
5438
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5439
+ (*p3) = _r;
5440
+ }
5441
+ }
5350
5442
  }
5351
5443
  }
5352
5444
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -5360,13 +5452,27 @@ ca_binop_mod_int8_t (ca_size_t n, boolean8_t *m,
5360
5452
  #pragma omp simd
5361
5453
  for (k=0; k<n; k++) {
5362
5454
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5363
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5455
+ {
5456
+ if ((*p2)==0) {ca_zerodiv();};
5457
+ {
5458
+ int8_t _r = (*p1) % (*p2);
5459
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5460
+ (*p3) = _r;
5461
+ }
5462
+ }
5364
5463
  }
5365
5464
  } else {
5366
5465
  /* strided branch: numo-shape `p += s` increment form. */
5367
5466
  int8_t *p1 = q1, *p2 = q2, *p3 = q3;
5368
5467
  for (k=0; k<n; k++) {
5369
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5468
+ {
5469
+ if ((*p2)==0) {ca_zerodiv();};
5470
+ {
5471
+ int8_t _r = (*p1) % (*p2);
5472
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5473
+ (*p3) = _r;
5474
+ }
5475
+ }
5370
5476
  p1 += i1; p2 += i2; p3 += i3;
5371
5477
  }
5372
5478
  }
@@ -5436,7 +5542,14 @@ ca_binop_mod_int16_t (ca_size_t n, boolean8_t *m,
5436
5542
  p1 = q1 + k*i1;
5437
5543
  p2 = q2 + k*i2;
5438
5544
  p3 = q3 + k*i3;
5439
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5545
+ {
5546
+ if ((*p2)==0) {ca_zerodiv();};
5547
+ {
5548
+ int16_t _r = (*p1) % (*p2);
5549
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5550
+ (*p3) = _r;
5551
+ }
5552
+ }
5440
5553
  }
5441
5554
  }
5442
5555
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -5450,13 +5563,27 @@ ca_binop_mod_int16_t (ca_size_t n, boolean8_t *m,
5450
5563
  #pragma omp simd
5451
5564
  for (k=0; k<n; k++) {
5452
5565
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5453
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5566
+ {
5567
+ if ((*p2)==0) {ca_zerodiv();};
5568
+ {
5569
+ int16_t _r = (*p1) % (*p2);
5570
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5571
+ (*p3) = _r;
5572
+ }
5573
+ }
5454
5574
  }
5455
5575
  } else {
5456
5576
  /* strided branch: numo-shape `p += s` increment form. */
5457
5577
  int16_t *p1 = q1, *p2 = q2, *p3 = q3;
5458
5578
  for (k=0; k<n; k++) {
5459
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5579
+ {
5580
+ if ((*p2)==0) {ca_zerodiv();};
5581
+ {
5582
+ int16_t _r = (*p1) % (*p2);
5583
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5584
+ (*p3) = _r;
5585
+ }
5586
+ }
5460
5587
  p1 += i1; p2 += i2; p3 += i3;
5461
5588
  }
5462
5589
  }
@@ -5526,7 +5653,14 @@ ca_binop_mod_int32_t (ca_size_t n, boolean8_t *m,
5526
5653
  p1 = q1 + k*i1;
5527
5654
  p2 = q2 + k*i2;
5528
5655
  p3 = q3 + k*i3;
5529
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5656
+ {
5657
+ if ((*p2)==0) {ca_zerodiv();};
5658
+ {
5659
+ int32_t _r = (*p1) % (*p2);
5660
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5661
+ (*p3) = _r;
5662
+ }
5663
+ }
5530
5664
  }
5531
5665
  }
5532
5666
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -5540,13 +5674,27 @@ ca_binop_mod_int32_t (ca_size_t n, boolean8_t *m,
5540
5674
  #pragma omp simd
5541
5675
  for (k=0; k<n; k++) {
5542
5676
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5543
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5677
+ {
5678
+ if ((*p2)==0) {ca_zerodiv();};
5679
+ {
5680
+ int32_t _r = (*p1) % (*p2);
5681
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5682
+ (*p3) = _r;
5683
+ }
5684
+ }
5544
5685
  }
5545
5686
  } else {
5546
5687
  /* strided branch: numo-shape `p += s` increment form. */
5547
5688
  int32_t *p1 = q1, *p2 = q2, *p3 = q3;
5548
5689
  for (k=0; k<n; k++) {
5549
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5690
+ {
5691
+ if ((*p2)==0) {ca_zerodiv();};
5692
+ {
5693
+ int32_t _r = (*p1) % (*p2);
5694
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5695
+ (*p3) = _r;
5696
+ }
5697
+ }
5550
5698
  p1 += i1; p2 += i2; p3 += i3;
5551
5699
  }
5552
5700
  }
@@ -5616,7 +5764,14 @@ ca_binop_mod_int64_t (ca_size_t n, boolean8_t *m,
5616
5764
  p1 = q1 + k*i1;
5617
5765
  p2 = q2 + k*i2;
5618
5766
  p3 = q3 + k*i3;
5619
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5767
+ {
5768
+ if ((*p2)==0) {ca_zerodiv();};
5769
+ {
5770
+ int64_t _r = (*p1) % (*p2);
5771
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5772
+ (*p3) = _r;
5773
+ }
5774
+ }
5620
5775
  }
5621
5776
  }
5622
5777
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -5630,13 +5785,27 @@ ca_binop_mod_int64_t (ca_size_t n, boolean8_t *m,
5630
5785
  #pragma omp simd
5631
5786
  for (k=0; k<n; k++) {
5632
5787
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5633
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5788
+ {
5789
+ if ((*p2)==0) {ca_zerodiv();};
5790
+ {
5791
+ int64_t _r = (*p1) % (*p2);
5792
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5793
+ (*p3) = _r;
5794
+ }
5795
+ }
5634
5796
  }
5635
5797
  } else {
5636
5798
  /* strided branch: numo-shape `p += s` increment form. */
5637
5799
  int64_t *p1 = q1, *p2 = q2, *p3 = q3;
5638
5800
  for (k=0; k<n; k++) {
5639
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
5801
+ {
5802
+ if ((*p2)==0) {ca_zerodiv();};
5803
+ {
5804
+ int64_t _r = (*p1) % (*p2);
5805
+ if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5806
+ (*p3) = _r;
5807
+ }
5808
+ }
5640
5809
  p1 += i1; p2 += i2; p3 += i3;
5641
5810
  }
5642
5811
  }
@@ -5706,7 +5875,16 @@ ca_binop_mod_float32_t (ca_size_t n, boolean8_t *m,
5706
5875
  p1 = q1 + k*i1;
5707
5876
  p2 = q2 + k*i2;
5708
5877
  p3 = q3 + k*i3;
5709
- { (*p3) = fmod(*p1, *p2); }
5878
+ {
5879
+ {
5880
+ float32_t _r = fmod((*p1), (*p2));
5881
+ if ( _r != 0 ) {
5882
+ if ( (_r < 0) != ((*p2) < 0) ) { _r += (*p2); }
5883
+ }
5884
+ else { _r = copysign((float32_t) 0, (*p2)); }
5885
+ (*p3) = _r;
5886
+ }
5887
+ }
5710
5888
  }
5711
5889
  }
5712
5890
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -5720,13 +5898,31 @@ ca_binop_mod_float32_t (ca_size_t n, boolean8_t *m,
5720
5898
  #pragma omp simd
5721
5899
  for (k=0; k<n; k++) {
5722
5900
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5723
- { (*p3) = fmod(*p1, *p2); }
5901
+ {
5902
+ {
5903
+ float32_t _r = fmod((*p1), (*p2));
5904
+ if ( _r != 0 ) {
5905
+ if ( (_r < 0) != ((*p2) < 0) ) { _r += (*p2); }
5906
+ }
5907
+ else { _r = copysign((float32_t) 0, (*p2)); }
5908
+ (*p3) = _r;
5909
+ }
5910
+ }
5724
5911
  }
5725
5912
  } else {
5726
5913
  /* strided branch: numo-shape `p += s` increment form. */
5727
5914
  float *p1 = q1, *p2 = q2, *p3 = q3;
5728
5915
  for (k=0; k<n; k++) {
5729
- { (*p3) = fmod(*p1, *p2); }
5916
+ {
5917
+ {
5918
+ float32_t _r = fmod((*p1), (*p2));
5919
+ if ( _r != 0 ) {
5920
+ if ( (_r < 0) != ((*p2) < 0) ) { _r += (*p2); }
5921
+ }
5922
+ else { _r = copysign((float32_t) 0, (*p2)); }
5923
+ (*p3) = _r;
5924
+ }
5925
+ }
5730
5926
  p1 += i1; p2 += i2; p3 += i3;
5731
5927
  }
5732
5928
  }
@@ -5751,7 +5947,16 @@ ca_binop_mod_float64_t (ca_size_t n, boolean8_t *m,
5751
5947
  p1 = q1 + k*i1;
5752
5948
  p2 = q2 + k*i2;
5753
5949
  p3 = q3 + k*i3;
5754
- { (*p3) = fmod(*p1, *p2); }
5950
+ {
5951
+ {
5952
+ float64_t _r = fmod((*p1), (*p2));
5953
+ if ( _r != 0 ) {
5954
+ if ( (_r < 0) != ((*p2) < 0) ) { _r += (*p2); }
5955
+ }
5956
+ else { _r = copysign((float64_t) 0, (*p2)); }
5957
+ (*p3) = _r;
5958
+ }
5959
+ }
5755
5960
  }
5756
5961
  }
5757
5962
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -5765,13 +5970,31 @@ ca_binop_mod_float64_t (ca_size_t n, boolean8_t *m,
5765
5970
  #pragma omp simd
5766
5971
  for (k=0; k<n; k++) {
5767
5972
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5768
- { (*p3) = fmod(*p1, *p2); }
5973
+ {
5974
+ {
5975
+ float64_t _r = fmod((*p1), (*p2));
5976
+ if ( _r != 0 ) {
5977
+ if ( (_r < 0) != ((*p2) < 0) ) { _r += (*p2); }
5978
+ }
5979
+ else { _r = copysign((float64_t) 0, (*p2)); }
5980
+ (*p3) = _r;
5981
+ }
5982
+ }
5769
5983
  }
5770
5984
  } else {
5771
5985
  /* strided branch: numo-shape `p += s` increment form. */
5772
5986
  double *p1 = q1, *p2 = q2, *p3 = q3;
5773
5987
  for (k=0; k<n; k++) {
5774
- { (*p3) = fmod(*p1, *p2); }
5988
+ {
5989
+ {
5990
+ float64_t _r = fmod((*p1), (*p2));
5991
+ if ( _r != 0 ) {
5992
+ if ( (_r < 0) != ((*p2) < 0) ) { _r += (*p2); }
5993
+ }
5994
+ else { _r = copysign((float64_t) 0, (*p2)); }
5995
+ (*p3) = _r;
5996
+ }
5997
+ }
5775
5998
  p1 += i1; p2 += i2; p3 += i3;
5776
5999
  }
5777
6000
  }
@@ -5854,10 +6077,10 @@ VALUE rb_ca_mod (VALUE self, VALUE other)
5854
6077
  VALUE rb_ca_mod_bang (VALUE self, VALUE other)
5855
6078
  { return rb_ca_call_binop_bang(self, other, ca_binop_mod); }
5856
6079
 
5857
- /* ===== binop reminder ============================================ */
6080
+ /* ===== binop fmod ============================================ */
5858
6081
 
5859
6082
  static void
5860
- ca_binop_reminder_int8_t (ca_size_t n, boolean8_t *m,
6083
+ ca_binop_fmod_int8_t (ca_size_t n, boolean8_t *m,
5861
6084
  char * __restrict__ ptr1, ca_size_t i1,
5862
6085
  char * __restrict__ ptr2, ca_size_t i2,
5863
6086
  char * __restrict__ ptr3, ca_size_t i3)
@@ -5902,7 +6125,7 @@ ca_binop_reminder_int8_t (ca_size_t n, boolean8_t *m,
5902
6125
  }
5903
6126
 
5904
6127
  static void
5905
- ca_binop_reminder_uint8_t (ca_size_t n, boolean8_t *m,
6128
+ ca_binop_fmod_uint8_t (ca_size_t n, boolean8_t *m,
5906
6129
  char * __restrict__ ptr1, ca_size_t i1,
5907
6130
  char * __restrict__ ptr2, ca_size_t i2,
5908
6131
  char * __restrict__ ptr3, ca_size_t i3)
@@ -5947,7 +6170,7 @@ ca_binop_reminder_uint8_t (ca_size_t n, boolean8_t *m,
5947
6170
  }
5948
6171
 
5949
6172
  static void
5950
- ca_binop_reminder_int16_t (ca_size_t n, boolean8_t *m,
6173
+ ca_binop_fmod_int16_t (ca_size_t n, boolean8_t *m,
5951
6174
  char * __restrict__ ptr1, ca_size_t i1,
5952
6175
  char * __restrict__ ptr2, ca_size_t i2,
5953
6176
  char * __restrict__ ptr3, ca_size_t i3)
@@ -5992,7 +6215,7 @@ ca_binop_reminder_int16_t (ca_size_t n, boolean8_t *m,
5992
6215
  }
5993
6216
 
5994
6217
  static void
5995
- ca_binop_reminder_uint16_t (ca_size_t n, boolean8_t *m,
6218
+ ca_binop_fmod_uint16_t (ca_size_t n, boolean8_t *m,
5996
6219
  char * __restrict__ ptr1, ca_size_t i1,
5997
6220
  char * __restrict__ ptr2, ca_size_t i2,
5998
6221
  char * __restrict__ ptr3, ca_size_t i3)
@@ -6037,7 +6260,7 @@ ca_binop_reminder_uint16_t (ca_size_t n, boolean8_t *m,
6037
6260
  }
6038
6261
 
6039
6262
  static void
6040
- ca_binop_reminder_int32_t (ca_size_t n, boolean8_t *m,
6263
+ ca_binop_fmod_int32_t (ca_size_t n, boolean8_t *m,
6041
6264
  char * __restrict__ ptr1, ca_size_t i1,
6042
6265
  char * __restrict__ ptr2, ca_size_t i2,
6043
6266
  char * __restrict__ ptr3, ca_size_t i3)
@@ -6082,7 +6305,7 @@ ca_binop_reminder_int32_t (ca_size_t n, boolean8_t *m,
6082
6305
  }
6083
6306
 
6084
6307
  static void
6085
- ca_binop_reminder_uint32_t (ca_size_t n, boolean8_t *m,
6308
+ ca_binop_fmod_uint32_t (ca_size_t n, boolean8_t *m,
6086
6309
  char * __restrict__ ptr1, ca_size_t i1,
6087
6310
  char * __restrict__ ptr2, ca_size_t i2,
6088
6311
  char * __restrict__ ptr3, ca_size_t i3)
@@ -6127,7 +6350,7 @@ ca_binop_reminder_uint32_t (ca_size_t n, boolean8_t *m,
6127
6350
  }
6128
6351
 
6129
6352
  static void
6130
- ca_binop_reminder_int64_t (ca_size_t n, boolean8_t *m,
6353
+ ca_binop_fmod_int64_t (ca_size_t n, boolean8_t *m,
6131
6354
  char * __restrict__ ptr1, ca_size_t i1,
6132
6355
  char * __restrict__ ptr2, ca_size_t i2,
6133
6356
  char * __restrict__ ptr3, ca_size_t i3)
@@ -6172,7 +6395,7 @@ ca_binop_reminder_int64_t (ca_size_t n, boolean8_t *m,
6172
6395
  }
6173
6396
 
6174
6397
  static void
6175
- ca_binop_reminder_uint64_t (ca_size_t n, boolean8_t *m,
6398
+ ca_binop_fmod_uint64_t (ca_size_t n, boolean8_t *m,
6176
6399
  char * __restrict__ ptr1, ca_size_t i1,
6177
6400
  char * __restrict__ ptr2, ca_size_t i2,
6178
6401
  char * __restrict__ ptr3, ca_size_t i3)
@@ -6217,7 +6440,7 @@ ca_binop_reminder_uint64_t (ca_size_t n, boolean8_t *m,
6217
6440
  }
6218
6441
 
6219
6442
  static void
6220
- ca_binop_reminder_float32_t (ca_size_t n, boolean8_t *m,
6443
+ ca_binop_fmod_float32_t (ca_size_t n, boolean8_t *m,
6221
6444
  char * __restrict__ ptr1, ca_size_t i1,
6222
6445
  char * __restrict__ ptr2, ca_size_t i2,
6223
6446
  char * __restrict__ ptr3, ca_size_t i3)
@@ -6235,7 +6458,7 @@ ca_binop_reminder_float32_t (ca_size_t n, boolean8_t *m,
6235
6458
  p1 = q1 + k*i1;
6236
6459
  p2 = q2 + k*i2;
6237
6460
  p3 = q3 + k*i3;
6238
- { (*p3) = remainder(*p1, *p2); }
6461
+ { (*p3) = fmodf((*p1), (*p2)); }
6239
6462
  }
6240
6463
  }
6241
6464
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -6249,20 +6472,20 @@ ca_binop_reminder_float32_t (ca_size_t n, boolean8_t *m,
6249
6472
  #pragma omp simd
6250
6473
  for (k=0; k<n; k++) {
6251
6474
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
6252
- { (*p3) = remainder(*p1, *p2); }
6475
+ { (*p3) = fmodf((*p1), (*p2)); }
6253
6476
  }
6254
6477
  } else {
6255
6478
  /* strided branch: numo-shape `p += s` increment form. */
6256
6479
  float *p1 = q1, *p2 = q2, *p3 = q3;
6257
6480
  for (k=0; k<n; k++) {
6258
- { (*p3) = remainder(*p1, *p2); }
6481
+ { (*p3) = fmodf((*p1), (*p2)); }
6259
6482
  p1 += i1; p2 += i2; p3 += i3;
6260
6483
  }
6261
6484
  }
6262
6485
  }
6263
6486
 
6264
6487
  static void
6265
- ca_binop_reminder_float64_t (ca_size_t n, boolean8_t *m,
6488
+ ca_binop_fmod_float64_t (ca_size_t n, boolean8_t *m,
6266
6489
  char * __restrict__ ptr1, ca_size_t i1,
6267
6490
  char * __restrict__ ptr2, ca_size_t i2,
6268
6491
  char * __restrict__ ptr3, ca_size_t i3)
@@ -6280,7 +6503,7 @@ ca_binop_reminder_float64_t (ca_size_t n, boolean8_t *m,
6280
6503
  p1 = q1 + k*i1;
6281
6504
  p2 = q2 + k*i2;
6282
6505
  p3 = q3 + k*i3;
6283
- { (*p3) = remainder(*p1, *p2); }
6506
+ { (*p3) = fmod((*p1), (*p2)); }
6284
6507
  }
6285
6508
  }
6286
6509
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -6294,20 +6517,20 @@ ca_binop_reminder_float64_t (ca_size_t n, boolean8_t *m,
6294
6517
  #pragma omp simd
6295
6518
  for (k=0; k<n; k++) {
6296
6519
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
6297
- { (*p3) = remainder(*p1, *p2); }
6520
+ { (*p3) = fmod((*p1), (*p2)); }
6298
6521
  }
6299
6522
  } else {
6300
6523
  /* strided branch: numo-shape `p += s` increment form. */
6301
6524
  double *p1 = q1, *p2 = q2, *p3 = q3;
6302
6525
  for (k=0; k<n; k++) {
6303
- { (*p3) = remainder(*p1, *p2); }
6526
+ { (*p3) = fmod((*p1), (*p2)); }
6304
6527
  p1 += i1; p2 += i2; p3 += i3;
6305
6528
  }
6306
6529
  }
6307
6530
  }
6308
6531
 
6309
6532
  static void
6310
- ca_binop_reminder_VALUE (ca_size_t n, boolean8_t *m,
6533
+ ca_binop_fmod_VALUE (ca_size_t n, boolean8_t *m,
6311
6534
  char * __restrict__ ptr1, ca_size_t i1,
6312
6535
  char * __restrict__ ptr2, ca_size_t i2,
6313
6536
  char * __restrict__ ptr3, ca_size_t i3)
@@ -6325,7 +6548,7 @@ ca_binop_reminder_VALUE (ca_size_t n, boolean8_t *m,
6325
6548
  p1 = q1 + k*i1;
6326
6549
  p2 = q2 + k*i2;
6327
6550
  p3 = q3 + k*i3;
6328
- { (*p3) = rb_funcall((*p1), rb_intern("%"), 1, (*p2)); }
6551
+ { (*p3) = rb_funcall((*p1), rb_intern("remainder"), 1, (*p2)); }
6329
6552
  }
6330
6553
  }
6331
6554
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -6339,49 +6562,49 @@ ca_binop_reminder_VALUE (ca_size_t n, boolean8_t *m,
6339
6562
  #pragma omp simd
6340
6563
  for (k=0; k<n; k++) {
6341
6564
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
6342
- { (*p3) = rb_funcall((*p1), rb_intern("%"), 1, (*p2)); }
6565
+ { (*p3) = rb_funcall((*p1), rb_intern("remainder"), 1, (*p2)); }
6343
6566
  }
6344
6567
  } else {
6345
6568
  /* strided branch: numo-shape `p += s` increment form. */
6346
6569
  VALUE *p1 = q1, *p2 = q2, *p3 = q3;
6347
6570
  for (k=0; k<n; k++) {
6348
- { (*p3) = rb_funcall((*p1), rb_intern("%"), 1, (*p2)); }
6571
+ { (*p3) = rb_funcall((*p1), rb_intern("remainder"), 1, (*p2)); }
6349
6572
  p1 += i1; p2 += i2; p3 += i3;
6350
6573
  }
6351
6574
  }
6352
6575
  }
6353
6576
 
6354
6577
  ca_binop_func_t
6355
- ca_binop_reminder[CA_NTYPE] = {
6578
+ ca_binop_fmod[CA_NTYPE] = {
6356
6579
  ca_binop_not_implement,
6357
6580
  ca_binop_not_implement,
6358
- ca_binop_reminder_int8_t,
6359
- ca_binop_reminder_uint8_t,
6360
- ca_binop_reminder_int16_t,
6361
- ca_binop_reminder_uint16_t,
6362
- ca_binop_reminder_int32_t,
6363
- ca_binop_reminder_uint32_t,
6364
- ca_binop_reminder_int64_t,
6365
- ca_binop_reminder_uint64_t,
6366
- ca_binop_reminder_float32_t,
6367
- ca_binop_reminder_float64_t,
6581
+ ca_binop_fmod_int8_t,
6582
+ ca_binop_fmod_uint8_t,
6583
+ ca_binop_fmod_int16_t,
6584
+ ca_binop_fmod_uint16_t,
6585
+ ca_binop_fmod_int32_t,
6586
+ ca_binop_fmod_uint32_t,
6587
+ ca_binop_fmod_int64_t,
6588
+ ca_binop_fmod_uint64_t,
6589
+ ca_binop_fmod_float32_t,
6590
+ ca_binop_fmod_float64_t,
6368
6591
  ca_binop_not_implement,
6369
6592
  ca_binop_not_implement,
6370
6593
  ca_binop_not_implement,
6371
6594
  ca_binop_not_implement,
6372
- ca_binop_reminder_VALUE,
6595
+ ca_binop_fmod_VALUE,
6373
6596
  };
6374
6597
 
6375
- VALUE rb_ca_reminder (VALUE self, VALUE other)
6598
+ VALUE rb_ca_fmod (VALUE self, VALUE other)
6376
6599
  {
6377
6600
  if ( ! rb_ca_test_castable(other) ) {
6378
- return rb_ca_binop_pass_to_other(self, other, rb_intern("reminder"));
6601
+ return rb_ca_binop_pass_to_other(self, other, rb_intern("fmod"));
6379
6602
  }
6380
- return rb_ca_call_binop(self, other, ca_binop_reminder);
6603
+ return rb_ca_call_binop(self, other, ca_binop_fmod);
6381
6604
  }
6382
6605
 
6383
- VALUE rb_ca_reminder_bang (VALUE self, VALUE other)
6384
- { return rb_ca_call_binop_bang(self, other, ca_binop_reminder); }
6606
+ VALUE rb_ca_fmod_bang (VALUE self, VALUE other)
6607
+ { return rb_ca_call_binop_bang(self, other, ca_binop_fmod); }
6385
6608
 
6386
6609
  /* ===== binop bit_and_i ============================================ */
6387
6610
 
@@ -9466,7 +9689,7 @@ ca_binop_power_float32_t (ca_size_t n, boolean8_t *m,
9466
9689
  p1 = q1 + k*i1;
9467
9690
  p2 = q2 + k*i2;
9468
9691
  p3 = q3 + k*i3;
9469
- { (*p3) = pow((*p1), (*p2)); }
9692
+ { (*p3) = powf((*p1), (*p2)); }
9470
9693
  }
9471
9694
  }
9472
9695
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -9480,13 +9703,13 @@ ca_binop_power_float32_t (ca_size_t n, boolean8_t *m,
9480
9703
  #pragma omp simd
9481
9704
  for (k=0; k<n; k++) {
9482
9705
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
9483
- { (*p3) = pow((*p1), (*p2)); }
9706
+ { (*p3) = powf((*p1), (*p2)); }
9484
9707
  }
9485
9708
  } else {
9486
9709
  /* strided branch: numo-shape `p += s` increment form. */
9487
9710
  float *p1 = q1, *p2 = q2, *p3 = q3;
9488
9711
  for (k=0; k<n; k++) {
9489
- { (*p3) = pow((*p1), (*p2)); }
9712
+ { (*p3) = powf((*p1), (*p2)); }
9490
9713
  p1 += i1; p2 += i2; p3 += i3;
9491
9714
  }
9492
9715
  }
@@ -9725,7 +9948,7 @@ ca_binop_copysign_float32_t (ca_size_t n, boolean8_t *m,
9725
9948
  p1 = q1 + k*i1;
9726
9949
  p2 = q2 + k*i2;
9727
9950
  p3 = q3 + k*i3;
9728
- { (*p3) = copysign((*p1), (*p2)); }
9951
+ { (*p3) = copysignf((*p1), (*p2)); }
9729
9952
  }
9730
9953
  }
9731
9954
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -9739,13 +9962,13 @@ ca_binop_copysign_float32_t (ca_size_t n, boolean8_t *m,
9739
9962
  #pragma omp simd
9740
9963
  for (k=0; k<n; k++) {
9741
9964
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
9742
- { (*p3) = copysign((*p1), (*p2)); }
9965
+ { (*p3) = copysignf((*p1), (*p2)); }
9743
9966
  }
9744
9967
  } else {
9745
9968
  /* strided branch: numo-shape `p += s` increment form. */
9746
9969
  float *p1 = q1, *p2 = q2, *p3 = q3;
9747
9970
  for (k=0; k<n; k++) {
9748
- { (*p3) = copysign((*p1), (*p2)); }
9971
+ { (*p3) = copysignf((*p1), (*p2)); }
9749
9972
  p1 += i1; p2 += i2; p3 += i3;
9750
9973
  }
9751
9974
  }
@@ -9924,7 +10147,7 @@ ca_binop_nextafter_float32_t (ca_size_t n, boolean8_t *m,
9924
10147
  p1 = q1 + k*i1;
9925
10148
  p2 = q2 + k*i2;
9926
10149
  p3 = q3 + k*i3;
9927
- { (*p3) = nextafter((*p1), (*p2)); }
10150
+ { (*p3) = nextafterf((*p1), (*p2)); }
9928
10151
  }
9929
10152
  }
9930
10153
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -9938,13 +10161,13 @@ ca_binop_nextafter_float32_t (ca_size_t n, boolean8_t *m,
9938
10161
  #pragma omp simd
9939
10162
  for (k=0; k<n; k++) {
9940
10163
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
9941
- { (*p3) = nextafter((*p1), (*p2)); }
10164
+ { (*p3) = nextafterf((*p1), (*p2)); }
9942
10165
  }
9943
10166
  } else {
9944
10167
  /* strided branch: numo-shape `p += s` increment form. */
9945
10168
  float *p1 = q1, *p2 = q2, *p3 = q3;
9946
10169
  for (k=0; k<n; k++) {
9947
- { (*p3) = nextafter((*p1), (*p2)); }
10170
+ { (*p3) = nextafterf((*p1), (*p2)); }
9948
10171
  p1 += i1; p2 += i2; p3 += i3;
9949
10172
  }
9950
10173
  }
@@ -10102,205 +10325,6 @@ VALUE rb_ca_nextafter (VALUE self, VALUE other)
10102
10325
  VALUE rb_ca_nextafter_bang (VALUE self, VALUE other)
10103
10326
  { return rb_ca_call_binop_bang(self, other, ca_binop_nextafter); }
10104
10327
 
10105
- /* ===== binop fmod ============================================ */
10106
-
10107
- static void
10108
- ca_binop_fmod_float32_t (ca_size_t n, boolean8_t *m,
10109
- char * __restrict__ ptr1, ca_size_t i1,
10110
- char * __restrict__ ptr2, ca_size_t i2,
10111
- char * __restrict__ ptr3, ca_size_t i3)
10112
- {
10113
- float * __restrict__ q1 = (float *) ptr1;
10114
- float * __restrict__ q2 = (float *) ptr2;
10115
- float * __restrict__ q3 = (float *) ptr3;
10116
- ca_size_t k;
10117
- if ( m ) {
10118
- float *p1 = q1, *p2 = q2, *p3 = q3;
10119
- boolean8_t *pm;
10120
- for (k=0; k<n; k++) {
10121
- pm = m + k;
10122
- if ( ! *pm ) {
10123
- p1 = q1 + k*i1;
10124
- p2 = q2 + k*i2;
10125
- p3 = q3 + k*i3;
10126
- { (*p3) = fmod((*p1), (*p2)); }
10127
- }
10128
- }
10129
- } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
10130
- /* contig branch: SIMD-friendly form. Index-form `q[k]` exposes
10131
- the unit-stride access to the vectorizer; `__restrict__` on
10132
- q1/q2/q3 promises no aliasing so the omp simd pragma can
10133
- license lane-parallel loads/stores. Element-wise binop has
10134
- no reassoc, so ε-close numeric contract is unaffected. */
10135
- float *p1, *p2, *p3;
10136
- (void)p1; (void)p2; (void)p3;
10137
- #pragma omp simd
10138
- for (k=0; k<n; k++) {
10139
- p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
10140
- { (*p3) = fmod((*p1), (*p2)); }
10141
- }
10142
- } else {
10143
- /* strided branch: numo-shape `p += s` increment form. */
10144
- float *p1 = q1, *p2 = q2, *p3 = q3;
10145
- for (k=0; k<n; k++) {
10146
- { (*p3) = fmod((*p1), (*p2)); }
10147
- p1 += i1; p2 += i2; p3 += i3;
10148
- }
10149
- }
10150
- }
10151
-
10152
- static void
10153
- ca_binop_fmod_float64_t (ca_size_t n, boolean8_t *m,
10154
- char * __restrict__ ptr1, ca_size_t i1,
10155
- char * __restrict__ ptr2, ca_size_t i2,
10156
- char * __restrict__ ptr3, ca_size_t i3)
10157
- {
10158
- double * __restrict__ q1 = (double *) ptr1;
10159
- double * __restrict__ q2 = (double *) ptr2;
10160
- double * __restrict__ q3 = (double *) ptr3;
10161
- ca_size_t k;
10162
- if ( m ) {
10163
- double *p1 = q1, *p2 = q2, *p3 = q3;
10164
- boolean8_t *pm;
10165
- for (k=0; k<n; k++) {
10166
- pm = m + k;
10167
- if ( ! *pm ) {
10168
- p1 = q1 + k*i1;
10169
- p2 = q2 + k*i2;
10170
- p3 = q3 + k*i3;
10171
- { (*p3) = fmod((*p1), (*p2)); }
10172
- }
10173
- }
10174
- } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
10175
- /* contig branch: SIMD-friendly form. Index-form `q[k]` exposes
10176
- the unit-stride access to the vectorizer; `__restrict__` on
10177
- q1/q2/q3 promises no aliasing so the omp simd pragma can
10178
- license lane-parallel loads/stores. Element-wise binop has
10179
- no reassoc, so ε-close numeric contract is unaffected. */
10180
- double *p1, *p2, *p3;
10181
- (void)p1; (void)p2; (void)p3;
10182
- #pragma omp simd
10183
- for (k=0; k<n; k++) {
10184
- p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
10185
- { (*p3) = fmod((*p1), (*p2)); }
10186
- }
10187
- } else {
10188
- /* strided branch: numo-shape `p += s` increment form. */
10189
- double *p1 = q1, *p2 = q2, *p3 = q3;
10190
- for (k=0; k<n; k++) {
10191
- { (*p3) = fmod((*p1), (*p2)); }
10192
- p1 += i1; p2 += i2; p3 += i3;
10193
- }
10194
- }
10195
- }
10196
-
10197
- static void
10198
- ca_binop_fmod_VALUE (ca_size_t n, boolean8_t *m,
10199
- char * __restrict__ ptr1, ca_size_t i1,
10200
- char * __restrict__ ptr2, ca_size_t i2,
10201
- char * __restrict__ ptr3, ca_size_t i3)
10202
- {
10203
- VALUE * __restrict__ q1 = (VALUE *) ptr1;
10204
- VALUE * __restrict__ q2 = (VALUE *) ptr2;
10205
- VALUE * __restrict__ q3 = (VALUE *) ptr3;
10206
- ca_size_t k;
10207
- if ( m ) {
10208
- VALUE *p1 = q1, *p2 = q2, *p3 = q3;
10209
- boolean8_t *pm;
10210
- for (k=0; k<n; k++) {
10211
- pm = m + k;
10212
- if ( ! *pm ) {
10213
- p1 = q1 + k*i1;
10214
- p2 = q2 + k*i2;
10215
- p3 = q3 + k*i3;
10216
- { {
10217
- VALUE _l = (*p1);
10218
- VALUE _r = (*p2);
10219
- if ((RB_FLOAT_TYPE_P(_l) || RB_INTEGER_TYPE_P(_l) || RB_TYPE_P(_l, T_RATIONAL)) &&
10220
- (RB_FLOAT_TYPE_P(_r) || RB_INTEGER_TYPE_P(_r) || RB_TYPE_P(_r, T_RATIONAL))) {
10221
- (*p3) = DBL2NUM(fmod(NUM2DBL(_l), NUM2DBL(_r)));
10222
- } else {
10223
- (*p3) = rb_funcall(_l, rb_intern("fmod"), 1, _r);
10224
- }
10225
- }
10226
- }
10227
- }
10228
- }
10229
- } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
10230
- /* contig branch: SIMD-friendly form. Index-form `q[k]` exposes
10231
- the unit-stride access to the vectorizer; `__restrict__` on
10232
- q1/q2/q3 promises no aliasing so the omp simd pragma can
10233
- license lane-parallel loads/stores. Element-wise binop has
10234
- no reassoc, so ε-close numeric contract is unaffected. */
10235
- VALUE *p1, *p2, *p3;
10236
- (void)p1; (void)p2; (void)p3;
10237
- #pragma omp simd
10238
- for (k=0; k<n; k++) {
10239
- p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
10240
- { {
10241
- VALUE _l = (*p1);
10242
- VALUE _r = (*p2);
10243
- if ((RB_FLOAT_TYPE_P(_l) || RB_INTEGER_TYPE_P(_l) || RB_TYPE_P(_l, T_RATIONAL)) &&
10244
- (RB_FLOAT_TYPE_P(_r) || RB_INTEGER_TYPE_P(_r) || RB_TYPE_P(_r, T_RATIONAL))) {
10245
- (*p3) = DBL2NUM(fmod(NUM2DBL(_l), NUM2DBL(_r)));
10246
- } else {
10247
- (*p3) = rb_funcall(_l, rb_intern("fmod"), 1, _r);
10248
- }
10249
- }
10250
- }
10251
- }
10252
- } else {
10253
- /* strided branch: numo-shape `p += s` increment form. */
10254
- VALUE *p1 = q1, *p2 = q2, *p3 = q3;
10255
- for (k=0; k<n; k++) {
10256
- { {
10257
- VALUE _l = (*p1);
10258
- VALUE _r = (*p2);
10259
- if ((RB_FLOAT_TYPE_P(_l) || RB_INTEGER_TYPE_P(_l) || RB_TYPE_P(_l, T_RATIONAL)) &&
10260
- (RB_FLOAT_TYPE_P(_r) || RB_INTEGER_TYPE_P(_r) || RB_TYPE_P(_r, T_RATIONAL))) {
10261
- (*p3) = DBL2NUM(fmod(NUM2DBL(_l), NUM2DBL(_r)));
10262
- } else {
10263
- (*p3) = rb_funcall(_l, rb_intern("fmod"), 1, _r);
10264
- }
10265
- }
10266
- }
10267
- p1 += i1; p2 += i2; p3 += i3;
10268
- }
10269
- }
10270
- }
10271
-
10272
- ca_binop_func_t
10273
- ca_binop_fmod[CA_NTYPE] = {
10274
- ca_binop_not_implement,
10275
- ca_binop_not_implement,
10276
- ca_binop_not_implement,
10277
- ca_binop_not_implement,
10278
- ca_binop_not_implement,
10279
- ca_binop_not_implement,
10280
- ca_binop_not_implement,
10281
- ca_binop_not_implement,
10282
- ca_binop_not_implement,
10283
- ca_binop_not_implement,
10284
- ca_binop_fmod_float32_t,
10285
- ca_binop_fmod_float64_t,
10286
- ca_binop_not_implement,
10287
- ca_binop_not_implement,
10288
- ca_binop_not_implement,
10289
- ca_binop_not_implement,
10290
- ca_binop_fmod_VALUE,
10291
- };
10292
-
10293
- VALUE rb_ca_fmod (VALUE self, VALUE other)
10294
- {
10295
- if ( ! rb_ca_test_castable(other) ) {
10296
- return rb_ca_binop_pass_to_other(self, other, rb_intern("fmod"));
10297
- }
10298
- return rb_ca_call_binop(self, other, ca_binop_fmod);
10299
- }
10300
-
10301
- VALUE rb_ca_fmod_bang (VALUE self, VALUE other)
10302
- { return rb_ca_call_binop_bang(self, other, ca_binop_fmod); }
10303
-
10304
10328
  /* ===== binop atan2 ============================================ */
10305
10329
 
10306
10330
  static void
@@ -10322,7 +10346,7 @@ ca_binop_atan2_float32_t (ca_size_t n, boolean8_t *m,
10322
10346
  p1 = q1 + k*i1;
10323
10347
  p2 = q2 + k*i2;
10324
10348
  p3 = q3 + k*i3;
10325
- { (*p3) = atan2((*p1), (*p2)); }
10349
+ { (*p3) = atan2f((*p1), (*p2)); }
10326
10350
  }
10327
10351
  }
10328
10352
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -10336,13 +10360,13 @@ ca_binop_atan2_float32_t (ca_size_t n, boolean8_t *m,
10336
10360
  #pragma omp simd
10337
10361
  for (k=0; k<n; k++) {
10338
10362
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
10339
- { (*p3) = atan2((*p1), (*p2)); }
10363
+ { (*p3) = atan2f((*p1), (*p2)); }
10340
10364
  }
10341
10365
  } else {
10342
10366
  /* strided branch: numo-shape `p += s` increment form. */
10343
10367
  float *p1 = q1, *p2 = q2, *p3 = q3;
10344
10368
  for (k=0; k<n; k++) {
10345
- { (*p3) = atan2((*p1), (*p2)); }
10369
+ { (*p3) = atan2f((*p1), (*p2)); }
10346
10370
  p1 += i1; p2 += i2; p3 += i3;
10347
10371
  }
10348
10372
  }
@@ -10521,7 +10545,7 @@ ca_binop_hypot_float32_t (ca_size_t n, boolean8_t *m,
10521
10545
  p1 = q1 + k*i1;
10522
10546
  p2 = q2 + k*i2;
10523
10547
  p3 = q3 + k*i3;
10524
- { (*p3) = hypot((*p1), (*p2)); }
10548
+ { (*p3) = hypotf((*p1), (*p2)); }
10525
10549
  }
10526
10550
  }
10527
10551
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -10535,13 +10559,13 @@ ca_binop_hypot_float32_t (ca_size_t n, boolean8_t *m,
10535
10559
  #pragma omp simd
10536
10560
  for (k=0; k<n; k++) {
10537
10561
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
10538
- { (*p3) = hypot((*p1), (*p2)); }
10562
+ { (*p3) = hypotf((*p1), (*p2)); }
10539
10563
  }
10540
10564
  } else {
10541
10565
  /* strided branch: numo-shape `p += s` increment form. */
10542
10566
  float *p1 = q1, *p2 = q2, *p3 = q3;
10543
10567
  for (k=0; k<n; k++) {
10544
- { (*p3) = hypot((*p1), (*p2)); }
10568
+ { (*p3) = hypotf((*p1), (*p2)); }
10545
10569
  p1 += i1; p2 += i2; p3 += i3;
10546
10570
  }
10547
10571
  }
@@ -10720,7 +10744,7 @@ ca_binop_logaddexp_float32_t (ca_size_t n, boolean8_t *m,
10720
10744
  p1 = q1 + k*i1;
10721
10745
  p2 = q2 + k*i2;
10722
10746
  p3 = q3 + k*i3;
10723
- { (*p3) = fmax((*p1), (*p2)) + log1p(exp(-fabs((*p1) - (*p2)))); }
10747
+ { (*p3) = fmaxf((*p1), (*p2)) + log1pf(expf(-fabsf((*p1) - (*p2)))); }
10724
10748
  }
10725
10749
  }
10726
10750
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -10734,13 +10758,13 @@ ca_binop_logaddexp_float32_t (ca_size_t n, boolean8_t *m,
10734
10758
  #pragma omp simd
10735
10759
  for (k=0; k<n; k++) {
10736
10760
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
10737
- { (*p3) = fmax((*p1), (*p2)) + log1p(exp(-fabs((*p1) - (*p2)))); }
10761
+ { (*p3) = fmaxf((*p1), (*p2)) + log1pf(expf(-fabsf((*p1) - (*p2)))); }
10738
10762
  }
10739
10763
  } else {
10740
10764
  /* strided branch: numo-shape `p += s` increment form. */
10741
10765
  float *p1 = q1, *p2 = q2, *p3 = q3;
10742
10766
  for (k=0; k<n; k++) {
10743
- { (*p3) = fmax((*p1), (*p2)) + log1p(exp(-fabs((*p1) - (*p2)))); }
10767
+ { (*p3) = fmaxf((*p1), (*p2)) + log1pf(expf(-fabsf((*p1) - (*p2)))); }
10744
10768
  p1 += i1; p2 += i2; p3 += i3;
10745
10769
  }
10746
10770
  }
@@ -10932,8 +10956,8 @@ Init_carray_kernels_binop (void)
10932
10956
  rb_define_method(rb_cCArray, "rcp_mul!", rb_ca_rcp_mul_bang, 1);
10933
10957
  rb_define_method(rb_cCArray, "%", rb_ca_mod, 1);
10934
10958
  rb_define_method(rb_cCArray, "mod!", rb_ca_mod_bang, 1);
10935
- rb_define_method(rb_cCArray, "reminder", rb_ca_reminder, 1);
10936
- rb_define_method(rb_cCArray, "reminder!", rb_ca_reminder_bang, 1);
10959
+ rb_define_method(rb_cCArray, "fmod", rb_ca_fmod, 1);
10960
+ rb_define_method(rb_cCArray, "fmod!", rb_ca_fmod_bang, 1);
10937
10961
  rb_define_method(rb_cCArray, "&", rb_ca_bit_and_i, 1);
10938
10962
  rb_define_method(rb_cCArray, "bit_and_i!", rb_ca_bit_and_i_bang, 1);
10939
10963
  rb_define_method(rb_cCArray, "|", rb_ca_bit_or_i, 1);
@@ -10968,8 +10992,6 @@ Init_carray_kernels_binop (void)
10968
10992
  rb_define_method(rb_cCArray, "copysign!", rb_ca_copysign_bang, 1);
10969
10993
  rb_define_method(rb_cCArray, "nextafter", rb_ca_nextafter, 1);
10970
10994
  rb_define_method(rb_cCArray, "nextafter!", rb_ca_nextafter_bang, 1);
10971
- rb_define_method(rb_cCArray, "fmod", rb_ca_fmod, 1);
10972
- rb_define_method(rb_cCArray, "fmod!", rb_ca_fmod_bang, 1);
10973
10995
  rb_define_method(rb_cCArray, "atan2", rb_ca_atan2, 1);
10974
10996
  rb_define_method(rb_cCArray, "atan2!", rb_ca_atan2_bang, 1);
10975
10997
  rb_define_method(rb_cCArray, "hypot", rb_ca_hypot, 1);