Message Boards Message Boards

0
|
7989 Views
|
12 Replies
|
4 Total Likes
View groups...
Share
Share this post:

Addition and subtraction don't give exact zero?

Posted 2 years ago

Hi, I just want to make very simple operations, and it doesn't work. The result of the attached operation (in the last line i) should be simply zero, and I have 9. 10 -13 instead of zero ! .... Please help.

a = 5306.47 
b = 4 
c = 1182.54 
d = 50.26 
e = 0 
f = 377.11 
g = c + d + e + f 
h = 3700.56 
i = a + b - g - h
POSTED BY: Yvan Abbe
12 Replies
Posted 2 years ago

Thanks to all for your help. I think the simplest for me is Chop[].

POSTED BY: Yvan Abbe
Posted 2 years ago

Quantity can do what you expect if we add an extra definition as follows:

Quantity[1,"Dollars"];
Unprotect[Quantity];
Quantity[x_,"Dollars"]+Quantity[y_,"Dollars"]^:=With[{s=x+y},(
Quantity[0.01(Round[100 x]+Round[100 y]),"Dollars"])/;Head[s]===Real];
UpValues[Quantity]=RotateRight[UpValues[Quantity],1];

Then we can do this:

a=Quantity[5306.47,"Dollars"];
b=Quantity[4,"Dollars"];
c=Quantity[1182.54,"Dollars"];
d=Quantity[50.26,"Dollars"];
e=Quantity[0,"Dollars"];
f=Quantity[377.11,"Dollars"];
g=c+d+e+f;
h=Quantity[3700.56,"Dollars"];
i=a+b-g-h
(*  $0.00  *)

However, if you evaluate b, it will be displayed as an integer number of dollars. If you want to see $4.00 instead, add the following definition:

Quantity[x_Integer,"Dollars"]:=Quantity[N@x,"Dollars"];
POSTED BY: Ted Ersek

Accuracy can be nailed on input, still output needs to be stripped by a formatter

Clear[a, b, c, d, e, f, h, g]
a = 5306.47``2;
b = 4.``2;
c = 1182.54``2;
d = 50.26``2;
e = 0.``2;
f = 377.11``2;
h = 3700.56``2;
g = c + d + e + f
Out[9]= 1609.9

In[14]:= a + b - g - h
Out[14]= 0.*10^-2

In[12]:= N[a + b - g - h]
Out[12]= 0.

In[13]:= AccountingForm[a + b - g - h]
Out[13]//AccountingForm= 0.
POSTED BY: Dent de Lion
In[122]:= Clear[a, b, c, d, e, f, h, g]
a = 5306.47;
b = 4.;
c = 1182.54;
d = 50.26;
e = 0.;
f = 377.11;
h = 3700.56;
g = c + d + e + f

Out[130]= 1609.91

In[133]:= N[SetAccuracy[a + b - g - h, 2]]
Out[133]= 0.

In[134]:= N[a + b - g - h, 2]
Out[134]= 9.09495*10^-13
POSTED BY: Dent de Lion
Posted 2 years ago

That is because AccountingForm is not computable (like MatrixForm, TableForm...). It is for display purposes only. It can only be used on the final result.

POSTED BY: Rohit Namjoshi
Posted 2 years ago

..? Thanks for the proposal, but this following code doesn't give the expected result (0) on my side ...

Clear[a, b, c, d, e, f, h]
a = 5306.47 
b = 4.
c = 1182.54 
d = 50.26 
e = 0.
f = 377.11 
g = c + d + e + f  // AccountingForm
h = 3700.56 
i = a + b - g - h // AccountingForm
POSTED BY: Yvan Abbe
Posted 2 years ago

Thanks!

POSTED BY: Yvan Abbe

Don't mix integers with reals, Rationalize[] is an ovekill because there is AccountingForm[], a formatter, with other words

Clear[a, b, c, d, e, f, h]
a = 5306.47;
b = 4.;
c = 1182.54;
d = 50.26;
e = 0.;
f = 377.11;
h = 3700.56`;

In[51]:= c + d + e + f // AccountingForm
Out[51]//AccountingForm= 1609.91

In[52]:= a + b - g - h // AccountingForm
Out[52]//AccountingForm= 0.
POSTED BY: Dent de Lion
Posted 2 years ago

It would depend on what "financial computations" are being performed. Machine precision is about 16 decimal digits which should be sufficient. As Marvin showed, you can always use Chop to convert small values to 0.

$MachinePrecision
(* 15.9546 *)
POSTED BY: Rohit Namjoshi

Here is a shorter way:

POSTED BY: Marvin Ray Burns
Posted 2 years ago

Thank you very much! So does it means that for financial computations, it is recommended to always enclose the inputs numbers with the Rationalize[] function?

POSTED BY: Yvan Abbe
Posted 2 years ago

Machine precision numbers are not exact so there will always be rounding errors. This is not something specific to Wolfram language. If you want exact results, use exact numbers.

a = Rationalize@5306.47
b = 4
c = Rationalize@1182.54
d = Rationalize@50.26
e = 0
f = Rationalize@377.11
g = c + d + e + f
h = Rationalize@3700.56
i = a + b - g - h
(* 0 *)

For details, see this.

POSTED BY: Rohit Namjoshi
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract