c语言正分数的判断用a1*b2-a2*b1为什么不对?

按a1/b1 a2/b2格式输入分数,已经知道 四个数都是正整数并比较分数大小。用a1*b2-a2*b1的正负号进行判断一直有个例子不能过。改来改去,试用了“re=1.0*a1/b1-1.0*a2/b2;”的符号判断,就过了,不知道这两个式子为什么会不一个样?可以解释一下原因吗?或者举个例子也可以。


#include <stdio.h>


int main() {

        int re,T,a1,b1,a2,b2;

        char op;

        printf("T = ");//T待测实例数

        scanf("%d",&T);

        while(T--) {

                scanf("%d%d%d%d",&a1,&b1,&a2,&b2);

                re = a1*b2 - a2*b1;//全部都是整数,运算结果必然是整型数

                if(re > 0) op = '>';

                else if(re < 0) op = '<';

                else op = '=';

                printf("%d/%d %c %d/%d\n",a1,b1,op,a2,b2);

        }

        printf("\n");

        return 0;

}

追问

不是,这个问题主要是用a1*b2-a2*b1判断,有一个测试例子失败了。而用1.0*a1/b1-1.0*a2/b2判断就全部通过了。网站自动测试的,我不知道测试用例。就想来问问,这个两个方法有什么不同?什么测试用例,会让用a1*b2-a2*b1判断会出错。我自己也试了很久,用循环结构,也穷举了从1到300000的数,两个方法的答案都一样。😫还是不知道这两个方法有什么区别?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-01-18
a/b两个整型数相除会取整,和数学上的a/b不等
例如6/4得到是1,不是1.5
第2个回答  2021-01-18
作为一名程序员,运行了一下 re = a1 * b2 - a2 * b1,未发现任何异常。能否说明“直有个例子不能过”具体什么例子吗追问

我也不知道。/(ㄒoㄒ)/~~那是线上的题,网站会有5个例子进行测试。但那是网站自动测试的。我只能知道测试结果。所以,我希望能有个例子也好。

本回答被网友采纳
第3个回答  2021-01-19
这个应该就是溢出了。

试试这个例子:
2/3与1/2147483647比较大小。本回答被提问者采纳