-1

为什么我会得到异常

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

当我尝试使用 4294967295 或更高的数字时。在我的机器上, sizeofdouble8bytes应该能够处理和使用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;
}
4

3 回答 3

2

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

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

于 2012-12-22T13:58:10.127 回答
0
remainderA = a - (int)a;

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

于 2012-12-22T17:08:35.420 回答
0

您的数组边界用完了。

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

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

于 2012-12-22T17:14:09.183 回答