mod操作员的困难

问题描述

如果有人能帮助我解决这个问题,我将不胜感激。

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 范围。

剩下的就是简单的除法。

,

您必须在计算的最后(和一次)使用除法以保持精度。

使用除法可能会失去精度。查看蝴蝶效应维基百科页面为什么它可以产生巨大差异。

您可以处理分数,并且只能在打印时进行除法。