9
$\begingroup$

The result seems weird for simple multiplication, I have no idea why this happens.

In[71]:= 0.6*0.8048780487804877` Out[71]= 0.482927 In[72]:= 0.3*0.8414634146341463` Out[72]= 0.252439 In[74]:= (0.6*0.8048780487804877`) + 0.3*0.8414634146341463` Out[74]= 0.735366 In[75]:= 0.6*0.8048780487804877`+0.3*0.8414634146341463` Out[75]= 0.406365 

Why the brackets In[74] and In[75] have effect? I think it should have no difference. I use mathematica 12.1. Thank you for your help.

$\endgroup$
1
  • 8
    $\begingroup$ This is definitely one of Mathematica's "gotchas." This lexical quirk is a consequence of Wolfram Language allowing both a plus and a minus in the number in a precision annotation. Since the precision annotation is infix instead of matchfix, there is no good way of avoiding some version of this lexical trap, unfortunately. $\endgroup$ Commented Mar 27, 2020 at 19:38

4 Answers 4

8
$\begingroup$

Because the In[75] is completely different than you think.

0.6*0.8048780487804877`+0.3*0.8414634146341463` (* 0.406365 *) 0.6*0.8048780487804877` + 0.3*0.8414634146341463` (* 0.735366 *) 

Notice the space in the second example: in your case +0.3 is a specification for precision for tick `

Easier example:

(* in this case it's specification of precision *) 1.2`+30 (* 1.20000000000000000000000000000 *) (* in this case it's 1.2 with $MachinePrecision, plus 30 *) 1.2` + 30 (* 31.2 *) 
$\endgroup$
4
  • 1
    $\begingroup$ "arbitrary-precision" It's $MachinePrecision when a precision isn't specified after the tick. $\endgroup$ Commented Mar 27, 2020 at 19:33
  • 2
    $\begingroup$ @RobertJacobson Nope, it's MachinePrecision. Indeed, there is a difference! Compare N[1, MachinePrecision] and N[1, $MachinePrecision]. $\endgroup$ Commented Mar 27, 2020 at 20:04
  • $\begingroup$ You are right! Now I need to go edit my other comment! $\endgroup$ Commented Mar 27, 2020 at 20:08
  • 5
    $\begingroup$ N.B. Once upon a time, N[1, $MachinePrecision] was used to get a machine precision result. Version 5 introduced MachinePrecision, so that N[1, MachinePrecision] was what you now had to do to get a machine precision result, and N[1, $MachinePrecision] now produced an arbitrary precision result. Perhaps this is what @Robert was (mis)remembering. $\endgroup$ Commented Mar 27, 2020 at 20:17
8
$\begingroup$

0.8048780487804877`+0.3 is an arbitrary-precision number with precision 0.3.

With the parentheses, the 0.3 does not specify the precision, but stands as a number. The second line is equivalent to

0.6 * (0.8048780487804877`+0.3) * 0.8414634146341463` 
$\endgroup$
6
  • $\begingroup$ Note that 3.0 will be a $MachinePrecision number. $\endgroup$ Commented Mar 27, 2020 at 19:31
  • 1
    $\begingroup$ @RobertJacobson I suppose you meant 0.3, not 3.0. Do you mean $MachinePrecision (i.e., arbitrary precision) or MachinePrecision number? Do you just mean that the precision of an arbitrary-precision number is specified by a MachinePrecision number? $\endgroup$ Commented Mar 27, 2020 at 19:38
  • $\begingroup$ The value of MachinePrecision is $MachinePrecision. Real numbers with fewer than $MachinePrecision digits have precision $MachinePrecision. $\endgroup$ Commented Mar 27, 2020 at 19:42
  • $\begingroup$ (Technically, MachinePrecision is n*Log[10, 2] where n is the IEEE mantissa on the host system, and $MachinePrecision is the MachinePrecision approximation to MachinePrecision.) $\endgroup$ Commented Mar 27, 2020 at 19:56
  • 2
    $\begingroup$ Just to clarify: Arbitrary precision numbers (aka "bignums") can have precision less than $MachinePrecision. $\endgroup$ Commented Mar 27, 2020 at 21:38
4
$\begingroup$

It's not hte parentheses; it's the missing whitespace!

There is a tiny difference between the meanings of

 0.8048780487804877`+0.3 

0.*10^-1

and

 0.8048780487804877` +0.3 

1.10488

We have

 0.8048780487804877`+0.3 == 0.8048780487804877`0.3 

and the number behind the backtick denotes the number of significant digits. In particular, no addition is performed during evaluation of in case of 0.8048780487804877`+0.3

$\endgroup$
0
$\begingroup$

Of course you can raise all the numbers to a higher precision:

0.6`50 0.8048780487804877`50 + 0.3`50*0.8414634146341463`50 (*0.7353658536585365100000000000000000000000000000000*) 
$\endgroup$

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.