/src/PROJ/src/aasincos.cpp
Line | Count | Source |
1 | | /* arc sin, cosine, tan2 and sqrt that will NOT fail */ |
2 | | |
3 | | #include <math.h> |
4 | | |
5 | | #include "proj.h" |
6 | | #include "proj_internal.h" |
7 | | |
8 | 22 | #define ONE_TOL 1.00000000000001 |
9 | 990k | #define ATOL 1e-50 |
10 | | |
11 | 557k | double aasin(PJ_CONTEXT *ctx, double v) { |
12 | 557k | double av; |
13 | | |
14 | 557k | if ((av = fabs(v)) >= 1.) { |
15 | 6 | if (av > ONE_TOL) |
16 | 3 | proj_context_errno_set( |
17 | 3 | ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); |
18 | 6 | return (v < 0. ? -M_HALFPI : M_HALFPI); |
19 | 6 | } |
20 | 557k | return asin(v); |
21 | 557k | } |
22 | | |
23 | 23.4k | double aacos(PJ_CONTEXT *ctx, double v) { |
24 | 23.4k | double av; |
25 | | |
26 | 23.4k | if ((av = fabs(v)) >= 1.) { |
27 | 16 | if (av > ONE_TOL) |
28 | 3 | proj_context_errno_set( |
29 | 3 | ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); |
30 | 16 | return (v < 0. ? M_PI : 0.); |
31 | 16 | } |
32 | 23.4k | return acos(v); |
33 | 23.4k | } |
34 | 28.3k | double asqrt(double v) { return ((v <= 0) ? 0. : sqrt(v)); } |
35 | 495k | double aatan2(double n, double d) { |
36 | 495k | return ((fabs(n) < ATOL && fabs(d) < ATOL) ? 0. : atan2(n, d)); |
37 | 495k | } |