【发布时间】:2019-07-08 17:00:05
【问题描述】:
代码如下:
#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) 或 here (GCC):
errorLn2per12 = 9.3702823278363212011754512786865234375e-12
取而代之的是here (GCC):
errorLn2per12 = 9.368505970996920950710773468017578125e-12
这是不同的。是因为Machine Epsilon?还是编译器精度标志?或者不同的IEEE 评价?
这种漂移的原因是什么?问题似乎在fabs() 函数中(因为其他值似乎相同)。
【问题讨论】:
-
@MatthieuBrucher:请不要!这不是那个问题的重复!它特定于每个平台。请仔细阅读
-
显然不是重复
-
@markzzz 链接可能会过时,如果这些链接包含重要信息,问题就会变得毫无价值。尝试使问题自成一体。
-
@markzzz 标志应该在问题中,而不是在外部链接后面。就我而言,如果我必须点击一个链接,它不存在作为问题的一部分。
标签: c++ floating-point floating-accuracy