다음 10
은 quandary의 핵심 입니다. 2
및 의 곱입니다 5
. 는 K *이 1/2이 정확하게 기지를 10 진수 숫자를 나타낼 수 N * 1/5 m 여기서 k
, n
및 m
정수이다.
대안 적으로 말하면 n
-1 / n 의 숫자 에 밑의 인수에 속하지 않는 요소가 포함 된 경우, 이진수 / 소수 / 소수 확장에서 숫자는 고정 된 자릿수로 정확하게 표현 될 수 없습니다 숫자-반복되는 부분이 있습니다. 예를 들어 1/15 = 0.0666666666 ....은 3 (15 = 3 * 5)이 10의 인수가 아니기 때문입니다.
따라서,베이스 2에서 정확하게 (k * 1/2 n ) 표현 될 수있는 것은베이스 10에서 정확하게 표현 될 수 있습니다.
그 외에도 숫자를 나타내는 데 몇 자릿수 / 비트가 사용되는지에 대한 문제가 있습니다. 어떤베이스에는 정확하게 표현할 수있는 숫자가 있지만, 몇 자릿수 / 비트 이상이 필요합니다.
이진수에서 1/10은 편리하게 10 진수 0.1이며 이진수로 고정 된 비트 수로 표현할 수있는 숫자로 표현할 수 없습니다. 대신 숫자는 0.00011001100110011 ... 2입니다 (0011 부분이 영원히 반복됨).
숫자 1 2 / 1010 2 를 조금 더 자세히 살펴 보겠습니다 .
____
0.00011
+ ---------
1010 | 1.00000
0
-
1 0
0
----
1 00 --------- +
0 |
----- |
1,000 |
0 |
------ | 반복
1 0000 | 블록
1010 |
------ |
1100 |
1010 |
---- |
100 ---- +
이것은 1/3의 긴 나눗셈을 할 때 얻는 것과 정확히 같은 유형입니다.
1/10 인 경우 1 / (2 1 * 5 1 )입니다. 기수 10 (또는 10의 배수)의 경우이 숫자는 종료되며 일반 숫자 로 알려져 있습니다. 반복되는 10 진수 확장을 반복 10 진수라고하며 반복 하지 않고 영원히 계속되는 숫자는 비이성적 인 숫자입니다.
이 배후 의 수학은 Fermat의 작은 정리를 탐구 하고 일단 Fermat 또는 정리를 말하기 시작하면 Math.SE 질문이 됩니다.
10 진수로 표현할 수 없지만 2 진수로 표현할 수있는 숫자가 있습니까?
내 대답은 아니오 야'.
따라서이 시점에서 우리는 합리적인 숫자의 모든 고정 길이 이진 확장이 고정 길이 십진 확장으로 표현 될 수 있음을 분명히해야합니다.
수 있습니다 C #에서 소수점 좀 더 자세히 살펴 으로 우리를 인도 .NET에서 진수 부동 소수점 과 저자를 주어, 나는 그것이 어떻게 작동하는지 그 그게 전부를 받아 들일 수 있습니다.
10 진수 유형은 다른 부동 소수점 숫자와 동일한 구성 요소를 갖습니다. 가수, 지수 및 부호. 평소와 같이 부호는 단일 비트이지만 96 비트의 가수와 5 비트의 지수가 있습니다. 그러나 모든 지수 조합이 유효한 것은 아닙니다. 값 0-28 만 작동하며 사실상 모두 음수입니다 . 숫자 값은 입니다. 이는 유형의 최대 값과 최소값이 +/- (2 96-1 )이고 절대 크기 측면에서 0이 아닌 가장 작은 숫자는 10-28 입니다.sign * mantissa / 10exponent
이 구현으로 인해 double
표현할 수없는 유형의 숫자 decimal
가 범위를 벗어난 숫자가 있음을 즉시 지적 합니다. Double.Epsilon
되는 4.94065645841247e-324
A의 표현 될 수없는 decimal
A의, 그러나 캔 double
.
그러나 10 진수가 표시 할 수있는 범위 내에서 다른 기본 유형보다 정밀도가 더 높고 오류없이 표시 할 수 있습니다.
떠 다니는 다른 유형이 있습니다. C # 에는 임의로 큰 정수를 나타낼 수 있는 BigInteger 가 있습니다. Java의 BigDecimal (최대 2 32 자리 의 10 진수로 숫자를 나타낼 수 있음 )과 정확히 일치하는 것은 없습니다 . 그러나 약간 찌르면 수동 구현을 찾을 수 있습니다.
합리적 데이터 유형 을 가진 일부 언어가 있는데, 이를 통해 합리적 표현을 정확하게 표현할 수 있습니다 (1/3이 실제로 1/3 임).
C #과 float 또는 합리적인 선택을 위해 특별히 .NET 의 Decimal floating pint에서 Jon Skeet을 연기합니다 .
대부분의 비즈니스 응용 프로그램은 아마도 부동 또는 이중이 아닌 십진수를 사용해야합니다. 필자의 경험에 따르면 통화와 같은 인공 값은 일반적으로 십진 부동 소수점으로 더 잘 표현됩니다. 예를 들어 정확히 1.25 달러의 개념은 전적으로 합리적입니다. 길이 및 무게와 같은 자연 세계의 값의 경우 이진 부동 소수점 유형이 더 적합합니다. 이론적으로 "정확하게 1.25 미터"가 있더라도 실제로는 결코 발생하지 않을 것입니다. 정확한 길이를 측정 할 수 없으며 원자 수준에서도 존재하지 않을 것입니다. 우리는 특정한 관용이 관여하는 데 익숙합니다.