2014-10-23 5 views
-1

나는 총 초보자입니다. BigInteger 구조체를 사용하는 SharpDevelop에 C# 프로그램을 만들었습니다. 난 그냥 처음 5 개 것들을 넣어했지만, 실제로 1000 큰 정수가 있습니다 :SharpDevelop가 왜이 오류를 반환합니까? 'double'및 'System.Numerics.BigInteger'유형의 피연산자에 연산자 '/'를 적용 할 수 없습니까?

using System; 
using System.Numerics; 
using System.Linq; 


namespace HCC 
{ 
class Program 
{ 
    public static void Main(string[] args) 
    { 

     BigInteger[] HCC = new[] 
     { 
      BigInteger.Parse("2"), 
      BigInteger.Parse("4"), 
      BigInteger.Parse("6"), 
      BigInteger.Parse("12"), 
      BigInteger.Parse("24"), 
     }; 

     double S; 

     int i; 

     S=0; 

     for(i=0; i<HCC.Length; i++) 
     { 
      S=S+1.0/HCC[i]; 
     } 

     Console.Write(""+S); 

     Console.ReadKey(true);   

    } 
} 
} 

참고 :

는 여기있다. 그리고 일부는 70 자리가 넘습니다.

S=S+1.0/HCC[i]; 

이 무엇을 의미 하는가 :

Operator '/' cannot be applied to operands of type 'double' and 'System.Numerics.BigInteger' (CS0019)

그것은이 라인을 기준으로 :

문제는 SharpDevelop이 오류가 표시된다는 점이다? 이것은 BigIntegers에 대해 더하기, 곱하기 및 나눗셈과 같은 기본 연산을 수행 할 수 없다는 것을 의미합니까?

가장 중요한 것은 다음과 같습니다. 어떻게이 문제를 해결할 수 있습니까?

+0

아니요, 그렇다고해서 그것이 정확히 말하는 것을 의미하지는 않습니다 : 'BigInteger'로 'double'을 나눌 수 없습니다. 그것을 해결하는 방법에 관해서는 : 근사치 또는 정확한 결과에 관심이 있습니까? 만약 이전에'BigInteger'를 사용하고있는 특별한 이유가 있습니까? 후자의 경우, 귀하의 접근 방식을 다시 생각해야합니다. 'BigInteger'라는 이름이 이미 클래스가 분수를 지원하지 않는다고 알려주고 있다고 생각 했습니까? – hvd

+0

@hvd : 실제 결과에 무한 십진수 표현이 있기 때문에 완전히 정확한 결과는 없습니다. 하지만 저는 정말로 정확한 결과를 원합니다. 최소 7 자리 숫자를 찾고 있습니다. BigInteger를 사용하고 있는데 계산을 수행하는 데 사용하는 정수가 매우 큽니다 (일부는 70 자리 이상). – user50746

+0

분수로 표현할 수있는 완전히 정확한 결과가있을 수 있습니다. 그러나 ~ 7 자리가 충분하다면, 모든 것을 (정확히 ~ 15 자리의 정밀도를 가짐)'double '을 사용합니다. 70 자리 정수 중 마지막 자리수는 큰 차이가 없습니다. – hvd

답변

2

대부분 BigInteger을 사용하고 싶지는 않습니다. 대신 decimal이 당신이 원하는 것일 수 있습니다. 이 같은

뭔가 : 그것은 당신에게 소수점 정밀도를 보장 할 수 있도록

decimal[] HCC = new [] { 2M, 4M, 6M, 12M, 24M }; 

... 

S += 1M/HCC[i]; 

진수가 아니라 진보다, 오히려 기본-2보다,베이스 (10)에있다. 또한 꽤 큰 범위가 있으므로 사용하기에 충분해야합니다.

아, 거기에 70 자리 숫자가 있다면 어떻게 숫자에 영향을 줄 것으로 예상합니까? 정확하게 소수점 7 자리 만 있으면됩니까? - 당신이 정말로 위의 자리 숫자의 성장 시리즈와 숫자를 작업하는 경우 당신은 여전히 ​​중요한 점을 놓치고

: 나는 당신이 ... 어딘가

편집을 점을 놓치고있어 생각 20은 결과에 아무런 영향을 미치지 않습니다. 이 시리즈의 합은 주어진 수로 수렴되며, 첫 번째 n 개의 유효 자릿수를 쉽게 근사 할 수 있습니다 (예 : sin (x)을 계산하는 데있어 Taylor 시리즈를 살펴보십시오. 이것은 또 다른 무한 십진수 표현식입니다).

이제 시리즈가 유한하고 반드시 성장하지 않는 경우, 할 수있는 가장 간단한 것은 합계를하기 전에 주문하는 것입니다. double에 숫자를 입력하십시오 - 정밀도를 잃어버린 것에 대해 걱정하지 마십시오. 결과에 영향을 미치지 않습니다. (이것은 약간의 수학적 분석을 필요로하지만, 당신의 배경이 무엇인지 모르므로, 당신 스스로 이것을 증명할 수 없다면, 수학 SE에 대한 질문을 원할 수도 있습니다.) 가장 큰 것부터 가장 작은 것까지 순서를 정하십시오. 그들을 하나씩 합산해라. 결과는 약 15 자리 정도로 매우 정확해야합니다. 더 큰 숫자 인 1/x을 더할수록 멀리있는 자리수를 빨리 잃어 버릴 수 있지만 어쨌든 결과에 영향을 미치지는 않습니다.

물론이 사실을 이미 알고 있다면 큰 숫자를 계산할 필요가 없다는 것을 쉽게 증명할 수 있습니다. 즉, 자신의 자리 수보다 약 1 ~ 2 배 더 큰 소수에 영향을 줄 수는 없습니다 .정확한 동작은 성장률이 실제로 큰 경우 (매우 간단한 예가 G(n) = 2^n의 기하학적 시리즈 임) 분명하지만, 실제로 작고 매우 큰 숫자로 작업 할 경우 케이스를 대략 비슷하게하는 것처럼 보입니다. 같은 시리즈. 이것이 충분하지 않은 경우 숫자에 부분 정밀도로 추가 할 수 있습니다. decimal, 그리고 그 합계를 합산 - 고교 대수학은 그걸 위해 충분해야합니다 :)

무엇보다도 머리에 (또는 종이에) 수학을하는 것은 많은 도움이됩니다. 무한한 십진수 표현은 수학에서 꽤 정상적인 무언가이며, 그것들을 처리 할 수있는 많은 도구가 있습니다. 그리고 근사, 반올림, 한도 및 기타 이와 관련된 것들.

+0

"십진수"유형을 사용하는 것이 여기서는 쓸모가 없다고 생각합니다. "double"유형이 더 좋습니다. 최종 진정한 결과는 모든 기반에서 유한 표현으로 표현 될 수 없습니다. – user50746

+0

@ user50746 음, 수학을 해보십시오. 소수 자릿수 7 자리까지만 정밀도를 신경 쓰는 경우 왜 거꾸로 된 70 자리 숫자를 추가해야합니까? 어쨌든 차이는 없습니다 (HCC가 항상 성장하고 있다고 가정). 이것은 유한 데이터 유형에 관한 것이 아니라 수학 수준에서 이미 실패했습니다. D – Luaan