LINUX.ORG.RU
grep "PI" /usr/include/math.h
# define M_PI           3.14159265358979323846  /* pi */
# define M_PI_2         1.57079632679489661923  /* pi/2 */
# define M_PI_4         0.78539816339744830962  /* pi/4 */
# define M_1_PI         0.31830988618379067154  /* 1/pi */
# define M_2_PI         0.63661977236758134308  /* 2/pi */
# define M_2_SQRTPI     1.12837916709551257390  /* 2/sqrt(pi) */
# define M_PIf          3.14159265358979323846f /* pi */
# define M_PI_2f        1.57079632679489661923f /* pi/2 */
# define M_PI_4f        0.78539816339744830962f /* pi/4 */
# define M_1_PIf        0.31830988618379067154f /* 1/pi */
# define M_2_PIf        0.63661977236758134308f /* 2/pi */
# define M_2_SQRTPIf    1.12837916709551257390f /* 2/sqrt(pi) */
[...]

Есть какая-то причина использовать новые функции?

Bfgeshka ★★★★★
()
Ответ на: комментарий от kaldeon

Ради интереса я посмотрел, как они делают, и не увидел ничего особенного по поводу точности.

Вот, непример, код для косинуса: https://sourceware.org/git/?p=glibc.git;a=blob;f=math/s_cospi_template.c;h=2eb907973dd40f25436782db1849eb6fd1bcc522;hb=0ae0af68d8fa3bf6cbe1e4f1de5929ff71de67b3

Тут только крайние случаи для x = 0, 1/2 и бесконечности, далее значение x заворачивается в кольцо и вызывается не-pi функция как возврат. Никаких оптимизаций или увеличения точности за пределами крайних случаев нет. Сугубо производится сокращение boilerplate для функции, про которую в четырёх случаях из пяти даже не вспомнят.

Bfgeshka ★★★★★
()
Ответ на: комментарий от Bfgeshka

Печально. Я ожидал, что экономия одного умножения всё-таки будет

mittorn ★★★★★
()

добавили cospi(), sinpi() и tanpi().

Это функции военного времени :)

quickquest ★★★★★
()

… tanpi(x) возвращает tan(π*x).

Это еще, может, и добавит точности при x = 1/2 + n + epsilon (n=0,+-1,+-2,…). А cospi(), sinpi() зачем?

x22 ★★
()
Ответ на: комментарий от Bfgeshka

Подозреваю что заворачивание в кольцо x до умножения на пи само по себе точнее чем после. Потому как оно целочисленное, а находить остаток от деления на иррациональное число - явная потеря точности.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Потому как оно целочисленное

Мб наоборот :)

Но вообще да, чисто технически в этом толк есть. Однако, если хочется либо быстрее, либо точнее, то нужно будет всё равно самому писать.

Bfgeshka ★★★★★
()

Главное чтобы не удаляли ничего.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от firkax

Подозреваю что заворачивание в кольцо x до умножения на пи само по себе точнее чем после.

Все равно перед вызовом делить угол на pi.

x22 ★★
()

Кстати, решил потестить что получается через классические функции. Получилось это:

x = 0.000000, sin(x) = 0.000000, cos(x) = 1.000000, tan(x) = 0.000000
x = 1.570796, sin(x) = 1.000000, cos(x) = 0.000000, tan(x) = 16331239353195370.000000
x = 3.141593, sin(x) = 0.000000, cos(x) = -1.000000, tan(x) = -0.000000
x = 4.712389, sin(x) = -1.000000, cos(x) = -0.000000, tan(x) = 5443746451065123.000000
x = 6.283185, sin(x) = -0.000000, cos(x) = 1.000000, tan(x) = -0.000000

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от praseodim

В итоге непонятно нахрена это. Только код glibc раздувается и ломается совместимость.

в glibc понятно почему - вслед за стандартом. А вот нахрена они в стандарте, вот то загадка..

MKuznetsov ★★★★★
()
Ответ на: комментарий от x22
#include <stdio.h>
#include <unistd.h>
#include <math.h>

int
main(int argc, char **argv)
{
    double i, x;
    for (i = -4; i < 4.5; i += 0.5){
            x = i * M_PI;
            printf("x = %.15lf, sin(x) = %.15lf, cos(x) = %.15lf, tan(x) = %.15lf\n", x, sin(x), cos(x), tan(x));
        }
    return 0;
}
x = -12.566370614359172, sin(x) = 0.000000000000000, cos(x) = 1.000000000000000, tan(x) = 0.000000000000000
x = -10.995574287564276, sin(x) = 1.000000000000000, cos(x) = -0.000000000000000, tan(x) = -2333034193313624.000000000000000
x = -9.424777960769379, sin(x) = -0.000000000000000, cos(x) = -1.000000000000000, tan(x) = 0.000000000000000
x = -7.853981633974483, sin(x) = -1.000000000000000, cos(x) = 0.000000000000000, tan(x) = -3266247870639074.000000000000000
x = -6.283185307179586, sin(x) = 0.000000000000000, cos(x) = 1.000000000000000, tan(x) = 0.000000000000000
x = -4.712388980384690, sin(x) = 1.000000000000000, cos(x) = -0.000000000000000, tan(x) = -5443746451065123.000000000000000
x = -3.141592653589793, sin(x) = -0.000000000000000, cos(x) = -1.000000000000000, tan(x) = 0.000000000000000
x = -1.570796326794897, sin(x) = -1.000000000000000, cos(x) = 0.000000000000000, tan(x) = -16331239353195370.000000000000000
x = 0.000000000000000, sin(x) = 0.000000000000000, cos(x) = 1.000000000000000, tan(x) = 0.000000000000000
x = 1.570796326794897, sin(x) = 1.000000000000000, cos(x) = 0.000000000000000, tan(x) = 16331239353195370.000000000000000
x = 3.141592653589793, sin(x) = 0.000000000000000, cos(x) = -1.000000000000000, tan(x) = -0.000000000000000
x = 4.712388980384690, sin(x) = -1.000000000000000, cos(x) = -0.000000000000000, tan(x) = 5443746451065123.000000000000000
x = 6.283185307179586, sin(x) = -0.000000000000000, cos(x) = 1.000000000000000, tan(x) = -0.000000000000000
x = 7.853981633974483, sin(x) = 1.000000000000000, cos(x) = 0.000000000000000, tan(x) = 3266247870639074.000000000000000
x = 9.424777960769379, sin(x) = 0.000000000000000, cos(x) = -1.000000000000000, tan(x) = -0.000000000000000
x = 10.995574287564276, sin(x) = -1.000000000000000, cos(x) = -0.000000000000000, tan(x) = 2333034193313624.000000000000000
x = 12.566370614359172, sin(x) = -0.000000000000000, cos(x) = 1.000000000000000, tan(x) = -0.000000000000000
saahriktu ★★★★★
() автор топика
Ответ на: комментарий от Bfgeshka

IEEE 754-2019, казалось бы, причем тут стандарт на числа?

Clause 9 in the standard recommends additional mathematical operations that language standards should define

IEEE 754-2019
9.2 new tanPi, aSinPi, and aCosPi operations

Причины: Стандартизация поведения подобных функций, и приводятся аргументы которые говорят что они могут быть быстрее, но у разработчиков glibc пока руки не дошли.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от saahriktu

Непраавильно ты, дядя Федор, тангенс pi/2 вычисляешь.

x22 ★★
()
Ответ на: комментарий от Bfgeshka

Есть какая-то причина использовать новые функции?

эти функции указаны в стандарте IEEE 754 (и одинаковом с ним ISO/IEC 60559) как рекомендованные к реализации, вот их и реализовали. Никаких других особых причин, судя по всему, нет.

Lrrr ★★★★★
()
Ответ на: комментарий от x22

Не надо ничего делить, эти функции для того чтоб ты мог хранить углы не в радианах а в процентах от пи. Например, прямой угол будет 0.5, которое, в отличие от pi/2, можно хранить без потерь точности.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Не надо ничего делить, эти функции для того чтоб ты мог хранить углы не в радианах а в процентах от пи.

Это правильно.

Но есть куча отлаженных библиотек, которые по входным данным возвращают углы в радианах. Их придется тоже переписать.

// Или переписать все в представлении SU(2)/Z2 вместо привычной SO(3). Проблем с делением на cos(n*pi + pi/2 + epsilon) будет меньше.

x22 ★★
()
Ответ на: комментарий от x22

gnu mpfr для математики кому нужно тот и подключит, Glibc существует для работы с ос и поддержка дробных чисел в таком ракурсе не обязательна и может даже не реализована в процессоре. Проблема rust в ядре как раз и состояла, что ядро запускается на системе с ЦПУ без поддержки float, double (например некоторые arm).

s-warus ★★★
()
Ответ на: комментарий от s-warus

Проблема rust в ядре как раз и состояла, что ядро запускается на системе с ЦПУ без поддержки float, double (например некоторые arm).

Хмм, здесь вроде как про прикладную математику, которую никому сейчас в голову не придет считать без аппаратной поддержки операций с float/double.

P.S.

Glibc существует для работы с ос и поддержка дробных чисел в таком ракурсе не обязательна и может даже не реализована в процессоре. Проблема rust в ядре …

При чем glibc к ядру?

Чот совсем перестал понимать за этот ваш линакс. Надо 150 и спать.

x22 ★★
()
Последнее исправление: x22 (всего исправлений: 1)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)