0

교수님은 씨앗과 함수를 가져 와서 재귀 적으로 값을 출력하고 입력하는 프로그램이 있습니다.재귀 사이클에서 왜이 값이 변경됩니까?

기본적인 생각은 f (x)가 있고 x_0부터 시작하므로 f (x_0) = x_1이됩니다. 그러면 x_2 = f (x_1)와 같이 x_2 = f (x_ {n-1})가됩니다.

어쨌든, 당신은 때때로 이런 사이클을 얻을 수 있습니다. 예를 들어, 프로그램에서 F (X) = 2 배속 모드 1

가자는 입력 0.2주기를 예상 할 수있다 : (0.2, 0.4, 0.3, 0.6, 0.2, ...)

하지만 결국 그의 프로그램은 이상한 일을합니다 .. 50 번째 반복마다 0.2를 얻습니다. 그러면 0.2를 기대할 것입니다. 그 때문에 프로그램이 사이클에서 벗어나 1에 도달하면 모든 출력이 0이됩니다.

컴퓨터에 값을 근사하는 방법과 관련이 있다고 가정하지만 0.2가 아닌 0.20001을 계산하는 이유는 알 수 없습니다. 누군가가 나에게 기술적 인 설명을 줄 수 있습니까?

+0

부동 소수점은 일반적으로 근사값입니다. 여기에서 시작하십시오. http://stackoverflow.com/questions/7644699/floating-point-representation – Ottak

답변

1

부동 소수점 산술은 결정적입니다 (*).

초기주기 단계가 다른 것으로 바뀌었지만 ("0.2, 0.4, 0.3, 0.6, 0.2"), 충분한 정밀도로 값을 인쇄했다면 (%.16e 형식을 사용하십시오 C 또는 C와 유사한 언어를 사용하는 경우) 첫 번째 "0.2"가 두 번째 "0.2"와 같지 않음을 알 수 있습니다.

첫 번째 단계에서 실제로 반복되는 값이 있으면 순서가 효과적으로 주기적으로 나타나며 다른 모든 값은 예상 한대로 무한 반복됩니다.


(*) Just-In-Time 컴파일 및 저속 부동 소수점 의미론을 사용하는 언어로 프로그래밍하지 않는 한. Java는 적시에 컴파일 될 수 있지만 부동 소수점 연산의 의미는 매우 엄격하게 정의되며 이러한 작업은 JIT (just-in-time) 컴파일 전과 후에이 정의를 구현해야하므로 이와 같은 이상한 동작을위한 공간이 남지 않습니다. 부동 소수점 연산에 대한 C#의 정의는 just-in-time 컴파일로 인해 프로그램이 잠시 후 동작을 변경할 수있을 정도로 이상하지만 충분히 끔찍한 속성을 가진 유일한 언어 일 것입니다.