c++ - TDD 让我除以零。可以吗?

标签 c++ visual-studio-2013 tdd divide-by-zero

我使用 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,所有测试也会通过 - 不会抛出异常。我是否使用调试信息构建并不重要。然而,调试显示 xlowerBound 相比是 -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/

相关文章:

visual-studio-2013 - Visual Studio “Go to definition” 禁用或灰显

node.js - 在nodejs中测试后台进程(使用磁带)

c++ - 删除链表,内存泄漏C++

c++ - 模板推导 : const reference and const pointer

c++ - 连接两个 move 的字符串

c++ - OpenGL多线程

sql-server-2012 - PowerShell 4 安装后 Invoke-Sqlcmd 不起作用

visual-studio - 在 Visual Studio 2013 中获取括号外

c# - 'run all tests' 发现但未运行 XUnit 测试

testing - 嵌入式 C 项目模块级测试的测试用例和测试自动化