- std:: sin, std:: sinf, std:: sinl
- [edit] Error handling
- [edit] Notes
- [edit] Example
- sin , sinf , sinl
- Remarks
- Requirements
- Example
- Стандартные математические функции в языке Си
- Неявное преобразование типов
- Практика
- Дополнительные материалы
- sin , sinf , sinl
- Комментарии
- Требования
- Пример
- sin, sinf, sinl
- Contents
- [edit] Parameters
- [edit] Return value
- [edit] Error handling
- [edit] Notes
- [edit] Example
- [edit] References
std:: sin, std:: sinf, std:: sinl
If no errors occur, the sine of num ( sin(num) ) in the range [-1, +1] , is returned.
The result may have little or no significance if the magnitude of num is large.
If a domain error occurs, an implementation-defined value is returned (NaN where supported).
If a range error occurs due to underflow, the correct result (after rounding) is returned.
[edit] Error handling
Errors are reported as specified in math_errhandling .
If the implementation supports IEEE floating-point arithmetic (IEC 60559),
- if the argument is ±0, it is returned unmodified
- if the argument is ±∞, NaN is returned and FE_INVALID is raised
- if the argument is NaN, NaN is returned
[edit] Notes
The case where the argument is infinite is not specified to be a domain error in C (to which C++ defers), but it is defined as a domain error in POSIX
POSIX also specifies that in case of underflow, num is returned unmodified, and if that is not supported, an implementation-defined value no greater than DBL_MIN , FLT_MIN , and LDBL_MIN is returned.
The additional overloads are not required to be provided exactly as (A) . They only need to be sufficient to ensure that for their argument num of integer type, std :: sin ( num ) has the same effect as std :: sin ( static_cast < double >( num ) ) .
[edit] Example
#include #include #include #include #include // #pragma STDC FENV_ACCESS ON const double pi = std::acos(-1); // or std::numbers::pi since C++20 constexpr double your_sin(double x) { double sin {0}, pow {x}; for (auto fac {1LLU}, n {1ULL}; n != 20; fac *= ++n, pow *= x) if (n & 1) sin += (n & 2 ? -pow : pow) / fac; return sin; } int main() { std::cout std::setprecision(10) std::showpos "Typical usage:\n" "std::sin(pi/6) = " std::sin(pi / 6) '\n' "your sin(pi/6) = " your_sin(pi / 6) '\n' "std::sin(pi/2) = " std::sin(pi / 2) '\n' "your sin(pi/2) = " your_sin(pi / 2) '\n' "std::sin(-3*pi/4) = " std::sin(-3 * pi / 4) '\n' "your sin(-3*pi/4) = " your_sin(-3 * pi / 4) '\n' "Special values:\n" "std::sin(+0) = " std::sin(0.0) '\n' "std::sin(-0) = " std::sin(-0.0) '\n'; // error handling std::feclearexcept(FE_ALL_EXCEPT); std::cout "std::sin(INFINITY) = " std::sin(INFINITY) '\n'; if (std::fetestexcept(FE_INVALID)) std::cout " FE_INVALID raised\n"; }
Typical usage: std::sin(pi/6) = +0.5 your sin(pi/6) = +0.5 std::sin(pi/2) = +1 your sin(pi/2) = +1 std::sin(-3*pi/4) = -0.7071067812 your sin(-3*pi/4) = -0.7071067812 Special values: std::sin(+0) = +0 std::sin(-0) = -0 std::sin(INFINITY) = -nan FE_INVALID raised
sin , sinf , sinl
The sin functions return the sine of x . If x is greater than or equal to 263, or less than or equal to -263, a loss of significance in the result occurs.
Input | SEH exception | _matherr exception |
---|---|---|
± QNaN, IND | None | _DOMAIN |
± INF ( sin , sinf , sinl ) | INVALID | _DOMAIN |
Remarks
Because C++ allows overloading, you can call overloads of sin that take and return float or long double values. In a C program, unless you’re using the macro to call this function, sin always takes and returns double .
If you use the sin() macro, the type of the argument determines which version of the function is selected. See Type-generic math for details.
By default, this function’s global state is scoped to the application. To change this behavior, see Global state in the CRT.
Requirements
Routine | Required header (C) | Required header (C++) |
---|---|---|
sin , sinf , sinl | or | |
sin macro |
For more compatibility information, see Compatibility.
Example
// crt_sincos.c // This program displays the sine and cosine of pi / 2. // Compile by using: cl /W4 crt_sincos.c #include #include int main( void) < double pi = 3.1415926535; double x, y; x = pi / 2; y = sin( x ); printf( "sin( %f ) = %f\n", x, y ); y = cos( x ); printf( "cos( %f ) = %f\n", x, y ); >
sin( 1.570796 ) = 1.000000 cos( 1.570796 ) = 0.000000
Стандартные математические функции в языке Си
Математические вычисления не ограничиваются лишь арифметическими действиями. Кроме них, можно ещё встретить корни, модули, логарифмы, тригонометрические функции и пр. Научимся же использовать подобные функции в своих программах.
Для использования математических функций нужно подключить заголовочный файл math.h . В ней определено много различных функций, но мы пока рассмотрим следующие:
Некоторые математические функции
fabs(x) модуль числа x
sqrt(x) квадратный корень из числа x
sin(x) синус числа x (х в радианах)
cos(x) косинус числа x (х в радианах)
pow(x, y) вычисление x y
exp(x) вычисление e x
log(x) натуральный логарифм числа x
log10(x) десятичный логарифм числа x
- Все функции возвращают значение типа double .
- Параметры функций – вещественные числа( double ), но можно передавать и целые числа. При этом произойдёт неявное преобразование типа . Компилятор из целого числа, например 3, сделает вещественное 3.0.
#include #include // подключаем math.h int main (void)
#include #include // подключаем math.h int main (void) < double alpha, sin_a, pi = 3.1415926; scanf("%lf",&alpha); alpha = alpha*pi/180; sin_a = sin(alpha); printf("%.2f\n", sin_a); return 0; >
В этой программе есть о чём поговорить. Тригонометрические функции, которые определены в math.h работают с радианной мерой угла. Людям же привычнее работать с градусами. Поэтому в данной программе мы предварительно перевели значение из градусов в радианы. Если этого не сделать, результат получится неправильным. Проверьте это самостоятельно.
Неявное преобразование типов
При явном преобразовании типа мы в скобках перед значением указывали тип, к которому нужно привести данное значение. В неявном преобразовании этого делать не нужно. Компилятор автоматически подберёт необходимый тип. Неявное преобразование типов осуществляется в следующих случаях:
- перед передачей аргументов в функцию (как в нашем примере с корнем. Листинг 1.)
- выполнение арифметических операций с разными типами аргументов
- перед выполнением присваивания
- если выполняются арифметические операции с разными типами аргументов. Оба аргумента приводятся к большему типу.
Порядок типов: int < float < double - при присваивании. Значение справа от оператора присваивания приводится к типу переменной слева от оператора присваивания. При этом, если больший тип присваивается меньшему, то может произойти потеря точности.
Примеры: int+float будет автоматически преобразовано к float+float
float/int будет автоматически преобразовано к float/float
double*float будет преобразовано к double*double
int = double double будет преобразовано к int с потерей дробной части
float = int int будет преобразовано к float
Практика
Решите предложенные задачи: Для удобства работы сразу переходите в полноэкранный режим
Дополнительные материалы
sin , sinf , sinl
Функции sin возвращают синус x . Если x значение больше или равно 263, меньше или равно -263, происходит потеря значимости в результате.
Входные данные | Исключение SEH | Исключение _matherr |
---|---|---|
± QNaN, IND | Нет | _DOMAIN |
± INF ( sin , sinf , sinl ) | INVALID | _DOMAIN |
Дополнительные сведения о кодах возврата см. в разделе errno , _doserrno , _sys_errlist и _sys_nerr .
Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки sin , которые принимают и возвращают значения float или long double . В программе на языке C, если вы не используете макрос для вызова этой функции, sin всегда принимает и возвращает . double
При использовании макроса sin() тип аргумента определяет, какая версия функции выбрана. Дополнительные сведения см. в разделе Типообразная математика .
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Требования
Подпрограмма | Обязательный заголовок (C) | Обязательный заголовок (C++) |
---|---|---|
sin , sinf , sinl | или | |
sin Макрос |
Дополнительные сведения о совместимости см. в разделе Compatibility.
Пример
// crt_sincos.c // This program displays the sine and cosine of pi / 2. // Compile by using: cl /W4 crt_sincos.c #include #include int main( void) < double pi = 3.1415926535; double x, y; x = pi / 2; y = sin( x ); printf( "sin( %f ) = %f\n", x, y ); y = cos( x ); printf( "cos( %f ) = %f\n", x, y ); >
sin( 1.570796 ) = 1.000000 cos( 1.570796 ) = 0.000000
sin, sinf, sinl
7) Type-generic macro: If the argument has type long double , (3) ( sinl ) is called. Otherwise, if the argument has integer type or the type double , (2) ( sin ) is called. Otherwise, (1) ( sinf ) is called. If the argument is complex, then the macro invokes the corresponding complex function ( csinl , csin , csinf ).
The functions (4-6) are declared if and only if the implementation predefines __STDC_IEC_60559_DFP__ (i.e. the implementation supports decimal floating-point numbers).
Contents
[edit] Parameters
[edit] Return value
If no errors occur, the sine of arg ( sin(arg) ) in the range [-1 ; +1] , is returned.
The result may have little or no significance if the magnitude of arg is large.
If a domain error occurs, an implementation-defined value is returned (NaN where supported).
If a range error occurs due to underflow, the correct result (after rounding) is returned.
[edit] Error handling
Errors are reported as specified in math_errhandling .
If the implementation supports IEEE floating-point arithmetic (IEC 60559):
- if the argument is ±0, it is returned unmodified;
- if the argument is ±∞, NaN is returned and FE_INVALID is raised;
- if the argument is NaN, NaN is returned.
[edit] Notes
The case where the argument is infinite is not specified to be a domain error in C, but it is defined as a domain error in POSIX.
POSIX also specifies that in case of underflow, arg is returned unmodified, and if that is not supported, an implementation-defined value no greater than DBL_MIN , FLT_MIN , and LDBL_MIN is returned.
[edit] Example
#include #include #include #include #ifndef __GNUC__ #pragma STDC FENV_ACCESS ON #endif int main(void) { const double pi = acos(-1); // typical usage printf("sin(pi/6) = %f\n", sin(pi / 6)); printf("sin(pi/2) = %f\n", sin(pi / 2)); printf("sin(-3*pi/4) = %f\n", sin(-3 * pi / 4)); // special values printf("sin(+0) = %f\n", sin(0.0)); printf("sin(-0) = %f\n", sin(-0.0)); // error handling feclearexcept(FE_ALL_EXCEPT); printf("sin(INFINITY) = %f\n", sin(INFINITY)); if (fetestexcept(FE_INVALID)) puts(" FE_INVALID raised"); }
sin(pi/6) = 0.500000 sin(pi/2) = 1.000000 sin(-3*pi/4) = -0.707107 sin(+0) = 0.000000 sin(-0) = -0.000000 sin(INFINITY) = -nan FE_INVALID raised
[edit] References
- C23 standard (ISO/IEC 9899:2023):
- 7.12.4.6 The sin functions (p: TBD)
- 7.27 Type-generic math (p: TBD)
- F.10.1.6 The sin functions (p: TBD)
- C17 standard (ISO/IEC 9899:2018):
- 7.12.4.6 The sin functions (p: 175)
- 7.25 Type-generic math (p: 272-273)
- F.10.1.6 The sin functions (p: 378)
- C11 standard (ISO/IEC 9899:2011):
- 7.12.4.6 The sin functions (p: 239-240)
- 7.25 Type-generic math (p: 373-375)
- F.10.1.6 The sin functions (p: 519)
- C99 standard (ISO/IEC 9899:1999):
- 7.12.4.6 The sin functions (p: 220)
- 7.22 Type-generic math (p: 335-337)
- F.9.1.6 The sin functions (p: 456)