gpt4 book ai didi

c++ - exp10 不同于 pow(10)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:12 25 4
gpt4 key购买 nike

首先,我意识到大多数以 10 为底的数字不能以 2 为底精确表示,所以我的问题并不是关于浮点运算的缺陷。

我正在尝试编写一个函数,该函数将尝试通过检查最后 6 个有意义的数字是否在某个公差范围内并将其更改为某个假设的精确值之上的下一个可表示值(仅用于显示目的)来纠正被累积舍入误差双重污染的函数- 除非它是整数或 2 的幂)。

尽管我的函数的一个组成部分让我感到惊讶,但它是 exp10 的输出;据我所知,只要两个 double 之间的间距小于 2,那么存储为 double 的整数值就应该是精确的——尽管 10^14 插入它,这应该是一个精确的整数(因为 10^14 =~ 2^46.507 < 2^53)。然而,这不是我的测试显示的。

我的调试工作(没有什么特别明显)和输出的摘录如下:

double test = 0.000699;
double tmp = fabs(test);
double exp = 10.0 - floor(log10(tmp));
double powTen = exp10(10.0 - floor(log10(tmp)));
double powTen2 = exp10(exp);
double powTen3 = exp10((int)exp);
double powTen4 = exp10(exp);
double powTen5 = pow(10, exp);

printf("exp: %.16lf\n", exp);
printf("powTen: %.16lf\n", powTen);
printf("powTen2: %.16lf\n", powTen2);
printf("powTen3: %.16lf\n", powTen3);
printf("powTen4: %.16lf\n", powTen4);

//these two are exact
printf("10^14: %.16lf\n", exp10(14));
printf("powTen5: %.16lf\n", powTen5);
printf("exp == 14.0: %d\n", exp == 14.0);

输出:

exp: 14.0000000000000000
powTen: 100000000000000.1250000000000000
powTen2: 100000000000000.1250000000000000
powTen3: 100000000000000.1250000000000000
powTen4: 100000000000000.1250000000000000
10^14: 100000000000000.0000000000000000
powTen5: 100000000000000.0000000000000000
exp == 14.0: 1

pow 得到准确的答案,就像 exp10 和硬编码的 int 一样。对于所有其他情况,我添加了 1/8(10^14 和 10^14 + 下一个可表示之间的间距是 1/64)。文档说 exp10 应该等同于 pow。谁能看到我遗漏的东西?

编辑 - 通过 O3、O2、O1 优化,我得到了预期的输出 - 除非直到运行时才能知道数据。此时 exp10 仍然表现不正常。

最佳答案

很可能是您的 exp10 实现出现了问题。请注意,它返回的结果有时会相差一个 ulp(相对于您的 10^14 为 0.125。)

这是一个相当令人发指的错误;您遇到了这样一种情况,其中正确答案可以表示为 doubleexp10 没有这样做。

我赞同 Ben Voigt 的评论,即编译器有时可能会自行评估事物,而不是将它们传递给数学库。它可能做得更好,因为它可能链接到任意精度的数学库。您可以尝试使用 -fno-builtin 选项来查看它是否会改变任何内容。

不幸的是,我不认为crlibm已实现 exp10。否则,我建议您只使用它而不必担心。

编辑:我拥有的eglibc 源拷贝似乎是这样实现exp10的:

double
__ieee754_exp10 (double arg)
{
/* This is a very stupid and inprecise implementation. It'll get
replaced sometime (soon?). */
return __ieee754_exp (M_LN10 * arg);
}

不要指望它会很好地工作。

关于c++ - exp10 不同于 pow(10),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23666565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com