lmi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[lmi-commits] [lmi] master cde9755 3/6: Factor out max-power-of-10 param


From: Greg Chicares
Subject: [lmi-commits] [lmi] master cde9755 3/6: Factor out max-power-of-10 parameter [383]
Date: Thu, 15 Mar 2018 20:12:22 -0400 (EDT)

branch: master
commit cde9755a3bedb84cb6f01727fcf2929f19d0fa3b
Author: Gregory W. Chicares <address@hidden>
Commit: Gregory W. Chicares <address@hidden>

    Factor out max-power-of-10 parameter [383]
    
    Made the threshold value for scaling into an argument. Its value is
    hard-coded for now, and the effect of changing it has not been tested.
    
    It would not make sense to treat the highest supported scaling power a
    parameter: currency amounts beyond quintillions will not be needed for
    the anticipated lifetime of lmi.
---
 ledger.cpp      |  6 ++++--
 ledger_base.cpp | 12 ++++--------
 ledger_base.hpp |  2 +-
 3 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/ledger.cpp b/ledger.cpp
index c49f38d..86f06f7 100644
--- a/ledger.cpp
+++ b/ledger.cpp
@@ -315,12 +315,14 @@ int Ledger::GetMaxLength() const
 // largest absolute value of any number in any column of every subledger.
 void Ledger::AutoScale()
 {
-    int k = ledger_invariant_->DetermineScalePower();
+    int const max_power = 9;
+
+    int k = ledger_invariant_->DetermineScalePower(max_power);
 
     ledger_map_t& l_map_rep = ledger_map_->held_;
     for(auto const& i : l_map_rep)
         {
-        k = std::max(k, i.second.DetermineScalePower());
+        k = std::max(k, i.second.DetermineScalePower(max_power));
         }
 
     ledger_invariant_->ApplyScaleFactor(k);
diff --git a/ledger_base.cpp b/ledger_base.cpp
index 2252738..c41f23f 100644
--- a/ledger_base.cpp
+++ b/ledger_base.cpp
@@ -307,7 +307,7 @@ LedgerBase& LedgerBase::PlusEq
 
 /// Triple-power-of-ten scaling to keep ledger extremum < 10^max_power.
 
-int LedgerBase::DetermineScalePower() const
+int LedgerBase::DetermineScalePower(int max_power) const
 {
     double min_value = 0.0;
     double max_value = 0.0;
@@ -327,17 +327,13 @@ int LedgerBase::DetermineScalePower() const
         ,max_value
         );
 
-// TODO ?? It would be nicer to factor out
-//   1000000000.0 (max width)
-//   and 1.0E-18 (highest number we translate to words)
-// and make them variables.
-// PDF !! This seems not to be rigorously correct: $999,999,999.99 is
-// less than one billion, but rounds to $1,000,000,000.
-    if(widest < 1000000000.0 || widest == 0)
+    if(widest < nonstd::power(10.0, max_power) || widest == 0)
         {
         return 0;
         }
 
+// PDF !! This seems not to be rigorously correct: $999,999,999.99 is
+// less than one billion, but rounds to $1,000,000,000.
     double d = std::log10(widest);
     d = std::floor(d / 3.0);
     int k = 3 * static_cast<int>(d);
diff --git a/ledger_base.hpp b/ledger_base.hpp
index 0c3902a..98b7322 100644
--- a/ledger_base.hpp
+++ b/ledger_base.hpp
@@ -176,7 +176,7 @@ class LMI_SO LedgerBase
 
     void               ApplyScaleFactor(int decimal_power);
 
-    int                DetermineScalePower() const;
+    int                DetermineScalePower(int max_power) const;
     std::string const& ScaleUnit() const;
 // PDF !! expunge
     int                ScalePower() const;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]