자바에서 sin이랑 cos 이거 구하는데
일정 값 이상 집어넣으면 오차 무지막지해지는데 어떡해야함?
주기함수니까 적당히 입략값 작게 해요
ㄷㄷ;; 100이상 넣으면 안되는거임?
컴퓨터의 Cos와 Sin은 Taylor series를 이용해서 구해서 그럼
뭔... 테일러급수까지 알아야하네 쉬부럴....
알 필욘 없음.. 그 함수가 알아서 해주겠지..
다만 그 함수가 테일러 급수를 쓴다는것만 알아둬..
테일러 급수 쓸테니까 그거로 설명하면
f =sigma f^(n)(0)x^n / n!
여기서 x 절대값이 커지면 오차가 커집니다.
자세한 건 테일러 급수 오차 괸련해서 찾아보면 금방 찾을 거고요
고맙습니다... 다시 한번 프로그래밍에서의 수학공식은 완벽하지 않다는걸 깨달았습니다... ㅠㅠ
오차 조절이 관건이지요
Math.cos(rad % Math.PI);
라디안을 x값으로 보면되?
ㅇㅇ 자바는 Cos와 Sin의 주기를 2파이인지 파이인지 모르겠지만, Modular 취해서 하면 주기만큼 될테니 그렇게 하셈
ㅇㅋㅇㅋ 고맙다
modulo 연산이 실수 연산자에도 적용됨?
정수배이기만 하면 되는건가
어? 잠깐.. 그러네...? ㅈㅅ;;
?? 되던데?
자바라서 그런가?
되는거 같은데? https://ideone.com/gw6N19
나도 헷갈려서 확인한거여 안되는거 아니냐고 따지는게 아니고 ㅎㅎ
근데 이거 신호처리가 매트랩결과랑 프로그래밍 결과랑 조금 다르게 뜨는게 정상임?
라이브러리에서 사용하는 데이터 타입에 따라서 유효숫자가 다르므로 다를 수 있음
그리고 연산 순서에 따라서도 다를 수 있어
예를들어(과장된 예임..) 0.3 * 0.7 * 0.5을 한다고 쳤을 때 유효숫자가 소수점 첫번째 자리까지라면
앞에 두개를 곱하면 0.21이 나오고 소수점 두번째 자리는 날아가니까 0.2 * 0.5을 해서 0.10이 되서 결과는 0.1이 됨
순서를 바꿔서 0.3 * 0.5 * 0.7을 한다고 치면 처음 둘을 곱하면 0.15 니까 유효한 값은 0.1이 남고 0.1 * 0.7을 하면 0.07이므로 0이 됨
물론 실제로는 float(32bit)는 유효숫자가 8인가 9개정도 되고(2진수로)
double은 20개 조금 넘었던거같은데 여튼 그런 차이들로 인해서 차이가 남
ppoopp
주기함수니까 적당히 입략값 작게 해요
Tbps
ㄷㄷ;; 100이상 넣으면 안되는거임?
잉텔
컴퓨터의 Cos와 Sin은 Taylor series를 이용해서 구해서 그럼
Tbps
뭔... 테일러급수까지 알아야하네 쉬부럴....
잉텔
알 필욘 없음.. 그 함수가 알아서 해주겠지..
다만 그 함수가 테일러 급수를 쓴다는것만 알아둬..
ppoopp
테일러 급수 쓸테니까 그거로 설명하면
f =sigma f^(n)(0)x^n / n!
여기서 x 절대값이 커지면 오차가 커집니다.
자세한 건 테일러 급수 오차 괸련해서 찾아보면 금방 찾을 거고요
Tbps
고맙습니다... 다시 한번 프로그래밍에서의 수학공식은 완벽하지 않다는걸 깨달았습니다... ㅠㅠ
ppoopp
오차 조절이 관건이지요
잉텔
Math.cos(rad % Math.PI);
Tbps
라디안을 x값으로 보면되?
잉텔
ㅇㅇ 자바는 Cos와 Sin의 주기를 2파이인지 파이인지 모르겠지만, Modular 취해서 하면 주기만큼 될테니 그렇게 하셈
Tbps
ㅇㅋㅇㅋ 고맙다
여우가죽
modulo 연산이 실수 연산자에도 적용됨?
정수배이기만 하면 되는건가
잉텔
어? 잠깐.. 그러네...? ㅈㅅ;;
Tbps
?? 되던데?
자바라서 그런가?
여우가죽
되는거 같은데? https://ideone.com/gw6N19
나도 헷갈려서 확인한거여 안되는거 아니냐고 따지는게 아니고 ㅎㅎ
Tbps
근데 이거 신호처리가 매트랩결과랑 프로그래밍 결과랑 조금 다르게 뜨는게 정상임?
흔한개드립의
라이브러리에서 사용하는 데이터 타입에 따라서 유효숫자가 다르므로 다를 수 있음
그리고 연산 순서에 따라서도 다를 수 있어
예를들어(과장된 예임..) 0.3 * 0.7 * 0.5을 한다고 쳤을 때 유효숫자가 소수점 첫번째 자리까지라면
앞에 두개를 곱하면 0.21이 나오고 소수점 두번째 자리는 날아가니까 0.2 * 0.5을 해서 0.10이 되서 결과는 0.1이 됨
순서를 바꿔서 0.3 * 0.5 * 0.7을 한다고 치면 처음 둘을 곱하면 0.15 니까 유효한 값은 0.1이 남고 0.1 * 0.7을 하면 0.07이므로 0이 됨
물론 실제로는 float(32bit)는 유효숫자가 8인가 9개정도 되고(2진수로)
double은 20개 조금 넘었던거같은데 여튼 그런 차이들로 인해서 차이가 남