为什么GCC在赋值表达式时从表达式中减去1 ?
why does gcc subtract 1 from an expression while assigning the expression?
在解决问题时使用code::阻塞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;
}
之前
您正在进行浮点运算。计算机上的浮点运算不是特别精确。至少不适合base10。可能发生的情况是,您的结果类似于7.9999999999991。标准库中的各种文本流将把它打印为8,但事实并非如此。然后,当你给result[i]
赋值时,它是一个char类型——一个整型——你会从编译器得到标准的"截断。之后的所有内容"的响应。
对此的简单响应是一个舍入操作。在结果上加0.5,然后转换成一个积分。根据你想要解决的问题,有多种解决方案。
您正在使用浮点数学,这将引入舍入误差,然后您还将它们转换为截断的整数(可能是您在程序中想要的)。
经验法则:不要期望浮点数学的精确结果。这些细节可以填满一学期或更长时间的课程。
对于你的程序,你应该知道余数运算,我认为它正是你想要做的:
arr1[i]=temp1 %= 10;
temp1 / =10;
相关文章:
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 表达式中运算符的 GCC 和 ADL
- 如何让 GCC (C++) 停止简化算术表达式?
- C++正则表达式失败(GCC vs Microsoft 编译器)
- 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?
- GCC 7 C++17支持折叠表达式
- GCC 不支持新表达式中的大括号省略号
- 适用于 gcc 4.8 的任何正则表达式库
- gcc 发出了与解析新表达式中的类型 ID 相关的错误
- 使用函数参数作为常量表达式的一部分 - gcc vs clang
- 当使用 require 表达式指定和不使用 require 表达式指定 require 子句时,C++ gcc HEAD
- 在折叠表达式中扩展参数包作为 lambda 捕获的一部分 - gcc 与 clang
- GCC 和 LLVM 中的正则表达式速度相差 1000 倍
- 在折叠表达式中使用 lambda 时"Uninitialized captured reference"错误 - clang vs gcc
- 无限模板递归,因为没有布尔表达式优化,只有 gcc
- 将参数包扩展到具有折叠表达式的lambda -GCC与Clang
- gcc 是否将非常量表达式函数的内置视为常量表达式
- GCC 以错误的方式解包(我<...)折叠表达式
- 为什么不同的 GCC 4.9.2 安装为此正则表达式匹配给出不同的结果
- 二进制表达式中的 GCC 常量临时