The IEEEReal 구조
The IEEEReal 구조
IEEEReal 구조는 부동소수점 수의 IEEE 구현과 관련된 타입을 정의해요. 또한 부동소수점 하드웨어의 반올림 모드를 제어해요. 추가 정보는 IEEE 표준 754-1985와 ANSI/IEEE 표준 854-1987을 참조하세요.
출처: 문서
본문
시놉시스 (Synopsis)
signature IEEE_REAL
structure IEEEReal :> IEEE_REAL
인터페이스 (Interface)
exception Unordered
datatype real_order = LESS | EQUAL | GREATER | UNORDERED
datatype float_class
= NAN
| INF
| ZERO
| NORMAL
| SUBNORMAL
datatype rounding_mode
= TO_NEAREST
| TO_NEGINF
| TO_POSINF
| TO_ZERO
val setRoundingMode : rounding_mode -> unit
val getRoundingMode : unit -> rounding_mode
type decimal_approx = {
class : float_class,
sign : bool,
digits : int list,
exp : int
}
val toString : decimal_approx -> string
val scan : (char, 'a) StringCvt.reader
-> (decimal_approx, 'a) StringCvt.reader
val fromString : string -> decimal_approx option
설명 (Description)
val setRoundingMode : rounding_mode -> unit
val getRoundingMode : unit -> rounding_mode
이 함수들은 밑에 깔린 하드웨어의 반올림 모드를 설정하고 얻어요. IEEE 표준은 기본 반올림 모드로 TO_NEAREST를 요구해요. 구현 참고: 일부 플랫폼은 모든 반올림 모드를 지원하지 않아요. 이런 플랫폼 위에 세운 SML 구현은 필연적으로 비준수일 텐데, 보통 setRoundingMode가 지원되지 않는 모드에 대해 예외를 발생시킬 거예요.
type decimal_approx = {
class : float_class,
sign : bool,
digits : int list,
exp : int
}
이 타입은 실수의 구조화된 십진 표현을 제공해요. class 필드는 실수의 클래스를 나타내요. sign이 true면 수는 음수예요. digits 리스트의 정수는 숫자, 즉 0과 9 사이여야 해요. class가 NORMAL 또는 SUBNORMAL일 때 digits = [d(1), d(2), ..., d(n)]인 decimal_approx 값은 실수 s * 0.d(1)d(2)...d(n) 10(exp)에 해당해요. 여기서 s는 sign이 true면 -1, 아니면 1이에요. class가 ZERO 또는 INF일 때 값은 각각 0 또는 무한대에 해당하고 부호는 sign이 결정해요. class가 NAN일 때 값은 지정되지 않은 NaN에 해당해요.
toString d
d의 문자열 표현을 돌려줘요. digits = [d(1), d(2), ..., d(n)]이고 sign·exp 필드를 무시한다고 할 때, toString은 class 필드에 따라 ZERO면 "0.0", NORMAL이면 "0.d(1)d(2)...d(n)", SUBNORMAL이면 "0.d(1)d(2)...d(n)", INF면 "inf", NAN이면 "nan"을 생성해요. sign 필드가 true면 앞에 "~"를 붙여요. exp 필드가 0이 아니고 class가 NORMAL 또는 SUBNORMAL이면 "E" 뒤에 Integer.toString exp를 붙여요. toString o REAL.toDecimal은 REAL.fmt StringCvt.EXACT와 동등해요.
scan getc strm
이 함수들은 문자 소스의 접두부에서 십진 근사값을 스캔해요. 초기 공백은 무시돼요. 첫 번째는 문자 입력 함수 getc를 사용해 문자 스트림 src에서 읽어요. 십진 근사값 d를 파싱할 수 있으면 SOME(d, rest)를 돌려주고 rest는 문자 스트림 나머지예요. 그렇지 않으면 NONE을 돌려줘요. 두 번째 형태는 문자열 s를 입력으로 사용해요. 성공 시 십진 근사값을, 실패 시 NONE을 돌려줘요. fromString은 StringCvt.scanString scan과 동등해요. 이 함수들은 정규식 [+~-]?([0-9]+.[0-9]+? | .[0-9]+)(e | E)[+~-]?[0-9]+? 형태의 실수를 받아요. 선택 부호는 sign 필드 값을 결정하며 기본 false예요. 정수부의 앞 0과 소수부의 뒤 0을 제거해 각각 숫자 리스트 il과 fl을 얻어요. il이 비어 있지 않으면 class를 NORMAL로, digits를 뒤 0을 제거한 il@fl로, exp를 il의 길이 더하기 스캔한 지수의 값으로 설정해요. il과 fl이 모두 비어 있으면 class를 ZERO, digits=[] , exp=0으로 해요. il이 비어 있고 fl이 비어 있지 않으면 m을 fl의 앞 0 개수로 하고 fl'을 앞 0을 제거한 fl로 할 때, class를 NORMAL, digits를 fl', exp를 -m 더하기 스캔한 지수로 해요. 또한 정규식 [+~-]?(inf | infinity | nan) 형태의 비유한 값을 받는데 알파벳은 대소문자를 가리지 않아요. 첫째와 둘째 경우 d의 class는 INF, 셋째 경우 NAN이 돼요. 이 모든 경우 d는 digits=[] , exp=0을 가져요.
fromString s
fromString는 문자열 s에서 십진 근사값을 스캔해요. 초기 공백은 무시돼요. 성공 시 십진 근사값을 돌려주고, 실패 시 NONE을 돌려줘요. 이 함수는 StringCvt.scanString scan과 동등해요. 자세한 파싱 규칙은 위 scan getc strm의 설명을 참고하세요.