10 진수로 표현할 수 없지만 2 진수로 표현할 수있는 숫자가 있습니까?


42

C#갖는 decimal유형 예를 들어베이스 (10)의 정확한 표현을 필요로 번호를 사용하고, 0.1베이스 (2)에서 표현 될 수 없다 (예를 들어, floatdouble)과 항상 이러한 유형의 변수에 저장된 근사 할 것이다.

반대의 사실도 가능했는지 궁금했습니다. 10 진수로 표현할 수 없지만 2 진수로 표현할 수있는 숫자가 있습니까 (이 경우 a float대신에 a decimal를 사용 하여 처리하고 싶습니다)?


14
질문에 +1하지만 c # 태그가 실제로 적용됩니까? 다른 언어들도 십진법을 가지고 있습니다.
Patrick M

1
@Max : 연습으로베이스 2 숫자를베이스 10으로 직접 변환하는 것을 상상해보십시오. 예를 들어의 값을 계산하려면로 0.11_b2쓰십시오 0.5 + 0.5 * 0.5. 실패하거나 반복되는 10 진수를 초래할 수있는 단계가 있습니까? 개인적으로, 나는이 운동이 밑이 2 인 숫자에 대한 직관을 이해하는 데 큰 도움이된다는 것을 알게되었습니다. 한 걸음 더 나아가이 연습을 구성 증명으로 바꿀 수 있다고 생각합니다.
Brian

아,하지만 틀렸어 1/1010
Xavier J

3
@Ramhound 메모리 제한이 주어지면 바이너리는 0.0999999....998..정확히 나타낼 수 있지만 정수는 아닙니다. 0.1가장 가까운 장애물로 반올림하는 것과 같은 근사치 0.100는 모든 숫자를 표시하지 않고 대신 반올림하는 구현 문제입니다.
이즈 카타

1
'0.1'을 정확하게 표현할 수있는 FP 인코딩 메커니즘을 생각해 낼 수 있습니다. 이러한 인코딩은 단지 표현 될 수 있고 표현할 수없는 것보다 FP 수 범위의 세트 주위를 이동한다.
Martin James

답변:


104

다음 10은 quandary의 핵심 입니다. 2및 의 곱입니다 5. 는 K *이 1/2이 정확하게 기지를 10 진수 숫자를 나타낼 수 N * 1/5 m 여기서 k, nm정수이다.

대안 적으로 말하면 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-324A의 표현 될 수없는 decimalA의, 그러나 캔 double.

그러나 10 진수가 표시 할 수있는 범위 내에서 다른 기본 유형보다 정밀도가 더 높고 오류없이 표시 할 수 있습니다.

떠 다니는 다른 유형이 있습니다. C # 에는 임의로 큰 정수를 나타낼 수 있는 BigInteger 가 있습니다. Java의 BigDecimal (최대 2 32 자리 의 10 진수로 숫자를 나타낼 수 있음 )과 정확히 일치하는 것은 없습니다 . 그러나 약간 찌르면 수동 구현을 찾을 수 있습니다.

합리적 데이터 유형 을 가진 일부 언어가 있는데, 이를 통해 합리적 표현을 정확하게 표현할 수 있습니다 (1/3이 실제로 1/3 임).


C #과 float 또는 합리적인 선택을 위해 특별히 .NETDecimal floating pint에서 Jon Skeet을 연기합니다 .

대부분의 비즈니스 응용 프로그램은 아마도 부동 또는 이중이 아닌 십진수를 사용해야합니다. 필자의 경험에 따르면 통화와 같은 인공 값은 일반적으로 십진 부동 소수점으로 더 잘 표현됩니다. 예를 들어 정확히 1.25 달러의 개념은 전적으로 합리적입니다. 길이 및 무게와 같은 자연 세계의 값의 경우 이진 부동 소수점 유형이 더 적합합니다. 이론적으로 "정확하게 1.25 미터"가 있더라도 실제로는 결코 발생하지 않을 것입니다. 정확한 길이를 측정 할 수 없으며 원자 수준에서도 존재하지 않을 것입니다. 우리는 특정한 관용이 관여하는 데 익숙합니다.


명확하고 간결한 수학 설명을 보려면 +1 제목에 제기 된보다 일반적인 질문에 대답하기 위해 밑 10에서 표현할 수없는 숫자의 예는 1/3입니다.
Doval

@Doval 나는 더 논리적 인 사람이 지적 할 수있는 추론이나 설명에 결함이 있다고 생각합니다 ...하지만 그 경우에 나는 올바른 길을 가고 있다고 생각합니다.

이 경우 "상대적으로 소수"는 단지 "요소가 아님"을 의미합니다. 내가 누락 된 더 깊은 수학적 관계가 있습니까?
Patrick M

1
아, 그래서 그것을 이해로 n = 15하고 b = 10아닌 상대적으로 소수 가 요인으로 5를 공유하기 때문에 ( "공통의 긍정적 인 요인 1을 제외하고 (약수)를 공유하지"). 핵심은 15 (5 3) 의 모든 요소가 10의 요소도 아니라는 것입니다. (제외 : 모든 공통 요소를 공유하거나 공유하지 않는 숫자를 나타내는 단어가 있습니까?) 당신의 k, n, m방정식에 싸여 있지만 실제로 머리를 감싸려면 3d 플롯을 볼 필요가 있습니다. 어쨌든, 당신에게 +1의 가치가 있습니다.
Patrick M

1
@PatrickM : "제외 : 모든 공통 요소를 공유하거나 공유하지 않는 숫자를 나타내는 단어가 있습니까?": 정수는 자체 요소이므로 m의 모든 요소가 n의 요소 인 경우 에는 다음과 같이 나타납니다. mn 의 인수입니다 . 아시다시피이 용어 중 하나는 factor 입니다. 다른 하나는 제수 입니다.
ruakh

6

허용 가능한 값의 범위를 벗어나면 답이 예입니다. 즉, 범위 내의 거의 모든 것이 표현됩니다. C # 10 진수 참조 사양에 명시되어 있지 않지만 비이성적 인 숫자는 정확하게 표현할 수 없습니다 (예 : e 1 , pi, 2의 제곱근 등).

decimal 키워드는 128 비트 데이터 형식을 나타냅니다. 부동 소수점 유형과 비교하여 10 진수 유형은 정밀도가 높고 범위가 작으므로 재무 및 금전적 계산에 적합합니다. 10 진수 유형의 대략적인 범위와 정밀도는 다음 표에 나와 있습니다.

정밀도 : 유효 숫자 28-29 자리

1 다른 비이성적 인 번호를 상기시켜 준 MichaelT에게 감사합니다.


2
@Magus는 비이성적 인 숫자 e(2.71 ...)를 고려합니다 . 자연 로그-ln (x)는 로그베이스 e입니다. 따라서, 비이성적 기초가 존재하고 유용하다. base pi의 특별한 유용성은 확실하지 않지만 어딘가에 사용되지 않는다는 의미는 아닙니다.

6
@Max 수학 문제에 점점 더 많이 빠져 있습니다. 당신은 찾을 수 있습니다 숫자가베이스 (10)에 불합리한 경우, 다른 기지에서 비이성적인가? 더 많은 수의 이론적 질문에 대한 유용한 정보와 출발점이 될 것입니다.

2
1/3은 비이성적이지 않습니다.
Adam Zuckerman

2
OP는 기본 10 (10)에 대해 물었습니다. 어떤 숫자 시스템을 기반으로한다면 10으로 표현할 수 있습니다. Wikipedia 기사에 따르면 , 비합리적인 숫자를 기본으로 사용한다고해서 합리적이지는 않습니다. 유리수는 분자와 분모 모두에 대한 정수, 10 진수로 반복되는 숫자 또는 10 진수로 숫자의 유한 종료로 표현 될 수 있습니다.
Adam Zuckerman

5
@FrustratedWithFormsDesigner Irrationality는베이스와 관련이 없습니다. 글쎄, 그것은 과장된 표현이지만, 다른 방법으로가 아닌 다양한 기반 (예를 들어 무한의 반복되지 않는 숫자가 있는지 여부)에서 숫자의 표현에 영향을 미치는 것은 비합리성입니다. 위의 math.se 질문을 읽으십시오 : math.stackexchange.com/questions/625473/…

1

기수 2 부동 소수점 유형은 같은 크기의 기수 10 유형 할 수 없었던 많은 값을 정확하게 나타낼 수 있습니다. 어떤 크기의 base-2 유형으로 정확하게 표현 될 수있는 모든 값은 충분한 크기의 base- 10 유형으로 정확하게 표현 될 수 있습니다. 이진 부동 소수점 수의 모든 값을 나타내는 순수 10 진법 유형의 필수 크기는 이진 유형의 지수 범위에 따라 다릅니다. 에 대한 수백 비트 float, 또는에 대한 수천 비트 double.

말했듯이, Decimal유형은 다른 숫자 프리미티브의 값을 보유하고 다른 추가 기능을 제공 할 수있는 "범용"유형으로 사용할 수있을만큼 충분히 큽니다 (아무것도 없다면 1 비트를 사용하십시오) 저장된 값이를 변환 한 결과인지 여부를 표시 double하고 해당 비트가 설정된 경우 64 비트를 사용하여 해당 값을 보유하십시오. 그러나 마이크로 소프트는 그렇게하지 않기로 결정했다. 결과적으로 큰 값 의 경우 doubleto 변환은 Decimal완전히 실패하고 작은 값은 가장 가까운 1E-28로 반올림됩니다. 또한 동적 범위 내에서도decimal, 변환 방법은 "왕복"하지 않습니다. 예를 들어, 1.0 / 3.0을 double로 평가하면 0.3333333333333333148이 생성되지만 10 진수로 변환하면 0.333333333333333m이 생성되고 다시 double로 변환하면 0.3333333333333329818이 생성됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.