я что-то упустил в жизни?

с каких пор вот такой код:

#include <cmath>
#include <iostream>
int main(int argc, char** argv)
{
	std::cout << sin(M_PI/2) << '\n' << cos(M_PI/2) << '\n';
	return 0;
}

выводит вот такое:
$ ./cos
1
6.12323e-17
$

с каких пор косинус от пи/2 не равен нулю?
Обычное дело для вычислительной техники. Округлять надо :)
Разберемся, голубчик!
я, конечно, понимаю, что надо округлять. Но интересует вопрос, нафига нужна ВМ если она даже табличные значения с погрешностью вычисляет. и что странно, на C++ и на паскале косинус вычисляется неправильно… точнее правильно, но не совсем. откуда погрешность? я же пишу не 3,14 а с системной константой у которой точность довольнотаки высока… странно всё это. Интересно, это у всех так?
пи - число иррациональное и в комп ты его ну никак не вобьешь, только приближение. и косинус считается не от пи пополам, а от приближения пи пополам.
минус 17 степень достаточно малое число, если тебе нужен ноль, введи число эпсилон - нужная точность и сравнивай с ним результат, если он меньше эпсилон, то обнуляй. и вдогонку, по этой же причине если нужна точность я не сравниваю дробные числа друг с другом как есть, а использую эпсилон, и проверяю уже пересечения эпсилон-окрестностей чисел.
Еще могу сказать, что ещё во многих числодробилках типа octave, scilab столкншся с этим “не нулями”, для себя просто принимай - они ноль. Числодробление идет всегда с конечной точностью, нужно точнее - maxima и ему подобное, библиотек для Си не подскажу (не было такой задачи)

Вот примеры:
Octave
octave:1> cos(pi/2)
ans =  6.1230e-17
octave:2> eps
ans =  2.2204e-16
octave:3> help eps
`eps' is a built-in function
 -- Built-in Function:  eps
 -- Built-in Function:  eps (X)
 -- Built-in Function:  eps (N, M)
 -- Built-in Function:  eps (N, M, K, ...)
 -- Built-in Function:  eps (..., CLASS)
     Return a scalar, matrix or N-dimensional array whose elements are
     all eps, the machine precision.  More precisely, `eps' is the
     relative spacing between any two adjacent numbers in the machine's
     floating point system.  This number is obviously system dependent.
     On machines that support IEEE floating point arithmetic, `eps' is
     approximately 2.2204e-16 for double precision and 1.1921e-07 for
     single precision.
     When called with no arguments, return a scalar with the value
     `eps(1.0)'.  Given a single argument X, return the distance
     between X and the next largest value.  When called with more than
     one argument the first two arguments are taken as the number of
     rows and columns and any further arguments specify additional
     matrix dimensions.  The optional argument CLASS specifies the
     return type and may be either "double" or "single".

Достаточно внятно про твою проблему сказано в справке, с отсылкой к источникам стандартов :)

SciLab
-->cos(%pi/2)
 ans  =
 
    6.123D-17  
systemd должен умереть.
 
Зарегистрироваться или войдите чтобы оставить сообщение.