2017-02-23 83 views
2

В настоящее время я решаю разреженную линейную систему с разреженным решателем из scipy, Python.Как найти точность поплавка, если n бит повреждены или потеряны

Я сравниваю аналитическое решение с результатом моделирования. Однако в каком-то режиме у меня есть некоторые сомнения относительно точности имитируемого результата.

Сложно оценить condition number для разреженных матриц. Я могу найти наибольшее собственное значение матрицы, но поиск наименьшего собственного значения никогда не сходится, поэтому я даже не могу использовать max (eig)/min (eig) = condition. Идти в другом приближении, которое является max (abs (diag))/min (abs (diag)), я получаю номер условия, из которого log2 дает 26, поэтому я эвристически говорю, теряя около 26 бит точности по моему результату ,

Мой вопрос следующий: учитывая, что мои вычисления выполнены с float64 (numpy), а 26 бит отсутствуют, как я могу вычислить знать, какие десятичные числа моего числа я могу доверять? Например, если ответ дается моей симуляции:

Number_to_verify = +1663,123609834 (float64) и 26 последние биты являются потенциально коррумпированными, какая часть этого числа я могу доверять?

ответ

2

Грубо, 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') 

Для

##123456789
0b11001111111000111111010010 00000000000000000000000000 
0b11001111111000111111010010 01110010011100010011111101 
0b11001111111000111111010010 11111111111111111111111111 

1663.1235961914062 
1663.123609834 
1663.123626708984 
+0

Спасибо, принял ответ. – Mathusalem

Смежные вопросы