gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:06:49 26 4
gpt4 key购买 nike

我使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com