1 | Description: fix infinite loop in Boost.multiprecision
|
---|
2 | Multiprecision acos(), asin() and atan() sometimes loop infinitely when
|
---|
3 | they should converge exactly because of the way the distance between the
|
---|
4 | current and target value is compared to zero.
|
---|
5 | Author: Thibaut Paumard <thibaut@debian.org>
|
---|
6 | Origin: vendor
|
---|
7 | Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=844495
|
---|
8 | Forwarded: no
|
---|
9 | Last-Update: 2016-11-25
|
---|
10 | ---
|
---|
11 | This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
|
---|
12 | Index: boost1.62-1.62.0+dfsg/boost/multiprecision/detail/functions/trig.hpp
|
---|
13 | ===================================================================
|
---|
14 | --- boost1.62-1.62.0+dfsg.orig/boost/multiprecision/detail/functions/trig.hpp
|
---|
15 | +++ boost1.62-1.62.0+dfsg/boost/multiprecision/detail/functions/trig.hpp
|
---|
16 | @@ -515,10 +515,8 @@ void eval_asin(T& result, const T& x)
|
---|
17 | eval_divide(sine, cosine);
|
---|
18 | eval_subtract(result, sine);
|
---|
19 | current_precision = eval_ilogb(sine);
|
---|
20 | -#ifdef FP_ILOGB0
|
---|
21 | - if(current_precision == FP_ILOGB0)
|
---|
22 | + if(sine.iszero())
|
---|
23 | break;
|
---|
24 | -#endif
|
---|
25 | }
|
---|
26 | if(b_neg)
|
---|
27 | result.negate();
|
---|
28 | @@ -662,10 +660,8 @@ void eval_atan(T& result, const T& x)
|
---|
29 | eval_multiply(s, t, c);
|
---|
30 | eval_add(result, s);
|
---|
31 | current_precision = eval_ilogb(s);
|
---|
32 | -#ifdef FP_ILOGB0
|
---|
33 | - if(current_precision == FP_ILOGB0)
|
---|
34 | + if(s.iszero())
|
---|
35 | break;
|
---|
36 | -#endif
|
---|
37 | }
|
---|
38 | if(b_neg)
|
---|
39 | result.negate();
|
---|