Приближённое вычисление математических функций для калькулей

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Приближённое вычисление математических функций для калькулей

Post by Shaos »

Есть у меня книжка, купленная в библиотеке УПИ в конце 90х за 50 копеек по причине списания про стандартные математические функции системы М-7000 для СМ ЭВМ и там есть алгоритмы приближённого вычисления логарифмов, экспоненты, корня, синуса, тангенса и т.д. - я хочу их задействовать в собственных программах для гипотетического калькулятора (например троичного). Проблема лишь в том, что информация там не совсем полная для некоторых функций, например синус-косинус вычисляется путём вызова функции CHEBY, которой нужны коэффициенты, обозначенные в книжке просто как C0, C1, C2 ... Cn - пришлось поискать в интернете и вот что нашлось:

https://3ys.ru/chislennye-metody-v-zadachakh-matematicheskogo-analiza/mnogochleny-chebysheva.html
sin.jpg
тут последнее слагаемое отбрасывается и получается точность 3.51E-9 (если надо точнее, то надо вычислить и подставить T11, T13 и т.д.)
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Приближённое вычисление математических функций

Post by Shaos »

На самом деле по книжке чебышев вычисляется как 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] и т.д.
Я тут за главного - если что шлите мыло на me собака shaos точка net
Konstantin18
Maniac
Posts: 325
Joined: 15 Jan 2019 15:48
Location: Украина, Луганская обл.

Re: Приближённое вычисление математических функций для кальк

Post by Konstantin18 »

А как же ряды Тейлора ?

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

Пример для синуса:
Screenshot from 2022-08-27 13-28-17.png
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.
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Приближённое вычисление математических функций для кальк

Post by Shaos »

Ряды Тейлора вроде имеют неравномерную погрешность на покрываемой оси входных значений - Чебышев как-бы более единообразен:
ChebTailor.jpg
( хотя судя по цифрам коэффициентов - одно на другое очень похоже : )
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Приближённое вычисление математических функций для кальк

Post by Lavr »

В калькуляторах, насколько я помню, был другой метод, назывался "цифра-за-цифрой"...
А вот в чем там суть была, сейчас - убей, не помню..
iLavr
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Приближённое вычисление математических функций для кальк

Post by Shaos »

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

Re: Приближённое вычисление математических функций для кальк

Post by Lavr »

Я единственное что хорошо помню, что реализация метода "цифра-за-цифрой"
очень компактна для ограниченных ресурсов калькуляторов. Как-то так...

А читать и вспоминать - мне что-то не захотелось... :-?
iLavr
dvarkin
Fanat
Posts: 87
Joined: 05 Jul 2020 14:08
Location: Ижевск

Re: Приближённое вычисление математических функций для кальк

Post by dvarkin »

Цифра-за-цифрой чем-то напомнил cordic.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Приближённое вычисление математических функций для кальк

Post by Lavr »

Читал я статейку про арифмометр Однера (aka ФеликсЪ) и наткнулся на весьма любопытный алгоритм:
... квадрат целого числа n равен сумме нечётных чисел от 1 до 2n–1. Например, 25 = 1 + 3 + 5 + 7 + 9. Причём в сумме как раз n слагаемых. Таким образом, для нахождения корня из некоторого числа на арифмометре надо складывать нечётные числа, пока не получится это число. Ответ при этом показывается на счётчике оборотов, на котором отображается число слагаемых.

Подробнее см.: https://www.nkj.ru/archive/articles/38885/ (Наука и жизнь, Рождение легенды)
iLavr
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Приближённое вычисление математических функций для кальк

Post by Shaos »

А вот интересно можно такой подход на дробные числа распространить?
Скажем корень из 27.5 - доходим до 25 (количество оборотов 5) и следующее значение будет 36 (количество оборотов 6)
Если взять тупо линейную интерполяцию, то будет 2.5/11=0.227 т.е. приближённый ответ 5.227 а настоящий - 5.244
Можно приближать не линейно, а выпукло...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Приближённое вычисление математических функций для кальк

Post by Shaos »

Ешё в тему (взято отсюда):
Lavr wrote:
Shaos wrote:
сигналы надо перевести в логарифмический вид, перемножение величин эквивалентно сложению их логарифмов, результат следует перевести из логарифмической формы
Мне про такой трюк научрук рассказывал, когда я активно работал над своей диссертацией в конце 90х ...
Кстати говоря, во всех 8-битных компьютерах с Basic-ом умножение и деление так и выполняются,
как сложение и вычитание логарифмов, только программным путём.
Lavr wrote:...открой исходник Васика от Биллагейца - и всё сам увидишь.
Да и библиотека мат. функций от "ЮТ-88" точно также устроена - мы где-то тут
разбирали её...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Приближённое вычисление математических функций для кальк

Post by Lavr »

Shaos wrote:Скажем корень из 27.5 - доходим до 25 (количество оборотов 5) и следующее значение будет 36 (количество оборотов 6)
Мне всё же думается, что эти алгоритмы целочисленные, и "крутить ручку" надо до числа
2750 по меньшей мере, если я не ошибаюсь, а потом вернуть десятичную точку на место.
iLavr
User avatar
Shaos
Admin
Posts: 24087
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Приближённое вычисление математических функций для кальк

Post by Shaos »

Lavr wrote:
Shaos wrote:Скажем корень из 27.5 - доходим до 25 (количество оборотов 5) и следующее значение будет 36 (количество оборотов 6)
Мне всё же думается, что эти алгоритмы целочисленные, и "крутить ручку" надо до числа
2750 по меньшей мере, если я не ошибаюсь, а потом вернуть десятичную точку на место.
Ну да - похоже на правду :)
sqrt(27.5)=5.244
sqrt(2750)=52.44
Я тут за главного - если что шлите мыло на me собака shaos точка net
Andnor
Fanat
Posts: 80
Joined: 01 Jan 2023 11:37

Re: Приближённое вычисление математических функций для кальк

Post by Andnor »

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. По-моему вполне достаточная точность...

А метод Ньютона - это бинарный поиск. Квадратить каждый результат и брать среднее арифметическое с одним из предыдущих в зависимости от знака.
Last edited by Andnor on 06 Feb 2023 20:11, edited 1 time in total.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Приближённое вычисление математических функций для кальк

Post by Lavr »

Andnor wrote:...тут уже желательно всё-таки взять арифмометр, а не считать в уме, а у меня его нету.
Да... это весьма заметно... :ebiggrin:
iLavr