카테고리 없음

[FDF] ft_sin() ft_cos()

이놈의 허수는 컴터로는 만드는것이 느리다

이 

 1

이녀석을 만드는 방법이 없음

 y2 = (x2 1)

이게 원 방정식인데 

이걸 y = 으로 만들수가 없음

https://youtu.be/C1sNow9MHGo?t=1103 

이거  보면 왜인이 암

https://www.desmos.com/calculator/hjexlhyavu

 

sin cos

 

www.desmos.com

대충 비슷하게 만들어봣는데 값이 안맞다 그냥 테일러 급수 쓰는게 날듯?

 

테일러 급수

 sin(x)=xx33!+x55!x77!+

 cos(x)=1x22!+x44!+x66!+

적당히 길이를 잡아서 소수 구하는 방식

https://www.youtube.com/watch?v=ZWwdAidVsZ8&t=213s 

이거보면 됨 ㅇㅇ

https://ko.wikipedia.org/wiki/%EC%98%A4%EC%9D%BC%EB%9F%AC_%EA%B3%B5%EC%8B%9Dck

 

 

오일러 공식 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

참고자료

/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   ft_sin.c                                           :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: kyoulee <kyoulee@student.42seoul.kr>       +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2022/06/28 02:11:57 by kyoulee           #+#    #+#             */
/*   Updated: 2022/06/28 02:11:59 by kyoulee          ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include <libft.h>

double	ft_sin(long double angle)
{
    int over = 0;
    int i = 1;
    long double tmp;
    long double result;
    while (angle < (-3.141592 * 2))
        angle += 3.141592 * 2;
    while (angle >= (3.141592 * 2))
        angle -= 3.141592 * 2;
    angle = (int)(angle * 10000);
    angle = 1 + (angle / 10000);
    tmp = angle;
    result = 1;
    while (over++ < ft_abs(angle * 10))
    {
        if (i % 2)
            result += tmp - 1;
        else
            result -= tmp - 1; 
        tmp = (tmp - 1) * ((angle - 1) * (angle - 1) / (2 * i) / ((2 * i) + 1)) + 1;
        i++;
    }
    return (result - 1);
}

조금 오차가 있긴함 근데 제일 많이 잡은거임

/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   ft_cos.c                                           :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: kyoulee <kyoulee@student.42seoul.kr>       +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2022/06/28 02:27:32 by kyoulee           #+#    #+#             */
/*   Updated: 2022/06/28 02:27:35 by kyoulee          ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include <libft.h>

double	ft_cos(long double angle)
{
    int over = 0;
    int i = 1;
    long double tmp;
    long double result;
    while (angle < (-3.141592 * 2))
        angle += 3.141592 * 2;
    while (angle >= (3.141592 * 2))
        angle -= 3.141592 * 2;
    angle = (int)(angle * 1000);
    angle = 1 + (angle / 1000);
    tmp = 1 + 1;
    result = 1;
    while (over++ < ft_abs(angle * 10))
    {
        if (i % 2)
            result -= tmp - 1;
        else
            result += tmp - 1; 
        tmp = (tmp - 1) * ((angle - 1) * (angle - 1) / (2 * i) / ((2 * i) - 1)) + 1;
        i++;
    }
    return (-(result - 1));
}

큰수의 오차도 제거하여주었다