Это потому, что M_PI != real pi
, потому что оно не может быть представлено, поэтому то, что вы получаете от M_PI
, является приближением к пи, а его тангенс - это то, что вы получаете.
Редактировать: следующее:
printf("cos(M_PI / 2) = %.30f\nsin(M_PI / 2) = %.30f\n",
cos(M_PI / 2), sin(M_PI / 2));
напечатает
cos(M_PI / 2) = 0.000000000000000061232339957368
sin(M_PI / 2) = 1.000000000000000000000000000000
Что показывает, что cos(pi / 2)
не равно нулю.
Выполнение деления даст
1.63312393531953E16
, что в точности так и получается.