Как извлечь кубический корень как можно точнее?
Популярный способ извлечь кубический корень из вещественного числа такой: x ** (1 / 3) . Но он не самый точный: 19683 ** (1 / 3) -> 26.999999999999996 , хотя для обратной функции 27 ** 3 == 19683 . Налицо неточность. И да, я знаю что вещественные числа считают приближенно. Как извлечь корень кубический максимально точно?
Отслеживать
3,388 2 2 золотых знака 10 10 серебряных знаков 28 28 бронзовых знаков
задан 4 мар 2022 в 16:57
Stanislav Volodarskiy Stanislav Volodarskiy
31k 3 3 золотых знака 19 19 серебряных знаков 55 55 бронзовых знаков
Кажется, для этого придётся искать какие-то специальные математические библиотеки. Число 1/3 невозможно представить в виде конечной десятичной дроби (поэтому использовать decimal не годится), а результат извлечения корня в общем случае не обязательно окажется рациональным числом
4 мар 2022 в 17:09
@andreymal , двоичный поиск для кубической функции должен выдать самый точный представимый результат. Не так ли?
4 мар 2022 в 17:11
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Ну вот такая есть библиотека, например:
import gmpy2 print(gmpy2.root(19683, 3))
Отслеживать
ответ дан 5 мар 2022 в 7:21
69.4k 5 5 золотых знаков 20 20 серебряных знаков 51 51 бронзовый знак
Может стоит попробовать numpy ? Эта библиотека, вроде, куда точнее проводит вычисления. Информацию взял отсюда
Пример
Код
import numpy as np cubes = [125, -64, 27, -8, 1] cube_roots = np.cbrt(cubes) print(cube_roots)
Вывод
[ 5. -4. 3. -2. 1.]
Отслеживать
ответ дан 4 мар 2022 в 17:03
2,816 2 2 золотых знака 16 16 серебряных знаков 57 57 бронзовых знаков
На примере из вопроса numpy даёт точно такой же неточный результат 26.999999999999996
4 мар 2022 в 17:04
@andreymal, извиняюсь, безрассудную теорию предложил. Проверить сам не успеваю, т.к. на завтра праздничную программу готовлю XD
4 мар 2022 в 17:10
Даже если использовать максимально точный вещественный тип np.float128 , всё-равно точно 27 в numpy никак не получится.
5 мар 2022 в 7:22
Возможно вы хотели просто решить проблему неточного извлечения корней из точных кубов, но получилось как получилось:
import struct from fractions import Fraction def difference(float_expected, float_root, degree): ''' Возвращает разницу между степенью корня и ожидаемым значением ''' fraction_expected = Fraction.from_float(float_expected) fraction_root = Fraction.from_float(float_root) return abs(fraction_expected - fraction_root ** degree) def ternary_search(lower_bound, upper_bound, function): ''' Находит целое значение x из промежутка [lower_bound, upper_bound), для которого значение function(x) минимально ''' while lower_bound + 3 < upper_bound: mid1 = (lower_bound * 2 + upper_bound) // 3 mid2 = (lower_bound + upper_bound * 2) // 3 res1 = function(mid1) res2 = function(mid2) if res1 < res2: upper_bound = mid2 else: lower_bound = mid1 return min(range(lower_bound, upper_bound), key=function) def create_float(exponent, mantissa): ''' Создает число binary64 IEEE-754 по экспоненте и мантиссе ''' number = (exponent
Как извлечь кубический корень в Python
Кубическим корнем числа называют такое значение, которое при возведении в куб дает исходное число. Другими словами, кубический корень — это значение, при троекратном умножении на которое мы можем получить число под корнем.
Кубический корень обозначается символом «3√». В случае с квадратным корнем мы использовали только символ ‘√’ без указания степени, который также называется радикалом.
Например, кубический корень из 125, обозначаемый как 3√125, равен 5, так как при умножении 5 на само себя три раза получается 5 x 5 x 5 = 125 = 5^3.
Кубический корень в Python
Чтобы вычислить кубический корень в Python, используйте простое математическое выражение x ** (1. / 3.), результатом которого является кубический корень из x в виде значения с плавающей точкой. Для проверки, корректно ли произведена операция извлечения корня, округлите полученный результат до ближайшего целого числа и возведите его в третью степень, после сравните, равен ли результат x.
Извлечение корня в Python
В этой статье мы рассмотрим, как извлечь корень в Python, а также какой модуль и функция для этого используется. Но давайте обо всем по порядку.
Если мы знаем только общую площадь квадрата и хотим узнать размер одной его стороны либо же собираемся рассчитать расстояние между 2-мя точками в декартовых координатах, нам потребуется квадратный корень. Это не проблема, если речь идет о математике. Но что делать, когда речь идет о языке программирования? К нашему счастью разработчики Python предусмотрели для решения вышеописанной задачи специальную функцию. Но прежде чем продолжить, давайте немного вспомним теорию.
Квадратный корень — что это?
Квадратным корнем, полученным из числа «A», называют число «B», которое при возведении во 2-ю степень даст в итоге то самое изначальное число «A».
Непосредственную операцию, позволяющую найти значение «B», называют извлечением корня из «A». Математики применяют для обозначения этой операции специальный знак (его еще называют знаком радикала):
Когда речь идет о корне в «Питоне», ситуация обстоит иначе, причем в обоих случаях. К примеру, само возведение числа в степень записывают посредством оператора «**«:
Ответ в консоли «Пайтона» будет равняться четырем.
Касаемо квадратного корня, то он в Python представлен функцией sqrt(). Однако она существует не сама по себе, а в рамках соответствующего математического модуля math. Таким образом, перед началом работы этот модуль надо будет импортировать, но это абсолютно не сложно сделать на практике:
import math
Идем дальше. Наша функция sqrt() принимает лишь один параметр – значение, из которого нам надо извлечь √. Давайте напишем простенький код и задействуем float в качестве типа данных возвращаемого значения.
import math
import random
# попробуем функцию sqrt() на практике
# найдем корень случайного числа с последующим выводом его на экран
rand_num = random.randint(5, 55)
print('Наше случайное число = ', rand_num)
print('Искомое значение корня = ', sqrt_rand_num)
Вы можете попробовать работу этого кода у себя на компьютере или на любом онлайн-компиляторе. Вот, к примеру, компилятор для Python 3 .
Результат может быть таким:


Так как мы используем модуль random, результат будет различаться при каждом выполнении кода.
Но никто не мешает сделать все намного проще:

Положительные числа
Функция sqrt() предназначена для работы с положительными значениями. Если число больше либо равно нулю, то неважно, какой тип данных у него, ведь извлечение корня возможно как из целых, так и из вещественных чисел.
Из целых:
Из вещественных:
Сомневаетесь в корректности итоговых результатов предыдущего примера? Просто выполните обратное возведение в степень:
Также не забывайте, что сделать это можно и посредством специальной функции pow:
Отрицательные значения и ноль
Функция sqrt в «Питоне» — вещь полезная и знать ее нужно, однако она не принимает отрицательного числа — лишь положительные (целые и вещественные), а также ноль.
Такая ограниченная возможность использования не соответствует математическим канонам, ведь в реальной жизни специалисты по математике без проблем извлекают √ и из отрицательных значений. Да, результат будет комплексным и пригодится лишь для решения довольно узкого спектра задач, типа расчетов волновых явлений в физике либо вычислений в энергетической сфере.
Учитывайте вышесказанное, если пытаетесь извлекать корни в Python посредством этой функции. Передав отрицательное значение, вы получите error:

А вот если говорить про ноль, то ошибки не будет, так как код отработает корректно. Однако результат тут очевиден, поэтому практическая ценность данной возможности весьма условна:
Хотите знать о «Питоне» намного больше? Добро пожаловать на специализированный курс в «Отус»!

- http://python-teach.ru/python-dlya-nachinayushhih/vychislenie-kvadratnogo-kornya-chisla-v-python/.
Извлечение корней в Python
Под извлечением корня из какого-либо числа чаще всего подразумевают нахождение решение уравнения x в степени n = value, соответственно для квадратного корня, число n — это два, для кубического — 3. Чаще всего под результатом и числом подразумеваются вещественные числа.
В программировании нахождение корней используется очень часто. Разберемся, как и какими методами можно эффективно извлекать корни из числа. Вначале рассмотрим, какие способы есть в Python, и определим самый эффективный. Потом более подробно разберём, как можно найти не только квадратный корень из числа, но и кубический, и потом корень n степени.
Способы извлечения корня
В языке программирования Python 3 существует три способа извлечения корней:
- Использование функции sqrt из стандартной математической библиотеки math.
- Операция возведения в степень **
- Применение функции pow(x, n)
Чтобы воспользоваться первым способом, необходимо вначале импортировать sqrt из модуля math. Это делается с помощью ключевого слова import: from math import sqrt . При помощи этой функции можно извлекать только квадратный корень из числа. Приведем пример:
from math import sqrt x = sqrt(4) print(x) 2.0
Если же нам нужно вычислить в Python корень квадратный из суммы квадратов, то можно воспользоваться функцией hypot из модуля math. Берется сумма квадратов аргументов функции, из нее получается корень. Аргументов у функции два.
from math import hypot x = hypot(4,3) print(x) 5.0
Еще одним, чуть более универсальным методом, будет использование возведения в степень. Известно, что для того, чтобы взять корень n из числа, необходимо возвести его в степень 1/n. Соответственно, извлечение квадратного корня из числа 4 будет выглядеть так:
n = 2 x = 4**(1./n) print(x) 2.0
Обратите внимание, что в Python 2 необходимо ставить точку после единицы, иначе произойдет целочисленное деление, и 1/n == 0, а не нужной нам дроби. В Python 3 можно не ставить точку.
Последний метод использует функцию pow(value, n). Эта функция в качестве аргумента value возьмет число, которое необходимо возвести в степень, а второй аргумент будет отвечать за степень числа. Как и в предыдущем методе, необходимо использовать дробь, для того, чтобы получить корень числа.
x = pow(4, 0.5) print(x) 2.0
Какой метод быстрее?
Для того, чтобы определить какой же метод предпочтительнее использовать, напишем программу. Замерять время выполнения будем с помощью метода monotonic библиотеки time.
from time import monotonic from math import sqrt iterations = 1000000 start = monotonic() for a in range(iterations): x = sqrt(4) print("sqrt time: .3f>".format(monotonic() - start) + " seconds") start = monotonic() for a in range(iterations): x = 4 ** 0.5 print("** time: .3f>".format(monotonic() - start) + " seconds") start = monotonic() for a in range(iterations): x = pow(4, 0.5) print("pow time: .3f>".format(monotonic() - start) + " seconds") sqrt time: 0.266 seconds ** time: 0.109 seconds pow time: 0.453 seconds
Как видно, самое быстрое решение — использовать **. На втором месте метод sqrt, а pow — самый медленный. Правда, метод sqrt наиболее нагляден при вычислении в Python квадратных корней.
Таким образом, если критична скорость, то используем **. Если скорость не критична, а важна читаемость кода, то следует использовать sqrt.
Квадратный корень
Для извлечения квадратного корня самым наглядным способом, правда не самым быстрым, будет использование sqrt из модуля math.
from math import sqrt x = sqrt (value)
Но можно использовать и трюки с возведением в степень 1/2, что тоже будет приводить к нужному результату.
x = value ** (0.5) или x = pow(value, 0.5) .
Кубический корень
Для извлечения кубического корня в Python 3 метод sqrt не подойдет, поэтому воспользуйтесь возведением в степень 1/3:
x = value ** (1./3) или x=pow(value, 1/3) .
Корень n-степени
Корень n-степени из числа в Python извлекается можно получить двумя способами с помощью возведения в степень 1.0/n:
- С помощью оператора **.
- Используя функцию pow.
Как было проверено выше, оператор ** быстрее. Поэтому его использовать более целесообразно. Приведем пример вычисления кубических корней в Python 3 с помощью этих двух методов:
n = 4. x = 16.0 ** (1./n) print(x) x = pow(16.0, 1./n) print(x) 2.0 2.0
Корень отрицательного числа
Рассмотрим, как поведут себя функции, если будем брать корень из отрицательного числа.
from math import sqrt x = sqrt(-4) File "main.py", line 2, in x = sqrt(-4) ValueError: math domain error
Как видим, функция sqrt выдаёт исключение.
Теперь посмотрим, что будет при использовании других методов.
x = -4 ** 0.5 print(x) x = pow(-4, 0.5) print(x) -2.0 (1.2246467991473532e-16+2j)
Как видно из результата, оператор ** не выдает исключения и возвращает некорректный результат. Функция pow работает корректно. В результате получаем комплексное число 2j, что является верным.
Вывод
В Python существуют два универсальных способа для извлечения корня из числа. Это возведение в необходимую степень 1/n. Кроме того, можно воспользоваться функцией из математического модуля языка, если необходимо извлечь квадратный корень числа.
Все эти методы имеют свои преимущества и недостатки. Самый наглядный это sqrt, но подходит только для квадратный корней из числа. Остальные методы не такие элегантные, но легко могут извлечь корень нужной степени из числа. Кроме того оператор ** оказался наиболее быстрым при тестировании.
Необходимо также помнить про целочисленное деление, неправильное использование которого может приводить к ошибке в вычислении.