我正在玩在 qemu 中模拟的 PPC64 虚拟机,试图模仿 POWER8 CPU。
在这里,该long double
类型与 x86 中用于长双精度的 80 位浮点数不同,并且据我所知,它也不符合 IEEE754 的 float128,因为根据 C 宏它有一个 106 位的尾数LDBL_MANT_DIG
(对比。 IEEE754 为其 float128 规定的 112 位尾数)。
维基百科说 IEEE754 float128 的机器 epsilon 应该在 1.93e-34 左右,比 80 位 x86 浮点数 (1.08e-19) 要好得多。
然而,当我尝试在这个虚拟机中获取机器 epsilon 时,我得到了一个相当令人惊讶的答案:
#include <iostream>
int main()
{
long double eps = 1.0l;
while (1.0l + 0.5l * eps != 1.0l)
eps = 0.5l * eps;
std::cout << eps << std::endl;
return 0;
}
它输出以下内容:
4.94066e-324
我从LDBL_EPSILON
和 从得到相同的结果std::numeric_limits<long double>::epsilon()
。
这将使它比预期的精确度高出大约 10 倍,逻辑告诉我这应该是不可能的。看到尾数正好是 2x53(IEEE754 的 float64 的),我认为它可能使用双双结构,维基百科还说,它对小数字的精度应该低于 IEEE754 float128。
这里发生了什么?