如果有人能帮我解决这个问题,我将不胜感激。
一个C程序包含以下声明和初始赋值。
int i = 8, j = 5;
float x = 0.005, y = - 0.01;
char c = 'c', d = 'd';
使用分配给表达式的变量的值确定以下表达式的值:
(i - 3 * j) % ( c + 2 *d)/ (x - y )
我先手动尝试了一下:
( i- 3 * j) % ( c + 2 *d ) / ( x - y)
( 8 - 3*5) % ( 99 + 2 * 100 ) / ( 0.005 - (-0.01) )
( -7 ) % ( 299 ) / ( 0.015 )
考虑到优先级和关联性,我首先使用了mod运算符:
( 292 ) / ( 0.015 )
这给出了19466.66的答案。
这与书中给出的答案或我在代码块中使用它时的答案不匹配,这两个代码块的答案都是- 466.6667
代码块程序如下所示
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 8,j = 5, c = 'c',d = 'd';
float x = 0.005, y = -0.01, a = 0.0; // a is the float variable to which the value is assigned
a = (i-3*j)%(c+2*d)/(x-y);
printf("%f\n",a);
return 0;
}
发布于 2021-03-31 05:55:57
关键是除法前的整数部分:
(i-3*j)%(c+2*d)
其中它的计算结果为:
(8-3*5) % (99 + 2 * 100)
(8-15) % (99 + 200)
-7 % 299
因此,现在它取决于C正在使用的modulo定义,因为它可能有几个定义。C将其解释为-7
,而其他语言总是映射到0到298的范围。
剩下的只是简单的除法。
发布于 2021-03-31 05:39:38
你必须在计算的最后(也是一次)使用除法来保持精度。
使用除法,您可能会失去精度。看看维基百科页面上的“蝴蝶效应”,它为什么能带来巨大的差异。
您可以使用分数,并且仅在打印时除法。
https://stackoverflow.com/questions/66882219
复制