这里是代码:
#include <iostream>
#include <math.h>
const double ln2per12 = log(2.0) / 12.0;
int main() {
std::cout.precision(100);
double target = 9.800000000000000710542735760100185871124267578125;
double unnormalizatedValue = 9.79999999999063220457173883914947509765625;
double ln2per12edValue = unnormalizatedValue * ln2per12;
double errorLn2per12 = fabs(target - ln2per12edValue / ln2per12);
std::cout << unnormalizatedValue << std::endl;
std::cout << ln2per12 << std::endl;
std::cout << errorLn2per12 << " <<<<< its different" << std::endl;
}
如果在我的机器上尝试(MSVC
),或者在这里(GCC
):
errorLn2per12 = 9.3702823278363212011754512786865234375e-12
相反,这里(GCC
):
errorLn2per12 = 9.368505970996920950710773468017578125e-12
这是不同的。它是由机器epsilon引起的吗?还是编译器精度标志?或者是不同的IEEE
评估?
这里漂移的原因是什么?问题似乎在于fabs()
函数(因为其他值看起来都是相同的)。