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