52903


intとdoubleを比較したい関数のジェネリック版なのですが  
main関数のmaxとしてintもdoublenに型変換すれば９も9.0になるだけなので  
このやり方で例外もでなくなったのですが、そもそもdouble同士を比較する方法はあるのでしょうか？

[code]

    static int max<type,type_b>(type a , type b) 
        where type : IComparable
        where type_b : IComparable
    {
        int x = a.CompareTo(b);
        return x;
    }
    
    static void Main(string[] args)
    {
        int x = 9;
        double y = 9.3;
        int e = max<double,double>(x,y);
        Console.WriteLine(e);
    
        Console.ReadKey();
    }
    
[/code]


CC BY-SA 4.0
2019-02-20T10:34:58.637
52898
2019-02-25T01:12:12.250
2019-02-25T01:12:12.250
2238
question
c#
C# ジェネリック関数でdouble型を比較するときで正しいやり方知りたい


浮動小数点型は、様々な理由で誤差が出るため、等しいかどうかを判定するのが問題になります。  
例えばdoubleではなくfloat基準でほぼ同じなら等しい扱いにしたいなら、  
用意する典型的な関数は以下です。

[code]

    public static class Num
    {
        public static float FloatEpsilon { get { return 0.00000011920929f; } } // 1.1920929e-7
    }
    
    public static class NumericalExtension
    {
        public static bool Is0fEps(this double value)
        {
            return -Num.FloatEpsilon < value && value < Num.FloatEpsilon;
        }
    }
    
[/code]

上記を用意して、まず2つの値の差を出して、Is0fEps が Trueなら同じ、  
そうでないなら正負を見て大小関係を返します。

厳密で正確な計算をしたい場合はdecimalを使用するか、  
分数や平方根やlogをそのまま表現できる数値型構造体を自作定義してください。


CC BY-SA 4.0
2019-02-20T12:14:08.827
52901
2019-02-20T12:14:08.827
25396
52898
answer


数値型は [暗黙的な数値変換](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-
reference/keywords/implicit-numeric-conversions-table) で適応できる型に暗黙的に変換されます。

次のようなジェネリックにすれば渡される引数の型によって呼び出すメソッドの型が自動的に決まります。

[code]

    static int max<type>(type a, type b)
        where type : IComparable
    {
        Console.WriteLine("Type:" + typeof(type)); // 確認用
    
        int x = a.CompareTo(b);
        return x;
    }
    
    public void Test()
    {
        // max<int> になる
        int e1 = max(9, 9);
    
        // max<double> になる
        int e2 = max(9, 9.3);
    
        // max<double> になる
        int e3 = max(9.0, 9.3);
    }
    
[/code]


CC BY-SA 4.0
2019-02-20T12:51:59.233
52903
2019-02-20T13:01:32.023
2019-02-20T13:01:32.023
14817
14817
52898
answer