The Battle for Wesnoth  1.13.4+dev
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
floating_point_emulation.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2011 - 2016 by Mark de Wever <[email protected]>
3  Part of the Battle for Wesnoth Project http://www.wesnoth.org/
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY.
11 
12  See the COPYING file for more details.
13 */
14 
16 #include <boost/test/unit_test.hpp>
17 
18 namespace floating_point_emulation {
19 
20 template<class T, unsigned S>
21 inline std::ostream&
22 operator<<(std::ostream& stream, const tfloat<T, S>& rhs)
23 {
24  stream << "\nfloat value_type »" << typeid(T).name()
25  << "« shift »" << S
26  << "« internal value »" << rhs.get_value()
27  << "« as double »" << rhs.to_double()
28  << "« as int »" << rhs.to_int()
29  << "«.\n";
30 
31  return stream;
32 }
33 
34 } // namespace floating_point_emulation
35 
36 template<class T, unsigned S>
37 static void
39 {
40  {
42  BOOST_CHECK_EQUAL(f, 0);
43  BOOST_CHECK_EQUAL(f, 0.);
44  }
45 
46  {
48  BOOST_CHECK_EQUAL(f, 42);
49  BOOST_CHECK_EQUAL(f, 42.);
50  }
51 
52  {
54  BOOST_CHECK_EQUAL(f, 42);
55  BOOST_CHECK_EQUAL(f, 42.);
56  }
57 
58  {
60  BOOST_CHECK_NE(f, 42);
61  BOOST_CHECK_EQUAL(f, 42.42);
62  }
63 }
64 
65 template<class T, unsigned S>
66 static void
68 {
69  {
71  f = 42;
72  BOOST_CHECK_EQUAL(f, 42);
73  BOOST_CHECK_EQUAL(f, 42.);
74  }
75 
76  {
78  f = 42.;
79  BOOST_CHECK_EQUAL(f, 42);
80  BOOST_CHECK_EQUAL(f, 42.);
81  }
82 
83  {
85  f = 42.42;
86  BOOST_CHECK_NE(f, 42);
87  BOOST_CHECK_EQUAL(f, 42.42);
88  }
89 
90  {
92  f = 42;
93  g = f;
94  BOOST_CHECK_EQUAL(f, g);
95  }
96 }
97 
98 
99 template<class T, unsigned S>
100 static void
102 {
103  {
105  BOOST_CHECK_EQUAL(!f, false);
106  BOOST_CHECK_EQUAL(!!f, true);
107 
108  BOOST_CHECK_EQUAL(!g, true);
109  BOOST_CHECK_EQUAL(!!g, false);
110  }
111 
112  {
114  BOOST_CHECK_NE(f, g);
115  BOOST_CHECK_EQUAL(f, -g);
116 
117  BOOST_CHECK_EQUAL(-f, -42);
118  BOOST_CHECK_EQUAL(-f, -42.);
119 
120  BOOST_CHECK_EQUAL(-42, -f);
121  BOOST_CHECK_EQUAL(-42., -f);
122 
123  BOOST_CHECK_EQUAL(-f == g, true);
124  BOOST_CHECK_EQUAL(f == -g, true);
125  BOOST_CHECK_EQUAL(-g == f, true);
126  BOOST_CHECK_EQUAL(g == -f, true);
127 
128  BOOST_CHECK_EQUAL(-f == -42, true);
129  BOOST_CHECK_EQUAL(-f == -42., true);
130 
131  BOOST_CHECK_EQUAL(-42 == -f, true);
132  BOOST_CHECK_EQUAL(-42. == -f, true);
133  }
134 
135  {
137 
138  BOOST_CHECK_EQUAL(+f == f, true);
139  BOOST_CHECK_EQUAL(f == +f, true);
140 
141  BOOST_CHECK_EQUAL(+f == 42, true);
142  BOOST_CHECK_EQUAL(+f == 42., true);
143 
144  BOOST_CHECK_EQUAL(42 == +f, true);
145  BOOST_CHECK_EQUAL(42. == +f, true);
146  }
147 }
148 
149 template<class T, unsigned S>
150 static void
152 {
153  {
155  f *= g;
156  BOOST_CHECK_EQUAL(f, 0);
157  BOOST_CHECK_EQUAL(f, 0.);
158  }
159 
160  {
162  f *= 0;
163  BOOST_CHECK_EQUAL(f, 0);
164  BOOST_CHECK_EQUAL(f, 0.);
165  }
166 
167  {
169  f *= 0.;
170  BOOST_CHECK_EQUAL(f, 0);
171  BOOST_CHECK_EQUAL(f, 0.);
172  }
173 
174 
175 
176  {
178  f *= g;
179  BOOST_CHECK_EQUAL(f, 1764);
180  BOOST_CHECK_EQUAL(f, 1764.);
181  }
182 
183  {
185  f *= 42;
186  BOOST_CHECK_EQUAL(f, 1764);
187  BOOST_CHECK_EQUAL(f, 1764.);
188  }
189 
190  {
192  f *= 42.;
193  BOOST_CHECK_EQUAL(f, 1764);
194  BOOST_CHECK_EQUAL(f, 1764.);
195  }
196 
197 
198 
199  {
201  f *= g;
202  BOOST_CHECK_EQUAL(f, -1764);
203  BOOST_CHECK_EQUAL(f, -1764.);
204  }
205 
206  {
208  f *= 42;
209  BOOST_CHECK_EQUAL(f, -1764);
210  BOOST_CHECK_EQUAL(f, -1764.);
211  }
212 
213  {
215  f *= 42.;
216  BOOST_CHECK_EQUAL(f, -1764);
217  BOOST_CHECK_EQUAL(f, -1764.);
218  }
219 
220 
221 
222  {
224  f *= g;
225  BOOST_CHECK_EQUAL(f, 1764);
226  BOOST_CHECK_EQUAL(f, 1764.);
227  }
228 
229  {
231  f *= -42;
232  BOOST_CHECK_EQUAL(f, 1764);
233  BOOST_CHECK_EQUAL(f, 1764.);
234  }
235 
236  {
238  f *= -42.;
239  BOOST_CHECK_EQUAL(f, 1764);
240  BOOST_CHECK_EQUAL(f, 1764.);
241  }
242 
243 
244 
245  {
247  f *= g;
248  BOOST_CHECK_EQUAL(f, -1764);
249  BOOST_CHECK_EQUAL(f, -1764.);
250  }
251 
252  {
254  f *= -42;
255  BOOST_CHECK_EQUAL(f, -1764);
256  BOOST_CHECK_EQUAL(f, -1764.);
257  }
258 
259  {
261  f *= -42.;
262  BOOST_CHECK_EQUAL(f, -1764);
263  BOOST_CHECK_EQUAL(f, -1764.);
264  }
265 
266 
267 
268  {
270  f *= g;
271  BOOST_CHECK_EQUAL(f, 3.125);
272  }
273 
274  {
276  f *= 2;
277  BOOST_CHECK_EQUAL(f, 2.5);
278  }
279 
280  {
282  f *= 2.5;
283  BOOST_CHECK_EQUAL(f, 3.125);
284  }
285 
286  {
288  f *= g;
289  BOOST_CHECK_EQUAL(f, -3.125);
290  }
291 
292  {
294  f *= -2;
295  BOOST_CHECK_EQUAL(f, -2.5);
296  }
297 
298  {
300  f *= -2.5;
301  BOOST_CHECK_EQUAL(f, 3.125);
302  }
303 }
304 
305 template<class T, unsigned S>
306 static void
308 {
309  {
311  f /= g;
312  BOOST_CHECK_EQUAL(f, 0);
313  BOOST_CHECK_EQUAL(f, 0.);
314  }
315 
316  {
318  f /= g;
319  BOOST_CHECK_EQUAL(f, 42);
320  BOOST_CHECK_EQUAL(f, 42.);
321  }
322 
323  {
325  f /= 42;
326  BOOST_CHECK_EQUAL(f, 42);
327  BOOST_CHECK_EQUAL(f, 42.);
328  }
329 
330  {
332  f /= 42.;
333  BOOST_CHECK_EQUAL(f, 42);
334  BOOST_CHECK_EQUAL(f, 42.);
335  }
336 
337 
338 
339  {
341  f /= g;
342  BOOST_CHECK_EQUAL(f, -42);
343  BOOST_CHECK_EQUAL(f, -42.);
344  }
345 
346  {
348  f /= 42;
349  BOOST_CHECK_EQUAL(f, -42);
350  BOOST_CHECK_EQUAL(f, -42.);
351  }
352 
353  {
355  f /= 42.;
356  BOOST_CHECK_EQUAL(f, -42);
357  BOOST_CHECK_EQUAL(f, -42.);
358  }
359 
360 
361 
362  {
364  f /= g;
365  BOOST_CHECK_EQUAL(f, 42);
366  BOOST_CHECK_EQUAL(f, 42.);
367  }
368 
369  {
371  f /= -42;
372  BOOST_CHECK_EQUAL(f, 42);
373  BOOST_CHECK_EQUAL(f, 42.);
374  }
375 
376  {
378  f /= -42.;
379  BOOST_CHECK_EQUAL(f, 42);
380  BOOST_CHECK_EQUAL(f, 42.);
381  }
382 
383 
384 
385  {
387  f /= g;
388  BOOST_CHECK_EQUAL(f, -42);
389  BOOST_CHECK_EQUAL(f, -42.);
390  }
391 
392  {
394  f /= -42;
395  BOOST_CHECK_EQUAL(f, -42);
396  BOOST_CHECK_EQUAL(f, -42.);
397  }
398 
399  {
401  f /= -42.;
402  BOOST_CHECK_EQUAL(f, -42);
403  BOOST_CHECK_EQUAL(f, -42.);
404  }
405 
406 
407 
408  {
410  f /= g;
411  BOOST_CHECK_EQUAL(f, 1.25);
412  }
413 
414  {
416  f /= 2;
417  BOOST_CHECK_EQUAL(f, 1.25);
418  }
419 
420  {
422  f /= 2.5;
423  BOOST_CHECK_EQUAL(f, 1.25);
424  }
425 
426  {
428  f /= g;
429  BOOST_CHECK_EQUAL(f, -1.25);
430  }
431 
432  {
434  f /= -2;
435  BOOST_CHECK_EQUAL(f, -1.25);
436  }
437 
438  {
440  f /= -2.5;
441  BOOST_CHECK_EQUAL(f, 1.25);
442  }
443 }
444 
445 template<class T, unsigned S>
446 static void
448 {
449  {
451  f += 42;
452  BOOST_CHECK_EQUAL(f, 42);
453  BOOST_CHECK_EQUAL(f, 42.);
454  }
455 
456  {
458  f += 42.;
459  BOOST_CHECK_EQUAL(f, 42);
460  BOOST_CHECK_EQUAL(f, 42.);
461  }
462 
463  {
465  f += 42.4;
466  BOOST_CHECK_EQUAL(f, 42.4);
467  }
468 
469  {
471  f += g;
472  BOOST_CHECK_EQUAL(f, 42);
473  BOOST_CHECK_EQUAL(f, 42.);
474  }
475 
476  {
478  f += g;
479  BOOST_CHECK_NE(f, 42);
480  BOOST_CHECK_EQUAL(f, 42.42);
481  }
482 
483 
484 
485  {
487  f += 42;
488  BOOST_CHECK_EQUAL(f, -100);
489  BOOST_CHECK_EQUAL(f, -100.);
490  }
491 
492  {
494  f += 42.;
495  BOOST_CHECK_EQUAL(f, -100);
496  BOOST_CHECK_EQUAL(f, -100.);
497  }
498 
499  {
501  f += g;
502  BOOST_CHECK_EQUAL(f, -100);
503  BOOST_CHECK_EQUAL(f, -100.);
504  }
505 
506  {
508  f += g;
509  BOOST_CHECK_NE(f, -142);
510  BOOST_CHECK_EQUAL(f, -142.4);
511  }
512 }
513 
514 template<class T, unsigned S>
515 static void
517 {
518  {
520  f -= 42;
521  BOOST_CHECK_EQUAL(f, -42);
522  BOOST_CHECK_EQUAL(f, -42.);
523  }
524 
525  {
527  f += -42.;
528  BOOST_CHECK_EQUAL(f, -42);
529  BOOST_CHECK_EQUAL(f, -42.);
530  }
531 
532  {
534  f -= 42.4;
535  BOOST_CHECK_EQUAL(f, -42.4);
536  }
537 
538  {
540  f -= g;
541  BOOST_CHECK_EQUAL(f, -42);
542  BOOST_CHECK_EQUAL(f, -42.);
543  }
544 
545  {
547  f -= g;
548  BOOST_CHECK_NE(f, -42);
549  BOOST_CHECK_EQUAL(f, -42.42);
550  }
551 
552 
553 
554  {
556  f -= -42;
557  BOOST_CHECK_EQUAL(f, -100);
558  BOOST_CHECK_EQUAL(f, -100.);
559  }
560 
561  {
563  f -= -42.;
564  BOOST_CHECK_EQUAL(f, -100);
565  BOOST_CHECK_EQUAL(f, -100.);
566  }
567 
568  {
570  f -= -g;
571  BOOST_CHECK_EQUAL(f, -100);
572  BOOST_CHECK_EQUAL(f, -100.);
573  }
574 
575  {
577  f -= -g;
578  BOOST_CHECK_NE(f, -142);
579  BOOST_CHECK_EQUAL(f, -142.4);
580  }
581 }
582 
583 template<class T, unsigned S>
584 static void
586 {
587  {
589  BOOST_CHECK_LT(f, g);
590  }
591 
592 
593 
594  {
596  BOOST_CHECK_EQUAL(f < g, true);
597  BOOST_CHECK_EQUAL(g < f, false);
598  }
599 
600  {
602  BOOST_CHECK_EQUAL(f < g, true);
603  BOOST_CHECK_EQUAL(g < f, false);
604  }
605 
606  {
608  BOOST_CHECK_EQUAL(f < g, true);
609  BOOST_CHECK_EQUAL(g < f, false);
610  }
611 
612  {
614  BOOST_CHECK_EQUAL(f < g, true);
615  BOOST_CHECK_EQUAL(g < f, false);
616  }
617 
618  {
620  BOOST_CHECK_EQUAL(f < g, false);
621  BOOST_CHECK_EQUAL(g < f, false);
622  }
623 
624 
625 
626  {
628  BOOST_CHECK_EQUAL(f < g, false);
629  BOOST_CHECK_EQUAL(g < f, false);
630  }
631 
632  {
634  BOOST_CHECK_EQUAL(f < g, false);
635  BOOST_CHECK_EQUAL(g < f, false);
636  }
637 
638  {
640  BOOST_CHECK_EQUAL(f < g, false);
641  BOOST_CHECK_EQUAL(g < f, false);
642  }
643 }
644 
645 template<class T, unsigned S>
646 static void
648 {
649  {
651  BOOST_CHECK_LE(f, g);
652  }
653 
654 
655 
656  {
658  BOOST_CHECK_EQUAL(f <= g, true);
659  BOOST_CHECK_EQUAL(g <= f, false);
660  }
661 
662  {
664  BOOST_CHECK_EQUAL(f <= g, true);
665  BOOST_CHECK_EQUAL(g <= f, false);
666  }
667 
668  {
670  BOOST_CHECK_EQUAL(f <= g, true);
671  BOOST_CHECK_EQUAL(g <= f, false);
672  }
673 
674  {
676  BOOST_CHECK_EQUAL(f <= g, true);
677  BOOST_CHECK_EQUAL(g <= f, false);
678  }
679 
680 
681 
682  {
684  BOOST_CHECK_EQUAL(f <= g, true);
685  BOOST_CHECK_EQUAL(g <= f, true);
686  }
687 
688  {
690  BOOST_CHECK_EQUAL(f <= g, true);
691  BOOST_CHECK_EQUAL(g <= f, true);
692  }
693 
694  {
696  BOOST_CHECK_EQUAL(f <= g, true);
697  BOOST_CHECK_EQUAL(g <= f, true);
698  }
699 
700  {
702  BOOST_CHECK_EQUAL(f <= g, true);
703  BOOST_CHECK_EQUAL(g <= f, true);
704  }
705 }
706 
707 template<class T, unsigned S>
708 static void
710 {
711  {
713  BOOST_CHECK_GT(f, g);
714  }
715 
716 
717 
718  {
720  BOOST_CHECK_EQUAL(f > g, true);
721  BOOST_CHECK_EQUAL(g > f, false);
722  }
723 
724  {
726  BOOST_CHECK_EQUAL(f > g, true);
727  BOOST_CHECK_EQUAL(g > f, false);
728  }
729 
730  {
732  BOOST_CHECK_EQUAL(f > g, true);
733  BOOST_CHECK_EQUAL(g > f, false);
734  }
735 
736  {
738  BOOST_CHECK_EQUAL(f > g, true);
739  BOOST_CHECK_EQUAL(g > f, false);
740  }
741 
742 
743 
744  {
746  BOOST_CHECK_EQUAL(f > g, false);
747  BOOST_CHECK_EQUAL(g > f, false);
748  }
749 
750  {
752  BOOST_CHECK_EQUAL(f > g, false);
753  BOOST_CHECK_EQUAL(g > f, false);
754  }
755 
756  {
758  BOOST_CHECK_EQUAL(f > g, false);
759  BOOST_CHECK_EQUAL(g > f, false);
760  }
761 
762  {
764  BOOST_CHECK_EQUAL(f > g, false);
765  BOOST_CHECK_EQUAL(g > f, false);
766  }
767 }
768 
769 template<class T, unsigned S>
770 static void
772 {
773  {
775  BOOST_CHECK_GE(f, g);
776  }
777 
778 
779 
780  {
782  BOOST_CHECK_EQUAL(f >= g, true);
783  BOOST_CHECK_EQUAL(g >= f, false);
784  }
785 
786  {
788  BOOST_CHECK_EQUAL(f >= g, true);
789  BOOST_CHECK_EQUAL(g >= f, false);
790  }
791 
792  {
794  BOOST_CHECK_EQUAL(f >= g, true);
795  BOOST_CHECK_EQUAL(g >= f, false);
796  }
797 
798  {
800  BOOST_CHECK_EQUAL(f >= g, true);
801  BOOST_CHECK_EQUAL(g >= f, false);
802  }
803 
804 
805 
806  {
808  BOOST_CHECK_EQUAL(f >= g, true);
809  BOOST_CHECK_EQUAL(g >= f, true);
810  }
811 
812  {
814  BOOST_CHECK_EQUAL(f >= g, true);
815  BOOST_CHECK_EQUAL(g >= f, true);
816  }
817 
818  {
820  BOOST_CHECK_EQUAL(f >= g, true);
821  BOOST_CHECK_EQUAL(g >= f, true);
822  }
823 
824  {
826  BOOST_CHECK_EQUAL(f >= g, true);
827  BOOST_CHECK_EQUAL(g >= f, true);
828  }
829 }
830 
831 template<class T, unsigned S>
832 static void
834 {
835  {
837  BOOST_CHECK_EQUAL(f, g);
838  }
839 
840 
841 
842  {
844  BOOST_CHECK_EQUAL(f == g, true);
845 
846  BOOST_CHECK_EQUAL(f == 42, true);
847  BOOST_CHECK_EQUAL(f == 42., true);
848 
849  BOOST_CHECK_EQUAL(f == 43, false);
850  BOOST_CHECK_EQUAL(f == 43., false);
851 
852  BOOST_CHECK_EQUAL(42 == f, true);
853  BOOST_CHECK_EQUAL(42. == f, true);
854 
855  BOOST_CHECK_EQUAL(43 == f, false);
856  BOOST_CHECK_EQUAL(43. == f, false);
857  }
858 }
859 
860 template<class T, unsigned S>
861 static void
863 {
864  {
866  BOOST_CHECK_NE(f, g);
867  }
868 
869 
870 
871  {
873  BOOST_CHECK_EQUAL(f != g, true);
874 
875  BOOST_CHECK_EQUAL(f != 42, true);
876  BOOST_CHECK_EQUAL(f != 42., true);
877 
878  BOOST_CHECK_EQUAL(f != 43, false);
879  BOOST_CHECK_EQUAL(f != 43., false);
880 
881  BOOST_CHECK_EQUAL(42 != f, true);
882  BOOST_CHECK_EQUAL(42. != f, true);
883 
884  BOOST_CHECK_EQUAL(43 != f, false);
885  BOOST_CHECK_EQUAL(43. != f, false);
886  }
887 }
888 
889 template<class T, unsigned S>
890 static void
892 {
893  {
895  BOOST_CHECK_EQUAL(f.to_int(), 42);
896  BOOST_CHECK_EQUAL(f.to_int(), 42.);
897  }
898 
899  {
901  BOOST_CHECK_EQUAL(f.to_int(), -42);
902  BOOST_CHECK_EQUAL(f.to_int(), -42.);
903  }
904 
905  {
907  BOOST_CHECK_EQUAL(f.to_int(), 42);
908  BOOST_CHECK_EQUAL(f.to_int(), 42.);
909  }
910 
911  {
913  BOOST_CHECK_EQUAL(f.to_int(), 42);
914  BOOST_CHECK_EQUAL(f.to_int(), 42.);
915  }
916 
917  {
919  BOOST_CHECK_EQUAL(f.to_int(), -42);
920  BOOST_CHECK_EQUAL(f.to_int(), -42.);
921  }
922 }
923 
924 template<class T, unsigned S>
925 static void
927 {
928  {
930  BOOST_CHECK_EQUAL(f.to_double(), 42);
931  BOOST_CHECK_EQUAL(f.to_double(), 42.);
932  }
933 
934  {
936  BOOST_CHECK_EQUAL(f.to_double(), -42);
937  BOOST_CHECK_EQUAL(f.to_double(), -42.);
938  }
939 
940  {
942  BOOST_CHECK_EQUAL(f.to_double(), 42);
943  BOOST_CHECK_EQUAL(f.to_double(), 42.);
944  }
945 
946  {
947  floating_point_emulation::tfloat<T, S> f(42.25), g(f.to_double());
948  BOOST_CHECK_EQUAL(static_cast<int>(f.to_double()), 42);
949  BOOST_CHECK_EQUAL(f.to_double(), 42.25);
950  BOOST_CHECK_EQUAL(g, 42.25);
951  }
952 
953  {
954  floating_point_emulation::tfloat<T, S> f(-42.25), g(f.to_double());
955  BOOST_CHECK_EQUAL(static_cast<int>(f.to_double()), -42);
956  BOOST_CHECK_EQUAL(f.to_double(), -42.25);
957  BOOST_CHECK_EQUAL(g, -42.25);
958  }
959 }
960 
961 template<class T, unsigned S>
962 static void
964 {
965  {
967  BOOST_CHECK_EQUAL(f.floor(), 42);
968  }
969 
970  {
972  BOOST_CHECK_EQUAL(f.floor(), -43);
973  }
974 }
975 
976 template<class T, unsigned S>
977 static void
979 {
980 
981  /* Basic test for division. */
982  {
984  f /= g;
985  BOOST_CHECK_EQUAL(f, 0);
986  }
987 
988  /*
989  * Test the entire positive range with the second last bit set.
990  *
991  * Dividing by an int so the divisor_low_bit will always be 8.
992  */
993 
994  for(int i = 1; i < 23; ++i) {
995  floating_point_emulation::tfloat<T, S> f((1 << i) + 2. / 256.), g(2);
996  f /= g;
997  BOOST_CHECK_EQUAL(f, (1 << (i - 1)) + 1. / 256.);
998  }
999 
1000  /*
1001  * Test the entire negative range with the second last bit set.
1002  *
1003  * Dividing by an int so the divisor_low_bit will always be 8.
1004  */
1005 
1006  for(int i = 1; i < 23; ++i) {
1007  floating_point_emulation::tfloat<T, S> f(-((1 << i) + 2. / 256.)), g(2);
1008  f /= g;
1009  BOOST_CHECK_EQUAL(f, -((1 << (i - 1)) + 1. / 256.));
1010  }
1011 
1012  /* Test the maximum negative value. */
1013 
1014  {
1015  floating_point_emulation::tfloat<T, S> f(-(1 << 23)), g(2);
1016  f /= g;
1017  BOOST_CHECK_EQUAL(f, -(1 << 22));
1018  }
1019 
1020  /* Test the the positive range for all cases of divisor_low_bit. */
1021 
1022  for(int i = 1; i <= 8; ++i) {
1023  floating_point_emulation::tfloat<T, S> f((1 << 22) + (1 << (22 - i)));
1024  floating_point_emulation::tfloat<T, S> g(1. + 1. / (1 << i));
1025  f /= g;
1026  BOOST_CHECK_EQUAL(
1027  f
1028  , ((1 << 22) + (1 << (22 - i))) / (1. + 1. / (1 << i)));
1029  }
1030 
1031  /* Test the the negative range for all cases of divisor_low_bit. */
1032 
1033  for(int i = 1; i <= 8; ++i) {
1034  floating_point_emulation::tfloat<T, S> f((1 << 22) + (1 << (22 - i)));
1035  floating_point_emulation::tfloat<T, S> g(- 1. - 1. / (1 << i));
1036  f /= g;
1037  BOOST_CHECK_EQUAL(
1038  f
1039  , ((1 << 22) + (1 << (22 - i))) / (- 1. - 1. / (1 << i)));
1040  }
1041 }
1042 
1043 template<class T, unsigned S>
1044 static void
1046 {
1047  test_create<T, S>();
1048  test_assign<T, S>();
1049  test_unary<T, S>();
1050  test_multiply<T, S>();
1051  test_divide<T, S>();
1052  test_add<T, S>();
1053  test_subtract<T, S>();
1054  test_less_than<T, S>();
1055  test_less_than_equal_to<T, S>();
1056  test_greater_than<T, S>();
1057  test_greater_than_equal_to<T, S>();
1058  test_equal_to<T, S>();
1059  test_not_equal_to<T, S>();
1060  test_to_int<T, S>();
1061  test_to_double<T, S>();
1062  test_floor<T, S>();
1063 
1064  test_divide_range_optimizations<T, S>();
1065 }
1066 
1067 BOOST_AUTO_TEST_CASE(test_floating_point_emulation)
1068 {
1069 // asm("int3");
1070  test<double, 0>();
1071  test<double, 8>();
1072  test<Sint32, 8>();
1073  test<tfloat::value_type, tfloat::shift>();
1074 }
1075 
1076 /*
1077  * Instanciate some functions.
1078  *
1079  * This allows to check the assembly output of the function, which can be
1080  * useful to see what really happens.
1081  */
1082 
1083 void
1087 void
1091 {
1092  f /= g;
1093 }
1094 
static void test_less_than()
BOOST_AUTO_TEST_CASE(test_floating_point_emulation)
static void test_to_int()
static void test_create()
static void test_equal_to()
GLboolean GLboolean g
Definition: glew.h:7319
static void test_less_than_equal_to()
void instanciate_idiv(floating_point_emulation::tfloat< Sint32, 8 > &f, const floating_point_emulation::tfloat< Sint32, 8 > g)
static void test_add()
GLuint GLuint stream
Definition: glew.h:5239
static void test_subtract()
Contains code for a floating point emulation.
static void test_divide_range_optimizations()
static void test_greater_than()
static void test_multiply()
static void test_greater_than_equal_to()
static void test_unary()
static void test_to_double()
Template class for the emulation.
static void test_assign()
size_t i
Definition: function.cpp:1057
static void test_not_equal_to()
GLuint const GLchar * name
Definition: glew.h:1782
#define g
Definition: glew.h:12730
static void test_floor()
static void test_divide()
static void test()
#define S(x)
Definition: luac.cpp:374
GLclampf f
Definition: glew.h:3024