Как избежать ошибок с плавающей запятой в Python
В сфере программирования очень важно понимать тонкости вычислений с плавающей запятой, поскольку они могут привести к неожиданным ошибкам, если их не обработать должным образом. В этой статье рассматривается практический пример, который подчеркивает подводные камни арифметики с плавающей запятой.
Проблема квадратного корня
Рассмотрим функцию Python, предназначенную для аппроксимации квадратных корней:
def sqrt(num):
root = 0.0
while root * root Используя эту функцию, мы получаем неожиданные результаты:
>>> sqrt(4)
2.0000000000000013
>>> sqrt(9)
3.00999999999998
Арифметика с плавающей запятой объясняет эти неточности. При представлении дробных чисел компьютеры хранят их как комбинацию целого числа и показателя степени. Из-за ограничений этого представления некоторые десятичные значения не могут быть представлены точно, что приводит к приближениям.
Понимание ошибки
В приведенном выше коде проблема заключается в приращение, используемое для увеличения корневого значения. Хотя мы намерены добавить значение 0,01, фактическое значение, хранящееся в регистре с плавающей запятой, немного отличается и превышает 0,01.
Устранение ошибки
Чтобы избежать ошибок с плавающей запятой, можно использовать различные подходы:
- Использование десятичной дроби Модуль:
Модуль Decimal в Python обеспечивает более точную десятичную арифметику. Заменяя в коде число с плавающей запятой на Decimal, мы получаем более точные результаты:
from decimal import Decimal as D
def sqrt(num):
root = D(0)
while root * root
Now, the function returns precise results, such as:
```
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
```
- Использование приращений с плавающей запятой:
Если использование модуля Decimal невозможно, другой подход заключается в использовании значений с плавающей запятой, которые точно представляются в двоичном виде, например, 1/2**J. Это требует более сложного кода, но обеспечивает точные приращения. - Использование методов численного анализа:
Численный анализ предлагает специализированные методы для обработки сложных математических вычислений. Такие методы, как метод Ньютона, могут обеспечить точные приближения квадратного корня.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3