5

あちこちにフロートがある深くネストされたデータ構造があります。FsCheck を使用して、シリアル化してから逆シリアル化した後にデータが変更されていないかどうかを確認しています。

float が NaN または +/- 無限大の場合、このプロパティは失敗しますが、これらの値が実際のデータで発生するとは思わないため、このようなケースには興味がありません。

FsCheck が NaN と無限大を生成するのを防ぐ方法はありますか?

上記の値を含む生成されたデータを破棄しようとしましたが、これによりテストが非常に遅くなり、実際には非常に遅くなり、これを書いている間もテストがまだ実行されており、実際に終了するのではないかと疑っています...

4

2 に答える 2

8

Mauricio Scheffer が言ったように、テスト パラメータで NormalFloat 型を使用できます。

float のリストの簡単な例:

open FsCheck

let f (x : float list) = x |> List.map id

let propFloat (x : float list) = x = (f x)

let propNormalFloat (xn : NormalFloat list) = 
    let x = xn |> List.map NormalFloat.get
    x = f x

Check.Quick propFloat
//Falsifiable, after 18 tests (13 shrinks) (StdGen (761688149,295892075)):
//[nan]

Check.Quick propNormalFloat
//Ok, passed 100 tests.
于 2014-07-30T15:30:13.597 に答える