부동 소수점 수학의 이상JMP15를 사용하고 있습니다.
최근에 내가 사용한 스크립트에 작은 오류가 있음을 깨달았습니다.이 오류는 아래에 설명 된 부동 소수점 쿼크에서 비롯됩니다.
처음 두 줄은 같은 수-> 23을 계산합니다.
천장 함수를 사용하면 첫 번째 버전은 24를 반환하고 두 번째 버전은 23을 반환합니다.
이런 일이 일어나야합니까?
show ((((1104/2016) * 42));
show (((42 * 1104 / 2016)));
쇼 (천장 ((1104/2016) * 42));
쇼 (천장 ((42 * 1104 / 2016)));
/ * :
(1104/2016) * 42 = 23;
42 * 1104/2016 = 23;
천장 ((1104/2016) * 42) = 24;
천장 (42 * 1104/2016) = 23;
스크립팅다시 : 부동 소수점 수학의 이상이미 부동 소수점임을 알았습니다. 기술적으로는 그렇지 않지만 부동 소수점 계산으로 인해 항상 "반올림 문제"가 발생합니다.
첫 번째 계산을 열에 넣은 경우 (1104/2016) * 42, 열 너비를 30 (임의로 크게)으로 변경하고 소수 자릿수가 20 인 고정 소수점으로 형식을 지정하면 숫자가 다음과 같이 저장됩니다. 23.00000000000000355271 .
다시 : 부동 소수점 수학의 이상2016 년 : 2 × 2 × 2 × 2 × 2 × 3 × 3 × 7
1104 : 2 × 2 × 2 × 2 × 3 × 23
42 : 2 × 3 × 7
1104/2016은 2 × 2 × 2 × 2 × 3 × 23) / ( 2 × 2 × 2 × 2 × 2 × 3 × 3 × 7)
23 / (2 × 3 × 7)은 밑이 10이고 밑이 2 (16 진수, 16 진수, 16 진수당 4 비트로 표시)에서 반복되는 분수입니다.
0.5476190476190476190476190 ... 또는 3FE186186186186 ... (가상화를 위해 운이 좋은 12 비트 반복!)
둘 다 잘리고 정확하지 않습니다. 16 진법 2 표현의 실제 값은 3FE1861861861862로 반올림되어 약간 높습니다 (3FE는 지수). 나누기 후 42를 곱하면 약간 높습니다.
(42 × 1104) / 2016은 (( 2 × 3 × 7 ) × ( 2 × 2 × 2 × 2 × 3 × 23)) / ( 2 × 2 × 2 × 2 × 2 × 3 × 3 × 7 )
나누기 전에 42를 곱하면 소수의 제수를 크게 줄일 수 있습니다.
다시 : 부동 소수점 수학의 이상그 답을 틀어 놓을 것 같아요