2016-05-12 8 views
3

Es ist sehr seltsam für mich, aber man kann sich diesen kurzen Code versuchen:BigInteger.Parse arbeitet falsch

var num1 = BigInteger.Parse("1e+9999", NumberStyles.AllowExponent); 
var num2 = BigInteger.Parse("1e+9998", NumberStyles.AllowExponent); 
var div = num1/num2; // is 1, but must be 10 
var eq = num1 == num2; // true, but must be false 

Verbesserungsvorschläge?

+1

Was ist der dokumentierte Bereich von dotnet BigInteger? – LutzL

+0

Unbegrenzt! Vielleicht, Größe des RAM. – TimeCoder

Antwort

4

Beim Analysieren einer BigInteger in Exponentialform begrenzt der .NET-FX-Code den Exponenten auf 1000. Wenn ein größerer Exponent gefunden wird, wird statt dessen ein Exponent von 9999 (!!) verwendet. Siehe FormatProvider.Number.cs, from line 495. Sie können selbst sehen:

Console.WriteLine(BigInteger.Parse("1e+1000", NumberStyles.AllowExponent).ToString("E", CultureInfo.InvariantCulture)); 
Console.WriteLine(BigInteger.Parse("1e+1001", NumberStyles.AllowExponent).ToString("E", CultureInfo.InvariantCulture)); 

1.000000E + 1000

1.000000E + 9999

Auch wenn dies nicht eine Grenze von BigInteger selbst, nur eine Grenze des Parsers :

Console.WriteLine((BigInteger.Parse("1e+1000", NumberStyles.AllowExponent) * 10).ToString("E", CultureInfo.InvariantCulture)); 

1.000000E + 1001

ich so ein überraschendes und inkohärent Verhalten eines offensichtlicher Fehler nennen würde, aber das Verhalten von einem explizit hinzugefügt Stück Code verursacht wird, und ich bin nicht in der Lage, eine genaue Angabe über BigInteger Grenzen zu finden, abgesehen von “arbitrarily large” and “whose value in theory has no upper or lower bounds”.

+0

Danke! Können Sie eine Problemumgehung vorschlagen? Was kann ich für die Initialisierung BigInteger mit Wert z. 10^100000? – TimeCoder

+0

@TimeCoder können Sie auch herausfinden, was der hexadezimale Wert von '10^100000' ist, und den entsprechenden Wert an den Konstruktor übergeben, der [' byte [] '] akzeptiert (https://msdn.microsoft.com/de) -us/Bibliothek/dd268207 (v = vs.110) .aspx). –

+0

@ScottChamberlain Es ist wie ein Paradox, "den Wert von' 10^100000' "ohne BigInteger-Klasse herauszufinden. – Eser