python - 如果 n 位损坏或丢失,如何找到 float 的精度

标签 python numpy floating-point precision

我目前正在使用 scipy、Python 的稀疏求解器求解稀疏线性系统。

我正在将解析解与模拟解的结果进行比较。然而,在某些情况下,我对模拟结果的精度有些怀疑。

很难估计 condition number对于稀疏矩阵。我可以找到矩阵的最大特征值,但是对最小特征值的搜索永远不会收敛,所以我什至不能使用 max(eig)/min(eig) = 条件。 采用另一个近似值,即 max(abs(diag))/min(abs(diag)),我得到 log2 给出的条件数为 26,因此我试探性地说,结果损失了大约 26 位精度。

我的问题如下:假设我的计算是用 float64 完成的(numpy),并且缺少 26 位,我如何计算知道我可以信任的数字的哪些小数? 例如,如果我的模拟给出的答案是:

要验证的数字 = 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

关于python - 如果 n 位损坏或丢失,如何找到 float 的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42414158/

相关文章:

python - 如何使用另一个列表对多维列表进行排序

python - 迭代python中的两个字典

c++ - 与迭代乘法相比,std::pow() 的数值稳定性如何?

python - 使用字符串和整数从 Numpy 中的列表创建结构体数组

C++ float 被转换为整数

python - 乔列斯基分解浮点误差

python - 如何卸载pycharm和rubymine?

python - 使用 Python 的 ujson 模块的 JSON 转储非数字 float

python - 如何根据 bash 脚本中的正则表达式拆分字符串

python - 将数组与文件进行比较,并根据数组元素形成组