1 #include <glm/gtc/ulp.hpp>
2 #include <limits>
3
test_ulp_float_dist()4 int test_ulp_float_dist()
5 {
6 int Error = 0;
7
8 float A = 1.0f;
9
10 float B = glm::next_float(A);
11 Error += A != B ? 0 : 1;
12 float C = glm::prev_float(B);
13 Error += A == C ? 0 : 1;
14
15 int D = glm::float_distance(A, B);
16 Error += D == 1 ? 0 : 1;
17 int E = glm::float_distance(A, C);
18 Error += E == 0 ? 0 : 1;
19
20 return Error;
21 }
22
test_ulp_float_step()23 int test_ulp_float_step()
24 {
25 int Error = 0;
26
27 float A = 1.0f;
28
29 for(int i = 10; i < 1000; i *= 10)
30 {
31 float B = glm::next_float(A, i);
32 Error += A != B ? 0 : 1;
33 float C = glm::prev_float(B, i);
34 Error += A == C ? 0 : 1;
35
36 int D = glm::float_distance(A, B);
37 Error += D == i ? 0 : 1;
38 int E = glm::float_distance(A, C);
39 Error += E == 0 ? 0 : 1;
40 }
41
42 return Error;
43 }
44
test_ulp_double_dist()45 int test_ulp_double_dist()
46 {
47 int Error = 0;
48
49 double A = 1.0;
50
51 double B = glm::next_float(A);
52 Error += A != B ? 0 : 1;
53 double C = glm::prev_float(B);
54 Error += A == C ? 0 : 1;
55
56 int D = glm::float_distance(A, B);
57 Error += D == 1 ? 0 : 1;
58 int E = glm::float_distance(A, C);
59 Error += E == 0 ? 0 : 1;
60
61 return Error;
62 }
63
test_ulp_double_step()64 int test_ulp_double_step()
65 {
66 int Error = 0;
67
68 double A = 1.0;
69
70 for(int i = 10; i < 1000; i *= 10)
71 {
72 double B = glm::next_float(A, i);
73 Error += A != B ? 0 : 1;
74 double C = glm::prev_float(B, i);
75 Error += A == C ? 0 : 1;
76
77 int D = glm::float_distance(A, B);
78 Error += D == i ? 0 : 1;
79 int E = glm::float_distance(A, C);
80 Error += E == 0 ? 0 : 1;
81 }
82
83 return Error;
84 }
85
main()86 int main()
87 {
88 int Error = 0;
89 Error += test_ulp_float_dist();
90 Error += test_ulp_float_step();
91 Error += test_ulp_double_dist();
92 Error += test_ulp_double_step();
93 return Error;
94 }
95
96
97