2009-03-01 16 views
7

Pracuję nad aplikacją, która będzie musiała obsłużyć bardzo duże liczby.Rodzaje dużych liczb

Sprawdziłem kilka dostępnych klas LargeNumber i znalazłem kilka, z których jestem zadowolony. Mam klasę dla dużych liczb całkowitych i dla dużych liczb zmiennoprzecinkowych.

Ponieważ niektóre liczby będą małe, a niektóre duże, pytanie brzmi, czy warto sprawdzić długość numeru, a jeśli jest małe, użyć zwykłego C# int lub podwójnego, a jeśli jest duże, użyć innych klas I mam lub jeśli już używam klas Large Integer i Large Float, powinienem trzymać się z nimi nawet dla mniejszych liczb.

Moje rozważanie to czysta wydajność. Będę zaoszczędzić dużo czasu na matematyce dla mniejszych liczb, które warto byłoby sprawdzić każdy numer po tym jak zostanie wprowadzony

+0

Z jakich klas korzystasz w przypadku większych liczb? – ahsteele

+0

Gram z kilkoma. Microsoft.FSharp.Math.BigInt Microsoft.SolverFoundation.Common.BigInteger http://www.codeproject.com/csharp/biginteger.asp IntX dla dziesiętnych używam w3b.sine Microsoft.FSharp.Math.BigNum mam zamiar zrobić kilka wzorców na wszystkie z nich i zobaczyć, co ja dostać – Sruly

+0

Proszę zobaczyć ten [Pytanie] (http: //stackoverflow.com/questions/494923/numbers-that-exceeds-basic- typeses-in-c). –

Odpowiedz

2

naprawdę trudno powiedzieć. - zależy od 3rd bibliotek stron :)

Najprościej byłoby użyć klasy System.Diagnostics.StopWatch, wykonać inne obliczenia, pomnożyć czas i porównać wyniki, jak sądzę ..

[Edycja] - o benchmarkach, zrobiłbym serię testów largeInt-type do wykonywania obliczeń na zwykłych liczbach 32/64 bitów i sprawdzania, czy liczba ta może pasować do zwykłych typów Int32/Int64 (które powinny), "downcastowania" ich do tych typów, a następnie uruchamiania tego samego calcu lacje wykorzystujące te typy. Z twojego pytania wynika to, co będziesz robił, jeśli wbudowane typy są szybsze ..

Jeśli Twoja aplikacja jest przeznaczona dla większej liczby osób niż Ty, spróbuj uruchomić je na różnych komputerach (jednordzeniowym, wielordzeniowym) 32-bitowe, 64-bitowe), a jeśli platforma wydaje się mieć duży wpływ w czasie wykonywania obliczeń, użyj jakiegoś wzorca strategii, aby wykonać obliczenia w różny sposób na różnych maszynach.

Powodzenia :)

+0

Jakiego rodzaju testy porównawcze byś zrobił? – Sruly

+0

@Suly - te, które powielają matematykę wymaganą przez aplikację ;-p –

+0

Zaktualizowana oryginalna odpowiedź z materiałami specyficznymi dla testu porównawczego: P – cwap

2

Spodziewam się, że to przyzwoity duża liczba biblioteka będzie w stanie to zrobić optymalizację na swój własny ...

2

powiedziałbym tak, kontrola będzie więcej niż płacić za tak długo, jak masz wystarczające wartości w regularnym zakresie.

Logika jest prosta: dodanie liczby całkowitej to jedna instrukcja montażu. W połączeniu z porównaniem to trzy lub cztery instrukcje. Jakiekolwiek wdrożenie oprogramowania takiej operacji będzie prawdopodobnie znacznie wolniejsze.

Optymalnie ta kontrola powinna zostać wykonana w samych bibliotekach LargeNumber. Jeśli tego nie zrobią, możesz potrzebować opakowania, aby uniknąć sprawdzania w każdym miejscu. Ale musisz także pomyśleć o dodatkowym koszcie opakowania.

0

Praca w projekcie, w którym te same pola wymagały obsługi bardzo dużych liczb, a jednocześnie precyzji ręcznej dla bardzo małych liczb.
Skończyło się z zapisaniem do pól (mantysa i wykładnik) dla każdej liczby tego rodzaju.
Zrobiliśmy klasę do obliczenia mantysa/wykładnika i spisaliśmy się dobrze.

Powiązane problemy