为什么gcc在分配表达式时从表达式中减去1?

时间:2015-10-18 15:18:15

标签: c++ gcc

在使用代码解决问题时::阻止IDE和C ++这样的表达式 result[i] += ((res*1.0 /10)-(res/10)) * 10;,如果在result[i]分配后,正确表达式的结果为8,则它变为7,因此result[i]包含7而不是8。

这是整个功能: 它需要两个数字并将它们转换为数组。例如。 34变为{4,3},因此我将数字添加为数组,而不是正常数字。

void add(char a, char b) { //get # digits of both int n1=0; int n2=0; char temp1=a; char temp2=b; //counting # digits of first number while( (temp1*1.0/10) != 0 ) { n1++; temp1/=10; } //counting # digits of second number while( (temp2*1.0/10) != 0 ) { n2++; temp2/=10; } int maxi=max(n1,n2); int mini=min(n1,n2); //filling arr1 arr2 char * arr1=new char[n1]; char * arr2=new char[n2]; char * result=new char[maxi+1]; //fill result with zeros for(int k=0; k<maxi+1; k++) result[k]=0; temp1=a; for(int i=0; i<n1; i++) { arr1[i]=((temp1*1.0 /10)-(temp1/10)) * 10; temp1/=10; } temp2=b; for(int j=0; j<n2; j++) { arr2[j]=((temp2*1.0 /10)-(temp2/10)) * 10; temp2/=10; } //add both arrays char res=0; char overflow=0; for(int i=0; i<maxi; i++) { if(i<mini) { res=arr1[i]+arr2[i]; if(checkDigit(res)) { result[i]=res; } else { //////////////////////////// //>>>>>>>> result[i] += ((res*1.0 /10)-(res/10)) * 10; /////////////////////////// overflow=res/10; result[i+1]=overflow; } } else { if(n1<n2) { result[i]+=arr2[i]; } else if(n2<n1) { result[i]+=arr1[i]; } } } if(!checkDigit(result[maxi-1])) { // assign overflow before result[maxi]=result[maxi-1]/10; result[maxi-1]=((result[maxi-1]*1.0 /10)-(result[maxi-1]/10)) * 10; } for(int i=0; i<maxi+1; i++) cout<<(int)result[i]<<endl; }

2 个答案:

答案 0 :(得分:2)

您正在进行浮点运算。计算机上的浮点运算不是特别准确。无论如何不适用于base10。可能发生的是你的结果是7.9999999999991。标准库中的各种文本流将打印为8,但事实并非如此。然后,当你分配给result[i],这是一个字符 - 一个整体类型 - 你得到标准&#34;砍掉后的所有内容。&#34;来自编译器的响应。

对此的简单回应是圆形操作。将.5添加到结果中,然后转换为积分。虽然取决于您尝试解决的问题,但这个问题有多种解决方案。

答案 1 :(得分:1)

您正在使用浮点数学,这将引入舍入错误,然后您还将它们转换为截断的整数(可能是您在程序中想要的)。

经验法则:不要指望使用浮点数学的精确结果。这些细节将填补一个学期或更长时间的课程。

对于你的程序,你应该知道剩余的操作,我认为它确实是你打算做的:

arr1[i]=temp1 %= 10;
temp1 / =10;