2016-09-30 4 views
1

나는이 은하의 중심에있는 블랙홀의 질량을 찾으려고 노력하고 있는데, 나는 태양 질량으로 질량을 가지고 있지만, 그것을 kg 단위로 필요로한다. 그러나 (1Msolar = 1.989 * 10^30kg) idl을 변환하려고하면 0.0000이됩니다. 내가 뭘 잘못하고 있는지 잘 모르겠다. 그리고 나는 idl에게 1.989 * 10^30과 1989000000000000000000000000000을 모두 출력하도록하고, 출력은 각각 0.00000과 -1이라고 말했다. 누군가 이것이 왜 일어나는지 설명해 주시겠습니까?큰 숫자를 만드는 idl = 0.0

+0

IDL을 모르지만 다음과 같은 힌트가 있습니다. 1. 값을 저장하는 데'data-type '을 사용하고있는 것처럼'data-type'이 오버플로 된 것 같습니다. (타입 : 부동/고정/임의, 가수/지수 또는 정수/십진수 당 비트 수) 2. 코드에 문제가있을 수 있습니다 (제공하지 않았 음). 3. 함수의 일부 장벽에 부딪 칠 수 있습니다. 사용하고 있습니다. – Spektre

답변

3

이것은 형식 변환 오류/오버플로 문제입니다. 큰 숫자를 사용할 때는 숫자를 정수로 정의 할 때 long 또는 long64 (즉, 64 비트 정수)으로 명시 적으로 정의해야합니다. 배정 밀도 부동 소수점 숫자로 1.989 × 10 30에 해당

msun = 1.989d30 

: 실수를 들어, float 또는 double를 사용할 수 있으며이 작업을 수행하는 가장 쉬운 방법은 다음과 같다. 당신은 단 정밀도를 원한다면, 단지 다음을 수행하십시오

msun = 1.989e30 

는 32 비트 또는 64 비트 길이의 정수를 만들려면 바로 사용

msun = 1989L * 10L^(27) 

또는 64 비트를

msun = 1989LL * 10LL^(27) 
+0

그래, 그 대답은 완전히 정확 해 보입니다. C/C++ 데이터 유형을 기반으로하는 모든 컴퓨터 언어에 Matlab을 포함하여 잠재적으로이 문제가있을 것입니다. 한 가지 차이점은이 문제를 피하기 위해 많은 언어가 모든 숫자에 대해 기본값을 "두 배로"설정한다는 것입니다. 이것은 간단한 계산을하는 경우에는 문제가 없지만, 각 더블이 8 바이트를 차지하는 엄청난 수의 배열을 가지고 있다면 낭비적이고 느려질 수 있습니다. 즉, "귀하의 데이터를 알고"적절한 데이터 유형을 사용하십시오. –

+0

감사합니다. 이것은 정말 저를 혼란스럽게 만들었습니다. – LexieStark

1

오버플로 및 데이터 형식에 대한 @ honeste_vivere의 답변에 동의하지만 필자는이 문제를 피하기 위해 종종 단위를 변경한다고 덧붙입니다. 나는 종종 1e19/m^3의 밀도를 가지기 때문에 1e19/m^3의 단위로 밀도를 캐스팅 한 다음 1 차의 숫자를 다룹니다. 이렇게하면 최소 제곱합 및 기타 작업에서 수학 오류를 방지 할 수 있습니다 내 데이터를 제곱하고 싶습니다.

관련 문제