| 1 | // | 
|---|
| 2 | //  boost_multiprecision_error_demo.cpp | 
|---|
| 3 | // | 
|---|
| 4 | //  Created by Jan Bouwer on 19/6/13. | 
|---|
| 5 |  | 
|---|
| 6 |  | 
|---|
| 7 | #include <cassert> | 
|---|
| 8 | #include <cstdint> | 
|---|
| 9 | #include <limits> | 
|---|
| 10 | #include <boost/multiprecision/cpp_int.hpp> | 
|---|
| 11 |  | 
|---|
| 12 |  | 
|---|
| 13 | template<typename T, class I> | 
|---|
| 14 | void test_boost_multiprecision() | 
|---|
| 15 | { | 
|---|
| 16 | T negMin = std::numeric_limits<T>::min(); | 
|---|
| 17 | I test1(negMin), test2( negMin + 1 ); | 
|---|
| 18 | --test2; | 
|---|
| 19 |  | 
|---|
| 20 | assert( test1 == test2 ); // This fails on my platform for T = long | 
|---|
| 21 | assert( test1 != 0 ); | 
|---|
| 22 | assert( test1 == negMin ); | 
|---|
| 23 | assert( test2 != 0 ); | 
|---|
| 24 | assert( test2 == negMin ); // This fails on my platform for T = long | 
|---|
| 25 | } | 
|---|
| 26 |  | 
|---|
| 27 | int main(int argc, const char * argv[]) | 
|---|
| 28 | { | 
|---|
| 29 | test_boost_multiprecision<int64_t, boost::multiprecision::checked_cpp_int>(); // Fails on my platform | 
|---|
| 30 | test_boost_multiprecision<int32_t, boost::multiprecision::checked_cpp_int>(); // Pass | 
|---|
| 31 | test_boost_multiprecision<int16_t, boost::multiprecision::checked_cpp_int>(); // Pass | 
|---|
| 32 |  | 
|---|
| 33 | test_boost_multiprecision<long, boost::multiprecision::cpp_int>(); // Fail on my platform | 
|---|
| 34 |  | 
|---|
| 35 | // The following hold for my platform: x86_64-apple-darwin12.4.0, | 
|---|
| 36 | // using: Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn) | 
|---|
| 37 | // with: -std=c++11 -stdlib=libc++ | 
|---|
| 38 | // static_assert(std::numeric_limits<long long>::min() == std::numeric_limits<int64_t>::min(), "Ok"); | 
|---|
| 39 | // static_assert(std::numeric_limits<long>::min() == std::numeric_limits<int64_t>::min(), "Ok"); | 
|---|
| 40 | } | 
|---|