5

私は数学ライブラリで作業していdoubleます.a == bMath.Abs(a - b) <= epsilon

また、デフォルトでは、フォーマットされた文字列が考慮される最大の精度で生成されるようにします。つまり、epsilonがの場合0.001、デフォルトの形式を にしますN3

幸いなことに、私は次のことを行いました。

public static class Math3D
{
     internal const int ROUND = 3;
     public const double Epsilon = 1e-ROUND;
}

...そして、コンパイルエラーが発生しました。どうやらこれは許可されていません。

この制限により、相互に依存する両方の定数を const として定義する方法がわかりません。もちろん、読み取り専用フィールドとして定義することはできますEpsilonが、そうすることは概念的に間違っていると感じています。これを行う方法の明らかな方法がありませんか?

4

4 に答える 4

10

変更する可能性がある場合は、ここを使用する必要readonlyがあります。π のように、決してconst変わらないものに使用する必要があります。この理由は、 と の微妙な違いによるものです。constreadonly

主な問題は、 の値を変更した場合、を使用するすべての依存クライアントを再コンパイルconstする必要があることです。そうしないと、ひどい. したがって、変更される可能性のある値については、 を使用せずに を使用してください。constconstreadonly

したがって、値が決して変わらない場合は、 を使用するだけで、 の観点からのconst定義について心配する必要はありません。次のように言ってください。EpsilonROUND

internal const int ROUND = 3;
public const double Epsilon = 1e-3;

もう一方を変更せずに一方を誤って変更しないようにしたい場合は、コンストラクターに小さなチェックを追加できます。

if (Epsilon != Math.Pow(10, -ROUND)) {
    throw new YouForgotToChangeBothConstVariablesException();
}

デバッグ リリースでのみコンパイルされるように、条件付きコンパイルを追加することもできます。

変更する場合、次を使用しますstatic readonly

internal readonly int ROUND = 3;
public static readonly double Epsilon = Math.Pow(10, -ROUND);

この制限により、相互に依存する両方の定数を const として定義する方法がわかりません。[...]これを行う方法の明らかな方法がありませんか?

Math.Powいいえ、 orを使用して何らかの計算を行う必要があり、とMath.Logの間を移動ROUNDする必要があります。1 つの入力値に基づいてこれら 2 行のコードを出力する小型のコード ジェネレーターを作成することもできますが、それに時間を費やすことの価値には疑問を感じます。Epsilonconst

于 2013-06-17T15:54:45.273 に答える
2

1e-ROUND、特に1e有効なリテラル整数ではありません。あなたは次のようなことをしなければならないでしょう、

public static readonly double Epsilon = 
    decimal.Parse(
        string.Format("1E-{0}", ROUND), 
        System.Globalization.NumberStyles.Float);

また、式が実行時までわからないときにstatic readonlya を使用できないため、注意してください。constこのシナリオでstatic readonlyは、 は と同様に機能します。const

stringsを扱いたくない場合は、いつでもできます。

public static readonly double Epsilon = Math.Pow(10, -ROUND);
于 2013-06-17T15:55:18.493 に答える
1

常に 3 をハードコーディングできます。定数を使用しているため、値を 3 以外に変更するつもりはありませんよね? したがって、DRY についてあまり心配する必要はありません。

public static class Math3D
{
    internal const int ROUND = 3;
    public const double Epsilon = 1e-3;
}

3を変更したいと考えているなら、それconstはあなたのためではなく、あなたの質問は意味がありません.

于 2013-06-17T15:58:18.163 に答える