I am trying to write on a file the table generated in this way:
error = ConstantArray[0, 3];
error[[1]] = ScientificForm[Sqrt[CovMat[[1, 1]] /. out[[2]]]];
error[[2]] = ScientificForm[Sqrt[CovMat[[2, 2]] /. out[[2]]]];
error[[3]] = ScientificForm[Sqrt[CovMat[[3, 3]] /. out[[2]]]];
Ris = out[[2]] /. Rule -> (#2 &);
par = out[[2]] /. Rule -> (#1 &);
Finale = MapThread[{#1, ScientificForm[#2], #3} &, {par, Ris,
error}] // TableForm
CovMat anf out are generated in a previoous part of the code (a NMinimize
). Typing Finale on the notebook I find:
M 4.35203*10^(10) 4.2566*10^(9)
\[Delta] 4.10847*10^(5) 2.12356*10^(4)
L 1.01689*10^(9) 1.30717*10^(16)
The problem is that in the file I find:
"M ScientificForm[1.7467449664329874*^11] \
ScientificForm[4.784135569792907*^9]
[\Delta] ScientificForm[606745.0359163599] \
ScientificForm[10326.21966853348]
L ScientificForm[2.788541796939519*^10] \
ScientificForm[1.5410843643505646*^18]"
I used Export
and
file = OpenAppend["out.txt"]
string = ExportString[Finale,"Table"];
WriteString[file, string]
WriteString[file, "\n"];
Close[file]
(I thought that ExportString
read the values as they are) but I cannot get rid of that ScientificForm
.
I suspect that I should use something like:
Export["file.dat", {elem1->expr1, elem2->expr2, ...}, "Rules"]
but I cannot find a way to express the rule.
Answer
Why your file looks like that
As we can read at the end of of "Details and Options" section of ScientificForm documentation:
ScientificForm acts as a "wrapper", which affects printing, but not evaluation.
So although
In[1]:= ScientificForm[410846.99999999994`]
is outputted as
Out[1]//ScientificForm=
4.10847 x 10^5
under the hood it is still number 410846.99999999994`
wrapped with ScientificForm
:
In[2]:= ScientificForm[410846.99999999994`] // FullForm
Out[2]//FullForm=
ScientificForm[410846.99999999994`]
This number wrapped with ScientificForm
when exported to "Table"
format is somehow converted to a string:
In[3]:= ExportString[ScientificForm[410846.99999999994`],"Table"]
Out[3]:= ScientificForm[410846.99999999994]
From simple experiment:
In[4]:= Block[{ToString = toString}, ExportString[{{a, b}, {c, d}}, "Table"]]
Out[4]:= toString[a, InputForm] toString[b, InputForm]
toString[c, InputForm] toString[d, InputForm]
we see that ToString[#, InputForm]&
is used and, as one would expect, in input form we have:
In[5]:= ToString[ScientificForm[410846.99999999994`], InputForm]
Out[5]:= ScientificForm[410846.99999999994`]
This is the reason behind output you're getting.
How to get what you want
What you want is to convert numbers wrapped with ScientificForm
to strings in OutputForm
not in InputForm
. Since OutputForm
is default form of ToString
we don't specify any form:
In[6]:= ScientificForm[410846.99999999994`] // ToString
Out[6]:= 5
4.10847 x 10
It's not exactly what we want, but since "ordinary" *.dat
file has no support for superscripts we need to change our scientific form a bit, to take that into account. We can do that using NumberFormat option:
In[7]:= ScientificForm[410846.99999999994`, NumberFormat -> (#1 <> "*10^(" <> #3 <> ")" &)] // ToString
Out[7]:= "4.10847*10^(5)"
That's of course just an example you can customize it to suit your needs.
Going back to your particular case. Start with your table containing "raw" numbers not wrapped with any formating function:
In[8]:= data = {
{M, 4.35203*10^(10), 4.2566*10^(9)},
{δ, 4.10847*10^(5), 2.12356*10^(4)},
{L, 1.01689*10^(9), 1.30717*10^(16)}
};
and make appropriate conversion just before exporting:
In[9]:= Export[
"file.dat"
,
data /. a_?NumberQ :>
ToString@ScientificForm[a, NumberFormat -> (#1 <> "*10^(" <> #3 <> ")" &)]
]
Out[9]:= file.dat
this produces following file.dat
file:
M 4.35203*10^(10) 4.2566*10^(9)
δ 4.10847*10^(5) 2.12356*10^(4)
L 1.01689*10^(9) 1.30717*10^(16)
Comments
Post a Comment