[GNC] GnuCash_user: rounding errors and significant digits

Jim DeLaHunt list+gnucash at jdlh.com
Wed Sep 13 21:21:35 EDT 2023


Hello again, Bruce!

I can point out a logic error in your argument here.

On 2023-09-13 17:28, Bruce McCoy via gnucash-user wrote:
> ...Yousay that 3750/599 is "the more accurate." How precise isit? Let's see.
>
> 2.396shares * (3750/599) $/share = 2.396 shares *6.260434056761268781302170283806343906510851419
> 3171953255425709515859766277128547579298831385642737 $/share
> = $15.000000000000000000000000
> 0000000000000000000006839999999999999999999999999999999999999999999999997852.
> So, thefraction is accurate to 51 significant digits....

By converting the rational number (3750/599) into a decimal number 
6.260434..., you introduce a numerical error. The decimal number,

     6.26043405676126878130 2170283806343906510 8514193171953255425 
709515859766277128 547579298831385642737

is equal to the rational number,

     626043405676126878130 2170283806343906510 8514193171953255425 
709515859766277128 547579298831385642737 / 1 00000000000000000000 
0000000000000000000 0000000000000000000 000000000000000000 
000000000000000000000

This is a fraction in reduced form, since the numerator does not have 2 
or 5 as factors. (This is easy to tell by inspection, because integers 
with 2 as a factor have an even number as the final digit, and integers 
with 5 as a factor have 0 or 5 as the final digit.)

The above fraction does not have the same numerical value as the price I 
think is correct to use for your example transaction,

     3750/599

The inaccurate decimal number you use as the price leads to an 
inaccurate value for the resulting dollar amount. You show this 
inaccuracy in the result.

So, rather than changing the numerical value of the price before 
multiplying it by the number of shares, how about using that exact value?

2.396 = (2396/1000)  by the definition of decimal number notation

2.396 shares * (3750/599) $/share = (2396/1000)*(3750/599) = 
((4*599)/1000)*(3750/599)
     = ((4*1)/1000)*(3750/1) = (4*3750)/1000 = 15000/1000 = 15.00... $

Thus, when GnuCash derives the price from the number of shares and the 
transaction amount, and stores it as a rational number, it ensures that 
our basic relationship,

     $value = $price/share * #shares

is precisely satisfied.

You ask,

> In September of 2003, we have a lot better options than Terry did in2000. What are some of the ones we prefer?
By my calendar, this is September of 2023 not 2003, and we have even 
better options available now than we did in 2003. However, the option 
GnuCash uses now seems to give correct, exactly precise answers. Why change?

By the way, you did not respond to my question,

On 2023-09-09 13:05, Jim DeLaHunt wrote:
> 1. if your brokerage reports a transaction in terms of price, currency 
> received and paid, and shares received and issued, which are logically 
> inconsistent, how should you interpret that information? This is a 
> step you have to take before entering the transaction into your 
> bookkeeping.

I think that your answer to this question might really help you get to 
the bottom of what is driving you in this thread.

Best regards,
     —Jim DeLaHunt


On 2023-09-13 17:28, Bruce McCoy via gnucash-user wrote:
> Jim,
>
>   
>
> Inyour response of Mon, Aug 21, 2023 at 5:00 PM via GnuCash-user yousaid:
>
>
>
>
>   "Logically,$value = $price/share * #shares, and this should be preciseequality."
>
>   
>
>   GnuCash“stores the price as a rational number, a ratio between numeratorand denominator,”
>
>
>
>
>   "price= 15000/2396 = 3750/599 $/share...the more accurate 3750/599."
>
>   
>
> Let'ssee what GnuCash, excellent program that it is, does with the exact(price per share) fraction it was given to use. If GnuCash does thecalculation correctly, then
>
> $value= $price/share * #shares will be a precise equality. If GnuCashdoes the calculation incorrectly, then
>
> $value= $price/share * #shares will not be a precise equality.
>
>
>
>
> Yousay that 3750/599 is "the more accurate." How precise isit? Let's see.
>
>   
>
> 2.396shares * (3750/599) $/share = 2.396 shares *6.260434056761268781302170283806343906510851419
>
> 3171953255425709515859766277128547579298831385642737 $/share = $15.000000000000000000000000
>
> 0000000000000000000006839999999999999999999999999999999999999999999999997852. So, thefraction is accurate to 51 significant digits. With 51 significantdigits, one would be precise to$23,456,789,012,345,678,901,234,567,890,123,456,789,012,345,678,901.23.Even if you had only 17 significant digits, you could have aprecision up to $123,456,789,012,345.67. Ifyou asked me, even if I reached 100, my portfolio would never comeclose to even the much more modest, second estimate.)
>
>
>
>
> Onmy Windows 10 machine, GnuCash shows 6 + 156/599 = 6.260434057$/share (10 significant digits). In a spreadsheet preferencessetting, we see about the same number of significant digits. In thisexample, GnuCash is losing 41 significant digits. Why?
>
>   
>
> Inexpression-parser.c, we find that on Wednesday June 21 2000 TerryBoldt informs us "The division operation is done in 'double'since I do not think that anybody really wants (9 / 2) to equal 4instead of 4.5 for financial operations."
>
> Scanningthe source for "long double" returned nothing.
>
>   
>
> Onx86, Double is 53bit mantissa or 16 round safe digits. Long Double"tends to be the 80-bit extended format: 64bits of mantissa,15bits of exponent, probably going to be around 18 round safedigits."(1) So, I suppose we lost a lot of significant digitshere in GnuCash. If this is not the case, please help. If this isthe case, we need more precision in GnuCash.
>
>
>
>
> InSeptember of 2003, we have a lot better options than Terry did in2000. What are some of the ones we prefer?
>
>   
>
> BestRegards,
>
> Bruce
>
>
>
>
>
>
>
> (1) https://stackoverflow.com/questions/476212/what-is-the-precision-of-long-double-in-c
>
>
>
> |  | Virus-free.www.avast.com |
>
> _______________________________________________
> gnucash-user mailing list
> gnucash-user at gnucash.org
> To update your subscription preferences or to unsubscribe:
> https://lists.gnucash.org/mailman/listinfo/gnucash-user
> -----
> Please remember to CC this list on all your replies.
> You can do this by using Reply-To-List or Reply-All.


More information about the gnucash-user mailing list