我正在学习单精度和双精度的机器epsilon,并比较不同程序的值。例如,在matlab中使用以下代码:
>> format long
>> eps
给出2.220446049250313e-16。但是Maple中的以下代码:
> readlib(Maple_floats);
> evalhf(DBL_EPSILON);
> quit;
给出-15 .2220446049250314 10(其中-15是指数)。
两个程序之间的输出略有不同。 Maple似乎从3到4向上舍入。这种差异的原因是什么?
答案 0 :(得分:7)
请注意,Maple(和Matlab)会向您显示硬件双精度浮点数的基数-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
根据文档,最后的结果是“以字节顺序无关的IEEE十六进制转储格式(16个字符宽)格式化”。
那么,当你printf
eps
的等效格式时,Matlab会给你什么?一个快速的网络搜索似乎表明,它将给你3C320000000000000以及你看到的2.220446049250313e-16。
换句话说:两个系统中的硬件双精度表示相同。它们在基数10中的表示方式不同。请注意 Maple显示的基数10值有18位小数。超过15的数字是一种类型的假象,存储使得通常内部存储的数字可以正确往返,以便双向重复转换。请注意,硬件双精度与 15到16位小数之间的某些内容相关。因此,如果您想比较两个系统,您可以(并且可能应该)比较存储的硬件双精度值,而不是超过第15位的基本10表示。