C'浮动'生成随机答案

时间:2017-02-12 01:51:14

标签: c floating-point division

我的输出应该是:

ch = *
f = 200
ch = /
f = 0.50

但由于某种原因,每次运行程序时“/”的情况都是一个随机数。 1639747584和下一个我得到206200832,这是为什么?它也是我使用'float'而不是'int'的程序的唯一部分。

我的代码:

#include <stdio.h>
#include <float.h>

void main() {
    char ch; 
    int f;
    int a = 10, b = 20;

    ch = '*';
    printf("ch = %c\n", ch);
    switch (ch) {
        case '*': f = a * b; printf("f = %d\n", f);
        break;
        case '/': f = a / b; printf("f = %d\n", f);
        default: printf("invalid operator\n");
    }
    ch = '/';
    printf("ch = %c\n", ch);
    (float) f;
    switch (ch) {
        case '*': f = a * b; printf("f = %d\n", f);
        case '/': f = a / b; printf("f = %d\n", f);
        break;
        default: printf("invalid operator\n");
    }
}

好吧,我用一个新变量替换了'(float)f'行,更改了print命令,并将(a / b)转换为'float',但现在我只得到0.00作为结果。还有什么不对?

更新的代码:

    ch = '/';
    printf("ch = %c\n", ch);
    float g;
    switch (ch) {
        case '*': f = a * b; printf("f = %d\n", f);
        case '/': g = (float)(a / b); printf("f = %.2f\n", g);
        break;
        default: printf("invalid operator\n");
    }

1 个答案:

答案 0 :(得分:0)

int a = 10, b = 20;
float g = (float)(a / b);  // problem code

执行a/b的整数除法。结果是int。将该商投射到(float)不能恢复作为整数除法的一部分而丢弃的分数。确保参数在分割之前是浮点数。

float g = (float) a / b;
// or better
// in general, better to avoid casts to accomplish coding goals.
float g = 1.0 * a / b;
// or 
float g = a;
g /= b;
(float) f;

这行代码无效。它是int变量ffloat值的强制转换。该转换的结果被丢弃,代码行可能被优化,导致没有发出与之相关的可执行代码。

要在单个对象中保存不同类型的数据,请使用union并跟踪上次用于向其保存数据的字段。

struct universal {
  char kind; 
  union {
    int i;
    float f;
  } u;
} y;

switch (ch) {
  case '*': 
    y.kind = 'i';
    y.u.i = a * b;
    break;
  case '/': 
    y.kind = 'f';
    y.u.f = (float) a / b;
    break;
  default:
    y.kind = 0;
}

switch (y.kind) {
  case 'f' : printf("y = %f\n", y.u.f); break; //or "%.2f" for only 2 places to right of .
  case 'i' : printf("y = %d\n", y.u.d); break;
  default  : printf("y = ?\n"
}