机器 Epsilon:MatLab 与 Maple

Machine Epsilon: MatLab vs Maple

我正在学习单精度和双精度的机器 epsilon 以及比较来自不同程序的值。例如,在matlab中有如下代码:

>> format long
>> eps

给出 2.220446049250313e-16。但是 Maple 中的以下代码:

> readlib(Maple_floats);
> evalhf(DBL_EPSILON);
> quit;

给出-15 .2220446049250314 10(其中 -15 是指数)。

两个程序的输出略有不同。 Maple 似乎从 3 向上舍入到 4。造成这种差异的原因是什么?

请注意,Maple(和 Matlab)向您展示了硬件双精度浮点数的 radix-10 表示。

所以也许您应该更关心底层硬件双精度值。

> restart:
> kernelopts(version);

       Maple 2015.0, X86 64 LINUX, Feb 17 2015, Build ID 1022128

> X:=Vector(1,datatype=float[8]): # double precision container
> p:=proc(x) x[1]:=DBL_EPSILON; end proc:
> evalhf(p(X)):

> lprint(X[1]);
HFloat(.222044604925031308e-15)

> printf("%Y\n", X[1]);                                       
3CB0000000000000

根据文档,最后的结果是 "formatted in byte-order-independent IEEE hex dump format (16 characters wide)"。

那么,当您 printf 它的 eps 等效格式时,Matlab 会给您什么?一个快速的网络搜索似乎表明它会给出 3CB0000000000000 和你看到的 2.220446049250313e-16。

换句话说:硬件双精度表示在两个系统中是相同的。它们以 10 为基数表示不同。请注意, Maple 显示的以 10 为基数的值有 18 位小数。超过 15 位的数字是某种人工制品,存储后通常内部存储的数字可以正确往返,以便双向重复转换。请注意,硬件双精度与 15 和 16 位小数之间的内容有关。因此,如果您想在两个系统之间进行比较,您可以(并且很可能应该)比较存储的硬件双精度值,而不是第 15 位之后的以 10 为底的表示形式。