Skip to content

Commit

Permalink
Replace the gnc:numeric pair with normal Scheme rationals.
Browse files Browse the repository at this point in the history
This allows direct conversion between Scheme numbers and gnc_numeric
without the performance or accuracy penalties arising from using doubles
as an intermediary.
  • Loading branch information
jralls committed Dec 21, 2017
1 parent 7061803 commit e0300d3
Show file tree
Hide file tree
Showing 30 changed files with 190 additions and 267 deletions.
2 changes: 1 addition & 1 deletion gnucash/report/business-reports/balsheet-eg.eguile.scm
Expand Up @@ -288,7 +288,7 @@
<?scm
(for xpair in xlist do
(let* ((comm (car xpair))
(one-num (gnc:make-gnc-numeric 10000 1))
(one-num 10000/1)
(one-foreign-mny (gnc:make-gnc-monetary comm one-num))
(one-local-mny (exchange-fn one-foreign-mny opt-report-commodity)))
?>
Expand Down
2 changes: 1 addition & 1 deletion gnucash/report/business-reports/receipt.scm
Expand Up @@ -46,7 +46,7 @@
(if (or (not taxable) (eq? taxtable '()))
(display "&nbsp;")
(let* ((amttot (gnc:make-commodity-collector))
(pctot (gnc:make-numeric-collector))
(pctot (gnc:make-number-collector))
(entries (gncTaxTableGetEntries taxtable))
(amt? #f) ; becomes #t if any entries are amounts
(pc? #f)) ; becomes #t if any entries are percentages
Expand Down
2 changes: 1 addition & 1 deletion gnucash/report/business-reports/taxinvoice.scm
Expand Up @@ -53,7 +53,7 @@
(if (or (not taxable) (eq? taxtable '()))
(display "&nbsp;")
(let* ((amttot (gnc:make-commodity-collector))
(pctot (gnc:make-numeric-collector))
(pctot (gnc:make-number-collector))
(entries (gncTaxTableGetEntries taxtable))
(amt? #f) ; becomes #t if any entries are amounts
(pc? #f)) ; becomes #t if any entries are percentages
Expand Down
4 changes: 2 additions & 2 deletions gnucash/report/locale-specific/us/taxtxf.scm
Expand Up @@ -701,7 +701,7 @@
(gnc-commodity-equiv account-commodity
USD-currency)))
(xaccSplitGetValue split)
(gnc:make-gnc-numeric 100 100)))
100/100))
(missing-pricedb-entry? #f)
(pricedb-lookup-price #f)
(pricedb-lookup-price-value (gnc-numeric-zero))
Expand Down Expand Up @@ -798,7 +798,7 @@
trans-currency
USD-currency))
(gnc-numeric-div
(gnc:make-gnc-numeric 100 100)
100/100
(xaccSplitGetSharePrice split)
GNC-DENOM-AUTO
(logior (GNC-DENOM-SIGFIGS 6)
Expand Down
14 changes: 7 additions & 7 deletions gnucash/report/report-system/commodity-utilities.scm
Expand Up @@ -415,8 +415,8 @@
;; numeric-collectors, where [abc] are numeric-collectors. See the
;; real variable names below.
(define (make-newrate unknown-coll un->known-coll known-pair)
(let ((a (gnc:make-numeric-collector))
(b (gnc:make-numeric-collector)))
(let ((a (gnc:make-number-collector))
(b (gnc:make-number-collector)))
(a 'add (unknown-coll 'total #f))
(b 'add
;; round to (at least) 8 significant digits
Expand Down Expand Up @@ -459,7 +459,7 @@
;; If this is an Euro currency, create the
;; pair of appropriately exchanged amounts.
(if euro-monetary
(let ((a (gnc:make-numeric-collector)))
(let ((a (gnc:make-number-collector)))
(a 'add
(gnc:gnc-monetary-amount euro-monetary))
(list report-commodity
Expand Down Expand Up @@ -532,8 +532,8 @@

(define (create-commodity-list inner-comm outer-comm share-amount value-amount)
(let ((foreignlist (list inner-comm
(cons (gnc:make-numeric-collector)
(gnc:make-numeric-collector))))
(cons (gnc:make-number-collector)
(gnc:make-number-collector))))
(comm-list #f))
((caadr foreignlist) 'add share-amount)
((cdadr foreignlist) 'add value-amount)
Expand All @@ -560,8 +560,8 @@
(if (not pair)
(begin
(set! pair (list (car foreignlist)
(cons (gnc:make-numeric-collector)
(gnc:make-numeric-collector))))
(cons (gnc:make-number-collector)
(gnc:make-number-collector))))
(gnc:debug "New commodity "
(gnc-commodity-get-mnemonic (car foreignlist)))))
pair))
Expand Down
2 changes: 0 additions & 2 deletions gnucash/report/report-system/html-barchart.scm
Expand Up @@ -300,8 +300,6 @@
(lambda ()
(let ((n (read)))
(if (number? n) n 0.0)))))
((gnc:gnc-numeric? elt)
(gnc-numeric-to-double elt))
(#t
0.0)))

Expand Down
2 changes: 0 additions & 2 deletions gnucash/report/report-system/html-linechart.scm
Expand Up @@ -335,8 +335,6 @@
(lambda ()
(let ((n (read)))
(if (number? n) n 0.0)))))
((gnc:gnc-numeric? elt)
(gnc-numeric-to-double elt))
(#t
0.0)))

Expand Down
4 changes: 1 addition & 3 deletions gnucash/report/report-system/html-piechart.scm
Expand Up @@ -152,9 +152,7 @@
(lambda ()
(let ((n (read)))
(if (number? n) (abs n) 0.0)))))
((gnc:gnc-numeric? elt)
(abs (gnc-numeric-to-double elt)))
(#t
(#t
0.0)))
nlist))

Expand Down
4 changes: 1 addition & 3 deletions gnucash/report/report-system/html-scatter.scm
Expand Up @@ -131,9 +131,7 @@
(lambda ()
(let ((n (read)))
(if (number? n) n 0.0)))))
((gnc:gnc-numeric? elt)
(gnc-numeric-to-double elt))
(#t
(#t
0.0)))

(let* ((retval '())
Expand Down
2 changes: 1 addition & 1 deletion gnucash/report/report-system/report-system.scm
Expand Up @@ -671,7 +671,7 @@
(export gnc:make-stats-collector)
(export gnc:make-drcr-collector)
(export gnc:make-value-collector)
(export gnc:make-numeric-collector)
(export gnc:make-number-collector)
(export gnc:make-commodity-collector)
(export gnc:commodity-collector-get-negated)
(export gnc:commodity-collectorlist-get-merged)
Expand Down
40 changes: 20 additions & 20 deletions gnucash/report/report-system/report-utilities.scm
Expand Up @@ -266,24 +266,24 @@


;; Same as above but with gnc:numeric
(define (gnc:make-numeric-collector)
(define (gnc:make-number-collector)
(let ;;; values
((value (gnc-numeric-zero)))
((value 0))
(lambda (action amount) ;;; Dispatch function
(case action
((add) (if (gnc:gnc-numeric? amount)
(set! value (gnc-numeric-add amount value
GNC-DENOM-AUTO GNC-DENOM-LCD))
(gnc:warn
"gnc:numeric-collector called with wrong argument: "
((add) (if (number? amount)
(set! value (gnc-numeric-add amount value
GNC-DENOM-AUTO GNC-DENOM-LCD))
(gnc:warn
"gnc:Number-collector called with wrong argument: "
amount)))
((total) value)
(else (gnc:warn "bad gnc:numeric-collector action: " action))))))
(else (gnc:warn "bad gnc:number-collector action: " action))))))

;; Replace all 'action function calls by the normal functions below.
(define (gnc:numeric-collector-add collector amount)
(define (gnc:number-collector-add collector amount)
(collector 'add amount))
(define (gnc:numeric-collector-total collector)
(define (gnc:number-collector-total collector)
(collector 'total #f))

;; A commodity collector. This is intended to handle multiple
Expand Down Expand Up @@ -338,12 +338,12 @@
(gnc-commodity-get-fraction commodity) GNC-RND-ROUND)))
(if (not pair)
(begin
;; create a new pair, using the gnc:numeric-collector
(set! pair (list commodity (gnc:make-numeric-collector)))
;; create a new pair, using the gnc:number-collector
(set! pair (list commodity (gnc:make-number-collector)))
;; and add it to the alist
(set! commoditylist (cons pair commoditylist))))
;; add the value
(gnc:numeric-collector-add (cadr pair) rvalue)))
(gnc:number-collector-add (cadr pair) rvalue)))

;; helper function to walk an association list, adding each
;; (commodity -> collector) pair to our list at the appropriate
Expand All @@ -352,23 +352,23 @@
(cond ((null? clist) '())
(else (add-commodity-value
(caar clist)
(gnc:numeric-collector-total (cadar clist)))
(gnc:number-collector-total (cadar clist)))
(add-commodity-clist (cdr clist)))))

(define (minus-commodity-clist clist)
(cond ((null? clist) '())
(else (add-commodity-value
(caar clist)
(gnc-numeric-neg
(gnc:numeric-collector-total (cadar clist))))
(gnc:number-collector-total (cadar clist))))
(minus-commodity-clist (cdr clist)))))

;; helper function walk the association list doing a callback on
;; each key-value pair.
(define (process-commodity-list fn clist)
(map
(lambda (pair) (fn (car pair)
(gnc:numeric-collector-total (cadr pair))))
(gnc:number-collector-total (cadr pair))))
clist))

;; helper function which is given a commodity and returns, if
Expand All @@ -381,8 +381,8 @@
(gnc-numeric-zero)
(if sign?
(gnc-numeric-neg
(gnc:numeric-collector-total (cadr pair)))
(gnc:numeric-collector-total (cadr pair))))
(gnc:number-collector-total (cadr pair)))
(gnc:number-collector-total (cadr pair))))
'()))))

;; helper function which is given a commodity and returns, if
Expand All @@ -395,8 +395,8 @@
(gnc-numeric-zero)
(if sign?
(gnc-numeric-neg
(gnc:numeric-collector-total (cadr pair)))
(gnc:numeric-collector-total (cadr pair)))))))
(gnc:number-collector-total (cadr pair)))
(gnc:number-collector-total (cadr pair)))))))

;; Dispatch function
(lambda (action commodity amount)
Expand Down
8 changes: 4 additions & 4 deletions gnucash/report/standard-reports/advanced-portfolio.scm
Expand Up @@ -321,7 +321,7 @@
;; If the units ratio is zero the stock is worthless and the value should be zero too
(value-ratio (if (gnc-numeric-zero-p units-ratio)
(gnc-numeric-zero)
(gnc-numeric-div (gnc:make-gnc-numeric 1 1) units-ratio GNC-DENOM-AUTO GNC-DENOM-REDUCE))))
(gnc-numeric-div 1/1 units-ratio GNC-DENOM-AUTO GNC-DENOM-REDUCE))))

(gnc:debug "blist is " b-list " current units is "
(gnc-numeric-to-string current-units)
Expand All @@ -341,7 +341,7 @@

(gnc:debug "this is a spinoff")
(gnc:debug "blist is " b-list " value ratio is " (gnc-numeric-to-string value-ratio))
(apply-basis-ratio b-list (gnc:make-gnc-numeric 1 1) value-ratio))
(apply-basis-ratio b-list 1/1 value-ratio))
)

;; when all else fails, just send the b-list back
Expand Down Expand Up @@ -473,7 +473,7 @@
(exchange-fn
(gnc:make-gnc-monetary
(gnc-price-get-currency price)
(gnc:make-gnc-numeric 100 1))
100/1)
currency))))
(set! price #f))

Expand Down Expand Up @@ -514,7 +514,7 @@
;; If we still don't have a price, use a price of 1 and complain later
(if (not price)
(begin
(set! price (gnc:make-gnc-monetary currency (gnc:make-gnc-numeric 1 1)))
(set! price (gnc:make-gnc-monetary currency 1/1))
;; If use-txn is set, but pricing-txn isn't set, it's a bogus price
(set! use-txn #t)
(set! pricing-txn #f)
Expand Down
16 changes: 8 additions & 8 deletions gnucash/report/standard-reports/cash-flow.scm
Expand Up @@ -427,9 +427,9 @@
(gnc:timepair-ge (gnc-transaction-get-date-posted parent) from-date-tp))
(let* ((parent-description (xaccTransGetDescription parent))
(parent-currency (xaccTransGetCurrency parent)))
;(gnc:debug parent-description
; " - "
; (gnc-commodity-get-printname parent-currency))
(gnc:debug parent-description
" - "
(gnc-commodity-get-printname parent-currency))
(for-each
(lambda (s)
(let* ((s-account (xaccSplitGetAccount s))
Expand All @@ -444,7 +444,7 @@
(string-append
"WARNING: s-account is NULL for split: "
(gncSplitGetGUID s) "\n")))
;(gnc:debug (xaccAccountGetName s-account))
(gnc:debug (xaccAccountGetName s-account))
(if (and ;; make sure we don't have
(not (null? s-account)) ;; any dangling splits
(or include-trading-accounts (not (eq? s-account-type ACCT-TYPE-TRADING)))
Expand All @@ -453,7 +453,7 @@
(begin
(if (gnc-numeric-negative-p s-value)
(let ((s-account-in-collector (account-hashtable-ref money-in-hash s-account)))
;(gnc:debug "in:" (gnc-commodity-get-printname s-commodity)
;(gnc:debug "in:" (gnc-commodity-get-printname s-commodity)
; (gnc-numeric-to-double s-amount)
; (gnc-commodity-get-printname parent-currency)
; (gnc-numeric-to-double s-value))
Expand Down Expand Up @@ -494,14 +494,14 @@
)
)
)
)
)
)
)
)
)
(xaccTransGetSplitList parent)
)
)
)
)
)
)

Expand Down
8 changes: 4 additions & 4 deletions gnucash/report/standard-reports/category-barchart.scm
Expand Up @@ -306,20 +306,20 @@ developing over time"))
(let* ((start-frac-avg (averaging-fraction-func (gnc:timepair->secs from-date-tp)))
(end-frac-avg (averaging-fraction-func (+ 1 (gnc:timepair->secs to-date-tp))))
(diff-avg (- end-frac-avg start-frac-avg))
(diff-avg-numeric (gnc:make-gnc-numeric
(diff-avg-numeric (/
(inexact->exact (round (* diff-avg 1000000))) ; 6 decimals precision
1000000))
(start-frac-int (interval-fraction-func (gnc:timepair->secs from-date-tp)))
(end-frac-int (interval-fraction-func (+ 1 (gnc:timepair->secs to-date-tp))))
(diff-int (- end-frac-int start-frac-int))
(diff-int-numeric (gnc:make-gnc-numeric
(diff-int-numeric (/
(inexact->exact diff-int) 1))
)
;; Extra sanity check to ensure a number smaller than 1
(if (> diff-avg diff-int)
(gnc-numeric-div diff-int-numeric diff-avg-numeric GNC-DENOM-AUTO GNC-RND-ROUND)
(gnc:make-gnc-numeric 1 1)))
(gnc:make-gnc-numeric 1 1)))
1/1))
1/1))
;; If there is averaging, the report-title is extended
;; accordingly.
(report-title
Expand Down
4 changes: 2 additions & 2 deletions gnucash/report/standard-reports/net-barchart.scm
Expand Up @@ -314,11 +314,11 @@
(liabilities (assoc-ref rpt 'liability)))
(set! assets-list (if assets (car assets)
(map (lambda (d)
(gnc:make-gnc-monetary report-currency (gnc:make-gnc-numeric 0 1)))
(gnc:make-gnc-monetary report-currency 0/1))
dates-list)))
(set! liability-list (if liabilities (car liabilities)
(map (lambda (d)
(gnc:make-gnc-monetary report-currency (gnc:make-gnc-numeric 0 1)))
(gnc:make-gnc-monetary report-currency 0/1))
dates-list)))
)

Expand Down
2 changes: 1 addition & 1 deletion gnucash/report/standard-reports/sx-summary.scm
Expand Up @@ -355,7 +355,7 @@
(guid (gncAccountGetGUID account))
(num-bal (hash-ref sx-value-hash guid)))
(if num-bal
(if (eq? 0 (gnc:gnc-numeric-denom num-bal))
(if (eq? 0 (denominator num-bal))
(gnc:warn "Oops, invalid gnc_numeric when looking up SX balance for account GUID " guid ": " num-bal)
(begin
(balance-collector
Expand Down

0 comments on commit e0300d3

Please sign in to comment.