У вас нет всех возможностей или возможности доступа к зашифрованным файлам при автоматическом входе в систему, поэтому попробуйте выполнить вход в систему и обратно, и посмотрите, дает ли это вам эти способности. Если это позволяет отключить автоматический вход в систему, то это быстрый способ.
Если это не сработает, загрузитесь с живого CD / DVD или USB-накопителя Ubuntu, откройте Nautilus (т. Е. Браузер файлов ) и щелкните по тому для системы Ubuntu, установленной на вашем жестком диске (она указана в верхней части левой панели любого окна браузера), чтобы установить ее. Затем выйдите из этого оригинального окна Nautilus и нажмите Alt + F2 и запустите gksu nautilus (это открывает окно браузера файлов как root с неограниченными возможностями). В окне браузера файлов, созданным при этом, найдите том, который вы только что установили (вам, возможно, придется вручную просмотреть его внутри /media), и внутри него перейдите в каталог etc. Внутри этого перейдите в каталог lightdm. Сделайте резервную копию файла lightdm.conf, а затем отредактируйте исходный файл, чтобы удалить строку, которая начинается autologin-user=. Затем перезагрузитесь (используя значок питания / шестерни> Shut Down в правом верхнем углу рабочего стола), извлеките CD / DVD или USB-накопитель и загрузитесь в свою установленную систему. Теперь вы должны увидеть экран входа, как вы привыкли.
(В итоге загрузите живую систему и создайте резервную копию и отредактируйте /etc/lightdm/lightdm.conf, чтобы удалить строку autologin-user=.)
Это может быть немного уродливое взломать, но оно работает очень хорошо, когда вам не нужно больше, чем точность поплавка по умолчанию (около 11 десятичных знаков). Хорошо работает на python 2.7.
Функция round_to использует метод format из встроенного класса str для округления float до строки, которая представляет float с количеством десятичных знаков, необходимых, а затем применяет eval встроенная функция для округленной строки с плавающей точкой, чтобы вернуться к числовому типу float.
Функция round_to просто применяет простой условный к округленному поплавку.
def round_to(float_num, decimal_precision):
return eval("'{:." + str(int(decimal_precision)) + "f}'.format(" + str(float_num) + ")")
def is_close(float_a, float_b, decimal_precision):
if round_to(float_a, decimal_precision) == round_to(float_b, decimal_precision):
return True
return False
a = 10.0 / 3
# Result: 3.3333333333333335
b = 10.0001 / 3
# Result: 3.3333666666666666
print is_close(a, b, decimal_precision=4)
# Result: False
print is_close(a, b, decimal_precision=3)
# Result: True
В некоторых случаях, когда вы можете повлиять на представление исходного номера, вы можете представлять их как фракции вместо float, используя целочисленный числитель и знаменатель. Таким образом, вы можете иметь точные сравнения.
Подробнее см. В разделе «Фракция от фракций».
Я не знаю ничего в стандартной библиотеке Python (или в другом месте), которая реализует функцию AlmostEqual2sComplement Доусона. Если это то поведение, которое вы хотите, вам придется реализовать его самостоятельно. (В этом случае, вместо того, чтобы использовать умные поразрядные хаки Доусона, вам, вероятно, лучше использовать более традиционные тесты формы if abs(a-b) <= eps1*(abs(a)+abs(b)) + eps2 или аналогичные. Чтобы получить поведение Доусона, вы можете сказать что-то вроде if abs(a-b) <= eps*max(EPS,abs(a),abs(b)) для некоторых небольших фиксированных EPS, это не совсем то же самое, что и Доусон, но похоже по духу.
Мне понравилось предложение @Sesquipedal, но с модификацией (специальный прецедент, когда оба значения равны 0, возвращает False). В моем случае я был на Python 2.7 и просто использовал простую функцию:
if f1 ==0 and f2 == 0:
return True
else:
return abs(f1-f2) < tol*max(abs(f1),abs(f2))
Использовать модуль decimal Python, который предоставляет класс Decimal.
Из комментариев:
Стоит отметить, что если вы делаете математическую работу и вам не нужна абсолютная точность с десятичной точки, это может действительно утомить вещи. Поплавки - это путь, способ быстрее справляться, но неточный. Десятичные числа являются чрезвычайно точными, но медленными.Является ли что-то вроде простого недостаточно хорошего?
return abs(f1 - f2) <= allowed_error
Я нашел следующее сравнение полезным:
str(f1) == str(f2)
math.isclose () добавлен в Python 3.5 для этого (исходный код). Вот его порт на Python 2. Различие между однострочным шрифтом Mark Ransom заключается в том, что он может обрабатывать «inf» и «-inf» правильно.
def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
'''
Python 2 implementation of Python 3.5 math.isclose()
https://hg.python.org/cpython/file/tip/Modules/mathmodule.c#l1993
'''
# sanity check on the inputs
if rel_tol < 0 or abs_tol < 0:
raise ValueError("tolerances must be non-negative")
# short circuit exact equality -- needed to catch two infinities of
# the same sign. And perhaps speeds things up a bit sometimes.
if a == b:
return True
# This catches the case of two infinities of opposite sign, or
# one infinity and one finite number. Two infinities of opposite
# sign would otherwise have an infinite relative tolerance.
# Two infinities of the same sign are caught by the equality check
# above.
if math.isinf(a) or math.isinf(b):
return False
# now do the regular computation
# this is essentially the "weak" test from the Boost library
diff = math.fabs(b - a)
result = (((diff <= math.fabs(rel_tol * b)) or
(diff <= math.fabs(rel_tol * a))) or
(diff <= abs_tol))
return result