Насправді не характерно для реалізації Python, але має застосовуватися до будь-яких функцій поплавця до десяткових рядків.
Число з плаваючою комою є по суті двійковим числом, але в наукових позначеннях із фіксованою межею значущих цифр.
Зворотне будь-яке число, яке має простий коефіцієнт числа, яке не поділяється з базою, завжди призведе до повторного подання точкових точок. Наприклад, 1/7 має простий коефіцієнт 7, який не поділяється на 10, а тому має повторне десяткове подання, і те саме стосується 1/10 з простими множниками 2 і 5, останній не ділиться з 2 ; це означає, що 0,1 не може бути точно представлений кінцевою кількістю бітів після крапки.
Оскільки 0,1 не має точного подання, функція, яка перетворює наближення до рядка з десятковою точкою, зазвичай намагається наблизити певні значення, щоб вони не отримували інтуїтивні результати, наприклад, 0,1000000000004121.
Оскільки плаваюча точка знаходиться в науковій нотації, будь-яке множення на силу основи впливає лише на експонентну частину числа. Наприклад, 1,231e + 2 * 100 = 1,231e + 4 для десяткової нотації, а також 1,00101010e11 * 100 = 1,00101010e101 у двійковій нотації. Якщо я помножую на не-потужність бази, це також вплине на значні цифри. Наприклад, 1,2e1 * 3 = 3,6e1
Залежно від використовуваного алгоритму, він може спробувати відгадати загальні десяткові знаки лише на основі значущих цифр. І 0,1, і 0,4 мають однакові значні цифри у двійкових, оскільки їх поплавці по суті є усіченнями (8/5) (2 ^ -4) та (8/5) (2 ^ -6) відповідно. Якщо алгоритм ідентифікує шаблон сигфіг 8/5 як десятковий 1.6, він буде працювати на 0,1, 0,2, 0,4, 0,8 і т.д. Він може також мати магічні шаблони сигфіг для інших комбінацій, наприклад, поплавок 3, поділений на поплавок 10 та інші магічні візерунки, статистично ймовірно, будуть сформовані діленням на 10.
У випадку 3 * 0,1 останні кілька значущих цифр, ймовірно, будуть відрізнятися від ділення поплавця 3 на поплавок 10, внаслідок чого алгоритм не може розпізнати магічне число для константи 0,3 залежно від його допуску до втрати точності.
Редагувати:
https://docs.python.org/3.1/tutorial/floatingpoint.html
Цікаво, що існує багато різних десяткових чисел, які поділяють однаковий найближчий приблизний двійковий дріб. Наприклад, числа 0,1 і 0,10000000000000001 та 0,1000000000000000055511151231257827021181583404541015625 всі наближені на 3602879701896397/2 ** 55. Оскільки всі ці десяткові значення мають однакове наближення, будь-яке з них може бути відображене при збереженні інваріантного рівня (repr (x)) ) == х.
Немає допуску до втрати точності, якщо float x (0,3) не точно дорівнює float y (0,1 * 3), то repr (x) точно не дорівнює repr (y).