Top.Mail.Ru
Ответы

Как вычислить синус угла, больше 90 градусов в C++?

Вводя значения до 90 градусов, синус считается нормально. Хотел посчитать синус 180 градусов - вывело 5.35898e-08. Как это по

фиксить? Код на картинке

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок

И полученный тобой результат совершенно правилен.

Невозможно точно записать значение числа pi. А вычисление синуса "примерно pi" даёт "примерно ноль" (в твоём случае: 0,0000000535898) - в точном соответствии с учебником вычислительной математики.

Но если ты поменяешь порядок выполнения математических действий в выражении x * (pi / 180), точность ответа может поменяться (а может и остаться той же самой) - и это тоже есть в учебнике.

Аватар пользователя
Высший разум
1234567891011121314
 #include <cmath> 
#include <iostream> 
using namespace std; 
double sin_x(double x) { 
    static const auto y = 3.14159265358979323846 / 180.0; 
    static const auto eps = 1e-14; 
    auto z = sin(x * y); 
    if (fabs(z) <= eps) z = 0; 
    return z; 
} 
int main() { 
    cout << sin_x(90) << '\n'; 
    cout << sin_x(180) << '\n'; 
} 
Аватар пользователя
Искусственный Интеллект

#include <cmath>
#include <iostream>
#include <iomanip>
using namespace std;
constexpr double pi=4*atan(1);
int main() {
cout<<fixed<<setprecision(14);
cout<<sin(pi/180*90)<<endl;
cout<<sin(pi/180*180)<<endl;
}

Аватар пользователя
Гений
12345678
 #include <iostream> 
#include <numbers> 
 
int main()  
{ 
	std::cout.precision(16); 
	std::cout << std::fixed << sin(180.0 * (std::numbers::pi / 180.0)); 
} 

выдает 0.0000000000000001
без fixed это соответствует 1.2 E-16 (1.2 умножить на 10 в минус 16 степени)
в расчетах используется числа с плавающей запятой, которые всегда имеют некоторую ошибку в младших разрядах. Поэтому результаты принято округлять до некоторого приемлемого разряда. И не слишком надеяться в сравнениях на равенство)

Аватар пользователя
Оракул

Попробуйте использовать функцию sinl, она точнее.
В выражении sin(x*(pi/180)) внутренние скобки не нужны, они снижают точность.