[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[lmi-commits] [lmi] master 3d69769b 05/13: Demonstrate that a default co
From: |
Greg Chicares |
Subject: |
[lmi-commits] [lmi] master 3d69769b 05/13: Demonstrate that a default comparison tolerance works well |
Date: |
Mon, 9 May 2022 20:13:17 -0400 (EDT) |
branch: master
commit 3d69769b190673547d5ab1fa3fc6a86753b9f1a8
Author: Gregory W. Chicares <gchicares@sbcglobal.net>
Commit: Gregory W. Chicares <gchicares@sbcglobal.net>
Demonstrate that a default comparison tolerance works well
---
ul_utilities.cpp | 9 ++++-----
ul_utilities_test.cpp | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/ul_utilities.cpp b/ul_utilities.cpp
index 2e8fa498..e8bae50c 100644
--- a/ul_utilities.cpp
+++ b/ul_utilities.cpp
@@ -121,10 +121,9 @@ currency max_modal_premium
int64 irate = bourn_cast<int64>(std::nearbyint(rate * radix));
// If the rate really has more than eight significant (non-erroneous)
// digits, then treat them all as significant. In that case, there
- // is no representation error to be removed. Here, 'tol' is just a
- // guess; it may need refinement.
- constexpr double tol = 1.0e-12;
- if(!materially_equal(bourn_cast<double>(irate), rate * radix, tol))
+ // is no representation error to be removed. The accompanying unit
+ // test gives illustrative examples.
+ if(!materially_equal(bourn_cast<double>(irate), rate * radix))
{
#if 0
// Enable this (including <iostream>) for research.
@@ -141,7 +140,7 @@ currency max_modal_premium
#if 0
// Enable this assertion, adjusting the tolerance (last) argument
// p.r.n., if no table is allowed to have more than eight decimals.
- LMI_ASSERT(materially_equal(bourn_cast<double>(irate), rate * radix, tol));
+ LMI_ASSERT(materially_equal(bourn_cast<double>(irate), rate * radix));
#endif // 0
// Multiply integer rate by integral-cents specamt.
// Use a large integer type to avoid overflow.
diff --git a/ul_utilities_test.cpp b/ul_utilities_test.cpp
index 51a064eb..a7c07d9d 100644
--- a/ul_utilities_test.cpp
+++ b/ul_utilities_test.cpp
@@ -23,12 +23,46 @@
#include "ul_utilities.hpp"
+#include "bourn_cast.hpp"
#include "materially_equal.hpp"
#include "round_to.hpp"
#include "test_tools.hpp"
+#include <cfenv> // fesetround()
+#include <cmath> // nearbyint()
+#include <cstdint> // int64_t
+
void test_max_modal_premium()
{
+ auto test_excess_precision = [](double rate)
+ {
+ using int64 = std::int64_t;
+ constexpr int radix {100'000'000};
+ std::fesetround(FE_TONEAREST);
+ int64 irate = bourn_cast<int64>(std::nearbyint(rate * radix));
+ return !materially_equal(bourn_cast<double>(irate), rate * radix);
+ };
+ LMI_TEST(!test_excess_precision(0.0 ));
+ LMI_TEST(!test_excess_precision(0.00000001 ));
+ LMI_TEST(!test_excess_precision(0.000000010000000000001));
+ LMI_TEST( test_excess_precision(0.00000001000000000001 ));
+ LMI_TEST( test_excess_precision(0.0000000100000000001 ));
+ LMI_TEST( test_excess_precision(0.000000010000000001 ));
+ LMI_TEST( test_excess_precision(0.00000001000000001 ));
+ LMI_TEST( test_excess_precision(0.0000000100000001 ));
+ LMI_TEST( test_excess_precision(0.000000010000001 ));
+ LMI_TEST(!test_excess_precision(0.999999990000000 ));
+ LMI_TEST(!test_excess_precision(0.999999990000001 ));
+ LMI_TEST(!test_excess_precision(0.99999999000001 ));
+ LMI_TEST(!test_excess_precision(0.9999999900001 ));
+ LMI_TEST( test_excess_precision(0.999999990001 ));
+ LMI_TEST( test_excess_precision(0.99999999001 ));
+ LMI_TEST( test_excess_precision(0.99999999999 ));
+ LMI_TEST( test_excess_precision(0.999999999999 ));
+ LMI_TEST(!test_excess_precision(0.9999999999999 ));
+ LMI_TEST(!test_excess_precision(0.99999999999999 ));
+ LMI_TEST(!test_excess_precision(0.999999999999999 ));
+
round_to<double> const round_down(2, r_downward);
round_to<double> const round_near(2, r_to_nearest);
round_to<double> const round_not (2, r_not_at_all);
- [lmi-commits] [lmi] master updated (9e5a09bf -> 3903a0c3), Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master a1533521 01/13: Replace a history command, Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master 3903eed7 03/13: Include appropriate headers, and say why they're included, Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master d9c5f0d5 04/13: Use a local alias to shorten expressions, Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master 3d69769b 05/13: Demonstrate that a default comparison tolerance works well,
Greg Chicares <=
- [lmi-commits] [lmi] master 4d7fe889 07/13: Use rate_times_currency(), Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master 03ad37d7 08/13: Note an arcanum, Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master a67210ec 10/13: Better explain the purpose of each block of unit tests, Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master ee272a29 02/13: Suppress certain GTK diagnostics, Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master c768da7e 06/13: Refactor, almost, Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master 35eb8545 09/13: Prefer a calculation with less roundoff error, Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master c53ea12a 11/13: Reorder some statements in a unit test, Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master 8b6d6dd8 12/13: Say DECIMAL_DIG wherever it's meant, Greg Chicares, 2022/05/09
- [lmi-commits] [lmi] master 3903a0c3 13/13: Record speed measurements, Greg Chicares, 2022/05/09