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

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток, форумчане.
Хочу показать код нахождения корня числа. Вообще в 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2019, 19:42
Ответы с готовыми решениями:

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

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

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

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

7
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
28.04.2019, 21:54 2
"Существует множество алгоритмов для вычисления значения квадратного корня из двух." (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
67 / 11 / 1
Регистрация: 29.03.2018
Сообщений: 37
29.04.2019, 07:04  [ТС] 3
Поменял 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
11270 / 4752 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
29.04.2019, 08:27 4
cube2, а кроме точности, зачем это еще нужно ?

А скорость вычисления в 20 раз ниже чем у стандартного извлечения корня.
0
67 / 11 / 1
Регистрация: 29.03.2018
Сообщений: 37
29.04.2019, 08:29  [ТС] 5
Встроенное извлечение извлекает только квадратный корень, а мне нужен был любой степени
0
COM‐пропагандист
859 / 768 / 147
Регистрация: 18.12.2014
Сообщений: 2,195
Записей в блоге: 4
29.04.2019, 08:32 6
Цитата Сообщение от cube2 Посмотреть сообщение
Но она может находить только квадратный корень.
Корень — это показатель степени меньше единицы.
В бейсике всегда был оператор ^ для возведения числа в любую степень, даже дробную, что равносильно извлечению корня n-степени.
4
es geht mir gut
11270 / 4752 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
29.04.2019, 08:37 7
Цитата Сообщение от Замабувараев Посмотреть сообщение
В бейсике всегда был оператор ^ для возведения числа в любую степень, даже дробную, что равносильно извлечению корня n-степени
Вот именно.
Миниатюры
Нахождения корня своим кодом  
1
4407 / 3531 / 843
Регистрация: 02.02.2013
Сообщений: 3,417
Записей в блоге: 2
29.04.2019, 19:24 8
Цитата Сообщение от 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
29.04.2019, 19:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.04.2019, 19:24
Помогаю со студенческими работами здесь

Рекурсивный метод нахождения корня
Здравствуйте. В университете дали задание: &quot;Вычислить значение Х = корень из а используя формулу...

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru