【问题标题】:Mathematica internal number formats and precisionMathematica 内部数字格式和精度
【发布时间】:2011-02-09 10:38:53
【问题描述】:

this 问题相关,数字格式到底发生了什么?

In[1]  := InputForm @ 3.12987*10^-270
Out[1] := 3.12987`*^-270

In[2]  := InputForm @ 3.12987*10^-271
Out[2] := 3.1298700000000003`*^-271

如果您使用 *10.^ 作为乘数,则转换是您天真地期望它的位置:

In[3]  := InputForm @ 3.12987*10.^-16
Out[3] := 3.12987`*^-16

In[4]  := InputForm @ 3.12987*10.^-17
Out[4] := 3.1298700000000004`*^-17

*^ 使过渡更进一步,尽管机器精度开始下降:

In[5]  := InputForm @ 3.12987*^-308
Out[5] := 3.12987`*^-308

In[6]  := InputForm @ 3.12987*10.^-309
Out[6] := 3.12987`15.954589770191008*^-309

基地在很久以后才开始解体

In[7]  := InputForm @ 3.12987*^-595
Out[7] := 3.12987`15.954589770191005*^-595

In[8]  := InputForm @ 3.12987*^-596
Out[8] := 3.1298699999999999999999999999999999999999`15.954589770191005*^-596

我假设这些转换与 Mathematica 内部保存其数字的格式有关,但有没有人知道或愿意冒险进行有根据的猜测?

【问题讨论】:

    标签: wolfram-mathematica number-formatting


    【解决方案1】:

    如果我理解正确,您想知道 InputForm 何时会显示超过 6 位数字。如果是这样,它会偶然发生,每当需要更多数字来“最佳”表示评估后获得的数字时。由于评估涉及显式乘以 10^(一些幂),并且由于十进制输入不需要(并且在这种情况下不是)精确地用二进制表示,因此您可以得到与您期望的微小差异。

    In[26]:= Table[3.12987*10^-j, {j, 10, 25}] // InputForm
    
    Out[26]//InputForm=
    {3.12987*^-10,
     3.12987*^-11, 
     3.12987*^-12, 
     3.12987*^-13, 
     3.12987*^-14, 
     3.12987*^-15, 
     3.12987*^-16, 
     3.1298700000000004*^-17, 
     3.1298700000000002*^-18, 
     3.12987*^-19, 
     3.12987*^-20, 
     3.1298699999999995*^-21, 
     3.1298700000000003*^-22, 
     3.1298700000000004*^-23, 
     3.1298700000000002*^-24, 
     3.1298699999999995*^-25}
    

    至于 *^ 输入语法,它实际上是一个解析(实际上是词法)结构。没有计算 10 的明确精确幂。构造一个浮点值,并且在二进制到十进制允许的范围内尽可能忠实于您的输入。 InputForm 将显示与输入数字一样多的数字,因为这确实是与创建的相应二进制值最接近的十进制数。

    当您超越机器浮点数的限制时,您将获得任意精度的模拟。它不再是 machinePrecision 而实际上是 $MachinePrecision(这是 Mathematica 中机器浮点数的 bignum 模拟)。

    我相信,您在 InputForm 中看到的 3.12987*^-596(以 9 结尾的十进制数)是由 Mathematica 的内部表示引起的,涉及使用保护位。如果只有 53 个尾数位,类似于机器双精度,那么最接近的十进制表示将是预期的六位数字。

    丹尼尔·利希特布劳 Wolfram 研究

    【讨论】:

    • +1 用于在描述软件行为时使用haphazardly
    • 感谢您的见解。向任意精度的过渡一直让我感到困惑,尤其是当我必须将大量数据写入文件时,突然间每个数字都添加了大约 16 个字符的精度数据!
    • @Timo 16 个字符似乎过多。你的意思是你得到的数字比机器两倍大大约 16 个字节?或者你观察到那个保护位现象?如果有问题的数字实际上在机器双倍的大小范围内,请随时发布或发送示例,因为它可能表明您的代码或 Mathematica 的 Put 或 Export 中存在问题,无论您使用的是哪个。跨度>
    • 我的意思是从例如 2.3' 扩展到 2.3'15.956428462957535 。这给文件大小带来了巨大的开销。我将针对我的实际问题提出一个单独的问题。
    • 问题在这里stackoverflow.com/q/4955429/181759我很感激你看看。我不认为它是一个错误,但可能是一个功能请求。
    猜你喜欢
    • 2018-02-23
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    相关资源
    最近更新 更多