c++ double 的平方生成一个负数

c++ the square of double generate a negative number

也许这是一个白痴问题,但我无法弄清楚问题所在。

运行以下代码:

    double num = 0.0;
    double den = 0.0;
    std::string line;
    if (std::getline (file,line))
    {
        std::istringstream iss(line);
        while (iss>>valueLine[j++]){} //Read and parse an entire line
        for (int i = 0; i < numberOfUe; i++)
        {
            num = num + (valueLine[i+1]/1000);
            den = den + ((valueLine[i+1]*valueLine[i+1])/1000000);
        }
        [...]

我在valueLine[i+1] = 57314时得到了那个((valueLine[i+1]*valueLine[i+1])/1000000) = -1010。 错误在哪里?为什么我得到了阴性结果?我错过了什么?

注意:

3284894596  = 57314 * 57314

例如,在我的机器中,INT_MAX 是:

2147483647

这意味着,您是溢出的受害者(这就是您在 Whosebug 中发帖的原因:))。

在您的机器中 INT_MAX 可能有另一个值,但同样小于 57314²。

你可能还想看看这里:

maximum value of int


你转向除法没有任何好处,因为乘法会先发生。您可以使用 unsigned int。在我的机器上:

#include <limits>
#include <iostream>

int main(){

    std::cout << std::numeric_limits<unsigned int>::max() << std::endl;
    unsigned int a = 57314;
    std::cout << a * a << std::endl;
}

给出:

4294967295
3284894596

PS - 你可以用 100 划分每一项,但如果你不小心,你会失去一些准确性。

您很可能遇到溢出。真正大的数字平方在一起可以创建一个无法存储在为您分配的内存中的数字 valueLine[i+1] 所以它 "overflows" 变成负数。

您可以尝试的事情:

  • 使用 unsigned long 类型(例如 uint64_t)而不是 double
  • 如果您需要带符号的值,请尝试使用更大的类型

查看与字体大小相关的 MSDN 文章:MSDN