Форум программистов, компьютерный форум CyberForum.ru

Реализация математических функций - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.10.2013, 18:42     Реализация математических функций #1
Где можно найти, как реализованы примитивные мат. функции такие, как sqrt, pow, sin, asin, log и другие и сколько примерно тактов потребуется для каждой из них? Всё что я знаю, что sqrt, скорее всего, использует двоичный поиск, а возведение степень метод "быстрого возведения в степень", но мне интересно сравнить тот же самый pow со степенью 1/2 и sqrt. А, быть может, это одно и то же?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2013, 18:42     Реализация математических функций
Посмотрите здесь:

Создание программы с использованием математических и тригонометрических функций C++
C++ Какая библиотека отвечает за использования математических функций в VS 2005?
C++ Печать таблицы значений математических функций
C++ Напишите программы для вычисления значений математических функций
C++ Вычисление математических функций
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
henecs
 Аватар для henecs
16 / 16 / 0
Регистрация: 19.05.2013
Сообщений: 135
28.10.2013, 19:00     Реализация математических функций #2
тут нет ?
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
28.10.2013, 19:17     Реализация математических функций #3
nexen, можете скачать реализацию стандартной библиотеки от GNU http://ftp.gnu.org/gnu/glibc/
Там, конечно, есть эти функции, но их реализацию трудно читать из-за адовых оптимизаций.
Стандартная библиотека С++ отдельно не поставляется, а вместе с GCC. Его сырцы можно скачать тоже с FTP
http://gcc.gnu.org/mirrors.html (сначала выберите зеркало)
Конечно, все вышенаписанное относится к библиотекам GNU, потому что частные компании с вами просто так не поделятся не то что исходниками, а готовую либу продают за огромные деньги)
Добавлено через 1 минуту
Цитата Сообщение от henecs Посмотреть сообщение
тут нет ?
TC нужна именно реализация, а не примеры использования, не так ли?
henecs
 Аватар для henecs
16 / 16 / 0
Регистрация: 19.05.2013
Сообщений: 135
28.10.2013, 19:33     Реализация математических функций #4
gromo, да вы правы (
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 20:02     Реализация математических функций #5
Есть software-implementation, есть hardware-implementation. Вас какие интересуют?
Как уже говорилось, практически всё это можно найти в glibc, dietlibc, uClibc, Newlib..

В GCC все эти функции я реализовывал аппаратным образом так:
C++
1
2
double my_sqrt( double x ) { double r; __asm__ __volatile__ ( "fsqrt" : "=t" (r) : "0" (x) : ); return r; }
double my_sin( double x ) { double r; __asm__ __volatile__ ( "fsin" : "=t" (r) : "0" (x) : ); return r; }
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
28.10.2013, 20:53  [ТС]     Реализация математических функций #6
castaway, а все современные fpu держат sin? Может в них и asin есть? О_о
Интересует и то, и то. В частности, как уже сказал, кол-во операций и реализация
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
28.10.2013, 21:17     Реализация математических функций #7
Цитата Сообщение от nexen Посмотреть сообщение
а все современные fpu держат sin?
Да. Все современные поддерживают. fsin появился очень давно, где-то начиная с 387-х..
Все простейшие функции, такие как: sin, cos, sqrt поддерживаются уже давно, все производные от них можно найти не прибегая к сложным формулам.
Какие именно тебя интересуют, и каким компилятором ты пользуешься?
Кстати, для чего это тебе?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.10.2013, 12:15  [ТС]     Реализация математических функций #8
castaway, просто интересно, что же тяжелее - sqrt или тот же sin/log. А может сам log на порядок тяжелее всего остального и так далее.
Компилятор cl (студии, не помню полное название) или gcc, как вариант.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
29.10.2013, 12:29     Реализация математических функций #9
fsqrt, fsin, fcos, fsincos (считает сразу и синус и косинус от одного значения), fabs, fmul st, st (возведение в квадрат), fpatan (atan2 из библиотеки Си) - это все можно реализовать через одну инструкцию, если не брать в расчёт fld, fst, fstp и другие инструкции загрузки и выгрузки значений.

Натуральный логарифм.
Кликните здесь для просмотра всего текста
Assembler
1
2
3
fldln2
fxch
fyl2x


Логарифм по основанию 2.
Кликните здесь для просмотра всего текста
Assembler
1
2
3
fld1
fxch
fyl2x


Логарифм по основанию 10.
Кликните здесь для просмотра всего текста
Assembler
1
2
3
fldlg2
fxch
fyl2x


А вот с возведением в степень дела обстоят интереснее.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
double my_pow( double x, double y ) {
    double r;
    short t1, t2;
    __asm__ __volatile__ (
        "fxch   \n"
        "ftst   \n"
        "fstsw  \n"
        "and    $0x40, %%ah\n"
        "jz     1f\n"
        "fstp   %%st(0)\n"
        "ftst   \n"
        "fstsw  \n"
        "fstp   %%st(0)\n"
        "and    $0x40, %%ah\n"
        "jnz    0f\n"
        "fldz   \n"
        "jmp    2f\n"
        "0:     \n"
        "fld1   \n"
        "jmp    2f\n"
        "1:     \n"
        "fstcw  %3\n"
        "fstcw  %4\n"
        "orw    $0xc00, %4\n"
        "fldcw  %4\n"
        "fld1   \n"
        "fxch   \n"
        "fyl2x  \n"
        "fmulp  \n"
        "fld    %%st(0)\n"
        "frndint    \n"
        "fxch   \n"
        "fsub   %%st(1), %%st(0)\n"
        "f2xm1  \n"
        "fld1   \n"
        "faddp  \n"
        "fxch   \n"
        "fld1   \n"
        "fscale \n"
        "fstp   %%st(1)\n"
        "fmulp  \n"
        "fldcw  %3\n"
        "2:"
        : "=t" (r)
        : "0" (y), "u" (x), "m" (t1), "m" (t2)
        : "st(1)", "st(7)", "%3", "%4", "ax" );
    return r;
}
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
29.10.2013, 14:01  [ТС]     Реализация математических функций #10
castaway, но ведь хоть и fsin реализовано через одну инструкцию fpu, но на деле она эквивалентна явно не одному процессорному такту, ведь так? И, если да, хотелось бы знать в переводе на такты cpu
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2013, 14:09     Реализация математических функций
Еще ссылки по теме:

вычисления по формулам. использование стандартных математических функций в c++ C++
Посмотреть код встроенных математических функций. Открыть cmath C++
C++ Вычисление квадратного корня из числа (без использования стандартных математических функций)

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
29.10.2013, 14:09     Реализация математических функций #11
На процессоре Pentium она занимает 16-126 циклов ( источник ). Вполне возможно, что современные процессоры способны выполнять её и за 1 такт.
Yandex
Объявления
29.10.2013, 14:09     Реализация математических функций
Ответ Создать тему
Опции темы

Текущее время: 16:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru