|
1 | 1 | #define _USE_MATH_DEFINES |
| 2 | +#include <assert.h> |
2 | 3 | #include <math.h> |
3 | 4 |
|
4 | 5 | int main() |
5 | 6 | { |
6 | | - double s, f = 0.0, fStep = 0.1 * M_PI; |
7 | | - int n = 0; |
| 7 | + // Test special values - these should be precise |
| 8 | + double s; |
8 | 9 |
|
9 | | - do |
| 10 | + // sin(0) should be exactly 0 |
| 11 | + s = sin(0.0); |
| 12 | + assert(s >= -1e-10 && s <= 1e-10); |
| 13 | + |
| 14 | + // sin(π/2) should be approximately 1 |
| 15 | + s = sin(M_PI / 2.0); |
| 16 | + assert(s >= 0.999999999 && s <= 1.0); |
| 17 | + |
| 18 | + // sin(-π/2) should be approximately -1 |
| 19 | + s = sin(-M_PI / 2.0); |
| 20 | + assert(s >= -1.0 && s <= -0.999999999); |
| 21 | + |
| 22 | + // sin(π) should be approximately 0 |
| 23 | + s = sin(M_PI); |
| 24 | + assert(s >= -1e-10 && s <= 1e-10); |
| 25 | + |
| 26 | + // sin(-π) should be approximately 0 |
| 27 | + s = sin(-M_PI); |
| 28 | + assert(s >= -1e-10 && s <= 1e-10); |
| 29 | + |
| 30 | + // sin(2π) should be approximately 0 |
| 31 | + s = sin(2.0 * M_PI); |
| 32 | + assert(s >= -1e-10 && s <= 1e-10); |
| 33 | + |
| 34 | + // Test range narrowing for first quadrant [0, π/2] |
| 35 | + s = sin(M_PI / 4.0); // 45 degrees |
| 36 | + assert(s >= 0.0 && s <= 1.0); // Should be in [0, 1] |
| 37 | + |
| 38 | + // Test range narrowing for second quadrant [π/2, π] |
| 39 | + s = sin(3.0 * M_PI / 4.0); // 135 degrees |
| 40 | + assert(s >= 0.0 && s <= 1.0); // Should be in [0, 1] |
| 41 | + |
| 42 | + // Test range narrowing for third quadrant [π, 3π/2] |
| 43 | + s = sin(5.0 * M_PI / 4.0); // 225 degrees |
| 44 | + assert(s >= -1.0 && s <= 0.0); // Should be in [-1, 0] |
| 45 | + |
| 46 | + // Test range narrowing for fourth quadrant [3π/2, 2π] |
| 47 | + s = sin(7.0 * M_PI / 4.0); // 315 degrees |
| 48 | + assert(s >= -1.0 && s <= 0.0); // Should be in [-1, 0] |
| 49 | + |
| 50 | + // ========== SINE TESTS ========== |
| 51 | + |
| 52 | + // Test 1: sin(0) ≈ 0 |
| 53 | + { |
| 54 | + double s = sin(0.0); |
| 55 | + assert(s >= -1e-9 && s <= 1e-9); |
| 56 | + } |
| 57 | + |
| 58 | + // Test 2: sin(π/2) ≈ 1 |
| 59 | + { |
| 60 | + double s = sin(M_PI / 2.0); |
| 61 | + assert(s >= 0.99 && s <= 1.0); |
| 62 | + } |
| 63 | + |
| 64 | + // Test 3: sin(-π/2) ≈ -1 |
| 65 | + { |
| 66 | + double s = sin(-M_PI / 2.0); |
| 67 | + assert(s >= -1.0 && s <= -0.99); |
| 68 | + } |
| 69 | + |
| 70 | + // Test 4: sin(π) ≈ 0 |
| 71 | + { |
| 72 | + double s = sin(M_PI); |
| 73 | + assert(s >= -1e-9 && s <= 1e-9); |
| 74 | + } |
| 75 | + |
| 76 | + // Test 5: Range narrowing - sin(x) ≥ 0 for x in [0, π] |
| 77 | + { |
| 78 | + double x; |
| 79 | + __CPROVER_assume(x >= 0.1 && x <= M_PI - 0.1); |
| 80 | + double s = sin(x); |
| 81 | + assert(s >= 0.0 && s <= 1.0); |
| 82 | + } |
| 83 | + |
| 84 | + // Test 6: Range narrowing - sin(x) ≤ 0 for x in [π, 2π] |
10 | 85 | { |
11 | | - s = sin(f); |
12 | | - f += fStep; |
13 | | - n++; |
14 | | - } while(f < M_PI); |
| 86 | + double x; |
| 87 | + __CPROVER_assume(x >= M_PI + 0.1 && x <= 2.0 * M_PI - 0.1); |
| 88 | + double s = sin(x); |
| 89 | + assert(s >= -1.0 && s <= 0.0); |
| 90 | + } |
15 | 91 |
|
16 | | - assert(n < 11); |
| 92 | + return 0; |
17 | 93 | } |
0 commit comments