12
$\begingroup$

Say I've computed something and got a number 0.02112398 with a computed error: 0.000331 Formatting it with ScientificForm[0.02112398 \[PlusMinus] 0.000331] gives me: $$ 2.1124 \times 10^{-2} \pm 3.31 \times 10^{-4} $$

How can I make it display it like this instead? (notice common exponent and the same number of digits)

$$ (2.1124 \pm 0.0331) \times 10^{-2} $$ having the option to cut some digits in both numbers would be a nice addition, for example displaying it like this: $$ (2.11 \pm 0.03) \times 10^{-2} $$

$\endgroup$
9
$\begingroup$
PlusMinus[{x_, err_}] := 
 Module[{errE = Last@MantissaExponent[err], xE = Last@MantissaExponent[x]}, 
  Row[{"(", 
    NumberForm[N@Round[x, 10^(errE - 1)]*10^(-xE + 1), {xE - errE + 1, xE - errE}], 
    " \[PlusMinus] ", 
    NumberForm[N@Round[err, 10^(errE - 1)]*10^(-xE + 1), {1, xE - errE}, 
     ExponentFunction -> (Null &)], ")", 
    " \[Times] ", 
    DisplayForm@SuperscriptBox["10", ToString[xE - 1]]}]]
PlusMinus[x_, err_] := PlusMinus[{x, err}]

Now

PlusMinus@{0.02112398, 0.000331}

output

or

0.02112398 ± 0.000331

output

and after the last edit also

PlusMinus@{0.02112398, 0.0000000000331}

out2

$\endgroup$
  • 1
    $\begingroup$ PlusMinus@{0.02112398, 0.000331} works well, but PlusMinus@{0.2112398, 0.00331} does not. $\endgroup$ – bbgodfrey Jul 2 '15 at 4:22
  • $\begingroup$ @bbgodfrey Thanks for pointing that out. Should be fixed now. $\endgroup$ – Karsten 7. Jul 2 '15 at 9:41
6
$\begingroup$

Here is my take on this problem.

errorForm[num_, err_, digits_] :=
 Module[{exp, n, e},
  exp = Floor @ Log10 @ num;
  n = NumberForm[num/10^exp, digits, ExponentFunction -> (Null &)];
  e = NumberForm[err/10^exp, digits, ExponentFunction -> (Null &)];
  Row[{
    "(", n, "\[ThinSpace]\[PlusMinus]\[ThinSpace]", e, ")
    \[ThinSpace]\[Times]\[ThinSpace]", Superscript["10", exp]}]]

errorForm[2.1124*^-2, 3.31*^-4, 3]
(2.11\[ThinSpace]\[PlusMinus]\[ThinSpace]0.0331)\[ThinSpace]*\[ThinSpace]10^-2

which looks this

formatting

in a Mathematica notebook.

Update

I have edited my function to deal with the issue raised by Mr.Wizard. Now

 errorForm[2.1124*^3, 3.31*^-3, 4]

produces

formated

$\endgroup$
  • 1
    $\begingroup$ @Mr.Wizard. I think I have fixed it. $\endgroup$ – m_goldberg Jul 2 '15 at 12:09
  • $\begingroup$ I copied your answer into a Mathematica code block and then converted it to Input style, as you kindly suggested in Meta1493, and it introduced \n between the second and third lines of Row. Great answer in any case (+1). $\endgroup$ – bbgodfrey Jul 2 '15 at 13:33
  • $\begingroup$ @bbgodfrey. Yes, that is an artifact of copy and paste. The code as written in the original notebook doesn't have the problem. If I removed the line break between the last two lines of the Module above, copy and paste would work fine, but the answer would be harder to read. What to do? :-) $\endgroup$ – m_goldberg Jul 2 '15 at 15:09
  • $\begingroup$ You can copy the Row code in Unicode format, and it fits on one line. Although \[ThinSpace] then disappears from sight, it still is there and works when the code is copied back to Mathematica. I tried it to be sure. $\endgroup$ – bbgodfrey Jul 2 '15 at 15:12
  • $\begingroup$ @bbgodfrey. But I really, really want readers to be able see all the special characters needed to get the formatting to look right. I think that's a very important feature of the answer. $\endgroup$ – m_goldberg Jul 2 '15 at 15:16
5
$\begingroup$

Likely some duplication with existing answers but I felt like playing with this one. I'll use Format so that the underlying representation does not change.

a_ ± b_ ± c_ := PlusMinus[a, b, c];

Format[b_?NumericQ ± err_?NumericQ ± acc_Integer: 6] ^:=
  Row[{
    "(",
     NumberForm[Row[{b, err}*10^-#, "±"], {acc, acc}, 
      ExponentFunction -> (Null &)],
    ")",
    Superscript["×\[ThinSpace]10", #]
  }] & @ ⌊Log10 @ Abs @ b⌋

Now with the default six digits of accuracy:

-0.02112398 ± 3.31*^-8
(-2.112400 ± 0.000003) × 10^-2

Or only three:

-0.02112398 ± 3.31*^-8 ± 3
(-2.110 ± 0.000) × 10^-2

The FullForm of the last expression:

% // FullForm
PlusMinus[-0.02112398`, 3.31`*^-8, 3]

This means that you can easily extract values or overload operations for PlusMinus as needed.

$\endgroup$
  • $\begingroup$ Great answer (+1), but it spills over into other open notebooks, even when they have different default contexts. How can this prevented? Also, could you add more explanation to your answer? $\endgroup$ – bbgodfrey Jul 2 '15 at 12:16
  • 1
    $\begingroup$ @bbgodfrey (1) This is defined upon a System` operator so it is global. One could use a head besides PlusMinus at the expense of the pretty entry form. (2) I would be happy to but what would you like explained? $\endgroup$ – Mr.Wizard Jul 2 '15 at 12:22
  • $\begingroup$ I am trying to understand the first line of your answer. For instance, in a new notebook, i_ ± j_ := i + 1 works, but i_ := i + 1 does not. $\endgroup$ – bbgodfrey Jul 2 '15 at 12:42
  • 2
    $\begingroup$ @bbgodfrey The PlusMinus operator is left-associative, therefore a ± b ± c is parsed as PlusMinus[PlusMinus[a, b], c] but I want to use and make a definition for the three parameter form PlusMinus[a, b, c]. The definition a_ ± b_ ± c_ := PlusMinus[a, b, c]; converts the former into the latter. A definition requires an active head to attach the rule to; in i_ ± j_ := i + 1 that head is PlusMinus; in i_ := i + 1 you have a bare Pattern which is not something you can attach a rule to. $\endgroup$ – Mr.Wizard Jul 2 '15 at 12:54
  • $\begingroup$ (+1) Notes: 1) Probably it is better to not show the exponent when it is zero; 2) You should apply N to {b, err} in order to work with _?NumericQ correctly (Integer, Rational etc.). $\endgroup$ – Alexey Popkov Jul 2 '15 at 20:06
2
$\begingroup$

This seems to be close to what is wanted.

a1 = 0.02112398; a2 = 0.000331;
f[z1_, z2_] := Module[{t, ee = Floor[Log10[Abs[z1]]]}, 
                  t = NumberForm[z1 10^-ee, 3] ± NumberForm[z2 10^-ee, 3 + ee, 
                  ExponentFunction -> (Null &)]; t RawBoxes[SuperscriptBox[10, ee]]]
f[a1, a2]

$$ (2.11 \pm 0.03) 10^{-2} $$

$\endgroup$
  • 1
    $\begingroup$ @Mr.Wizard Now fixed. Thanks. $\endgroup$ – bbgodfrey Jul 2 '15 at 12:00
0
$\begingroup$

Ugly, but seems close to what you seek:

myTidyForm[a_Real, b_Real] := (
   {"(" ~~ ToString[#[[1, 1]]] ~~ "\[PlusMinus]" ~~ 
       ToString[#[[2, 1]] 10^(#[[2, 2]] - #[[1, 2]])] ~~ ")\[Times]" ~~
        ToString[10]^ToString[#[[1, 2]]]} &@(MantissaExponent /@ {a, 
       b}))[[1]]
$\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.