C语言一个诡异的问题,百思不得其解

你怎么了熊吉 2015-05-28 09:33:27
在做一道题,解一元二次方程,题目本身没什么难度,就不贴了
关键是代码里有这么一句:


这个代码是网上找的,可以AC
但我不明白这个if 有什么意义,试着去掉图中前三行,留下最后一行,当然代码其余部分不变,结果就会有一个测试点通不过
百思不得其解,故来提问


附完整代码

#include <stdio.h>
#include <math.h>

int main()
{
double a, b, c;
scanf("%lf%lf%lf", &a, &b, &c);
if(!a && !b)
{
printf(c?"Not An Equation":"Zero Equation");
return 0;
}
if(!a)
{
printf("%.2f", -c/b);
return 0;
}
double delta = b*b - 4*a*c;
if(delta == 0)
{
printf("%.2f", -b/2/a);
}
else if(delta > 0)
{
printf("%.2f\n%.2f", (-b+pow(delta, 0.5))/2/a, (-b-pow(delta, 0.5))/2/a);
}
else
{
if(b == 0)
printf("%.2f+%.2fi\n%.2f-%.2fi", 0.00, pow(-delta, 0.5)/2/fabs(a), 0.00, pow(-delta, 0.5)/2/fabs(a));
else
printf("%.2f+%.2fi\n%.2f-%.2fi", -b/2/a, pow(-delta, 0.5)/2/fabs(a), -b/2/a, pow(-delta, 0.5)/2/fabs(a));
}
return 0;
}



题目在这里http://www.patest.cn/contests/basic-programming/%E5%88%86%E6%94%AF-18
...全文
196 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
FightForProgrammer 2015-05-28
  • 打赏
  • 举报
回复
引用 2 楼 FightForProgrammer 的回复:
第一种方式,当b==0输出 0.00 第二种方式,当b==0输出 -0.00
当然,a要是正数才有负号输出
FightForProgrammer 2015-05-28
  • 打赏
  • 举报
回复
第一种方式,当b==0输出 0.00 第二种方式,当b==0输出 -0.00
你怎么了熊吉 2015-05-28
  • 打赏
  • 举报
回复
简单总结一下我的问题,应该就是:

if(b == 0)
  printf("%.2f", 0.00)
else
  printf("%.2f", -b/2/a)

  printf("%.2f", -b/2/a)
这两段代码在什么情况下会不一样? 其中a,b都是double
赵4老师 2015-05-28
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    int    i, n;
    char   s[sizeof(double)];
    double a = -1.0;
    double b = +1.0;

    n = sizeof(s);

    while (a != 0.0) {
        a = a / 2.0;
    }
    printf("a=%.2g\n", a);
    memcpy(s, &a, sizeof(s));
    for (i = 0; i < n; i++) {
        printf("%02x ", (unsigned char)s[i]);
    }
    printf("\n");

    while (b != 0.0) {
        b = b / 2.0;
    }
    printf("b=%.2g\n", b);
    memcpy(s, &b, sizeof(s));
    for (i = 0; i < n; i++) {
        printf("%02x ", (unsigned char)s[i]);
    }
    printf("\n");

    return 0;
}

/* 输出:
a=0
00 00 00 00 00 00 00 80
b=0
00 00 00 00 00 00 00 00
*/

mymtom 2015-05-28
  • 打赏
  • 举报
回复
楼主的这个问题的原因在于浮点数(float/double)的表示方法,按照IEEE754的标准,零是区分正零和负零的(-0.0, +0.0)
mymtom 2015-05-28
  • 打赏
  • 举报
回复
计算机不会骗人,只会按照程序的意图去执行的。 楼主的这个问题的原因在于浮点数(float/double)的表示方法,按照IEEE754的标准,零是正零和负零的(-0.0, +0.0) 题目的意思要求 b==0的时候要按正零输出,这就是你所说的"结果就会有一个测试点通不过" 看下面的程序你就会明白了。

#include <stdio.h>
#include <string.h>

int
main(int argc, char *argv[])
{
    int    i, n;
    char   s[sizeof(double)];
    double a = -1.0;
    double b = +1.0;

    n = sizeof(s);

    while (a != 0.0) {
        a = a / 2.0;
    }
    printf("a=%.2f\n", a);
    memcpy(s, &a, sizeof(s));
    for (i = 0; i < n; i++) {
        printf("%02x ", (unsigned char)s[i]);
    }
    printf("\n");

    while (b != 0.0) {
        b = b / 2.0;
    }
    printf("b=%.2f\n", b);
    memcpy(s, &b, sizeof(s));
    for (i = 0; i < n; i++) {
        printf("%02x ", (unsigned char)s[i]);
    }
    printf("\n");

    return 0;
}

/* 输出:
a=-0.00
00 00 00 00 00 00 00 80 
b=0.00
00 00 00 00 00 00 00 00 
*/
a=-0.00 00 00 00 00 00 00 00 80 b=0.00 00 00 00 00 00 00 00 00
赵4老师 2015-05-28
  • 打赏
  • 举报
回复
试试%.2g
老王爱上猫 2015-05-28
  • 打赏
  • 举报
回复
double数值 不能跟0直接比较吧 一般不是用 |a-0| < 0.0000001 这种方式么?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧