我使用 TDD 开发了一个部分看起来像这样的类
class A
{
public:
// methods, members, stuff
private:
std::vector<int> vectorA;
std::vector<int> vectorB;
bool isAbove(double lowerBound)
{
double x = (double)vectorA.size() / vectorB.size();
return x > lowerBound;
}
// more methods, members, stuff
};
即使在调用 isAbove()
时 vectorB.size()
实际上是 0
,所有测试也会通过 - 不会抛出异常。我是否使用调试信息构建并不重要。然而,调试显示 x
与 lowerBound
相比是 -nan(ind)
(如您所料)。
我将 VS2015 与 VS2013 (v120) 工具集结合使用。 ideone.com produces the same result .
我是否应该在计算 x
之前检查 vectorB.size() == 0
,尽管(通过 TDD 的过程)这不是必需的?
最佳答案
float 除以零会在 C++ 中产生未定义的行为,因此您得到的任何结果都是正确的(至少在标准 C++ 中是这样)。除以零时不需要产生特定值或产生任何信号。
您描述的行为与您使用 IEEE float 的实现一致,其中正数除以零将得到正无穷大,负数除以零将得到负无穷大,零除以零将得到负无穷大给出一个 NaN(非数字)[这是一种过度简化,因为 IEEE 表示允许表示正零和负零,但是通过简单地转换 std::vector
您不会得到负零> 的大小为 double
]。
在除以它之前,您确实需要测试 vectorB.size()
是否为非零值。
或者,return vectorA.size() > lowerBound*vectorB.size()
它给出了一个(数学上)等效的结果,没有任何除法 - 唯一潜在的问题是计算溢出 lowerBound*vectorB.size()
(可以通过对 lowerBound
和/或 vectorB.size()
进行范围检查来解决)。
关于c++ - TDD 让我除以零。可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37137185/