2010-03-05 3 views
7

가 현재 내 Fortran95 지식에 위로 솔질하고있어 (왜 묻지 않는) ...포트란 : 크기의 처리 정수 값 : ~ 700000000000

은 비록 문제에 실행 해요. 어떻게 큰 정수를 다루는가? ~ 700000000000

INTEGER (KIND = 3)은이 번호를 보유 할 수 없습니다. 누구든지 내가 사용할 수있는 컴파일러가 Silverfrost FTN95입니다.

더 큰 데이터 집합을 실행하려면 정수를 사용하고 있습니다.

의견이 있으십니까?

+1

만약 물어볼 수 있다면, 그와 같은 범위가 무엇을 필요로합니까? – Rook

답변

16

표준 솔루션 (포트란 95 년부터, 그래서 컴파일러가 지원하는 가정) (그 값 컴파일러에 의존하는) 유효한 정수의 종류와 고유 HUGE에 대해 조사하기 위해 SELECTED_INT_KIND 고유을 사용하는 것입니다.

  • SELECTED_INT_KIND (R) 모든 정수 값을 나타내는 정수 타입의 종류 유형 파라미터를 반환 N -10^R < N < 10^R (복귀 -1 이러한 형태가 존재하지 않는 경우).
  • HUGE (K)는 정수 형태로 표현할 수있는 가장 큰 수를 반환 종류 K.

예를 들어, x86_64의 프로세서 내 맥 (gfortran 컴파일러, 64 비트 모드), 다음 프로그램에 대한 :

print *, selected_int_kind(1) 
    print *, selected_int_kind(4) 
    print *, selected_int_kind(8) 
    print *, selected_int_kind(16) 
    print *, selected_int_kind(32) 
    print *, selected_int_kind(64) 
    print *, huge(0_1) 
    print *, huge(0_2) 
    print *, huge(0_4) 
    print *, huge(0_8) 
    print *, huge(0_16) 
    end 

출력 :

  1 
      2 
      4 
      8 
      16 
      -1 
    127 
    32767 
    2147483647 
    9223372036854775807 
170141183460469231731687303715884105727 

하는 나는 당신의 일에 대한 integer(kind=8)를 사용하는 거라고 하더군요.

+0

종류 번호는 이식 할 수 없습니다. 특히 OP에서'kind = 3'과 Silverfrost Fortran을 사용하면'kind = 8'이 좋은 것은 아닙니다. Silverfrost Fortran에는 8 종류가 없습니다. 최소한 일반 설정에는 없습니다. 다른 답변과 같이 명명 된 상수에서'selected_int_kind (12)'를 직접 사용할 수 있습니다. –

2

루프 제어 변수로 사용하고 있지만 정수를 직접 사용하지 않는 경우 (가장 큰 인덱스보다 큰 배열을 선언 할 수 없기 때문에 정수는 사용할 수 없다고 생각하십니까?), 그 다음해야 할 일은 그 강아지를 100000과 같은 것으로 나눠서 여러 번 반복하는 다른 루프에 루프를 중첩시키는 것입니다.

+0

불행히도 나는 .. .. 문제는 엄청나게 큰 숫자의 가장 큰 소수 요소를 찾는 문제입니다. 초기 아이디어는 순수한 브루투 포스 다음에 smar 솔루션이 뒤 따릅니다. 현재의 생각이다 다음하지만 정말 가능 isen't 분명한 이유 : INTEGER : I = 0, J = 0, 주 = 0, LARGE_DIV = 0 긴 MAX = 7100000000000 내가 마십시오 = 2 MAX STATE = 0 DO J = 2, I 는 IF (MOD (I, J) == 0) STATE = STATE + 1 IF (STATE> = 2) EXIT END는 IF (STATE DO> = 2) CYCLE IF (MOD (MAX, I) == 0) LARGE_DIV = I END DO WRITE (*, *) LARGE_DIV – Daniel

+2

이것은 bignum 라이브러리의 일처럼 들립니다. 분명히 포트란 주변에 하나 있습니다 ... –

0

INTEGER (KIND = 4)를 사용해 보셨습니까?

+0

옙 .. 최대한 멀리 볼 수있는 가장 높은 수정 허용 종류 = 3 .. 컴파일러 오류 : C : \ FTN_Projects \ xxxxxx.F95 (3) : 오류 217 - INTEGER (KIND = 3) 상수가 범위를 벗어났습니다. (종류 = 3)이 컴파일러에서 설정되었으므로 제공된 인수는 kind = 4입니다. – Daniel

0

우리의 대답은 배정 밀도 변수에 값을 넣고 DINT를 사용하여 분수 부분을 제거하는 것입니다. 결과는 배정 밀도 변수에있는 정수입니다. DINT 함수가 모든 FORTRAN에서 항상 사용 가능한 것은 아닙니다. 이 함수는 배정도 정수 함수이며 매우 큰 정수 (최대 17 자리)를 허용합니다.

6

휴대 적어도 12 진수있을 것이다 정수 "인덱스"를 선언은 :

integer, parameter :: MyLongIntType = selected_int_kind (12) 
integer (kind=MyLongIntType) :: index 

은 "종류 ="생략 될 수있다.

3과 같은 특정 값을 사용하면 완전히 휴대 할 수 없으므로 권장하지 않습니다.일부 컴파일러는 유형 번호를 연속적으로 사용하고 다른 컴파일러는 바이트 수를 사용합니다. "selected_int_kind"는 요청 된 자릿수를 나타낼 수있는 컴파일러에서 사용할 수있는 가장 작은 정수 종류의 종류 번호를 반환합니다. 그러한 유형이 없으면 -1이 반환되고 정수를 선언 할 때 종류 값을 사용하면 값이 실패합니다.

gfortran과 ifort는 모두 selected_int_kind에서 최대 18까지의 10 진수 입력을 반환합니다. 18과 같은 큰 값은 일반적으로 9223372036854775807의 가장 큰 양수 값을 갖는 8 바이트 정수를 선택합니다.이 값은 19 자리이지만 if 컴파일러는이 형식을 지원하지만 더 긴 형식은 지원하지 않습니다. selected_int_kind (19)는 -19가됩니다. 왜냐하면 19 자리 정수가 모두 표현 가능하지 않기 때문입니다.