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