Mathematica内部数字格式和精度

问题描述:

this切线相关的问题,数字格式化到底发生了什么?Mathematica内部数字格式和精度

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内部保存数字的格式有关,但是有谁知道或者关心如何冒险进行有教育的猜测?

如果我理解正确,您在想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个尾数位,类似于一个机器双位,那么最接近的十进制表示将是预期的六位数。

丹尼尔Lichtblau 沃尔夫勒姆研究

+0

+1使用`haphazardly`在描述软件的行为。 – 2011-02-09 16:58:23