# Reading in scientific notation from C++ to Mathematica

With a text file with entries formatted as (output from C++):

f[38.67] = -2.5387862698183892298317350539374412777263289550697e-05;
⋮


Is there a way to read this into Mathematica? It seems to be getting confused with the e, thinking it is just a symbol e.

• Nov 22 '12 at 13:08
• When reading Python output in the past I have once or twice done a global replacement of e with *^. That seems like the easiest approach if you have this file already in place. Nov 22 '12 at 14:59
• Could be, is there an automated way to get Mathematica to do this? I am going to have lots of files in this format..(I was thinking about changing the output of c++ code to non scientific but it's not too easy with the MPFR data type and c++ wrapper I am using) Nov 22 '12 at 15:19
• Alternatively, you could Get the file via a pipe, preprocessing it with sed or similar. Nov 22 '12 at 15:30
• Perhaps something like <<"!sed 's/e/*^/gI' < file.m"? Obviously you should be careful when doing this if you have other occurrences of "e" in the file. Nov 22 '12 at 15:47

Similar to Rolf's method:

string = "f[38.67]=-2.5387862698183892298317350539374412777263289550697e-05;";

StringReplace[string, {"e+" :> "*^", "e-" :> "*^-"}];

ToExpression@%;

?? f

Globalf

f[38.67] = -0.000025387862698183892298317350539374412777263289550697


Depending on your data you may want a more specific pattern, e.g.:

StringReplace[string,
{a : NumberString ~~ "e" ~~ b : NumberString :> a <> "*^" <> b}]

• Regex fun: StringReplace[string, RegularExpression["e([+-]?)(\\d+)"] :> "*^$1$2"] Nov 23 '12 at 2:43
• @J.M. you are a glutton for punishment, aren't you! Nov 24 '12 at 20:39
• @Oleksandr... but I like regexes! :D Also, I like the generality: it can handle all of "2.9e5", "1.7e+2", and "3.16e-3". Nov 25 '12 at 1:22

Import usually automatically converts the e format to powers of. You can use ImportString with the "Table" or "List" type:

ImportString["-2.5387862698183892298317350539374412777263289550697e-05", "Table"]


{{-0.000025387862698183892298317350539374412777263289550697}}

or

ImportString["1.002e-26", "Table"]


{{1.002*10^-26}}

• thanks, but what if I want the input to initialize this function f rather than just reading the RHS values and putting them in a list? Nov 22 '12 at 13:29
• I had previously just been using Get to do this. Nov 22 '12 at 14:21

For those wishing to transform a full data file with numbers in scientific notation that is output from Fortran (or C, et al.) as "1.6E-19" and "3.0E+08" and such, it is incredibly faster to make changes in the Unix sed command line editor than doing a search and replace in the .m file within Mathematica or any word processor. At the Unix prompt $ one types $ cat FilewE.m | sed 's/E-/*^-/g' | sed 's/E+/*^+/g' > FilewoE.m


For those new to Unix, the cat command "concatenates" a single file (named FilewE.m in this example), which normally would flow the contents onto the terminal screen. Instead the flow is piped | into sed and, to avoid killing off any Es that appear in words, E- is replaced with *^- globally g. The output of that is piped into sed again to catch the positive exponents and the output of that is directed > to the output file named FilewoE.m` in this example.

• This should be the answer especially if you are dealing with a lot of files. Easily incorporated in a script.
– Cain
Jul 28 at 11:07