CAMLprim value LFUN(linspace_stub)(value vY, value va, value vb, value vN) { CAMLparam1(vY); integer i, GET_INT(N); REAL ar = Double_field(va, 0), ai = Double_field(va, 1), N1 = N - 1., hr = (Double_field(vb, 0) - ar) / N1, hi = (Double_field(vb, 1) - ai) / N1, xr = ar, xi = ai; VEC_PARAMS1(Y); caml_enter_blocking_section(); /* Allow other threads */ for (i = 1; i <= N; i++) { Y_data->r = xr; Y_data->i = xi; Y_data++; xr = ar + i * hr; xi = ai + i * hi; } caml_leave_blocking_section(); /* Disallow other threads */ CAMLreturn(Val_unit); }
CAMLprim value LFUN(logspace_stub)(value vY, value va, value vb, value vbase, value vN) { CAMLparam1(vY); integer i, GET_INT(N); REAL ar = Double_field(va, 0), ai = Double_field(va, 1), N1 = N - 1., hr = (Double_field(vb, 0) - ar) / N1, hi = (Double_field(vb, 1) - ai) / N1, base = Double_val(vbase), xr = ar, xi = ai; VEC_PARAMS1(Y); caml_enter_blocking_section(); /* Allow other threads */ if (base == 2.0) for (i = 1; i <= N; i++) { Y_data->r = exp2(xr); Y_data->i = exp2(xi); Y_data++; xr = ar + i * hr; xi = ai + i * hi; } else if (base == 10.0) for (i = 1; i <= N; i++) { Y_data->r = exp10(xr); Y_data->i = exp10(xi); Y_data++; xr = ar + i * hr; xi = ai + i * hi; } else if (base == 2.7182818284590452353602874713526625L) for (i = 1; i <= N; i++) { Y_data->r = exp(xr); Y_data->i = exp(xi); Y_data++; xr = ar + i * hr; xi = ai + i * hi; } else { double log_base = log(base); for (i = 1; i <= N; i++) { Y_data->r = exp(xr * log_base); Y_data->i = exp(xi * log_base); Y_data++; xr = ar + i * hr; xi = ai + i * hi; } } caml_leave_blocking_section(); /* Disallow other threads */ CAMLreturn(Val_unit); }
CAMLprim value LFUN(logspace_stub)(value vY, value va, value vb, value vbase, value vN) { CAMLparam1(vY); integer i, GET_INT(N); double a = Double_val(va), h = (Double_val(vb) - a)/(N - 1), base = Double_val(vbase), x = a; VEC_PARAMS1(Y); caml_enter_blocking_section(); /* Allow other threads */ if (base == 2.0) for (i = 1; i <= N; i++) { *Y_data = exp2(x); Y_data++; x = a + i * h; } else if (base == 10.0) for (i = 1; i <= N; i++) { *Y_data = exp10(x); Y_data++; x = a + i * h; } else if (base == 2.7182818284590452353602874713526625L) for (i = 1; i <= N; i++) { *Y_data = exp(x); Y_data++; x = a + i * h; } else { double log_base = log(base); for (i = 1; i <= N; i++) { *Y_data = exp(x * log_base); Y_data++; x = a + i * h; } } caml_leave_blocking_section(); /* Disallow other threads */ CAMLreturn(Val_unit); }
CAMLprim value LFUN(linspace_stub)(value vY, value va, value vb, value vN) { CAMLparam1(vY); integer i, GET_INT(N); double a = Double_val(va), h = (Double_val(vb) - a)/(N - 1), x = a; VEC_PARAMS1(Y); caml_enter_blocking_section(); /* Allow other threads */ for (i = 1; i <= N; i++) { *Y_data = x; Y_data++; x = a + i * h; } caml_leave_blocking_section(); /* Disallow other threads */ CAMLreturn(Val_unit); }