问题描述
如果有人能帮助我解决这个问题,我将不胜感激。
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;
}
解决方法
这里的关键是除法前的整数部分:
(i-3*j)%(c+2*d)
计算结果为:
(8-3*5) % (99 + 2 * 100)
(8-15) % (99 + 200)
-7 % 299
所以现在这取决于 C 使用的 modulo 的定义,因为它可能有几个。 C 将其解释为 -7
而其他语言始终映射到 0 到 298 范围。
剩下的就是简单的除法。
,您必须在计算的最后(和一次)使用除法以保持精度。
使用除法可能会失去精度。查看蝴蝶效应维基百科页面为什么它可以产生巨大差异。
您可以处理分数,并且只能在打印时进行除法。