Skip to content

Commit 99e5b49

Browse files
committed
tracking precision difference between Debug and Release builds in quad-double
1 parent ad24851 commit 99e5b49

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

include/universal/number/qd/mathext/horners.hpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace sw { namespace universal {
2525

2626
for (int i = n - 1; i >= 0; --i) {
2727
r *= x;
28-
r += coefficients[i];
28+
r += coefficients[static_cast<unsigned>(i)];
2929
}
3030

3131
return r;
@@ -43,14 +43,14 @@ namespace sw { namespace universal {
4343
inline qd polyroot(const std::vector<qd>& c, const qd& x0, int max_iter, double threshold = 1e-32) {
4444
if (threshold == 0.0) threshold = qd_eps;
4545

46-
int n = c.size() - 1;
46+
int n = static_cast<int>(c.size()) - 1;
4747
double max_c = std::abs(double(c[0]));
4848
// Compute the coefficients of the derivatives
4949
std::vector<qd> derivatives{ c };
5050
for (int i = 1; i <= n; ++i) {
5151
double v = std::abs(double(c[static_cast<unsigned>(i)]));
5252
if (v > max_c) max_c = v;
53-
derivatives[i - 1] = c[static_cast<unsigned>(i)] * static_cast<double>(i);
53+
derivatives[static_cast<unsigned>(i - 1)] = c[static_cast<unsigned>(i)] * static_cast<double>(i);
5454
}
5555
threshold *= max_c;
5656

static/qd/api/constants.cpp

+47-2
Original file line numberDiff line numberDiff line change
@@ -354,17 +354,62 @@ qd_1_sqrt2 : 7.07106781186547524400844362104849e-01 vs 7.071067811865475244
354354
{
355355

356356
qd a{ 2.0 };
357-
std::cout << "sqrt(2.0) " << to_quad(sqrt(a)) << '\n';
358-
std::cout << "1/sqrt(2.0) " << to_quad(reciprocal(sqrt(a))) << '\n';
357+
qd sqrt2 = sqrt(a);
358+
std::cout << "sqrt(2.0) " << to_quad(sqrt2) << '\n';
359+
359360
a = 3.0;
360361
std::cout << "sqrt(3.0) " << to_quad(sqrt(a)) << '\n';
361362
a = 5.0;
362363
std::cout << "sqrt(5.0) " << to_quad(sqrt(a)) << '\n';
363364

365+
std::cout << "1/sqrt(2.0) " << to_quad(reciprocal(sqrt2)) << '\n';
366+
364367
a = sqrt(qd_pi);
365368
std::cout << "2 / sqrtpi " << to_quad(2.0 / a) << '\n';
366369
}
370+
/*
371+
*
372+
Debug build
373+
sqrt(2.0) ( 1.4142135623730951, -9.6672933134529135e-17, 4.1386753086994136e-33, 4.9355469914683509e-50)
374+
sqrt(3.0) ( 1.7320508075688772, 1.0035084221806903e-16, -1.4959542475733896e-33, 5.3061475632961675e-50)
375+
sqrt(5.0) ( 2.2360679774997898, -1.0864230407365012e-16, 5.3086504167631309e-33, -6.6099839950042175e-50)
376+
1/sqrt(2.0) ( 0.70710678118654757, -4.8336466567264567e-17, 2.0693376543497068e-33, 2.4677734957341755e-50)
377+
2 / sqrtpi ( 1.1283791670955126, 1.5335459613165881e-17, -4.7656845966936863e-34, -2.0077946616552625e-50)
378+
379+
Release build
380+
sqrt(2.0) ( 1.4142135623730951, -9.6672933134529135e-17, 4.1386753203466335e-33, -3.3032885712977947e-49)
381+
sqrt(3.0) ( 1.7320508075688772, 1.0035084221806903e-16, -1.4959542883445281e-33, 5.0676801879243325e-50)
382+
sqrt(5.0) ( 2.2360679774997898, -1.0864230407365012e-16, 5.3086504310320564e-33, -2.7103246582355688e-49)
383+
1/sqrt(2.0) ( 0.70710678118654757, -4.8336466312625432e-17, -3.039266735626984e-34, -1.350504809842679e-50)
384+
2 / sqrtpi ( 1.1283791670955126, 1.5335458971746789e-17, 2.6579683555126638e-34, -1.683757146154259e-50)
385+
386+
difference sqrt2 : -1.16472195516512003859185071422508e-41
387+
difference sqrt3 : +4.07711385546630871610406778813869e-41
388+
difference sqrt5 : -1.42689253079290274645876254577245e-41
389+
difference 1_sqrt2 : -2.54639133258339414062837196323682e-25
390+
difference 2_sqrtpi : +6.41419091181394536188494115009207e-25
391+
392+
*/
367393

394+
{
395+
qd debug_sqrt2(1.4142135623730951, -9.6672933134529135e-17, 4.1386753086994136e-33, 4.9355469914683509e-50);
396+
qd debug_sqrt3 (1.7320508075688772, 1.0035084221806903e-16, -1.4959542475733896e-33, 5.3061475632961675e-50);
397+
qd debug_sqrt5(2.2360679774997898, -1.0864230407365012e-16, 5.3086504167631309e-33, -6.6099839950042175e-50);
398+
qd debug_1_sqrt2(0.70710678118654757, -4.8336466567264567e-17, 2.0693376543497068e-33, 2.4677734957341755e-50);
399+
qd debug_2_sqrtpi(1.1283791670955126, 1.5335459613165881e-17, -4.7656845966936863e-34, -2.0077946616552625e-50);
400+
401+
qd release_sqrt2(1.4142135623730951, -9.6672933134529135e-17, 4.1386753203466335e-33, -3.3032885712977947e-49);
402+
qd release_sqrt3(1.7320508075688772, 1.0035084221806903e-16, -1.4959542883445281e-33, 5.0676801879243325e-50);
403+
qd release_sqrt5(2.2360679774997898, -1.0864230407365012e-16, 5.3086504310320564e-33, -2.7103246582355688e-49);
404+
qd release_1_sqrt2(0.70710678118654757, -4.8336466312625432e-17, -3.039266735626984e-34, -1.350504809842679e-50);
405+
qd release_2_sqrtpi(1.1283791670955126, 1.5335458971746789e-17, 2.6579683555126638e-34, -1.683757146154259e-50);
406+
407+
std::cout << "difference sqrt2 : " << (debug_sqrt2 - release_sqrt2) << '\n';
408+
std::cout << "difference sqrt3 : " << (debug_sqrt3 - release_sqrt3) << '\n';
409+
std::cout << "difference sqrt5 : " << (debug_sqrt5 - release_sqrt5) << '\n';
410+
std::cout << "difference 1_sqrt2 : " << (debug_1_sqrt2 - release_1_sqrt2) << '\n';
411+
std::cout << "difference 2_sqrtpi : " << (debug_2_sqrtpi - release_2_sqrtpi) << '\n';
412+
}
368413

369414
std::cout << std::setprecision(oldPrec);
370415

0 commit comments

Comments
 (0)