... fixed with the below.
Thanks,
Paolo.
//////////////////////
2014-08-13 Paolo Carlini <[email protected]>
PR libstdc++/62118
* include/ext/random.tcc (uniform_on_sphere_helper<2, _RealType>::
operator()): Use std::hypot only when _GLIBCXX_USE_C99_MATH_TR1.
Index: include/ext/random.tcc
===================================================================
--- include/ext/random.tcc (revision 213898)
+++ include/ext/random.tcc (working copy)
@@ -1547,10 +1547,12 @@
template<std::size_t _Dimen, typename _RealType>
class uniform_on_sphere_helper
{
- typedef typename uniform_on_sphere_distribution<_Dimen,
_RealType>::result_type result_type;
+ typedef typename uniform_on_sphere_distribution<_Dimen, _RealType>::
+ result_type result_type;
public:
- template<typename _NormalDistribution, typename
_UniformRandomNumberGenerator>
+ template<typename _NormalDistribution,
+ typename _UniformRandomNumberGenerator>
result_type operator()(_NormalDistribution& __nd,
_UniformRandomNumberGenerator& __urng)
{
@@ -1604,9 +1606,13 @@
}
while (__sq == _RealType(0) || __sq > _RealType(1));
+#if _GLIBCXX_USE_C99_MATH_TR1
// Yes, we do not just use sqrt(__sq) because hypot() is more
// accurate.
auto __norm = std::hypot(__ret[0], __ret[1]);
+#else
+ auto __norm = std::sqrt(__ret[0] * __ret[0] + __ret[1] * __ret[1]);
+#endif
__ret[0] /= __norm;
__ret[1] /= __norm;