Mathematica内部数字格式和精度

Tim*_*imo 5 wolfram-mathematica number-formatting

这个问题切线相关,这里的数字格式究竟发生了什么?

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

In[2]  := InputForm @ 3.12987*10^-271
Out[2] := 3.1298700000000003`*^-271
Run Code Online (Sandbox Code Playgroud)

如果你*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
Run Code Online (Sandbox Code Playgroud)

然后*^进一步转换,虽然它是机器精度开始剥落:

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
Run Code Online (Sandbox Code Playgroud)

基地很晚才开始分手

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
Run Code Online (Sandbox Code Playgroud)

我假设这些转换与Mathematica内部保存数字的格式有关,但是有人知道,或者关心有害的教育猜测,如何?

Dan*_*lau 8

如果我理解正确,您想知道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}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Daniel Lichtblau Wolfram Research