__float128 的精度比 double 低吗?
下面是代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1000 +7;
int n,m;
double f[N][N];
// __float128 f[N][N];
signed main()
{
cin>>n>>m;
for(int i=n;i>=0;i--)
for(int j=m;j>=0;j--)
{
if(i!=n || j!=m)
{
f[i][j]=(n*m + f[i][j+1]*i*(m-j) + f[i+1][j]*(n-i)*j + f[i+1][j+1]*(n-i)*(m-j) );
f[i][j]=f[i][j] / (double)(n*m-i*j) ;
// f[i][j]=f[i][j] / (__float128)(n*m-i*j) ;
}
}
printf("%.11lf\n",(double)f[0][0]);
return 0;
}
input:
1 1000
output:
double: 7485.4708605504
__float128: 7485.4708605503
python 的输出是 7485.4708605504(与double一样)
python代码如下:
import numpy as np
n, m = map(int, input().split())
f = np.zeros((n + 2, m + 2))
# Initialize the last row and column
f[n,m]=0
# Calculate the values of f in reverse order
for i in range(n, -1, -1):
for j in range(m, -1, -1):
if i!=n or j!=m :
f[i][j] = (
(n) * (m)
+ f[i][j + 1] * i * ((m) - j)
+ f[i + 1][j] * (n - i) * j
+ f[i + 1][j + 1] * (n - i) * (m - j)
) / ((n) * (m) - i * j)
print(f"{f[0][0]:.10f}")