대회글
https://arca.live/b/refuge/98217960?category=2%EC%B0%A8+%EC%B5%9C%EC%95%A0%EB%8C%80%ED%9A%8C&p=1


1. 사전지식
https://arca.live/b/refuge/98233328/480453831#c_480453831
2. 로그 근사 및 증명
(본문)
3. 매직넘버 찾기 
-
4. 뉴턴-랩슨 방법
-


코딩을 배운 사람이라면 초반부는 잘 읽을 수 있을 것이다. 이딴 외계어를 만나기는 전까지는

일단 첫 줄 해석. 오른쪽에서 왼쪽으로 간다.

1. &y -> y의 메모리 주소 값을 찾는다.
2. (long*)&y ->
y가 float형으로 선언되었는데, 얘의 주소 값을 찾든지 아니면 y에 대한 포인터 변수(메모리 주소를 담는 변수)를 만들든 얘를 float형으로 인식하고 float형처럼 2진수를 읽겠지 그치?
근데 앞에 (long*)을 붙임으로서 지금부터 이새끼는 long형의 포인터다=얘의 메모리 주소에 있는 비트를 읽을 때는 평범한 2진수처럼 읽어라가 되는 거임.

3. *(long*)&y -> 1편에서 말했던거. 즉 메모리 주소에 있는 값을 읽는 것

첫 줄을 통해서 i에는 실수 표현을 위해 변형 해놓은 2진수 표현을 그대로 읽어버린 값이 저장됨.


그럼 i에는 뭐가 들어갈까? 1편을 읽은 사람은 알겠지만 E가 8자리, M이 23자리 차지하고 있고 실제 수 표현에는 변형되서 적용됨. 근데 그게 그대로 읽히니까 다음과 같은 값이 저장됨.

증명 들어간다


일단 얘가 실수형이니까 이런 꼴을 갖고있음. 어쨌든 함수 반환 값이 제곱근 분의 1이니까 y가 음수가 되는 경우는 무시함.

E가 2 위에 지수로 있으니까, 양변에 로그를 취하면 예쁜 모양이 되겠지?


자, 로그를 취하고 보니까 저기 있는 +1 때문에 좀 더러워 보여. 어차피 그래픽 표현이고 그렇게 정확할 필요가 없음. 그러니까 근사를 때려버리자 어떻게?

이렇게. 궁금한 사람은 직접 지오지브라에 쳐봐 글 분량 아껴야돼

아무튼 이걸 적용해보면

이렇게 됨. 뭔가 익숙한게 보이지 않나? 저기 2^{23}E+M이 바로 i임.


아니 시바 근데 2^23분의 1이 됐잖아

그래서 2번째 줄의 코드가 필요한거임

수식 들어간다 뇌피질 벌려


자. t를 솔루션으로 정하고 t에 대한 *(long*)&t 값을 찾아봤다.


마지막줄에 집중해보자. 

y에는 지금 입력값을 long형으로 읽은 값이 들어가있고, 거기 -1/2이 취해져있다. 근데 저게 로그에 머시기라는건 위에서 말했지? 로그에 -1/2을 곱했으니까 -1/2log y = log y^{-1/2} = log {sqrt(y)}가 적용이 되는 것이다.

그리고 그 앞에 0x로 시작하는 개미친소리는 3편에서 증명할 예정이다. 

아무튼 이 마지막 줄이 2번 줄에서 하는 행동이 되는 것이다.


그리고 3번줄에서 얘를 다시 float형으로 읽어서 저장한다. 끝.

질문은 댓글로 ㄱ