如果 n 位损坏或丢失,如何找到浮点数的精度
How to find precision of float if n bits are corrupt or lost
我目前正在使用 scipy、Python 中的稀疏求解器求解稀疏线性系统。
我正在将解析解与模拟解的结果进行比较。但是,在某些情况下,我对模拟结果的精度有些怀疑。
很难估计稀疏矩阵的 condition number。我可以找到矩阵的最大特征值,但对最小特征值的搜索永远不会收敛,所以我什至不能使用 max(eig)/min(eig) = 条件。
使用另一个近似值,即 max(abs(diag))/min(abs(diag)),我得到一个条件数,其中 log2 给出 26,所以我启发式地说我的结果损失了大约 26 位精度。
我的问题如下:鉴于我的计算是使用 float64 (numpy) 完成的,并且缺少 26 位,我如何计算才能知道我的数字的哪些小数位是我可以信任的?
比如我模拟给出的答案是:
Number_to_verify = 1663.123609834 (float64)
最后 26 位可能已损坏,我可以信任这个数字的哪一部分?
粗略地说,float64
有 52 位尾数和 ~ 16 位有效的十进制数字。
因此,如果您确定 26 位已损坏,请保留 8 位十进制数字。
更准确地说,错误是关于 Number_to_ verify * 2**(-26) # 2e-05
。
一种有效的技术方法:
f=1663.123609834
num,den=f.as_integer_ratio()
p=2**26
ninf=n//p*p
nsup=ninf|(p-1)
print(bin(ninf),bin(n),bin(nsup),sep='\n')
print(ninf/d,n/d,nsup/d,sep='\n')
为了
##12345678901234567890123456 12345678901234567890123456
0b11001111111000111111010010 00000000000000000000000000
0b11001111111000111111010010 01110010011100010011111101
0b11001111111000111111010010 11111111111111111111111111
1663.1235961914062
1663.123609834
1663.123626708984
我目前正在使用 scipy、Python 中的稀疏求解器求解稀疏线性系统。
我正在将解析解与模拟解的结果进行比较。但是,在某些情况下,我对模拟结果的精度有些怀疑。
很难估计稀疏矩阵的 condition number。我可以找到矩阵的最大特征值,但对最小特征值的搜索永远不会收敛,所以我什至不能使用 max(eig)/min(eig) = 条件。 使用另一个近似值,即 max(abs(diag))/min(abs(diag)),我得到一个条件数,其中 log2 给出 26,所以我启发式地说我的结果损失了大约 26 位精度。
我的问题如下:鉴于我的计算是使用 float64 (numpy) 完成的,并且缺少 26 位,我如何计算才能知道我的数字的哪些小数位是我可以信任的? 比如我模拟给出的答案是:
Number_to_verify = 1663.123609834 (float64) 最后 26 位可能已损坏,我可以信任这个数字的哪一部分?
粗略地说,float64
有 52 位尾数和 ~ 16 位有效的十进制数字。
因此,如果您确定 26 位已损坏,请保留 8 位十进制数字。
更准确地说,错误是关于 Number_to_ verify * 2**(-26) # 2e-05
。
一种有效的技术方法:
f=1663.123609834
num,den=f.as_integer_ratio()
p=2**26
ninf=n//p*p
nsup=ninf|(p-1)
print(bin(ninf),bin(n),bin(nsup),sep='\n')
print(ninf/d,n/d,nsup/d,sep='\n')
为了
##12345678901234567890123456 12345678901234567890123456
0b11001111111000111111010010 00000000000000000000000000
0b11001111111000111111010010 01110010011100010011111101
0b11001111111000111111010010 11111111111111111111111111
1663.1235961914062
1663.123609834
1663.123626708984