summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2006-08-22 18:07:55 +0000
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>2006-08-22 18:07:55 +0000
commit5e1bc357004e11ea98156d532fa106960f2eb5b5 (patch)
tree679adf62a0a441d998be29fc26947adef42bb8b4
parent78350879556239f5d05ec2e1f7f08a53704ea2cf (diff)
downloadgcc-5e1bc357004e11ea98156d532fa106960f2eb5b5.tar.gz
2006-08-22 Paolo Carlini <pcarlini@suse.de>
* include/tr1/random (class subtract_with_carry_01): Add. * include/tr1/random.tcc (subtract_with_carry_01<>:: seed(unsigned long), subtract_with_carry_01<>:: seed(_Gen&, false_type), subtract_with_carry_01<>:: operator(), operator<<(std::basic_ostream<>&, const subtract_with_carry_01<>&), operator>>(std::basic_istream<>&, subtract_with_carry_01<>&)): Define. * testsuite/tr1/5_numerical_facilities/random/ranlux3_01.cc: New. * testsuite/tr1/5_numerical_facilities/random/ranlux4_01.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry_01/cons/seed1.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry_01/cons/seed2.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry_01/cons/default.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry_01/cons/gen1.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry_01/requirements/typedefs.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry_01/operators/equal.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry_01/operators/not_equal.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry_01/operators/serialize.cc: Likewise. * docs/html/ext/howto.html: Add two implemented TR1 issues. * include/tr1/random.tcc (struct _To_Unsigned_Type): Move... * include/tr1/random: ... here. (class subtract_with_carry): Use it everywhere. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry/cons/seed1.cc: Qualify 1 as 1UL. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry/cons/seed2.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry/cons/default.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry/cons/gen1.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry/requirements/typedefs.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry/operators/equal.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry/operators/not_equal.cc: Likewise. * testsuite/tr1/5_numerical_facilities/random/ subtract_with_carry/operators/serialize.cc: Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116327 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--libstdc++-v3/ChangeLog53
-rw-r--r--libstdc++-v3/docs/html/ext/howto.html12
-rw-r--r--libstdc++-v3/include/tr1/random264
-rw-r--r--libstdc++-v3/include/tr1/random.tcc174
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/ranlux3_01.cc48
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/ranlux4_01.cc47
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/default.cc2
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/gen1.cc2
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/seed1.cc2
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/seed2.cc2
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/equal.cc4
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/not_equal.cc4
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/serialize.cc4
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/requirements/typedefs.cc3
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/default.cc48
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/gen1.cc50
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/seed1.cc40
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/seed2.cc41
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/equal.cc50
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/not_equal.cc43
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/serialize.cc51
-rw-r--r--libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/requirements/typedefs.cc34
22 files changed, 914 insertions, 64 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 6bf7bd73884..b3fac3ed504 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,56 @@
+2006-08-22 Paolo Carlini <pcarlini@suse.de>
+
+ * include/tr1/random (class subtract_with_carry_01): Add.
+ * include/tr1/random.tcc (subtract_with_carry_01<>::
+ seed(unsigned long), subtract_with_carry_01<>::
+ seed(_Gen&, false_type), subtract_with_carry_01<>::
+ operator(), operator<<(std::basic_ostream<>&, const
+ subtract_with_carry_01<>&), operator>>(std::basic_istream<>&,
+ subtract_with_carry_01<>&)): Define.
+ * testsuite/tr1/5_numerical_facilities/random/ranlux3_01.cc:
+ New.
+ * testsuite/tr1/5_numerical_facilities/random/ranlux4_01.cc:
+ Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry_01/cons/seed1.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry_01/cons/seed2.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry_01/cons/default.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry_01/cons/gen1.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry_01/requirements/typedefs.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry_01/operators/equal.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry_01/operators/not_equal.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry_01/operators/serialize.cc: Likewise.
+
+ * docs/html/ext/howto.html: Add two implemented TR1 issues.
+
+ * include/tr1/random.tcc (struct _To_Unsigned_Type): Move...
+ * include/tr1/random: ... here.
+ (class subtract_with_carry): Use it everywhere.
+
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry/cons/seed1.cc: Qualify 1 as 1UL.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry/cons/seed2.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry/cons/default.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry/cons/gen1.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry/requirements/typedefs.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry/operators/equal.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry/operators/not_equal.cc: Likewise.
+ * testsuite/tr1/5_numerical_facilities/random/
+ subtract_with_carry/operators/serialize.cc: Likewise.
+
2006-08-20 Paolo Carlini <pcarlini@suse.de>
* include/tr1/random (gamma_distribution<>::_M_initialize,
diff --git a/libstdc++-v3/docs/html/ext/howto.html b/libstdc++-v3/docs/html/ext/howto.html
index f937a14fbd2..7a9e4ef15a6 100644
--- a/libstdc++-v3/docs/html/ext/howto.html
+++ b/libstdc++-v3/docs/html/ext/howto.html
@@ -574,6 +574,18 @@
<code>at(const key_type&amp;)</code> to <code>std::map</code>.
</dd>
+ <dt><a href="lwg-defects.html#508">508</a>:
+ <em>Bad parameters for ranlux64_base_01</em>
+ </dt>
+ <dd>Fix the parameters.
+ </dd>
+
+ <dt><a href="lwg-active.html#512">512</a>:
+ <em>Seeding subtract_with_carry_01 from a single unsigned long</em>
+ </dt>
+ <dd>Construct a <code>linear_congruential</code> engine and seed with it.
+ </dd>
+
<dt><a href="lwg-active.html#538">538</a>:
<em>DR 538. 241 again: Does unique_copy() require CopyConstructible
and Assignable?</em>
diff --git a/libstdc++-v3/include/tr1/random b/libstdc++-v3/include/tr1/random
index 5254ea6e8b3..41e010a8a48 100644
--- a/libstdc++-v3/include/tr1/random
+++ b/libstdc++-v3/include/tr1/random
@@ -85,6 +85,31 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
template<typename _UIntType, int __w>
struct _Shift<_UIntType, __w, true>
{ static const _UIntType __value = _UIntType(1) << __w; };
+
+ template<typename _ValueT>
+ struct _To_Unsigned_Type
+ { typedef _ValueT _Type; };
+
+ template<>
+ struct _To_Unsigned_Type<short>
+ { typedef unsigned short _Type; };
+
+ template<>
+ struct _To_Unsigned_Type<int>
+ { typedef unsigned int _Type; };
+
+ template<>
+ struct _To_Unsigned_Type<long>
+ { typedef unsigned long _Type; };
+
+#ifdef _GLIBCXX_USE_LONG_LONG
+ template<>
+ struct _To_Unsigned_Type<long long>
+ { typedef unsigned long long _Type; };
+#endif
+
+ typedef _Select<(sizeof(unsigned) == 4),
+ unsigned, unsigned long>::_Type _UInt32Type;
} // anonymous namespace
/*
@@ -673,7 +698,7 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
* type large enough to store values up to m."
*
* @if maint
- * @var _M_x The state of te generator. This is a ring buffer.
+ * @var _M_x The state of the generator. This is a ring buffer.
* @var _M_carry The carry.
* @var _M_p Current index of x(i - r).
* @endif
@@ -724,8 +749,10 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
{ this->seed(__value); }
/**
- * Constructs a % subtract_with_carry random number generator seeded from
- * the PAD iterated by [__first, last).
+ * Constructs a %subtract_with_carry random number generator engine
+ * seeded from the generator function @p __g.
+ *
+ * @param __g The seed generator function.
*/
template<class _Gen>
subtract_with_carry(_Gen& __g)
@@ -734,10 +761,6 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
/**
* Seeds the initial state @f$ x_0 @f$ of the random number generator.
*
- * @note This implementation follows the tr1 specification but will
- * obviously not work correctly on all platforms, since it has hardcoded
- * values that may overflow ints on some platforms.
- *
* N1688[4.19] modifies this as follows.
* If @p __value == 0, sets value to 19780503. In any case, with a linear
* congruential generator lcg(i) having parameters @f$ m_{lcg} =
@@ -854,13 +877,210 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
seed(_Gen& __g, false_type);
private:
- int _M_p;
- result_type _M_x[long_lag];
- result_type _M_carry;
+ typedef typename _To_Unsigned_Type<_IntType>::_Type _UIntType;
+
+ _UIntType _M_x[long_lag];
+ _UIntType _M_carry;
+ int _M_p;
};
/**
+ * @brief The Marsaglia-Zaman generator (floats version).
+ *
+ * @if maint
+ * @var _M_x The state of the generator. This is a ring buffer.
+ * @var _M_carry The carry.
+ * @var _M_p Current index of x(i - r).
+ * @var _M_npows Precomputed negative powers of 2.
+ * @endif
+ */
+ template<typename _RealType, int __w, int __s, int __r>
+ class subtract_with_carry_01;
+
+ template<typename _RealType, int __w, int __s, int __r,
+ typename _CharT, typename _Traits>
+ std::basic_ostream<_CharT, _Traits>&
+ operator<<(std::basic_ostream<_CharT, _Traits>& __os,
+ const subtract_with_carry_01<_RealType, __w, __s, __r>& __x);
+
+ template<typename _RealType, int __w, int __s, int __r,
+ typename _CharT, typename _Traits>
+ std::basic_istream<_CharT, _Traits>&
+ operator>>(std::basic_istream<_CharT, _Traits>& __is,
+ subtract_with_carry_01<_RealType, __w, __s, __r>& __x);
+
+ template<typename _RealType, int __w, int __s, int __r>
+ class subtract_with_carry_01
+ {
+ public:
+ /** The type of the generated random value. */
+ typedef _RealType result_type;
+
+ // parameter values
+ static const int word_size = __w;
+ static const int long_lag = __r;
+ static const int short_lag = __s;
+
+ public:
+ /**
+ * Constructs a default-initialized % subtract_with_carry_01 random
+ * number generator.
+ */
+ subtract_with_carry_01()
+ { this->seed(); }
+
+ /**
+ * Constructs an explicitly seeded % subtract_with_carry_01 random number
+ * generator.
+ */
+ explicit
+ subtract_with_carry_01(unsigned long __value)
+ { this->seed(__value); }
+
+ /**
+ * Constructs a % subtract_with_carry_01 random number generator engine
+ * seeded from the generator function @p __g.
+ *
+ * @param __g The seed generator function.
+ */
+ template<class _Gen>
+ subtract_with_carry_01(_Gen& __g)
+ { this->seed(__g); }
+
+ /**
+ * Seeds the initial state @f$ x_0 @f$ of the random number generator.
+ */
+ void
+ seed(unsigned long __value = 19780503);
+
+ /**
+ * Seeds the initial state @f$ x_0 @f$ of the % subtract_with_carry_01
+ * random number generator.
+ */
+ template<class _Gen>
+ void
+ seed(_Gen& __g)
+ { seed(__g, typename is_fundamental<_Gen>::type()); }
+
+ /**
+ * Gets the minimum value of the range of random floats
+ * returned by this generator.
+ */
+ result_type
+ min() const
+ { return 0.0; }
+
+ /**
+ * Gets the maximum value of the range of random floats
+ * returned by this generator.
+ */
+ result_type
+ max() const
+ { return 1.0; }
+
+ /**
+ * Gets the next random number in the sequence.
+ */
+ result_type
+ operator()();
+
+ /**
+ * Compares two % subtract_with_carry_01 random number generator objects
+ * of the same type for equality.
+ *
+ * @param __lhs A % subtract_with_carry_01 random number generator object.
+ * @param __rhs Another % subtract_with_carry_01 random number generator
+ * object.
+ *
+ * @returns true if the two objects are equal, false otherwise.
+ */
+ friend bool
+ operator==(const subtract_with_carry_01& __lhs,
+ const subtract_with_carry_01& __rhs)
+ {
+ for (int __i = 0; __i < long_lag; ++__i)
+ if (!std::equal(__lhs._M_x[__i], __lhs._M_x[__i] + __n,
+ __rhs._M_x[__i]))
+ return false;
+ return true;
+ }
+
+ /**
+ * Compares two % subtract_with_carry_01 random number generator objects
+ * of the same type for inequality.
+ *
+ * @param __lhs A % subtract_with_carry_01 random number generator object.
+ * @param __rhs Another % subtract_with_carry_01 random number generator
+ * object.
+ *
+ * @returns true if the two objects are not equal, false otherwise.
+ */
+ friend bool
+ operator!=(const subtract_with_carry_01& __lhs,
+ const subtract_with_carry_01& __rhs)
+ { return !(__lhs == __rhs); }
+
+ /**
+ * Inserts the current state of a % subtract_with_carry_01 random number
+ * generator engine @p __x into the output stream @p __os.
+ *
+ * @param __os An output stream.
+ * @param __x A % subtract_with_carry_01 random number generator engine.
+ *
+ * @returns The output stream with the state of @p __x inserted or in
+ * an error state.
+ */
+ template<typename _RealType1, int __w1, int __s1, int __r1,
+ typename _CharT, typename _Traits>
+ friend std::basic_ostream<_CharT, _Traits>&
+ operator<<(std::basic_ostream<_CharT, _Traits>& __os,
+ const subtract_with_carry_01<_RealType1, __w1, __s1,
+ __r1>& __x);
+
+ /**
+ * Extracts the current state of a % subtract_with_carry_01 random number
+ * generator engine @p __x from the input stream @p __is.
+ *
+ * @param __is An input stream.
+ * @param __x A % subtract_with_carry_01 random number generator engine.
+ *
+ * @returns The input stream with the state of @p __x extracted or in
+ * an error state.
+ */
+ template<typename _RealType1, int __w1, int __s1, int __r1,
+ typename _CharT, typename _Traits>
+ friend std::basic_istream<_CharT, _Traits>&
+ operator>>(std::basic_istream<_CharT, _Traits>& __is,
+ subtract_with_carry_01<_RealType1, __w1, __s1, __r1>& __x);
+
+ private:
+ template<class _Gen>
+ void
+ seed(_Gen& __g, true_type)
+ { return seed(static_cast<unsigned long>(__g)); }
+
+ template<class _Gen>
+ void
+ seed(_Gen& __g, false_type);
+
+ private:
+ static const int __n = (__w + 31) / 32;
+
+ _UInt32Type _M_x[long_lag][__n];
+ _RealType _M_npows[__n];
+ _UInt32Type _M_carry;
+ int _M_p;
+ };
+
+ typedef subtract_with_carry_01<float, 24, 10, 24> ranlux_base_01;
+
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 508. Bad parameters for ranlux64_base_01.
+ typedef subtract_with_carry_01<double, 48, 5, 12> ranlux64_base_01;
+
+
+ /**
* Produces random numbers from some base engine by discarding blocks of
* data.
*
@@ -927,7 +1147,7 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
: _M_b(__s), _M_n(0) { }
/**
- * Generator constructs a %discard_block engine.
+ * Generator construct a %discard_block engine.
*
* @param __g A seed generator function.
*/
@@ -1056,7 +1276,7 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
* James's luxury-level-3 integer adaptation of Luescher's generator.
*/
typedef discard_block<
- subtract_with_carry<unsigned long, (1 << 24), 10, 24>,
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24>,
223,
24
> ranlux3;
@@ -1065,11 +1285,23 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
* James's luxury-level-4 integer adaptation of Luescher's generator.
*/
typedef discard_block<
- subtract_with_carry<unsigned long, (1 << 24), 10, 24>,
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24>,
389,
24
> ranlux4;
+ typedef discard_block<
+ subtract_with_carry_01<float, 24, 10, 24>,
+ 223,
+ 24
+ > ranlux3_01;
+
+ typedef discard_block<
+ subtract_with_carry_01<float, 24, 10, 24>,
+ 389,
+ 24
+ > ranlux4_01;
+
/**
* A random number generator adaptor class that combines two random number
@@ -1863,14 +2095,14 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
// NB: Unused when _GLIBCXX_USE_C99_MATH_TR1 is undefined.
normal_distribution<_RealType> _M_nd;
- _IntType _M_t;
- _RealType _M_p;
-
_RealType _M_q;
#if _GLIBCXX_USE_C99_MATH_TR1
_RealType _M_d1, _M_d2, _M_s1, _M_s2, _M_c,
_M_a1, _M_a123, _M_s, _M_lf, _M_lp1p;
#endif
+ _RealType _M_p;
+ _IntType _M_t;
+
bool _M_easy;
};
diff --git a/libstdc++-v3/include/tr1/random.tcc b/libstdc++-v3/include/tr1/random.tcc
index e809ba73ab6..2880aad580e 100644
--- a/libstdc++-v3/include/tr1/random.tcc
+++ b/libstdc++-v3/include/tr1/random.tcc
@@ -32,7 +32,7 @@ namespace std
_GLIBCXX_BEGIN_NAMESPACE(tr1)
/*
- * Implementation-space details.
+ * (Further) implementation-space details.
*/
namespace
{
@@ -101,29 +101,6 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
static const std::streamsize __value =
2 + std::numeric_limits<_RealType>::digits * 3010/10000;
};
-
- template<typename _ValueT>
- struct _To_Unsigned_Type
- { typedef _ValueT _Type; };
-
- template<>
- struct _To_Unsigned_Type<short>
- { typedef unsigned short _Type; };
-
- template<>
- struct _To_Unsigned_Type<int>
- { typedef unsigned int _Type; };
-
- template<>
- struct _To_Unsigned_Type<long>
- { typedef unsigned long _Type; };
-
-#ifdef _GLIBCXX_USE_LONG_LONG
- template<>
- struct _To_Unsigned_Type<long long>
- { typedef unsigned long long _Type; };
-#endif
-
} // anonymous namespace
@@ -376,7 +353,7 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
__lcg(__value);
for (int __i = 0; __i < long_lag; ++__i)
- _M_x[__i] = __mod<_IntType, 1, 0, modulus>(__lcg());
+ _M_x[__i] = __mod<_UIntType, 1, 0, modulus>(__lcg());
_M_carry = (_M_x[long_lag - 1] == 0) ? 1 : 0;
_M_p = 0;
@@ -388,13 +365,7 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
subtract_with_carry<_IntType, __m, __s, __r>::
seed(_Gen& __gen, false_type)
{
- const int __n = (std::numeric_limits<_IntType>::digits + 31) / 32;
-
- typedef typename _Select<(sizeof(unsigned) == 4),
- unsigned, unsigned long>::_Type _UInt32Type;
-
- typedef typename _To_Unsigned_Type<_IntType>::_Type
- _UIntType;
+ const int __n = (std::numeric_limits<_UIntType>::digits + 31) / 32;
for (int __i = 0; __i < long_lag; ++__i)
{
@@ -402,8 +373,7 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
_UIntType __factor = 1;
for (int __j = 0; __j < __n; ++__j)
{
- __tmp += (__mod<_UInt32Type, 1, 0, 0>(__gen())
- * __factor);
+ __tmp += __mod<_UInt32Type, 1, 0, 0>(__gen()) * __factor;
__factor *= _Shift<_UIntType, 32>::__value;
}
_M_x[__i] = __mod<_UIntType, 1, 0, modulus>(__tmp);
@@ -423,7 +393,9 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
__ps += long_lag;
// Calculate new x(i) without overflow or division.
- _IntType __xi;
+ // NB: Thanks to the requirements for _IntType, _M_x[_M_p] + _M_carry
+ // cannot overflow.
+ _UIntType __xi;
if (_M_x[__ps] >= _M_x[_M_p] + _M_carry)
{
__xi = _M_x[__ps] - _M_x[_M_p] - _M_carry;
@@ -434,10 +406,10 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
__xi = modulus - _M_x[_M_p] - _M_carry + _M_x[__ps];
_M_carry = 1;
}
- _M_x[_M_p++] = __xi;
+ _M_x[_M_p] = __xi;
// Adjust current index to loop around in ring buffer.
- if (_M_p >= long_lag)
+ if (++_M_p >= long_lag)
_M_p = 0;
return __xi;
@@ -483,6 +455,134 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1)
}
+ template<typename _RealType, int __w, int __s, int __r>
+ void
+ subtract_with_carry_01<_RealType, __w, __s, __r>::
+ seed(unsigned long __value)
+ {
+ if (__value == 0)
+ __value = 19780503;
+
+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
+ // 512. Seeding subtract_with_carry_01 from a single unsigned long.
+ std::tr1::linear_congruential<unsigned long, 40014, 0, 2147483563>
+ __lcg(__value);
+
+ this->seed(__lcg);
+ }
+
+ template<typename _RealType, int __w, int __s, int __r>
+ template<class _Gen>
+ void
+ subtract_with_carry_01<_RealType, __w, __s, __r>::
+ seed(_Gen& __gen, false_type)
+ {
+ for (int __i = 0; __i < long_lag; ++__i)
+ {
+ for (int __j = 0; __j < __n - 1; ++__j)
+ _M_x[__i][__j] = __mod<_UInt32Type, 1, 0, 0>(__gen());
+ _M_x[__i][__n - 1] = __mod<_UInt32Type, 1, 0,
+ _Shift<_UInt32Type, __w % 32>::__value>(__gen());
+ }
+ _M_carry = (_M_x[long_lag - 1][0] == 0) ? 1 : 0;
+ _M_p = 0;
+
+ // Initialize the array holding the negative powers of 2.
+ for (int __j = 0; __j < __n; ++__j)
+#if _GLIBCXX_USE_C99_MATH_TR1
+ _M_npows[__j] = std::tr1::ldexp(_RealType(1), -__w + __j * 32);
+#else
+ _M_npows[__j] = std::pow(_RealType(2), -__w + __j * 32);
+#endif
+ }
+
+ template<typename _RealType, int __w, int __s, int __r>
+ typename subtract_with_carry_01<_RealType, __w, __s, __r>::result_type
+ subtract_with_carry_01<_RealType, __w, __s, __r>::
+ operator()()
+ {
+ // Derive short lag index from current index.
+ int __ps = _M_p - short_lag;
+ if (__ps < 0)
+ __ps += long_lag;
+
+ _UInt32Type __new_carry;
+ for (int __j = 0; __j < __n - 1; ++__j)
+ {
+ if (_M_x[__ps][__j] > _M_x[_M_p][__j]
+ || (_M_x[__ps][__j] == _M_x[_M_p][__j] && _M_carry == 0))
+ __new_carry = 0;
+ else
+ __new_carry = 1;
+
+ _M_x[_M_p][__j] = _M_x[__ps][__j] - _M_x[_M_p][__j] - _M_carry;
+ _M_carry = __new_carry;
+ }
+
+ if (_M_x[__ps][__n - 1] > _M_x[_M_p][__n - 1]
+ || (_M_x[__ps][__n - 1] == _M_x[_M_p][__n - 1] && _M_carry == 0))
+ __new_carry = 0;
+ else
+ __new_carry = 1;
+
+ _M_x[_M_p][__n - 1] = __mod<_UInt32Type, 1, 0,
+ _Shift<_UInt32Type, __w % 32>::__value>
+ (_M_x[__ps][__n - 1] - _M_x[_M_p][__n - 1] - _M_carry);
+ _M_carry = __new_carry;
+
+ result_type __ret = 0.0;
+ for (int __j = 0; __j < __n; ++__j)
+ __ret += _M_x[_M_p][__j] * _M_npows[__j];
+
+ // Adjust current index to loop around in ring buffer.
+ if (++_M_p >= long_lag)
+ _M_p = 0;
+
+ return __ret;
+ }
+
+ template<typename _RealType, int __w, int __s, int __r,
+ typename _CharT, typename _Traits>
+ std::basic_ostream<_CharT, _Traits>&
+ operator<<(std::basic_ostream<_CharT, _Traits>& __os,
+ const subtract_with_carry_01<_RealType, __w, __s, __r>& __x)
+ {
+ const std::ios_base::fmtflags __flags = __os.flags();
+ const _CharT __fill = __os.fill();
+ const _CharT __space = __os.widen(' ');
+ __os.flags(std::ios_base::dec | std::ios_base::fixed
+ | std::ios_base::left);
+ __os.fill(__space);
+
+ for (int __i = 0; __i < __r; ++__i)
+ for (int __j = 0; __j < __x.__n; ++__j)
+ __os << __x._M_x[__i][__j] << __space;
+ __os << __x._M_carry;
+
+ __os.flags(__flags);
+ __os.fill(__fill);
+ return __os;
+ }
+
+ template<typename _RealType, int __w, int __s, int __r,
+ typename _CharT, typename _Traits>
+ std::basic_istream<_CharT, _Traits>&
+ operator>>(std::basic_istream<_CharT, _Traits>& __is,
+ subtract_with_carry_01<_RealType, __w, __s, __r>& __x)
+ {
+ const std::ios_base::fmtflags __flags = __is.flags();
+ __is.flags(std::ios_base::dec | std::ios_base::skipws);
+
+ for (int __i = 0; __i < __r; ++__i)
+ for (int __j = 0; __j < __x.__n; ++__j)
+ __is >> __x._M_x[__i][__j];
+ __is >> __x._M_carry;
+
+ __is.flags(__flags);
+ return __is;
+ }
+
+
template<class _UniformRandomNumberGenerator, int __p, int __r>
typename discard_block<_UniformRandomNumberGenerator,
__p, __r>::result_type
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/ranlux3_01.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/ranlux3_01.cc
new file mode 100644
index 00000000000..fc9cb3dd7a6
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/ranlux3_01.cc
@@ -0,0 +1,48 @@
+// 2006-08-22 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2006 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 5.1.5 Engines with predefined parameters
+// 5.1.5 [3]
+
+#include <iostream>
+#include <tr1/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ std::tr1::ranlux3_01 a;
+ for (int i = 0; i < 9999; ++i)
+ a();
+
+#if _GLIBCXX_USE_C99_MATH_TR1
+ VERIFY( a() == 5957620 * std::tr1::ldexp(float(1), -24) );
+#else
+ VERIFY( a() == 5957620 * std::pow(float(2), -24) );
+#endif
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/ranlux4_01.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/ranlux4_01.cc
new file mode 100644
index 00000000000..861edd4c101
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/ranlux4_01.cc
@@ -0,0 +1,47 @@
+// 2006-08-22 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2006 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 5.1.5 Engines with predefined parameters
+// 5.1.5 [3]
+
+#include <tr1/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+
+ std::tr1::ranlux4_01 a;
+ for (int i = 0; i < 9999; ++i)
+ a();
+
+#if _GLIBCXX_USE_C99_MATH_TR1
+ VERIFY( a() == 8587295 * std::tr1::ldexp(float(1), -24) );
+#else
+ VERIFY( a() == 8587295 * std::pow(float(2), -24) );
+#endif
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/default.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/default.cc
index 5ce9a991d01..466354124fc 100644
--- a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/default.cc
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/default.cc
@@ -30,7 +30,7 @@ test01()
bool test __attribute__((unused)) = true;
using namespace std::tr1;
- subtract_with_carry<unsigned long, (1 << 24), 10, 24> x;
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24> x;
VERIFY( x.min() == 0 );
VERIFY( x.max() == ((1<<24)-1) );
VERIFY( x() == 15039276 );
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/gen1.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/gen1.cc
index 717069086af..cacde1b8e36 100644
--- a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/gen1.cc
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/gen1.cc
@@ -38,7 +38,7 @@ test01()
bool test __attribute__((unused)) = true;
using namespace std::tr1;
- subtract_with_carry<unsigned long, (1 << 24), 10, 24> x(gen);
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24> x(gen);
VERIFY( x.min() == 0 );
VERIFY( x.max() == ((1 << 24) - 1) );
}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/seed1.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/seed1.cc
index 61d66ef9fe3..c17452c19a2 100644
--- a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/seed1.cc
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/seed1.cc
@@ -30,7 +30,7 @@ test01()
using namespace std::tr1;
unsigned long seed = 2;
- subtract_with_carry<unsigned long, (1 << 24), 10, 24> x(seed);
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24> x(seed);
}
int main()
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/seed2.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/seed2.cc
index 192a9b4e70f..f0ab7ef6cea 100644
--- a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/seed2.cc
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/cons/seed2.cc
@@ -31,7 +31,7 @@ test01()
using namespace std::tr1;
double seed = 2.0;
- subtract_with_carry<unsigned long, (1 << 24), 10, 24> x(seed);
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24> x(seed);
}
int main()
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/equal.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/equal.cc
index 8a5b9a5045f..f59fd00287f 100644
--- a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/equal.cc
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/equal.cc
@@ -30,8 +30,8 @@ test01()
bool test __attribute__((unused)) = true;
using namespace std::tr1;
- subtract_with_carry<unsigned long, (1 << 24), 10, 24> u;
- subtract_with_carry<unsigned long, (1 << 24), 10, 24> v;
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24> u;
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24> v;
VERIFY( u == v );
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/not_equal.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/not_equal.cc
index 8d5f6e0c57a..4b4efe0aff8 100644
--- a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/not_equal.cc
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/not_equal.cc
@@ -30,8 +30,8 @@ test01()
bool test __attribute__((unused)) = true;
using namespace std::tr1;
- subtract_with_carry<unsigned long, (1 << 24), 10, 24> u(1);
- subtract_with_carry<unsigned long, (1 << 24), 10, 24> v(2);
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24> u(1);
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24> v(2);
VERIFY( u != v );
}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/serialize.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/serialize.cc
index bbc645037ef..34badc14946 100644
--- a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/serialize.cc
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/operators/serialize.cc
@@ -32,8 +32,8 @@ test01()
using std::tr1::subtract_with_carry;
std::stringstream str;
- subtract_with_carry<unsigned long, (1 << 24), 10, 24> u;
- subtract_with_carry<unsigned long, (1 << 24), 10, 24> v;
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24> u;
+ subtract_with_carry<unsigned long, (1UL << 24), 10, 24> v;
u(); // advance
str << u;
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/requirements/typedefs.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/requirements/typedefs.cc
index d7dd8310fe2..e02b5cc13c5 100644
--- a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/requirements/typedefs.cc
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry/requirements/typedefs.cc
@@ -28,7 +28,8 @@
void
test01()
{
- typedef std::tr1::subtract_with_carry<long, 8, 2, 4> test_type;
+ typedef std::tr1::subtract_with_carry<unsigned long, (1UL << 24), 10, 24>
+ test_type;
typedef test_type::result_type result_type;
}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/default.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/default.cc
new file mode 100644
index 00000000000..adf0c1ac60d
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/default.cc
@@ -0,0 +1,48 @@
+// 2006-08-22 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2006 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 5.1.4.4 class template subtract_with_carry_01 [tr.rand.eng.sub1]
+// 5.1.1 Table 16 line 1 default ctor
+
+#include <tr1/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+ using namespace std::tr1;
+
+ subtract_with_carry_01<float, 24, 10, 24> x;
+ VERIFY( x.min() == 0.0 );
+ VERIFY( x.max() == 1.0 );
+
+#if _GLIBCXX_USE_C99_MATH_TR1
+ VERIFY( x() == 15039276 * std::tr1::ldexp(float(1), -24) );
+#else
+ VERIFY( x() == 15039276 * std::pow(float(2), -24) );
+#endif
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/gen1.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/gen1.cc
new file mode 100644
index 00000000000..0a95397c518
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/gen1.cc
@@ -0,0 +1,50 @@
+// 2006-08-22 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2006 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 5.1.4.4 class template subtract_with_carry_01 [tr.rand.eng.sub1]
+// 5.1.1 Table 16 line 3 Gen ctor
+
+#include <ctime>
+#include <tr1/random>
+#include <testsuite_hooks.h>
+
+// a not untypical initialization function
+unsigned long
+gen()
+{
+ return std::time(0);
+}
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+ using namespace std::tr1;
+
+ subtract_with_carry_01<float, 24, 10, 24> x(gen);
+ VERIFY( x.min() == 0.0 );
+ VERIFY( x.max() == 1.0 );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/seed1.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/seed1.cc
new file mode 100644
index 00000000000..62da61705a8
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/seed1.cc
@@ -0,0 +1,40 @@
+// 2006-08-22 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2006 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 5.1.4.4 class template subtract_with_carry_01 [tr.rand.eng.sub1]
+// 5.1.1 Table 16 line 2 seed ctor
+
+#include <tr1/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ using namespace std::tr1;
+
+ unsigned long seed = 2;
+ subtract_with_carry_01<float, 24, 10, 24> x(seed);
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/seed2.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/seed2.cc
new file mode 100644
index 00000000000..5efb6ba1152
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/cons/seed2.cc
@@ -0,0 +1,41 @@
+// 2006-08-22 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2006 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 5.1.4.4 class template subtract_with_carry_01 [tr.rand.eng.sub1]
+// 5.1.1 Table 16 line 2 seed ctor
+// 5.1.1 (4) point 2: Gen is a fundamental type.
+
+#include <tr1/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ using namespace std::tr1;
+
+ double seed = 2.0;
+ subtract_with_carry_01<float, 24, 10, 24> x(seed);
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/equal.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/equal.cc
new file mode 100644
index 00000000000..509a91cd8fe
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/equal.cc
@@ -0,0 +1,50 @@
+// 2006-08-22 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2006 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 5.1.4.4 class template subtract_with_carry_01 [tr.rand.eng.sub1]
+// 5.1.1 Table 16
+
+#include <tr1/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+ using namespace std::tr1;
+
+ subtract_with_carry_01<float, 24, 10, 24> u;
+ subtract_with_carry_01<float, 24, 10, 24> v;
+
+ VERIFY( u == v );
+
+ for (int i = 0; i < 100; ++i)
+ {
+ u();
+ v();
+ }
+ VERIFY( u == v );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/not_equal.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/not_equal.cc
new file mode 100644
index 00000000000..6bf7b2cee7e
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/not_equal.cc
@@ -0,0 +1,43 @@
+// 2006-08-22 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2006 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 5.1.4.4 class template subtract_with_carry_01 [tr.rand.eng.sub1]
+// 5.1.1 Table 16
+
+#include <tr1/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+ using namespace std::tr1;
+
+ subtract_with_carry_01<float, 24, 10, 24> u(1);
+ subtract_with_carry_01<float, 24, 10, 24> v(2);
+
+ VERIFY( u != v );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/serialize.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/serialize.cc
new file mode 100644
index 00000000000..23d9004f3d2
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/operators/serialize.cc
@@ -0,0 +1,51 @@
+// 2006-08-22 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2006 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 5.1.4.4 class template subtract_with_carry_01 [tr.rand.eng.sub1]
+// 5.1.1 Table 16
+
+#include <sstream>
+#include <tr1/random>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+ bool test __attribute__((unused)) = true;
+ using std::tr1::subtract_with_carry_01;
+
+ std::stringstream str;
+ subtract_with_carry_01<float, 24, 10, 24> u;
+ subtract_with_carry_01<float, 24, 10, 24> v;
+
+ u(); // advance
+ str << u;
+
+ VERIFY( u != v );
+
+ str >> v;
+ VERIFY( u == v );
+}
+
+int main()
+{
+ test01();
+ return 0;
+}
diff --git a/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/requirements/typedefs.cc b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/requirements/typedefs.cc
new file mode 100644
index 00000000000..21f91e52900
--- /dev/null
+++ b/libstdc++-v3/testsuite/tr1/5_numerical_facilities/random/subtract_with_carry_01/requirements/typedefs.cc
@@ -0,0 +1,34 @@
+// { dg-do compile }
+//
+// 2006-08-22 Paolo Carlini <pcarlini@suse.de>
+//
+// Copyright (C) 2006 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING. If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// 5.1.4.4 Class template subtract_with_carry_01
+// 5.1.1 [1] Table 15
+
+#include <tr1/random>
+
+void
+test01()
+{
+ typedef std::tr1::subtract_with_carry_01<float, 24, 10, 24> test_type;
+
+ typedef test_type::result_type result_type;
+}