为什么会出现异常
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;
}
答案 0 :(得分:2)
Double并不像那样。它是一个具有字段和特定格式的结构(称为IEEE double precision)。并非所有64位都可用于尾数。
然而,它应该在输入时吃掉你提到的数字(4294967295)。你确定这是你放的吗?你引用的程序是否全部?
答案 1 :(得分:0)
remainderA = a - (int)a;
在32位计算机上,如果a> gt,则此处的结果是不确定的。 429496725.尝试打印remainderA
,我打赌它很大,导致HFN
超出缓冲区。
答案 2 :(得分:0)
你的阵列边界已经不多了。
x ++永远完成,直到大于64.
在上面的代码中,没有理由让剩余部分也成为一个。将double与==进行比较是不正确的。它仅对整数算术可靠地起作用。