テストでの境界値解析の目的で、私は倍精度浮動小数点数型または浮動小数点型の最小ステップサイズを取得することを検討してきました。これにより、doubleまたはfloatで表現できる次の大きい値と小さい値を得ることができます。(ゼロではない)倍精度浮動小数点数の最小ステップサイズの取得
double.epsilonは、値がゼロまたは指数が-1022のDoubleインスタンスにのみ適用されます。
私は任意のdoubleまたはfloatを持っているとしましょう。 .Netで表現できる次の大きな値と次に小さい値は何ですか?
MSDNの記事に基づいて、私はもっともらしい見えた、次のコードを実装している:
private static int GetExponentWithMinorAdjustment(double value)
{
//int indent = result.Length;
// Convert the double to an 8-byte array.
byte[] bytes = BitConverter.GetBytes(value);
int exponent = (bytes[7] & 0x07F) << 4;
exponent = exponent | ((bytes[6] & 0xF0) >> 4);
int adjustment = exponent != 0 ? 1023 : 1022;
return exponent != 0 ? exponent - 1 : exponent; ;
}
private static double NextLargerNumber(double value)
{
// Cannot use double.epsilon * Math.Pow(2, GetExponentWithMinorAdjustment(value)) as this results in infinity
return value + Math.Pow(2, GetExponentWithMinorAdjustment(value) - 1074));
}
上記のコードの問題は、それが不安定に見えるということです。三項演算子(MSDNの記事を参考にしてください)。その調整の目的は何ですか?
いくつかのテストの出力は正のdouble値のためにOKに見えながらも、負の値の結果は、(出力画像を参照)などの良好ないないようです:
何を、許容可能な正確かつ理想的なソリューションでしょうこの問題のように見える?
ありがとうございます - その増分で表されるステップサイズも取得する方法はありますか? – Andrew
少なくとも浮動小数点数の場合(倍精度も同じように動作すると思います)、数値の精度に応じて可変です(小数点以下の桁でどれくらいの値が使用されるか)。 2つの値を取って、精度の異なるレベルでそれらの違いを得る – War
良い点。上記の例では、元の提案されたコードは、回答で提案されたインクリメント手法と同じ結果を返します。 – Andrew