我正在学习单精度和 double 的机器 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)向您展示了硬件 double float 的 radix-10 表示。
所以也许您应该更关心底层硬件 double 值。
> 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
根据文档,最后的结果是“格式化为与字节顺序无关的 IEEE 十六进制转储格式(16 个字符宽)”。
那么,当您以等效格式printf
其eps
时,Matlab 会为您提供什么?快速网络搜索似乎表明它会给出 3CB0000000000000 以及您看到的 2.220446049250313e-16。
换句话说:硬件 double 表示在两个系统中是相同的。它们以 10 为基数表示不同。请注意, Maple 显示的以 10 为基数的值有 18 位小数。超过 15 位的数字是某种人工制品,存储后通常内部存储的数字可以正确往返,以便双向重复转换。请注意,硬件 double 与 15 到 16 位小数有关。因此,如果您想比较这两个系统,您可以(并且很可能应该)比较存储的硬件 double 值,而不是第 15 位之后的以 10 为基数的表示。
关于matlab - 机器 Epsilon : MatLab vs Maple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32381398/