在Mathematica中写入文件时格式化数字

Tim*_*imo 6 precision wolfram-mathematica

这是关于数字格式的这个问题的延续,并且与我之前关于获得非常具体的Mathematica输出到文本文件的问题有关.

我经常不得不在Mathematica中使用高精度来生成数据,但只需要相对较低的精度来实现可视化.我还希望存储数据以供以后使用,所有符号名称和数组结构都保持不变.为此,我一直在使用Save[],但有两个相关的问题.

  1. 高精度"污染"我的结果与多余的数字很难摆脱:

    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.

  2. 有时甚至指示精度的数字也会被破坏,我得到的值就像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数组结构的情况下也丢失).

Dan*_*lau 6

你真的需要像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