Приближённое вычисление математических функций для калькулей
Moderator: Shaos
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Приближённое вычисление математических функций для калькулей
Есть у меня книжка, купленная в библиотеке УПИ в конце 90х за 50 копеек по причине списания про стандартные математические функции системы М-7000 для СМ ЭВМ и там есть алгоритмы приближённого вычисления логарифмов, экспоненты, корня, синуса, тангенса и т.д. - я хочу их задействовать в собственных программах для гипотетического калькулятора (например троичного). Проблема лишь в том, что информация там не совсем полная для некоторых функций, например синус-косинус вычисляется путём вызова функции CHEBY, которой нужны коэффициенты, обозначенные в книжке просто как C0, C1, C2 ... Cn - пришлось поискать в интернете и вот что нашлось:
https://3ys.ru/chislennye-metody-v-zadachakh-matematicheskogo-analiza/mnogochleny-chebysheva.html
тут последнее слагаемое отбрасывается и получается точность 3.51E-9 (если надо точнее, то надо вычислить и подставить T11, T13 и т.д.)
https://3ys.ru/chislennye-metody-v-zadachakh-matematicheskogo-analiza/mnogochleny-chebysheva.html
тут последнее слагаемое отбрасывается и получается точность 3.51E-9 (если надо точнее, то надо вычислить и подставить T11, T13 и т.д.)
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Приближённое вычисление математических функций
На самом деле по книжке чебышев вычисляется как T = 2xT[i-1]-T[i-2]+C, где T[0]=0 и T[1]=1 и результат выдаётся как (T[n]-T[n-2])/2
А для вычисления синуса по книжке оно вызывается так:
A=x*2/pi
B=A-4*int((A+1)/4)
если B>1, то B=2-B
и результат sin(x) равен CHEBY(2*B^2-1)
Получается коэффициенты из предыдущего сообщения надо пересчитать чтобы подставлялись вместо C при таком подходе
T[0]=0
T[1]=1
T[2]=2xT[1]-T[0]+C[2]=2x-0+C[2]=2x+C[2]
T[3]=2xT[2]-T[1]+C[3]=2x*(2x+C[2])-1+C[3]=4x^2+C[2]*2x+C[3]-1
T[4]=2xT[3]-T[2]+C[4] и т.д.
А для вычисления синуса по книжке оно вызывается так:
A=x*2/pi
B=A-4*int((A+1)/4)
если B>1, то B=2-B
и результат sin(x) равен CHEBY(2*B^2-1)
Получается коэффициенты из предыдущего сообщения надо пересчитать чтобы подставлялись вместо C при таком подходе
T[0]=0
T[1]=1
T[2]=2xT[1]-T[0]+C[2]=2x-0+C[2]=2x+C[2]
T[3]=2xT[2]-T[1]+C[3]=2x*(2x+C[2])-1+C[3]=4x^2+C[2]*2x+C[3]-1
T[4]=2xT[3]-T[2]+C[4] и т.д.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Maniac
- Posts: 325
- Joined: 15 Jan 2019 15:48
- Location: Украина, Луганская обл.
Re: Приближённое вычисление математических функций для кальк
А как же ряды Тейлора ?
Это я к тому, что для целочисленных аргументов можно свести к целочисленной математике.
Пример для синуса:
https://wikimedia.org/api/rest_v1/media/math/render/svg/b89940045b13c9bcd33512a3051b8869086947ed
Это я к тому, что для целочисленных аргументов можно свести к целочисленной математике.
Пример для синуса:
https://wikimedia.org/api/rest_v1/media/math/render/svg/b89940045b13c9bcd33512a3051b8869086947ed
You do not have the required permissions to view the files attached to this post.
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Приближённое вычисление математических функций для кальк
Ряды Тейлора вроде имеют неравномерную погрешность на покрываемой оси входных значений - Чебышев как-бы более единообразен:
( хотя судя по цифрам коэффициентов - одно на другое очень похоже : )
( хотя судя по цифрам коэффициентов - одно на другое очень похоже : )
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Приближённое вычисление математических функций для кальк
В калькуляторах, насколько я помню, был другой метод, назывался "цифра-за-цифрой"...
А вот в чем там суть была, сейчас - убей, не помню..
А вот в чем там суть была, сейчас - убей, не помню..
iLavr
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Приближённое вычисление математических функций для кальк
Да, натыкался на это тоже, но я хочу универсальную библиотеку сделать - для ретрокомпов тоже, так что по классическому пути пойдуLavr wrote:В калькуляторах, насколько я помню, был другой метод, назывался "цифра-за-цифрой"...
А вот в чем там суть была, сейчас - убей, не помню..

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Приближённое вычисление математических функций для кальк
Я единственное что хорошо помню, что реализация метода "цифра-за-цифрой"
очень компактна для ограниченных ресурсов калькуляторов. Как-то так...
А читать и вспоминать - мне что-то не захотелось...
очень компактна для ограниченных ресурсов калькуляторов. Как-то так...
А читать и вспоминать - мне что-то не захотелось...

iLavr
-
- Fanat
- Posts: 87
- Joined: 05 Jul 2020 14:08
- Location: Ижевск
Re: Приближённое вычисление математических функций для кальк
Цифра-за-цифрой чем-то напомнил cordic.
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Приближённое вычисление математических функций для кальк
Читал я статейку про арифмометр Однера (aka ФеликсЪ) и наткнулся на весьма любопытный алгоритм:
... квадрат целого числа n равен сумме нечётных чисел от 1 до 2n–1. Например, 25 = 1 + 3 + 5 + 7 + 9. Причём в сумме как раз n слагаемых. Таким образом, для нахождения корня из некоторого числа на арифмометре надо складывать нечётные числа, пока не получится это число. Ответ при этом показывается на счётчике оборотов, на котором отображается число слагаемых.
Подробнее см.: https://www.nkj.ru/archive/articles/38885/ (Наука и жизнь, Рождение легенды)
iLavr
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Приближённое вычисление математических функций для кальк
А вот интересно можно такой подход на дробные числа распространить?
Скажем корень из 27.5 - доходим до 25 (количество оборотов 5) и следующее значение будет 36 (количество оборотов 6)
Если взять тупо линейную интерполяцию, то будет 2.5/11=0.227 т.е. приближённый ответ 5.227 а настоящий - 5.244
Можно приближать не линейно, а выпукло...
Скажем корень из 27.5 - доходим до 25 (количество оборотов 5) и следующее значение будет 36 (количество оборотов 6)
Если взять тупо линейную интерполяцию, то будет 2.5/11=0.227 т.е. приближённый ответ 5.227 а настоящий - 5.244
Можно приближать не линейно, а выпукло...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Приближённое вычисление математических функций для кальк
Ешё в тему (взято отсюда):
Lavr wrote:Кстати говоря, во всех 8-битных компьютерах с Basic-ом умножение и деление так и выполняются,Shaos wrote:Мне про такой трюк научрук рассказывал, когда я активно работал над своей диссертацией в конце 90х ...сигналы надо перевести в логарифмический вид, перемножение величин эквивалентно сложению их логарифмов, результат следует перевести из логарифмической формы
как сложение и вычитание логарифмов, только программным путём.
Lavr wrote:...открой исходник Васика от Биллагейца - и всё сам увидишь.
Да и библиотека мат. функций от "ЮТ-88" точно также устроена - мы где-то тут
разбирали её...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Приближённое вычисление математических функций для кальк
Мне всё же думается, что эти алгоритмы целочисленные, и "крутить ручку" надо до числаShaos wrote:Скажем корень из 27.5 - доходим до 25 (количество оборотов 5) и следующее значение будет 36 (количество оборотов 6)
2750 по меньшей мере, если я не ошибаюсь, а потом вернуть десятичную точку на место.
iLavr
-
- Admin
- Posts: 24087
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Приближённое вычисление математических функций для кальк
Ну да - похоже на правдуLavr wrote:Мне всё же думается, что эти алгоритмы целочисленные, и "крутить ручку" надо до числаShaos wrote:Скажем корень из 27.5 - доходим до 25 (количество оборотов 5) и следующее значение будет 36 (количество оборотов 6)
2750 по меньшей мере, если я не ошибаюсь, а потом вернуть десятичную точку на место.

sqrt(27.5)=5.244
sqrt(2750)=52.44
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Fanat
- Posts: 80
- Joined: 01 Jan 2023 11:37
Re: Приближённое вычисление математических функций для кальк
52 оборота, да ещё после каждого менять число на следующее нечётное? Да вы задолбаетесь. Лучше методом Ньютона или даже по формуле квадрата суммы:
5^2=25, 6^2=36, первое ближе.
(5+x)²=25+10x+x², причём известно, что x<1 и скорее всего намного, поэтому x≈(27.2-25)/10=0.25, то есть sqrt(27.5)≈5.25, если надо точнее, возводим в квадрат по той же формуле, получаем 25+2.5+0.0625 (1/2^n = 5^n/10^n а тут 1/16 была), опять же учитывая, что производная квадрата это 2x, то надо ещё поделить это на 10.5, и получить примерно 0.006, вычесть это получим 5.244. Если трёх цифр после запятой мало, можно дальше считать. Но дальше лучше не считать в уме, а взять арифомометр, а арифмометра нету...
Ну ладно, заменим калькулятором, хотя им я и так уже корень посчитал... 5.244^2 = 27.499536, соответственно не хватает 0.000464, производная 2x, то есть 10.488 в этом районе, делим первое на второе, 0.0000442410, добавляем, выходит 5.244044241, квадратим: 27.500000001565266081. По-моему вполне достаточная точность...
А метод Ньютона - это бинарный поиск. Квадратить каждый результат и брать среднее арифметическое с одним из предыдущих в зависимости от знака.
5^2=25, 6^2=36, первое ближе.
(5+x)²=25+10x+x², причём известно, что x<1 и скорее всего намного, поэтому x≈(27.2-25)/10=0.25, то есть sqrt(27.5)≈5.25, если надо точнее, возводим в квадрат по той же формуле, получаем 25+2.5+0.0625 (1/2^n = 5^n/10^n а тут 1/16 была), опять же учитывая, что производная квадрата это 2x, то надо ещё поделить это на 10.5, и получить примерно 0.006, вычесть это получим 5.244. Если трёх цифр после запятой мало, можно дальше считать. Но дальше лучше не считать в уме, а взять арифомометр, а арифмометра нету...
Ну ладно, заменим калькулятором, хотя им я и так уже корень посчитал... 5.244^2 = 27.499536, соответственно не хватает 0.000464, производная 2x, то есть 10.488 в этом районе, делим первое на второе, 0.0000442410, добавляем, выходит 5.244044241, квадратим: 27.500000001565266081. По-моему вполне достаточная точность...
А метод Ньютона - это бинарный поиск. Квадратить каждый результат и брать среднее арифметическое с одним из предыдущих в зависимости от знака.
Last edited by Andnor on 06 Feb 2023 20:11, edited 1 time in total.
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Приближённое вычисление математических функций для кальк
Да... это весьма заметно...Andnor wrote:...тут уже желательно всё-таки взять арифмометр, а не считать в уме, а у меня его нету.

iLavr