/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 | 12 | #define ONE_TOL 1.00000000000001 |
9 | 552k | #define ATOL 1e-50 |
10 | | |
11 | 290k | double aasin(PJ_CONTEXT *ctx, double v) { |
12 | 290k | double av; |
13 | | |
14 | 290k | if ((av = fabs(v)) >= 1.) { |
15 | 4 | if (av > ONE_TOL) |
16 | 2 | proj_context_errno_set( |
17 | 2 | ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); |
18 | 4 | return (v < 0. ? -M_HALFPI : M_HALFPI); |
19 | 4 | } |
20 | 290k | return asin(v); |
21 | 290k | } |
22 | | |
23 | 4.08k | double aacos(PJ_CONTEXT *ctx, double v) { |
24 | 4.08k | double av; |
25 | | |
26 | 4.08k | if ((av = fabs(v)) >= 1.) { |
27 | 8 | if (av > ONE_TOL) |
28 | 2 | proj_context_errno_set( |
29 | 2 | ctx, PROJ_ERR_COORD_TRANSFM_OUTSIDE_PROJECTION_DOMAIN); |
30 | 8 | return (v < 0. ? M_PI : 0.); |
31 | 8 | } |
32 | 4.07k | return acos(v); |
33 | 4.08k | } |
34 | 14.6k | double asqrt(double v) { return ((v <= 0) ? 0. : sqrt(v)); } |
35 | 276k | double aatan2(double n, double d) { |
36 | 276k | return ((fabs(n) < ATOL && fabs(d) < ATOL) ? 0. : atan2(n, d)); |
37 | 276k | } |