| 1 | /* | 
|---|
| 2 | Compiled with: | 
|---|
| 3 | > gcc -I<BOOST_HOME>/include -c -g -o test.o test.cpp | 
|---|
| 4 | > gcc -o test test.o -lgmp -lstdc++ | 
|---|
| 5 |  | 
|---|
| 6 | Output: | 
|---|
| 7 | > ./test | 
|---|
| 8 | Input: 0.840188, 0.394383, 0.783099 | 
|---|
| 9 | Output A: 0 | 
|---|
| 10 | Input: 0.79844, 0.911647, 0.197551 | 
|---|
| 11 | Output B: 1.25764e-58 | 
|---|
| 12 | */ | 
|---|
| 13 |  | 
|---|
| 14 | #include <iostream> | 
|---|
| 15 | #include <cstdlib> | 
|---|
| 16 | #include <boost/multiprecision/gmp.hpp> | 
|---|
| 17 |  | 
|---|
| 18 | namespace b_mp = boost::multiprecision; | 
|---|
| 19 | typedef b_mp::number<b_mp::gmp_float<0>, b_mp::et_off> test_float_type; | 
|---|
| 20 |  | 
|---|
| 21 | // get random value between 0 and 1 | 
|---|
| 22 | void set_rand(test_float_type* v, bool with_division) { | 
|---|
| 23 | for (int i = 0; i < 3; i++) { | 
|---|
| 24 | v[i] = with_division ? | 
|---|
| 25 | test_float_type(double(std::rand()) / double(RAND_MAX)) : | 
|---|
| 26 | test_float_type(std::rand()) / test_float_type(RAND_MAX); | 
|---|
| 27 | } | 
|---|
| 28 | } | 
|---|
| 29 |  | 
|---|
| 30 | // test distributive property | 
|---|
| 31 | int main() { | 
|---|
| 32 | test_float_type v[3], a1, a2; | 
|---|
| 33 |  | 
|---|
| 34 | set_rand(v, true); | 
|---|
| 35 | std::cerr << "Input: " << v[0] << ", " << v[1] << ", " << v[2] << std::endl; | 
|---|
| 36 | a1 = v[0] * v[1] + v[0] * v[2]; | 
|---|
| 37 | a2 = v[0] * (v[1] + v[2]); | 
|---|
| 38 | std::cerr << "Output A: " << a1 - a2 << std::endl; | 
|---|
| 39 |  | 
|---|
| 40 | set_rand(v, false); | 
|---|
| 41 | std::cerr << "Input: " << v[0] << ", " << v[1] << ", " << v[2] << std::endl; | 
|---|
| 42 | a1 = v[0] * v[1] + v[0] * v[2]; | 
|---|
| 43 | a2 = v[0] * (v[1] + v[2]); | 
|---|
| 44 | std::cerr << "Output B: " << a1 - a2 << std::endl; | 
|---|
| 45 |  | 
|---|
| 46 | return 0; | 
|---|
| 47 | } | 
|---|