This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[v3] Improve variate_generator
- From: Paolo Carlini <pcarlini at suse dot de>
- To: Gcc Patch List <gcc-patches at gcc dot gnu dot org>
- Cc: Kai-Uwe Bux <bux_2002 at kubux dot net>
- Date: Sun, 04 Nov 2007 00:31:19 +0100
- Subject: [v3] Improve variate_generator
Hi,
I committed to mainline this patch based on off-line help from Kai-Uwe,
endowing variate_generator of non-trivial behavior in the
implementation-defined case (i.e, floating engine, integer distribution).
Tested x86_64-linux.
Paolo.
////////////////
2007-11-03 Paolo Carlini <pcarlini@suse.de>
Kai-Uwe Bux <bux@kubux.net>
* include/tr1_impl/random (variate_generator<>::min, max,
operator()()): Return non-trivial values when _Engine_result_type
is a floating point type and result_type is an integer type.
Index: include/tr1_impl/random
===================================================================
--- include/tr1_impl/random (revision 129852)
+++ include/tr1_impl/random (working copy)
@@ -89,11 +89,11 @@
result_type
min() const
{
- result_type __return_value = 0;
+ result_type __return_value;
if (is_integral<_Engine_result_type>::value
&& is_integral<result_type>::value)
__return_value = _M_g.min();
- else if (!is_integral<result_type>::value)
+ else
__return_value = result_type(0);
return __return_value;
}
@@ -101,48 +101,51 @@
result_type
max() const
{
- result_type __return_value = 0;
+ result_type __return_value;
if (is_integral<_Engine_result_type>::value
&& is_integral<result_type>::value)
__return_value = _M_g.max();
else if (!is_integral<result_type>::value)
__return_value = result_type(1);
+ else
+ __return_value = std::numeric_limits<result_type>::max() - 1;
return __return_value;
}
+ /*
+ * Converts a value generated by the adapted random number generator
+ * into a value in the input domain for the dependent random number
+ * distribution.
+ *
+ * Because the type traits are compile time constants only the
+ * appropriate clause of the if statements will actually be emitted
+ * by the compiler.
+ */
result_type
- operator()();
+ operator()()
+ {
+ result_type __return_value;
+ if (is_integral<_Engine_result_type>::value
+ && is_integral<result_type>::value)
+ __return_value = _M_g();
+ else if (!is_integral<_Engine_result_type>::value
+ && !is_integral<result_type>::value)
+ __return_value = result_type(_M_g() - _M_g.min())
+ / result_type(_M_g.max() - _M_g.min());
+ else if (is_integral<_Engine_result_type>::value
+ && !is_integral<result_type>::value)
+ __return_value = result_type(_M_g() - _M_g.min())
+ / result_type(_M_g.max() - _M_g.min() + result_type(1));
+ else
+ __return_value = (((_M_g() - _M_g.min())
+ / (_M_g.max() - _M_g.min()))
+ * std::numeric_limits<result_type>::max());
+ return __return_value;
+ }
private:
_Engine _M_g;
};
-
- /*
- * Converts a value generated by the adapted random number generator into a
- * value in the input domain for the dependent random number distribution.
- *
- * Because the type traits are compile time constants only the appropriate
- * clause of the if statements will actually be emitted by the compiler.
- */
- template<typename _Engine, typename _Distribution>
- typename _Adaptor<_Engine, _Distribution>::result_type
- _Adaptor<_Engine, _Distribution>::
- operator()()
- {
- result_type __return_value = 0;
- if (is_integral<_Engine_result_type>::value
- && is_integral<result_type>::value)
- __return_value = _M_g();
- else if (is_integral<_Engine_result_type>::value
- && !is_integral<result_type>::value)
- __return_value = result_type(_M_g() - _M_g.min())
- / result_type(_M_g.max() - _M_g.min() + result_type(1));
- else if (!is_integral<_Engine_result_type>::value
- && !is_integral<result_type>::value)
- __return_value = result_type(_M_g() - _M_g.min())
- / result_type(_M_g.max() - _M_g.min());
- return __return_value;
- }
} // namespace __detail
/**