c ++ double的平方生成负数

时间:2015-09-22 21:41:49

标签: c++ double

也许这是一个愚蠢的问题,但我无法弄清楚问题。

运行以下代码:

    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]*valueLine[i+1])/1000000) = -1010时获得了valueLine[i+1] = 57314。 错误在哪里?为什么我得到了否定结果?我缺少什么?

2 个答案:

答案 0 :(得分:3)

请注意:

3284894596  = 57314 * 57314
例如,在我的机器中,INT_MAX是:

2147483647

这意味着,你是溢出的受害者(这就是为什么你在Stackoverflow中发布的好处:) :)。

在你的机器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,但如果您不小心,则会失去一些准确性。

答案 1 :(得分:1)

你很可能会遇到溢出。真正的大数平方可以创建一个无法存储在为elements.style{ display: block; } 分配的内存中的数字,因此它会“溢出”到负数中。

你可以尝试的事情:

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

查看与MSDN相关的文章类型:MSDN