AUDIT: r16759 - gnucash/trunk/src/report/standard-reports - another stab at improving rounding. prevent more overflows as pointed out by Kendall Green.
Andrew Sackville-West
andrewsw at cvs.gnucash.org
Fri Dec 28 19:25:36 EST 2007
Author: andrewsw
Date: 2007-12-28 19:25:36 -0500 (Fri, 28 Dec 2007)
New Revision: 16759
Trac: http://svn.gnucash.org/trac/changeset/16759
Modified:
gnucash/trunk/src/report/standard-reports/advanced-portfolio.scm
Log:
another stab at improving rounding. prevent more overflows as pointed out by Kendall Green.
lots of GNC-AUTO-DENOM seems to clean up the overflowing and prevent phantom gains/losses from rounding errors.
BP
Modified: gnucash/trunk/src/report/standard-reports/advanced-portfolio.scm
===================================================================
--- gnucash/trunk/src/report/standard-reports/advanced-portfolio.scm 2007-12-28 23:16:44 UTC (rev 16758)
+++ gnucash/trunk/src/report/standard-reports/advanced-portfolio.scm 2007-12-29 00:25:36 UTC (rev 16759)
@@ -197,7 +197,7 @@
;; sum up the contents of the b-list built by basis-builder below
(define (sum-basis b-list)
(if (not (eqv? b-list '()))
- (gnc-numeric-add (gnc-numeric-mul (caar b-list) (cdar b-list) 100 GNC-RND-ROUND)
+ (gnc-numeric-add (gnc-numeric-mul (caar b-list) (cdar b-list) GNC-DENOM-AUTO GNC-RND-ROUND)
(sum-basis (cdr b-list)) 100 GNC-RND-ROUND)
(gnc-numeric-zero)
)
@@ -207,7 +207,7 @@
(define (units-basis b-list)
(if (not (eqv? b-list '()))
(gnc-numeric-add (caar b-list) (units-basis (cdr b-list))
- 100 (logior GNC-DENOM-REDUCE GNC-RND-NEVER))
+ 100 GNC-RND-ROUND)
(gnc-numeric-zero)
)
)
@@ -216,8 +216,8 @@
;; I need to get a brain and use (map) for this.
(define (apply-basis-ratio b-list units-ratio value-ratio)
(if (not (eqv? b-list '()))
- (cons (cons (gnc-numeric-mul units-ratio (caar b-list) 100000 GNC-RND-ROUND)
- (gnc-numeric-mul value-ratio (cdar b-list) 100000 GNC-RND-ROUND))
+ (cons (cons (gnc-numeric-mul units-ratio (caar b-list) GNC-DENOM-AUTO GNC-RND-ROUND)
+ (gnc-numeric-mul value-ratio (cdar b-list) GNC-DENOM-AUTO GNC-RND-ROUND))
(apply-basis-ratio (cdr b-list) units-ratio value-ratio))
'()
)
@@ -241,22 +241,22 @@
((average-basis)
(if (not (eqv? b-list '()))
(list (cons (gnc-numeric-add b-units
- (caar b-list) 10000 GNC-RND-ROUND)
+ (caar b-list) GNC-DENOM-AUTO GNC-RND-ROUND)
(gnc-numeric-div
(gnc-numeric-add b-value
(gnc-numeric-mul (caar b-list)
(cdar b-list)
- 10000 GNC-RND-ROUND)
- 10000 GNC-RND-ROUND)
+ GNC-DENOM-AUTO GNC-RND-ROUND)
+ GNC-DENOM-AUTO GNC-RND-ROUND)
(gnc-numeric-add b-units
- (caar b-list) 10000 GNC-RND-ROUND)
- 10000 GNC-RND-ROUND)))
+ (caar b-list) GNC-DENOM-AUTO GNC-RND-ROUND)
+ GNC-DENOM-AUTO GNC-RND-ROUND)))
(append b-list
(list (cons b-units (gnc-numeric-div
- b-value b-units 10000 GNC-RND-ROUND))))))
+ b-value b-units GNC-DENOM-AUTO GNC-RND-ROUND))))))
(else (append b-list
(list (cons b-units (gnc-numeric-div
- b-value b-units 10000 GNC-RND-ROUND)))))))
+ b-value b-units GNC-DENOM-AUTO GNC-RND-ROUND)))))))
;; we have value and negative units, remove units from basis
((and (not (gnc-numeric-zero-p b-value))
@@ -268,11 +268,11 @@
(gnc-numeric-abs b-units) (caar b-list))))
(basis-builder (cdr b-list) (gnc-numeric-add
b-units
- (caar b-list) 10000 GNC-RND-ROUND)
+ (caar b-list) GNC-DENOM-AUTO GNC-RND-ROUND)
b-value b-method)
(append (list (cons (gnc-numeric-add
b-units
- (caar b-list) 10000 GNC-RND-ROUND)
+ (caar b-list) GNC-DENOM-AUTO GNC-RND-ROUND)
(cdar b-list))) (cdr b-list))))
((filo-basis)
(if (not (= -1 (gnc-numeric-compare
@@ -281,16 +281,16 @@
(gnc-numeric-add
b-units
(caar (reverse b-list))
- 10000 GNC-RND-ROUND)
+ GNC-DENOM-AUTO GNC-RND-ROUND)
b-value b-method)
(append (cdr (reverse b-list))
(list (cons (gnc-numeric-add
b-units
- (caar (reverse b-list)) 10000 GNC-RND-ROUND)
+ (caar (reverse b-list)) GNC-DENOM-AUTO GNC-RND-ROUND)
(cdar (reverse b-list)))))))
((average-basis)
(list (cons (gnc-numeric-add
- (caar b-list) b-units 10000 GNC-RND-ROUND)
+ (caar b-list) b-units GNC-DENOM-AUTO GNC-RND-ROUND)
(cdar b-list)))))
'()
))
@@ -299,11 +299,11 @@
((and (gnc-numeric-zero-p b-value)
(not (gnc-numeric-zero-p b-units)))
(let* ((current-units (units-basis b-list))
- (units-ratio (gnc-numeric-div (gnc-numeric-add b-units current-units 100000 GNC-RND-ROUND)
- current-units 10000 GNC-RND-ROUND))
- (value-ratio (gnc-numeric-div (gnc:make-gnc-numeric 1 1) units-ratio 100000 GNC-RND-ROUND)))
+ (units-ratio (gnc-numeric-div (gnc-numeric-add b-units current-units GNC-DENOM-AUTO GNC-RND-ROUND)
+ current-units GNC-DENOM-AUTO GNC-RND-ROUND))
+ (value-ratio (gnc-numeric-div (gnc:make-gnc-numeric 1 1) units-ratio GNC-DENOM-AUTO GNC-RND-ROUND)))
- (gnc:debug "blist is " b-list " units ratio is " units-ratio)
+ (gnc:debug "blist is " b-list " current units is " current-units " units ratio is " units-ratio)
(apply-basis-ratio b-list units-ratio value-ratio)
))
@@ -313,8 +313,8 @@
((and (gnc-numeric-zero-p b-units)
(not (gnc-numeric-zero-p b-value)))
(let* ((current-value (sum-basis b-list))
- (value-ratio (gnc-numeric-div (gnc-numeric-add b-value current-value 100000 GNC-RND-ROUND)
- current-value 100000 GNC-RND-ROUND)))
+ (value-ratio (gnc-numeric-div (gnc-numeric-add b-value current-value GNC-DENOM-AUTO GNC-RND-ROUND)
+ current-value GNC-DENOM-AUTO GNC-RND-ROUND)))
(gnc:debug "this is a spinoff")
(gnc:debug "blist is " b-list " value ratio is " value-ratio)
@@ -545,13 +545,13 @@
(gnc:make-gnc-monetary commod-currency
(gnc-numeric-div txn-value
(gnc-numeric-abs txn-units)
- 100 (logior GNC-DENOM-REDUCE GNC-RND-NEVER)))
+ 100 GNC-RND-ROUND))
(gnc:make-gnc-monetary commod-currency (gnc-numeric-zero))))
(set! value (if price (gnc:make-gnc-monetary commod-currency
(gnc-numeric-mul units
(gnc:gnc-monetary-amount price)
- 100 (logior GNC-DENOM-REDUCE GNC-RND-NEVER)))
+ 100 GNC-RND-ROUND))
(gnc:make-gnc-monetary commod-currency (gnc-numeric-zero))))
(set! warn-price-dirty #t)
)
@@ -582,10 +582,10 @@
(ugain (gnc:make-gnc-monetary currency
(gnc-numeric-sub (gnc:gnc-monetary-amount (exchange-fn value currency))
(sum-basis basis-list)
- 100 (logior GNC-DENOM-REDUCE GNC-RND-NEVER))))
+ 100 GNC-RND-ROUND)))
(bothgain (gnc:make-gnc-monetary currency (gnc-numeric-add (gnc:gnc-monetary-amount gain)
(gnc:gnc-monetary-amount ugain)
- 100 (logior GNC-DENOM-REDUCE GNC-RND-NEVER))))
+ 100 GNC-RND-ROUND)))
(activecols (list (gnc:html-account-anchor current)))
)
@@ -784,7 +784,7 @@
(set! sum-total-ugain (gnc:sum-collector-commodity total-ugain currency exchange-fn))
(set! sum-total-both-gains (gnc:make-gnc-monetary currency (gnc-numeric-add (gnc:gnc-monetary-amount sum-total-gain)
(gnc:gnc-monetary-amount sum-total-ugain)
- 100 (logior GNC-DENOM-REDUCE GNC-RND-NEVER))))
+ 100 GNC-RND-ROUND)))
(set! sum-total-brokerage (gnc:sum-collector-commodity total-brokerage currency exchange-fn))
(gnc:html-table-append-row/markup!
More information about the gnucash-changes
mailing list