0

다음 예는 부동 소수 점수의 사용에 관하여 함정 하이라이트 부동 소수점 값이다일정 일정 시간

failed to schedule at 1.3 

I가 년후 :

available_again = 0 
for i in range(0,15): 
    time = 0.1*i 

    if time < available_again: 
     print("failed to schedule at " + str(time)) 

    available_again = time + 0.1 

이 코드는 다음과 같은 출력 그러나 나는 왜 그것이 발생하는지 이해하지만이 오류를 기대하지 않는다. 이 문제를 해결하기 위해 어떤 옵션이 있습니까? 내 코드에서

한 수정 프로그램은 다음과 같습니다이 올바른 경로 인 경우 내가 궁금하네요

available_again = 0.1*(i+1) 

. 내 특정 응용 프로그램은 이벤트가 발생하는 시간을 복잡한 수학 함수 (예 : sinc (2 * pi * f * t))로 지정하는 이벤트의 스케줄링과 관련됩니다. 이벤트 기간은 이벤트가 서로 겹칠 수 있으며,이 경우 이벤트를 별도의 채널로 보내야합니다. 내 코드에서

+0

분명히 들릴지 모르겠지만, 그럴 수있는 유일한 방법은 정수를 사용하는 것입니다 (단위를 밀리 초, 마이크로 초 또는 기타로 설정하는 것). 어쩌면 복잡한 타임 스탬프를 확장하여 정수로 사용할 수 있습니다 (int (1000 * sin (2 * pi * f * t)와 같은)? – jdehesa

답변

1

한 수정 프로그램은 다음과 같습니다

available_again = 0.1 * (I + 1)

이 수정이 정확하고 time가 충분히 작은 남아있는 한 당신의 코드가 작동 할 것 부동 소수점 분해능이 0.1보다 우수합니다 (최대 약 2 까지).

이 반복 i에서 계산 된 부동 소수점 숫자 0.1*(i+1) 때문에 한 정수로 정확하게 다음 반복에 의해 증가 된 i0.1*i으로 계산 된 부동 소수점 숫자와 같은이며, 때문에 작동 nm은 약 2 보다 낮게 유지되고, 어떤 다른 두 값도 nm의 값이 동일하지 않다. 0.1*n 및 은 동일하지 않다.

이유는 부동 소수점 연산이 결정적이라는 것입니다. 부동 소수점 연산 0.1 * nn의 일부 정수 값에 대해 반 직관적 인 결과를 생성 할 수 있지만 항상 동일한 n에 대해 동일한 결과를 생성합니다.


뿐만 아니라이 time 내가/10, 다음 i/10.0time 계산해야하고, 논리적으로, (i+1)/10.0available_again을 계산 가장 근접한 수학 몫입니다 당신을 위해 중요합니다.

위의 이유와 동일한 이유로 계속 작동하며 의도 된 지수에 가장 가까운 부동 소수점 수를 항상 계산하는 추가 속성이 있습니다. 0.1 * i은 부동 소수점 숫자 0.1과 합리적인 1/10.

어느 경우에도 time의 두 연속 값은 항상 같은 간격으로 분리되지 않습니다. i/10.0 계산에서는 합리적인 i/10 주위에 부동 소수점 값이 있습니다. 0.1*i을 사용하면 i * 0 주위로 이동합니다.1000000000000000055511151231257827021181583404541015625. 자유롭게 샘플링 빈도를 선택할 수 있다면 itime 사이의 인수가 2의 제곱 (예 : 1/64 또는 1/128)이되도록 선택하십시오. 그런 다음 time이 정확히 계산되고 모든 시간 간격이 정확히 동일하다는 추가 속성을 갖게됩니다.