C/C++

Помогите с программой на языке Си

Я написал программу которая должна выстраивать тригонометрическую таблицу, но у меня не выходят tg 90 и ctg 180, которые должны не существовать.
(результат, который должен выйти, на 3-ем скрине)
Razor Ser_Tek
Razor Ser_Tek
215
#pragma warning(disable : 5105)
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <Windows.h>
#include <corecrt_math_defines.h>
double deg(double x) { return M_PI / 180.0 * x; }
double sin_x(double x) { return sin(deg(x)); }
double cos_x(double x) { return cos(deg(x)); }
double tan_x(double x) { return tan(deg(x)); }
double ctg_x(double x) { return cos_x(x) / sin_x(x); }
void print(int i, int x) {
const char* sf = "%12.6lf";
const char* dash = "%9s%3s";
switch (i) {
case 0:
printf(sf, sin_x(x));
break;
case 1:
printf(sf, cos_x(x));
break;
case 2:
if (0 == x % 90 && x % 180 != 0) printf(dash, "-", "");
else {
double n = tan_x(x);
printf(sf, fabs(n) < 1e-12? 0 : n);
}
break;
case 3:
if (x % 180) printf(sf, ctg_x(x));
else printf(dash, "-", "");
}
}
void line(int n) {
int i;
for (i = 0; i < n; ++i) putchar('-');
puts("");
}
int main(void) {
int i, x;
const char* box[4] = { "sin |", "cos |", " tg |", "ctg |" };
SetConsoleTitleW(L"Лабораторная работа 1. Задание 3");
system("chcp 1251 > nul");
printf("%64s\n\n", "ТАБЛИЦА ТРИГОНОМЕТРИЧЕСКИХ ФУНКЦИЙ");
printf("%5c%9i%12i%12i%12i%12i%12i%12i\n", '|', 0, 30, 60, 90, 120, 150, 180);
line(93);
for (i = 0; i < 4; ++i) {
printf("%s", box[i]);
for (x = 0; x <= 180; x += 30) print(i, x);
puts("");
}
system("pause > nul");
return 0;
}
EE
Elton Elton
86 086
Лучший ответ
1. такое надо циклами реализовывать, а не такой хероборой
Takeша Adai
Takeша Adai
66 595
inf в C/C++ указывает на то, что произошло деление на ноль. Инфинити по английски -- бесконечность. В высшей математике при делении на бесконечно маленькое число (близкое нулю) получается бесконечно большое число (близкое к бесконечности).
В дискретной математике, реализованной в обычных языках программирования, без использования математических движков, невозможно представить точные значения констант, наподобие Пи. Таким образом, если считать встроенными математическими функциями и заданными константами типа M_PI или gcc-шным M_PIL, то ответ будет выглядеть как большое число, близкое к бесконечности настолько, насколько близка к Пи соответствующая константа, но никак не равным Inf.

Соответственно, единственный способ получить требуемый результат в стандартных библиотеках - делать свою собственную функцию тангенса, которая проверяет параметр на приближение к Пи/2 по какому-то заданному эпсилону, отражающему точность дискретных расчетов и подставляет в ответ std::numeric_limits< тип_параметра >::infinity() (ну или INFINITY для Си).
Phantom -Wx
Phantom -Wx
30 155