检查浮点参数是否正确

时间:2013-04-13 04:57:22

标签: c++ constructor floating-point floating-accuracy

我想写一个代表马尔可夫链的类(我们将它命名为MC)。它有一个构造函数,它接受状态转换矩阵(即vector<vector<double>>。我想,检查它实际上是一个矩阵(具有相同的行数和列数)是一个好主意,实际上是一个转换矩阵:其中的所有数字都是概率,即不小于0.0且不大于1.0,并且对于每一行,其元素的总和为1.0。但是,由浮点限制引起的问题是:例如,总和0.3 + 0.3 + 0.3 + 0.1将不等于1.0,因此检查不会那么容易。所以我看到了这个问题的两种可能的解决方案:

  1. 选择一些epsilon并与epsilon错误进行比较。当然它现在会接受一些违反转换矩阵属性的矩阵,但一般来说,如果有人偶尔将一些不良数据传递给构造函数,他将会得到一个例外。
  2. 不要检查任何东西,依靠班级用户,如果他传递了不好的东西,那完全是他的错,而且班级的行为会出乎意料。
  3. 哪种方法更好,更“真实”?我喜欢第一个,但又不知道我应该如何选择epsilon。

1 个答案:

答案 0 :(得分:3)

做第二个。

你的班级不是要总结浮点数列表,而是决定什么是“足够接近”1和什么不是。你的用户是。你的班级代表马尔可夫链。您将无法选择epsilon的值,以便您的类以有用的方式表示马尔可夫链。

考虑一下您要实施的操作。也许你将拥有一个能够通过链的转移矩阵在链的状态上达到概率分布的函数。该函数是否应该检查输入概率分布是否是某个epsilon中的概率分布?

您的功能几乎肯定不会保留“是概率分布”属性;当你通过马尔可夫链重复达到你的概率分布时,由于舍入误差远离概率分布的空间,你会得到一些漂移。您可以通过以后标准化来纠正此问题,但这会导致更多不准确。

现在想想“给定马尔可夫链和整数k,返回通过迭代输入链形成的马尔可夫链k次”操作。您可以看到,这将累积四舍五入并遭受与“马尔可夫链的命中概率分布”相同的问题。

如果您只能在使用12小时后破碎的东西和不必要的不​​准确的东西之间做出选择,那会不会很糟糕?

(检查方阵参数的矩形度和矩阵性当然是完全合理的。)

相关问题