有没有可能将C中调和级数的浮点和的精度提高到10^-8以上?

tnkciper  于 2023-02-03  发布在  其他
关注(0)|答案(2)|浏览(89)

给定一个调和级数1 - 1/2 + 1/3 - 1/4...= ln(2),是否可以仅使用浮点值和仅使用**基本运算来获得值0.69314718056(+,—,,是否有任何算法可以提高该计算的精度而不采用不合理的高n值(当前合理限度为1e^10)
我目前拥有的:* 这让我有8个正确的数字-〉0.6931471825*

EDIT目标是使用only float数据类型计算最精确的总和值

int main()
{
    float sum = 0;
    int n = 1e9;
    double ans = log(2);
    int i;
    float r = 0;

    for (i = n; i > 0; i--) {
        r = i - (2*(i/2));
        if(r == 0){
            sum -= 1.0000000 / i;
        }else{
            sum += 1.0000000 / i; 
        }
    }

    printf("\n%.10f", sum);
    printf("\n%.10f", ans);
    return 0;
}
u91tlkcl

u91tlkcl1#

floatsingle-precision IEEE floating point number的系统上,它有24位精度,大约是7位或(log10(224))位十进制精度。
如果你改变

double ans = log(2);

float ans = log(2);

你会发现你已经得到了最好的答案。

0.6931471 82464599609375       From log(2), casted to float
0.6931471 82464599609375       From your algorithm
0.6931471 8055994530941723...  Actual value
  \_____/
  7 digits

事实上,如果使用%A而不是%f,您将看到对该位的答案是相同的。

0X1.62E43P-1  // From log(2), casted to float
0X1.62E43P-1  // From your algorithm
9udxz4iz

9udxz4iz2#

@ikegami已经用十进制和十六进制显示了这个答案,但为了让它更清楚,这里是二进制的数字。
ln(2)实际上是:

0.1011000101110010000101111111011111010001110011111…

四舍五入到24位,即:

0.101100010111001000011000

转换回十进制,即:

0.693147182464599609375

......这就是你得到的数字。你不能做得比这更好,在单精度float的24位精度中。

相关问题