在做一道题,解一元二次方程,题目本身没什么难度,就不贴了 这个代码是网上找的,可以AC 附完整代码 #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 |
|
简单总结一下我的问题,应该就是:
if(b == 0) printf("%.2f", 0.00) else printf("%.2f", -b/2/a) 和 printf("%.2f", -b/2/a) 这两段代码在什么情况下会不一样? |
|
50分 |
第一种方式,当b==0输出 0.00
第二种方式,当b==0输出 -0.00 |
当然,a要是正数才有负号输出 |
|
double数值 不能跟0直接比较吧
一般不是用 |a-0| < 0.0000001 这种方式么? |
|
试试%.2g
|
|
25分 |
计算机不会骗人,只会按照程序的意图去执行的。
楼主的这个问题的原因在于浮点数(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 |
楼主的这个问题的原因在于浮点数(float/double)的表示方法,按照IEEE754的标准,零是区分正零和负零的(-0.0, +0.0)
|
|
25分 |
#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 */ |