【问题标题】:Exception for 32 bit number C++32 位数字 C++ 的异常
【发布时间】:2012-12-22 13:56:41
【问题描述】:

为什么会出现异常

Unhandled exception at 0x00000001 in TestingCOA.exe: 0xC0000005: Access violation (parameters: 0x00000008).

当我尝试使用 4294967295 或更高的数字时。在我的机器上,sizeof double 是 8bytes,它应该能够处理和使用2^64 -1 数字,但它会为 32 位数字生成异常,这是为什么呢?

int main()
{
  double n,remainderA;
  int AfterDecimal1[64],RemExponent1;

  cout<< "Enter number\n";
  cin>> n;

  remainderA=a-(int)a;

   HandleFractionNumber(remainderA,AfterDecimal1,RemExponent1);
}


int HandleFractionNumber(double remainder,int (&Goku)[64],int &RemExponent)
{
int x=0;
for(int i=0;;i++)
{
    remainder*=2;
    if(remainder>1)
    {
        remainder-=1;
        Goku[x]=1;
        x++;
    }
    else
        if(remainder<1)
        {
            Goku[x]=0;
            x++;
        }
        if(remainder==1)
        {
            Goku[x]=1;
            break;
        }
        RemExponent=x;
}

【问题讨论】:

  • 4294967295 位数?如果您的意思是输入该值作为值,it works fine。

标签: c++ exception double


【解决方案1】:

Double 不是那样工作的。它是一个具有字段和特定格式的结构(称为IEEE double precision)。并非所有 64 位都可用于尾数。

然而,它应该吃掉你在输入时提到的数字 (4294967295)。你确定这是你放的吗?您引用的程序是 - 全部吗?

【讨论】:

  • 我更新了问题。调用给定函数时出现异常。
  • AfterDecimal1 标识符未找到。无论如何,您的例外与双打无关。可能是写给这个未知的 AfterDecimal1
  • 对不起,我匆忙写了这个问题,所以它有一些错误。有些真的很奇怪。
【解决方案2】:
remainderA = a - (int)a;

在 32 位机器上,如果 a > 429496725,则此处的结果未定义。尝试打印出 remainderA,我敢打赌它很大,导致 HFN 溢出缓冲区。

【讨论】:

    【解决方案3】:

    您的数组边界已用完。

    x++ 永远完成,直到它大于 64。

    在上面的代码中,没有理由让余数也成为一。将 double 与 == 进行比较是不正确的。它仅适用于整数算术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-20
      • 2012-03-13
      • 2014-11-28
      • 2014-12-14
      • 1970-01-01
      • 2014-10-23
      • 2016-09-14
      • 1970-01-01
      相关资源
      最近更新 更多