Tim*_*imo 6 precision wolfram-mathematica
这是关于数字格式的这个问题的延续,并且与我之前关于获得非常具体的Mathematica输出到文本文件的问题有关.
我经常不得不在Mathematica中使用高精度来生成数据,但只需要相对较低的精度来实现可视化.我还希望存储数据以供以后使用,所有符号名称和数组结构都保持不变.为此,我一直在使用Save[],但有两个相关的问题.
高精度"污染"我的结果与多余的数字很难摆脱:
In[1] := b = SetPrecision[7, 50]; a = Pi/b
Out[1] := 0.44879895051282760549466334046850041202816705705358654585356351318683091518373`50.
In[2] := InputForm @ N[a, 6]
Out[2] := 0.44879895051282760549466334046850041203`6.
Run Code Online (Sandbox Code Playgroud)
我真的只需要0.448799.
4.72642364528438598726943'5.9999999999999999999999我通常不需要精度4.72642就足够了.这两者都会给文件大小带来很大的开销,虽然硬盘存储很便宜,但是后来将文件加载回Mathematica时,文件大小会产生巨大的差异.
因此,从例如aa包含不规则数组中的50位任意精度数字开始,是否有一种内置方式可以让我获得一个文本文件来读取这样的内容
aa = {{2.0437`4, 4.7276`4, ...}, ...}
Run Code Online (Sandbox Code Playgroud)
编辑:为了澄清,我没有显示数字或跟踪数字的精确度或更改数字的精度问题.我遇到的问题是控制如何将数字写入文件.
使用N,NumberForm,OutputForm,InputForm,*Form,等,都不能正常工作与Save.并且Save是我能找到的唯一导出符号和数组结构的导出选项.Export并且Put*可以用于更好地控制格式,但它们不包括符号(并且在Export数组结构的情况下也丢失).
你真的需要像2.0437`4这样的东西,还是机器双2.0437就足够了?如果是后者那么你可以做类似的事情
N[SetPrecision[values,6]]
Run Code Online (Sandbox Code Playgroud)
强制加工双打(大部分)显示六位小数.
一个可能的优点是回读它.您的阵列现在将是机器双打,因此可打包.我不确定Get或Import是否自动打包,但Developer`ToPackedArray会这样做.
---编辑2011-02-11 ---
现在我已经看到了什么可能出错......
这是一个例子,使用您以后的输入和其他一些我希望具有代表性的输入.
aa = {7.469702041097916467293771347613073888816285869`15.\
954589770191005*^-51, 5555.22222222222222222223,
.00000000002222222222222222222222222227777777777777, N[E, 22]^33}
Run Code Online (Sandbox Code Playgroud)
首先转换为字符串.出于保存到文件的目的,这实际上可能是您真正想要的.我使用NumberForm,但使用自定义格式化功能(文档页面中的大小写).
In[39]:=
InputForm[ToString[
NumberForm[N[aa], 6,
NumberFormat :> (If[#3 != "", Row[{#1, "*^", #3}], #1] &)]]]
Out[39]//InputForm=
"{7.4697*^-51, 5555.22, 2.22222*^-11, 2.14644*^14}"
Run Code Online (Sandbox Code Playgroud)
请注意,表达式转换在此方面正常工作.
In[40]:=
InputForm[ToExpression[
ToString[NumberForm[N[aa], 6,
NumberFormat :> (If[#3 != "", Row[{#1, "*^", #3}], #1] &)]]]]
Out[40]//InputForm=
{7.4697*^-51, 5555.22, 2.22222*^-11, 2.14644*^14}
Run Code Online (Sandbox Code Playgroud)
---结束编辑---
Daniel Lichtblau Wolfram Research