给定一个调和级数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;
}
2条答案
按热度按时间u91tlkcl1#
在
float
是single-precision IEEE floating point number的系统上,它有24位精度,大约是7位或(log10(224))位十进制精度。如果你改变
到
你会发现你已经得到了最好的答案。
事实上,如果使用
%A
而不是%f
,您将看到对该位的答案是相同的。9udxz4iz2#
@ikegami已经用十进制和十六进制显示了这个答案,但为了让它更清楚,这里是二进制的数字。
ln(2)实际上是:
四舍五入到24位,即:
转换回十进制,即:
......这就是你得到的数字。你不能做得比这更好,在单精度
float
的24位精度中。