Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для cube2
67 / 11 / 1
Регистрация: 29.03.2018
Сообщений: 37
.NET 4.x

Нахождения корня своим кодом

28.04.2019, 19:42. Показов 1973. Ответов 7

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане.
Хочу показать код нахождения корня числа. Вообще в Vb.Net для этого есть встроенная функция.
VB.NET
1
some_otvet = System.Math.Sqrt(some_chislo)
Но она может находить только квадратный корень. Для нахождения корня любой степени я сделал функцию:
Кликните здесь для просмотра всего текста

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Function Koren(ByVal kor As Double, ByVal ste As ULong)
        Dim otv As Double = 0.0
        Dim prev As Double = 0.0
        Dim left As Double = 0.0
        Dim right As Double = kor
        While otv <> prev    'зона поиска постепенно делится пополам, и когда дойдёт предел точности Double, искать не будет смысла 
            prev = otv    'запоминаем прошлое значение
            otv = (left / 2) + (right / 2)    'сначала делим на 2, а потом складываем во избежании переполнения Double
            If stepen(otv, ste) < kor Then
                left = otv    'сужаем левую границу поиска, если ответ слишком маленький
            ElseIf stepen(otv, ste) > kor Then
                right = otv    'сужаем правую границу поиска, если ответ слишком большой
            Else
                Exit While    'выходим из цикла, если ответ верный
            End If
        End While
        Return otv
    End Function
То есть мы ищем ste-нный корень числа kor.
Вообще, я хотел выполнить поиск корня полностью своим кодом, так что и нахождение степени брал на себя:
VB.NET
1
2
3
4
5
6
7
    Function stepen(osn As Double, pok As ULong) As Double
        Dim st As Double = osn
        For i As ULong = 2 To pok    'начинаем со 2й степени, так как ответ уже в первой
            st *= osn
        Next
        Return st
    End Function
Если вам это не нужно, замените в основной функции
VB.NET
1
stepen(otv, ste)
на
VB.NET
1
Math.Pow(otv, ste)

Далее идёт никому не нужная теория. Смотрите если интересно.
Кликните здесь для просмотра всего текста

Натуральный корень:
Кликните здесь для просмотра всего текста

Пример будет на квадратном корне из 16.
У нас есть виртуальный отрезок от 0 до 16 и его середина - 8.

Так как 82 больше 64, то приравниваем right к 8 и повторяем процедуру.


Иррациональный корень:
Кликните здесь для просмотра всего текста

Пример будет на квадратном корне из 2.
У нас есть виртуальный отрезок от 0 до 2 и его середина - 1.

Так как 12 меньше 2, то приравниваем left к 1 и повторяем процедуру.

Теперь у нас есть виртуальный отрезок от 1 до 2 и его середина - 1,5.
Так как 1,52 больше 2, то приравниваем right к 2 и повторяем процедуру.
...

Функция завершится, когда мы дойдёт до предела точности Double и значение перестанет изменяться


Результаты тестов:
  • Калькулятор: 1,414213562373095 (15 знаков)
  • Встроенный Sqrt: 1,4142135623731 (13 знаков)
  • Мой корень: 1,41421356237309 (14 знаков)
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.04.2019, 19:42
Ответы с готовыми решениями:

Создание страницы со своим php кодом
Необходимо собздать страницу и вставить в нее свой пхп код. Подскажитек как возможно это сделать на joomle?

Повторяющуюся последовательность символов заменить своим кодом
Для задания использовать строки массива типа char Дана строка символов. Для сохранения ее в сжатом виде найти максимальную...

Как быть суперпупер разрабам со своим кодом?
А вот пришло мне такое в голову. Как быть суперпупер разрабам со своим кодом? Ведь их код это как бы интеллектуальная собственность. ...

7
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
28.04.2019, 21:54
"Существует множество алгоритмов для вычисления значения квадратного корня из двух." (https://ru.wikipedia.org/wiki/... B8%D0%B7_2)
Определение квадратного корня методом Ньютона
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
Dim sq As Double = newSqrt(2, 0.000000000000001) '1.4142135623730949
Dim sqm As Double = Math.Sqrt(2) '1.4142135623730951
'…
Private Function newSqrt(ByVal x As Double, ByVal t As Double) As Double
    Dim s0 As Double = x / 2 'начальное приближение
    Dim s1 As Double
    Do While True
        s1 = 0.5 * (s0 + x / s0)
        If Math.Abs(s1 - s0) < t Then Exit Do
        s0 = s1
    Loop
    Return s1
End Function
Напомню, " с помощью числа с плавающей запятой можно аппроксимировать только десятичные числа, а точность, с которой аппроксимируется десятичное число, зависит от точности числа с плавающей запятой. По умолчанию значение Double содержит 15 десятичных цифр, хотя во внутреннем представлении может использоваться до 17 цифр."
Попробуем увеличить точность с тем же алгоритмом.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
Dim sqdec As Decimal = newSqrtDec(2D, 1.0E-25) '1.4142135623730950488016887242D
'…
Private Function newSqrtDec(ByVal x As Decimal, ByVal t As Decimal) As Decimal
    Dim s0 As Decimal = x / 2 'начальное приближение
    Dim s1 As Decimal
    Do While True
        s1 = 0.5D * (s0 + x / s0)
        If Math.Abs(s1 - s0) < t Then Exit Do
        s0 = s1
    Loop
    Return s1
End Function
Более точно (https://sites.google.com/site/... koren-iz-3)
1,414 213 562 373 095 048 801 688 724 209 698 078 569 671 875 376 948 073 176 679 737 99…
1
 Аватар для cube2
67 / 11 / 1
Регистрация: 29.03.2018
Сообщений: 37
29.04.2019, 07:04  [ТС]
Поменял Double на Decimal, точность повысилась с
  • 1,41421356237309 (14 знаков)
до
  • 1,4142135623730950344523193965 (28 знаков)
Вот новый код
Кликните здесь для просмотра всего текста

VB.NET
1
2
3
4
5
6
7
    Function stepen(osn As Decimal, pok As ULong) As Double
        Dim st As Decimal = osn
        For i As ULong = 2 To pok
            st *= osn
        Next
        Return st
    End Function
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Function Koren(ByVal kor As Decimal, ByVal ste As ULong)
        Dim otv As Decimal = 0.0
        Dim prev As Decimal = 0.1
        Dim left As Decimal = 0.0
        Dim right As Decimal = kor
        While otv <> prev
            prev = otv
            otv = (left / 2) + (right / 2)
            If stepen(otv, ste) < kor Then
                left = otv
            ElseIf stepen(otv, ste) > kor Then
                right = otv
            Else
                Exit While
            End If
        End While
        Return otv
    End Function


Добавлено через 13 минут

1,4142135623730950488016887242 Ваша функция
1,4142135623730950344523193965 Моя функция

Добавлено через 3 минуты
И вообще, я ищу не корень двух, а любой корень любой степени
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
29.04.2019, 08:27
cube2, а кроме точности, зачем это еще нужно ?

А скорость вычисления в 20 раз ниже чем у стандартного извлечения корня.
0
 Аватар для cube2
67 / 11 / 1
Регистрация: 29.03.2018
Сообщений: 37
29.04.2019, 08:29  [ТС]
Встроенное извлечение извлекает только квадратный корень, а мне нужен был любой степени
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
29.04.2019, 08:32
Цитата Сообщение от cube2 Посмотреть сообщение
Но она может находить только квадратный корень.
Корень — это показатель степени меньше единицы.
В бейсике всегда был оператор ^ для возведения числа в любую степень, даже дробную, что равносильно извлечению корня n-степени.
4
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
29.04.2019, 08:37
Цитата Сообщение от Замабувараев Посмотреть сообщение
В бейсике всегда был оператор ^ для возведения числа в любую степень, даже дробную, что равносильно извлечению корня n-степени
Вот именно.
Миниатюры
Нахождения корня своим кодом  
1
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
29.04.2019, 19:24
Цитата Сообщение от cube2 Посмотреть сообщение
1,4142135623730950344523193965 Моя функция
Сравните этот результат с представленным выше точным значением (65 знаков после запятой).
Цитата Сообщение от cube2 Посмотреть сообщение
я ищу не корень двух, а любой корень любой степени
Не вижу проблем
VB.NET
1
2
3
Dim x As Double = 22, n As Double = 1 / 3
Dim qn1 As Double = Math.Pow(x, n) '2.8020393306553868
Dim qn2 As Double = Math.Exp(n * Math.Log(x)) '2.8020393306553872
Если вы хотите контролировать точность получаемого результата то можно использовать разложение в ряд (Тейлора, полиномы Чебышева и т.п.).

Добавлено через 5 часов 28 минут
cube2, ближе к вашему подходу, но полагаю пошустрее
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Dim qn3 As Double = RootOfDegreeN(x, 3, 0.0000000001) '2.8020393306553872
'…
Private Function RootOfDegreeN(ByVal x As Double, ByVal n As Integer, ByVal t As Double) As Double
    Dim s0 As Double = x / n, s1 As Double
    Dim dn As Double = 1 / n, ds As Double
    Do While True
        ds = (x / Power(s0, n - 1) - s0) * dn
        s1 = s0 + ds
        If Math.Abs(ds) < t Then Exit Do
        s0 = s1
    Loop
    Return s1
End Function
Private Function Power(ByVal x As Double, ByVal n As Integer) As Double
    If n = 0 Then
        Return 1
    End If
    If n Mod 2 = 0 Then
        Dim p = Power(x, n / 2)
        Return p * p
    Else
        Return x * Power(x, n - 1)
    End If
End Function
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.04.2019, 19:24
Помогаю со студенческими работами здесь

Есть готовые ответы на мою задачу, но я принципиально хочу сделать это с своим кодом
Рисование вертикальными полосами гистограммы длинны слов. Максимум должно быть 10 слов. #include &lt;stdio.h&gt; //программа печатающая...

Рекурсивный метод нахождения корня
Здравствуйте. В университете дали задание: &quot;Вычислить значение Х = корень из а используя формулу : Xn = 0,5*(Xn-1 + a/Xn-1)&quot; , при...

Функция нахождения корня полинома
На входе функции find, должен быть массив коэффициентов при степенях x, функции f. (коэффициенты (d,s,j)) Сами коэффициенты должны...

Алгоритм нахождения квадратного корня
Алгоритм нахождения квадратного корня из положительного числа x можно представить следующей рекуррентной последовательностью: ...

Алгоритм нахождения корня слова...
помогите с алгоритмомо выделения корня в слове...отделение корня от других частей слова.... спасаибо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru