Если это реальная проблема, объясните, чем стандартный корень не подходит. Если это учебное задание, думайте сами, иначе вы ничему не научитесь. У нас не принято делать задания за студентов.
15 сен 2016 в 7:46
кстати, есть ещё инстрики. Они как бы не библиотечные функции. Более того, если все правильно сделать, то можно по 4 числа одновременно обрабатывать. Да, современные компиляторы их обычно и используют, когда пишем sqrt() .
15 фев 2017 в 20:26
из-за таких как VladD портится русскоязычное комьюнити, вопрос непростой, человек может понять пытается, что там за функцией написано, а его сразу называют студентом и пафосно *******тся «У нас не принято делать задания для студентов», уже успел разделить людей на «мы (элита русскоязычного комьюнити, которые всегда назовут студентами и отправят читать документацию)» и студентов, которые ищут халявы на стековерфлоу
23 янв 2018 в 18:31
3 ответа 3
Сортировка: Сброс на вариант по умолчанию
Как извлекать кубический корень без калькулятора
Вопрос на самом деле имеет множество решений.
Самый банальный — метод половинного деления.
double l = 0; double r = 1e100; //большое число double m; while (r — l > 1e-8) < //точность m = l + (r — l)/2; if (m*m >n) l = m; else r = m; > //ответ в l
Есть более оригинальные способы, например симуляция вычисления в столбик (вот пример, код приводить не буду )
Способ больше для C, но думаю можно использовать и в Java. Объяснение
float Q_rsqrt( float number ) < long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) i = 0x5f3759df — ( i >> 1 ); y = * ( float * ) y = y * ( threehalfs — ( x2 * y * y ) ); // 1 итерация // y = y * ( threehalfs — ( x2 * y * y ) ); // 2 итерация, можно удалить return 1/y; >
Можно использовать логарифмы
return Math.exp( Math.log(n) / 2);
Можно использовать численные методы, например метод Ньютона
double x = 1; for (;;) < double nx = (x + n / x) / 2; if (abs (x — nx) < 1e-10) break; //точность x = nx; >
Существует и много других способов, всё зависит от конкретных требований.
Источник: ru.stackoverflow.com
Извлечение корня в Excel с помощью формулы и функции
Среди базовых математических вычислений помимо сложения, вычитания, умножения и деления можно выделить возведение в степень и обратное действие – извлечение корня. Давайте посмотрим, каким образом можно выполнить последнее действие в Эксель разными способами.
Содержание скрыть
- Метод 1: использование функции КОРЕНЬ
- Метод 2: нахождение корня путем возведения в степень
- Заключение
Метод 1: использование функции КОРЕНЬ
Множество операций в программе реализуется с помощью специальных функций, и извлечение корня – не исключение. В данном случае нам нужен оператор КОРЕНЬ, формула которого выглядит так:
секретный способ извлечения квадратного корня #SHORTS
=КОРЕНЬ(число)
Для выполнения расчета достаточно написать данную формулу в любой свободной ячейке (или в строке формул, предварительно выбрав нужную ячейку). Слово “число”, соответственно, меняем на числовое значение, корень которого нужно найти.
Когда все готово, щелкаем клавишу Enter и получаем требуемый результат.
Вместо числа можно, также, указать адрес ячейки, содержащей число.
Указать координаты ячейки можно как вручную, прописав их с помощью клавиш на клавиатуре, так и просто щелкнув по ней, когда курсор находится в положенном месте в формуле.
Вставка формулы через Мастер функций
Воспользоваться формулой для извлечения корня можно через окно вставки функций. Вот, как это делается:
- Выбрав ячейку, в которой мы хотим выполнить расчеты, щелкаем по кнопке “Вставить функцию” (fx).
- В окне мастера функций выбираем категорию “Математические”, отмечаем оператор “КОРЕНЬ” и щелкаем OK.
- Перед нами появится окно с аргументом функции для заполнения. Как и при ручном написании формулы можно указать конкретное число или ссылку на ячейку, содержащую числовое значение. При этом, координаты можно указать, напечатав их с помощью клавиатуры или просто кликнуть по нужному элементу в самой таблице.
- Щелкнув кнопку OK мы получим результат в ячейке с функцией.
Вставка функции через вкладку “Формулы
- Встаем в ячейку, в которой хотим произвести вычисления. Щелкаем по кнопке “Математические” в разделе инструментов “Библиотека функций”.
- Пролистав предложенный перечень находим и кликаем по пункту “КОРЕНЬ”.
- На экране отобразится уже знакомое окно с аргументом, который нужно заполнить, после чего нажать кнопку OK.
Метод 2: нахождение корня путем возведения в степень
Описанный выше метод позволяет с легкостью извлекать квадратный корень из числа, однако, для кубического уже не подходит. Но и эта задача в Excel реализуема. Для этого числовое значение нужно возвести в дробную степень, где в числителе будет стоять “1”, а в знаменателе – цифра, означающая степень корня (n).
В общем виде, формула выглядит так:
=(Число)^(1/n)
Безусловным преимуществом такого способа является то, что мы можем извлечь корень любой степени, заменив букву “n” в знаменателе дроби на требуемую цифру.
Для начала давайте рассмотрим формулу для извлечения квадратного корня. Она выглядит следующим образом: =(Число)^(1/2).
Соответственно, для расчета кубического корня будет использоваться выражение ниже:
=(Число)^(1/3)
Допустим, нам нужно извлечь кубический корень из числа 27. В этом случае нужно записать в ячейке такую формулу: =27^(1/3).
Нажав Enter, получаем результат вычислений.
Аналогично работе с функцией КОРЕНЬ, вместо конкретного числа можно указать ссылку на ячейку.
Заключение
Таким образом, в Excel можно без особых усилий извлечь корень из любого числа, и сделать это можно разными способами. К тому же, возможности программы позволяют выполнять расчеты для извлечения не только квадратного, но и кубического корня. В редких случаях требуется найти корень n-степени, но и эта задача достаточно просто выполняется в программе.
Источник: microexcel.ru
Как написать собственную функцию извлечения кв. корня из целого числа?
Попробовал написать аналог функции sqrt(), но для целых чисел. Что можно сделать лучше, быстрее? Я просто начинающий, не хотелось бы «говнокодить» с самого начала изучения языка. Знаю, что register средой visual c++ не воспринимается, но судя по литературе, в других компайлерах скорость работы ускорить должно. Заранее спасибо за ответы.
int my_sqr(int number) < register unsigned int temp = 0, x = 1; if (number < 0) number = -number; while (temp != x)< temp = number / x; if (temp == x) return x; x++; >>;
- Вопрос задан более трёх лет назад
- 10927 просмотров
Комментировать
Решения вопроса 1
Что можно сделать лучше, быстрее?
Поменять алгоритм на метод деления пополам или побитовый поиск, с уменьшением сложности по количеству бит в int с экспоненциальной до линейной.
int my_sqr(int number)< register unsigned int temp, x; if (number < 0) number = -number; for (temp = 0, x = 1u >= 1) < if ((temp | x) * (temp | x) return temp; >
Не проверять на равенство if (temp == x), потому что равенства может не быть, например для number = 6.
Убедиться, что функция всегда что-то возвращает. Так, например, при number = 6 ваша функция зацикливается или падает с делением на 0, а при number = 0 завершается с неопределённым значением.
Ответ написан более трёх лет назад
Такой вариант будет намного быстрее в случае с большими числами?
Такой вариант гарантированно находит корень за 16 итераций для любого 32-битного инта.
Не могли бы вы немного разжевать вашу функцию? Никак не могу вникнуть в происходящее.
Ответы на вопрос 3
ну наверное вспомнить математику и включить голову. логарифм от числа, деленный на логарифм основания дает нам степень:
a^b=c b=ln(c)/ln(a) a=exp(b * ln(c)) для квадратного корня b = 1/2
Ответ написан более трёх лет назад
просто подставляем в формулу значения:
нда. Этот момент я точно не понял.
А использовать более оптимальные алгоритмы? Для целого числа очень подойдет разложение в ряд.
1 = 1^2
1 + 3 = 2^2
1 + 3 + 5 = 3^2
1 + 3 + 5 + 7 = 4^2
Замечаете?
Просто вычитаете все нечетные числа начиная с 1. Если остаток меньше следующего нечетного числа, то берете порядковый номер предыдущего нечетного числа. Но это подойдет, если числа не очень большие, хотя ваш алгоритм не лучше в этом отношении.
Ну и как обычно на тостере, поискать видимо лень, поэтому вопросов интересных нет, а вот такая вот фигня.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Существует такой алгоритм как бинпоиск
int sqrt (int v) < int L = 0, R = v; int M = (L + R) /2; while(R — L >1) < if(M * M else < R = M; >M = (L + R)/2; > >
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- C++
Что можно убрать чтобы оптимизировать затраты памяти?
- 1 подписчик
- вчера
- 107 просмотров
Источник: qna.habr.com