nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 03:51



Reply to topic  [ 58 posts ]  Go to page 1, 2, 3, 4  Next
Приближённое вычисление математических функций для калькулей 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Есть у меня книжка, купленная в библиотеке УПИ в конце 90х за 50 копеек по причине списания про стандартные математические функции системы М-7000 для СМ ЭВМ и там есть алгоритмы приближённого вычисления логарифмов, экспоненты, корня, синуса, тангенса и т.д. - я хочу их задействовать в собственных программах для гипотетического калькулятора (например троичного). Проблема лишь в том, что информация там не совсем полная для некоторых функций, например синус-косинус вычисляется путём вызова функции CHEBY, которой нужны коэффициенты, обозначенные в книжке просто как C0, C1, C2 ... Cn - пришлось поискать в интернете и вот что нашлось:

https://3ys.ru/chislennye-metody-v-zadachakh-matematicheskogo-analiza/mnogochleny-chebysheva.html

Attachment:
sin.jpg
sin.jpg [ 5.79 KiB | Viewed 8505 times ]

тут последнее слагаемое отбрасывается и получается точность 3.51E-9 (если надо точнее, то надо вычислить и подставить T11, T13 и т.д.)

_________________
:dj: https://mastodon.social/@Shaos


13 Aug 2020 00:06
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
На самом деле по книжке чебышев вычисляется как T[i] = 2xT[i-1]-T[i-2]+C[i], где 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[i] при таком подходе
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] и т.д.

_________________
:dj: https://mastodon.social/@Shaos


13 Aug 2020 00:26
Profile WWW
Maniac

Joined: 15 Jan 2019 15:48
Posts: 326
Location: Украина, Луганская обл.
Reply with quote
А как же ряды Тейлора ?

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

Пример для синуса:

Attachment:
Screenshot from 2022-08-27 13-28-17.png
Screenshot from 2022-08-27 13-28-17.png [ 6.68 KiB | Viewed 5658 times ]

https://wikimedia.org/api/rest_v1/media/math/render/svg/b89940045b13c9bcd33512a3051b8869086947ed


13 Aug 2020 00:52
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Ряды Тейлора вроде имеют неравномерную погрешность на покрываемой оси входных значений - Чебышев как-бы более единообразен:

Attachment:
ChebTailor.jpg
ChebTailor.jpg [ 7.09 KiB | Viewed 8439 times ]


( хотя судя по цифрам коэффициентов - одно на другое очень похоже : )

_________________
:dj: https://mastodon.social/@Shaos


13 Aug 2020 11:22
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
В калькуляторах, насколько я помню, был другой метод, назывался "цифра-за-цифрой"...
А вот в чем там суть была, сейчас - убей, не помню..

_________________
iLavr


13 Aug 2020 12:21
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Lavr wrote:
В калькуляторах, насколько я помню, был другой метод, назывался "цифра-за-цифрой"...
А вот в чем там суть была, сейчас - убей, не помню..

Да, натыкался на это тоже, но я хочу универсальную библиотеку сделать - для ретрокомпов тоже, так что по классическому пути пойду :idea:

_________________
:dj: https://mastodon.social/@Shaos


13 Aug 2020 20:30
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Я единственное что хорошо помню, что реализация метода "цифра-за-цифрой"
очень компактна для ограниченных ресурсов калькуляторов. Как-то так...

А читать и вспоминать - мне что-то не захотелось... :-?

_________________
iLavr


14 Aug 2020 06:55
Profile
Fanat

Joined: 05 Jul 2020 14:08
Posts: 87
Location: Ижевск
Reply with quote
Цифра-за-цифрой чем-то напомнил cordic.


15 Aug 2020 22:40
Profile WWW
Supreme God
User avatar

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

Подробнее см.: https://www.nkj.ru/archive/articles/38885/ (Наука и жизнь, Рождение легенды)

_________________
iLavr


25 Aug 2022 19:56
Profile
Admin
User avatar

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

_________________
:dj: https://mastodon.social/@Shaos


04 Feb 2023 10:42
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Ешё в тему (взято отсюда):
Lavr wrote:
Shaos wrote:
Quote:
сигналы надо перевести в логарифмический вид, перемножение величин эквивалентно сложению их логарифмов, результат следует перевести из логарифмической формы
Мне про такой трюк научрук рассказывал, когда я активно работал над своей диссертацией в конце 90х ...

Кстати говоря, во всех 8-битных компьютерах с Basic-ом умножение и деление так и выполняются,
как сложение и вычитание логарифмов, только программным путём.

Lavr wrote:
...открой исходник Васика от Биллагейца - и всё сам увидишь.
Да и библиотека мат. функций от "ЮТ-88" точно также устроена - мы где-то тут
разбирали её...

_________________
:dj: https://mastodon.social/@Shaos


04 Feb 2023 19:51
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Скажем корень из 27.5 - доходим до 25 (количество оборотов 5) и следующее значение будет 36 (количество оборотов 6)

Мне всё же думается, что эти алгоритмы целочисленные, и "крутить ручку" надо до числа
2750 по меньшей мере, если я не ошибаюсь, а потом вернуть десятичную точку на место.

_________________
iLavr


05 Feb 2023 06:42
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
Скажем корень из 27.5 - доходим до 25 (количество оборотов 5) и следующее значение будет 36 (количество оборотов 6)

Мне всё же думается, что эти алгоритмы целочисленные, и "крутить ручку" надо до числа
2750 по меньшей мере, если я не ошибаюсь, а потом вернуть десятичную точку на место.

Ну да - похоже на правду :)
sqrt(27.5)=5.244
sqrt(2750)=52.44

_________________
:dj: https://mastodon.social/@Shaos


05 Feb 2023 13:22
Profile WWW
Fanat

Joined: 01 Jan 2023 11:37
Posts: 80
Reply with quote
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.



05 Feb 2023 23:31
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Andnor wrote:
...тут уже желательно всё-таки взять арифмометр, а не считать в уме, а у меня его нету.

Да... это весьма заметно... :ebiggrin:

_________________
iLavr


06 Feb 2023 15:57
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 58 posts ]  Go to page 1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 24 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.