2010-01-20 6 views
1

플렉스 계산에 문제가 있습니다. 즉, 픽셀 값을 mm으로 변환하고 반전하려고합니다.플렉스의 간단한 계산 문제

Calculating MM to pixel from: 69.8 mm 
69.8*300 = 20940 
20940/2.54 = 8244.094488188975 
8244.094488188975/10 = 824.4094488188975 

을 다시 계산 :

69.8 함께 시작

Calculating pixel to MM from: 824.4094488188975 
824.4094488188975/300 = 2.7480314960629917 
2.7480314960629917 * 2.54 = 6.979999999999999 
6.979999999999999 * 10 = 69.79999999999998 

우리는 69.8를 원하지만 69.79999999999998으로 돌아가 셨습니다. 간단한 windows calc를 사용하여 프로세스를 추적했는데 처음에 잘못 계산 한 곳은 20940/2.54 = 8244.094488188975이고 8244,094488188976이어야합니다.

Anny help this great.

+4

모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 내용 http://docs.sun.com/source/806-3568/ncg_goldberg.htaccess Admin Home English Language Content – Amarghosh

+0

수학을 추가하기 위해이 태그를 다시 붙였습니다. 질문과 대답이 다른 사람들을 도울 것이라고 생각합니다. 더 많은 사람들이 그것을 보게 될 것입니다. – invertedSpear

답변

7

일반적으로 일반 프로그래밍만큼 Flex 질문이 아닙니다. 컴퓨터에 숫자가 얼마나 정확하게 저장되어 있는지 궁금한 적이 있습니까? 세부 사항은 수학의 실제에 더 가깝지만 간단하게하려고합니다. 무수한 수의 실수가 있다는 것을 알고 있습니다 (예 : 연속 선의 점과 같습니다). 그러나 컴퓨터에는 모든 것을 0과 1로 제한된 양 (32 또는 64 비트)으로 저장합니다. 이제 우리는 제한된 공간에서 숫자를 무제한으로 나타내는 방법에 문제가 있습니다. 부동 소수점 숫자에 사용 된 아이디어 (1.03 또는 4.2232와 같은 "점"값을 가질 수있는 아이디어)는 모두 가질 수 없기 때문에 숫자를 가장 가까운 숫자로 반올림합니다.

설탕이 얼마나 많은 설탕을 넣었는지 기억하는 것 같지만 설탕 1.1232 스푼을 좋아한다는 것을 기억하지 못합니다. 테이블 스푼은 재료의 정확한 양을 측정하는 데 그리 좋지 않기 때문입니다. 그 위에. 당신은 하나에 그것을 반올림하고 그것은 대부분의 시간을 잘 작동합니다.

부동 소수점 숫자를 사용하면 비슷한 생각이 드러납니다. 숫자는 멀리 떨어져있는 것보다 0 근처에 훨씬 더 빽빽합니다. 그 사이의 "빈 공간"은 실제로 커집니다. 예를 들어, 최대 값에서 10000을 뺀다면 숫자는 얻을 수 있습니다. 가장 가까운 값을 찾을 때 차이가 나는 숫자가 없기 때문에 수치는 여전히 동일합니다.

trace (Number.MAX_VALUE == Number.MAX_VALUE-10000); 
    // returns "true" 
    trace (200000 == 200000 - 10000); 
    // returns "false" 

그래서 문제는 번호가 정확하지 않다고 가정하면 발생합니다. as3의 Number는 배정 밀도 IEEE-754 표준을 준수하며, 이것이 어떻게 숫자를 결정하고 라운드 하는지를 결정합니다. 이것

봐 :

trace (8244.094488188976); 
// returns "8244.094488188975" 

추가 읽기 :

Floating point

IEEE_754-2008

+0

Btw. 빠른 수정은 최종 숫자를 필요한 정밀도로 반올림하는 것입니다. 결국, 당신은 소수점 이후 15 번째 숫자에 신경 쓰지 않는다고 생각합니다;) –

+0

Flex를 사용하여 정확히 어떻게 할 수 있는지 잘 모르겠습니다. 위대한 답변과 설명에 감사드립니다. – eldamar

+2

@eldamar : 숫자가 'n'이면 'n.toPrecision (1)'을 사용하여 해당 숫자가 포함 된 문자열을 하나의 소수점 이하 자릿수로 가져옵니다. –