【问题标题】:Division by Zero Error in a Simple Program简单程序中的零误差除法
【发布时间】:2014-01-16 07:13:06
【问题描述】:

无论出于何种原因,一个简单的测试程序都会产生除以零的错误,尽管据我所知,除零是不可能的:

#include <iostream>

using namespace std;

int main()
{
    int Level = 1;
    int EXPTNL = 0;

    cout << Level << endl;

    EXPTNL = (Level * 1250) * 1000 * 1000 * Level / (2 / ((1000 * (Level * 1250)) / 2));

    cout << EXPTNL << endl;

    system("Pause");
}

我错过了什么吗?这个完全相同的公式在另一个更复杂的程序中也能正常工作。

【问题讨论】:

    标签: c++ error-handling divide-by-zero


    【解决方案1】:

    这是整数除法:

    2 / ((1000 * (Level * 1250)) / 2)
    

    而且,由于分母的大小大于分子的大小,所以你得到 0。

    这很容易测试:

    std::cout << (2 / ((1000 * (Level * 1250)) / 2)) << std::endl;
    

    您需要浮点除法,您可以通过在分子或分母(或两者)中使用浮点数来获得。

    【讨论】:

    • 你是对的。在程序中,这源于我将 EXPTNL 设置为 double 而不是 int,因此即使程序在没有警告的情况下编译,它也会产生我尚未看到的错误数据,因为我没有将 main 函数链接到任何那个班级的东西用于测试:o 三鸟一石。
    【解决方案2】:

    这几乎肯定会导致零值:

    (2 / ((1000 * (Level * 1250))
    

    如果level 非零,1000 * (Level * 1250) 比 2 大得多,在整数除法中,结果为零。

    也许您想使用浮点值,以便您的 EXPTNL 成为浮点计算,然后在最后使其成为整数。

    我还希望 (Level * 1250) * 1000 * 1000 溢出一个 32 位整数,因此您可能希望将其作为浮点计算。

    只需将 1250 个值中的每一个都设置为 1250.0 即可解决问题。

    【讨论】:

    • 感谢您的回答。它帮助我解决了这个问题,但也暴露了我的 exp 计算的一个主要问题,即简化方程的分子我是一个完整的小数点。
    猜你喜欢
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多