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$
  • 7
    $\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$ – Robert Jacobson Mar 27 at 19:38
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 *)
| improve this answer | |
$\endgroup$
  • 1
    $\begingroup$ "arbitrary-precision" It's $MachinePrecision when a precision isn't specified after the tick. $\endgroup$ – Robert Jacobson Mar 27 at 19:33
  • 2
    $\begingroup$ @RobertJacobson Nope, it's MachinePrecision. Indeed, there is a difference! Compare N[1, MachinePrecision] and N[1, $MachinePrecision]. $\endgroup$ – Henrik Schumacher Mar 27 at 20:04
  • $\begingroup$ You are right! Now I need to go edit my other comment! $\endgroup$ – Robert Jacobson Mar 27 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$ – J. M.'s technical difficulties Mar 27 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`
| improve this answer | |
$\endgroup$
  • $\begingroup$ Note that 3.0 will be a $MachinePrecision number. $\endgroup$ – Robert Jacobson Mar 27 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$ – Michael E2 Mar 27 at 19:38
  • $\begingroup$ The value of MachinePrecision is $MachinePrecision. Real numbers with fewer than $MachinePrecision digits have precision $MachinePrecision. $\endgroup$ – Robert Jacobson Mar 27 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$ – Robert Jacobson Mar 27 at 19:56
  • 2
    $\begingroup$ Just to clarify: Arbitrary precision numbers (aka "bignums") can have precision less than $MachinePrecision. $\endgroup$ – Daniel Lichtblau Mar 27 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

| improve this answer | |
$\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*)
| improve this answer | |
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.