2009-03-01 20 views
7

非常に大きな数を処理する必要のあるアプリを開発中です。大量の種類

利用可能なLargeNumberクラスをいくつかチェックして、私が満足しているものがいくつか見つかりました。私は大きな整数と大きな浮動小数点数のクラスを持っています。

数字のいくつかは小さくなりますが、いくつかの大きな問題は、数字の長さをチェックする価値があるかどうかです。それが小さい場合、通常のC#intまたはdoubleを使用します。私がすでにLarge IntegerクラスとLarge Floatクラスを使用している場合は、小さい数の場合でもそれらに固執する必要があります。

私の配慮は純粋にパフォーマンスです。私は各番号は後であるに入れてチェックする価値があるだろうと小さな数字のための数学で十分な時間を節約します

+0

大きい数字にはどのクラスを使用していますか? – ahsteele

+0

私はいくつかで遊んでいます。 Microsoft.FSharp.Math.BigInt Microsoft.SolverFoundation.Common.BigInteger http://www.codeproject.com/csharp/biginteger。ASP INTX は私が w3b.sine Microsoft.FSharp.Math.BigNum を使用してい小数のため 私はそれらのすべてにいくつかのベンチマークを行うと、私は – Sruly

+0

得るものを見るつもりです。この[質問](HTTPを参照してください。 //stackoverflow.com/questions/494923/numbers-that-exceeds-basic-types-in-c)。 –

答えて

2

伝えるのは本当に難しい - 。あなたのサードパーティのライブラリに依存します:)

最善の策System.Diagnostics.StopWatchクラスを使用し、gazzillion異なる計算を行い、それらの時間を計算し、結果を比較すると、私は推測します。

[編集] - ベンチマークについて、私はあなたの一連のベンチマークを行います通常の32/64ビット数の計算を行うlargeInt型と、その数値が通常のInt32/Int64型(必要なもの)に収まるかどうかをチェックし、それらをこれらの型にダウンキャストして、それを実行するシリーズ計算これらのタイプを使用しています。あなたの質問から、組み込みの型が高速であれば、あなたは何をしているかのように聞こえます。

アプリケーションがあなた自身よりも多くの人をターゲットにしている場合は、別のマシン(シングルコア、マルチコア、32bit、64bitプラットフォーム)、プラットフォームが計算に要する時間に大きな影響を与えているように見える場合は、別のマシンで計算を行うために何らかの戦略パターンを使用します。

幸運:)私はまともな多数のライブラリーは、それ自身でこの最適化を行うことができるだろうという期待

+0

どのようなタイプのベンチマークテストをしますか? – Sruly

+0

@スルーリー - アプリケーションに必要な数学のタイプを複製するもの--p –

+0

ベンチマーク固有のものを元の答えに更新しました:P – cwap

2

私は、はい、チェックは以上のために支払うことになると言うでしょう通常の範囲内で十分な値を持っている限り、それ自体です。

ロジックは単純です:整数加算は1つのアセンブリ命令です。比較すると、それは3つまたは4つの命令です。このような操作のソフトウェア実装は、おそらくもっと遅くなります。

このチェックは、LargeNumberライブラリ自体で行うのが最適です。彼らがそれをしなければ、あなたはどこでも小切手を持つことを避けるためにラッパーが必要かもしれません。しかし、ラッパーの追加コストも考慮する必要があります。

0

非常に大きな数値を処理するのに同じフィールドが必要で、同時に非常に小さな数値の精度を扱うプロジェクトで作業しました。
このような種類のすべての数について、フィールド(仮数と指数)に格納することになりました。
仮数/指数の計算のためのクラスを作りました。