【问题标题】:Machine Epsilon: MatLab vs Maple机器 Epsilon:MatLab 与 Maple
【发布时间】:2015-11-29 15:05:38
【问题描述】:

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

>> format long
>> eps

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

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

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

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

【问题讨论】:

  • 在 Maple 中,evalhf(DBL_EPSILON) 给出 .222044604925031308 10^-15,这与 Matlab 中的 eps 相同。那么有什么问题呢?
  • 您在进行哪种计算,其中 30+ 浮点数真的很重要? :~
  • 它旨在证明关于机器 epsilon 的一点,我不明白。
  • 您使用的是什么版本的 Maple?是不是很老了? readlib 命令应该是不必要的。再次尝试使用它。我得到 2.22044604925031308e-16,,我得到的比你多两位。
  • @NKN 这可能比最初怀疑的要多。请注意,对于两个数字的相加(这是整个计算,例如nPebblesOnBeach + handfulOfPebbles),精度为 10^-16 可能没问题。此外,在大多数情况下,像 area = pi*r^2; 这样的乘法可能只需要较低的精度。但是,假设您有一个大矩阵。这个也可能条件不好。参见例如cond(rand(N))。在这里,您肯定会关心机器 epsilon 是 10^-16 还是(可能有点粗糙,但是......)10^-10。

标签: matlab numerical-methods scientific-computing maple


【解决方案1】:

请注意,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

根据文档,最后一个结果是“以与字节顺序无关的 IEEE 十六进制转储格式(16 个字符宽)格式化”。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2016-05-31
    相关资源
    最近更新 更多