【问题标题】:Why float data type treats X/Y (Eg 5/9) and X.0/Y.0 (Eg 5.0/9.0) differently?为什么浮点数据类型对 X/Y(例如 5/9)和 X.0/Y.0(例如 5.0/9.0)的处理方式不同?
【发布时间】:2020-09-01 04:08:11
【问题描述】:

我正在用 C 语言编写这段代码,但无法理解这两个代码得到不同答案的原因。

首先写入不带小数点的值

float num2=(5/9);

这给了我如下输出:

0.000000

带小数点

float num2=(5.0/9.0);

这给了我如下输出:

0.555556

这种不同答案背后的工作原理或理论是什么?

【问题讨论】:

  • 因为5/9是一个整数除法,提供一个整数值0,然后,这个整数值被转换为一个浮点数0.000000
  • 感谢您的回答先生,但您能否告诉我为什么在使用数据类型 float 时会发生整数除法?知道我可以在哪里阅读什么内容以了解更多信息吗?谢谢
  • 奇怪地与this question posted a few minutes ago相关。它不会变成float,直到 after rhs 上的表达式被求值并且赋值开始起作用;该表达式纯粹是5/9 中的int,每个整数除法规则为零。只有然后才会转换为float,从而变成0.0。通过5/9.f5.f/9 或其中的其他组合强制它浮动。
  • 这很有见地。感谢您的帮助

标签: c floating-point type-conversion


【解决方案1】:

C 从“底部”向上计算表达式。

在顶部,声明 float num2=(5/9); 包含表达式 (5/9)。该表达式包含5/9。该表达式在操作数59 上使用运算符/。这些操作数在底部。

59int 类型的文字。 5/9 使用 int 算术评估。结果是int 值为零。然后计算括号,所以(5/9) 实际上是(0),所以它为零。然后这个零被转换为float,用于初始化num2

因为表达式是自下而上计算的,所以它们会受到它们使用的操作数的影响。它们不受所处上下文的影响。表达式最终将分配给float 的事实不会导致使用float 对其进行评估。

【讨论】:

    【解决方案2】:

    5 和 9 都是整数。所以,5/9 的结果是0。一切都在整数级别完成,然后放入 float num2 变量。要获得实际的真实答案0.555556,您需要至少有一个数字作为浮点数或实数。 5.0/95/9.0 或类型转换其中之一,(float)5/9 也可以。

    理论上,这些数字被转换/升级为更高的数据类型(忘记了正确的术语)。就像5/9.0 的情况一样,这里的5 首先转换为5.0,然后进行除法运算。因此,C 在进行右侧操作时不会查看指令的左侧。

    【讨论】:

    • 谢谢,我应该阅读什么来了解更多关于不同数据类型的算术工作方式的信息?
    • @MankritSingh:虽然不打算作为教程或教学参考,但语言规范是最好的来源 - 请参阅 C 2011 Online Draft,第 6.3.8.1 节(通常的算术转换),6.5.5(乘法)运算符)和 6.5.6(加法运算符)
    【解决方案3】:

    C 将 5 和 9 视为整数,因为它们是。所以它在整数级别进行操作,即 5/9 确实为零。然后,将此结果分配给 num2 变量。

    当你写 5.0/9 时,C 看到 5.0 是一个浮点值,所以它会在 float 中进行运算,这会给你一个不同的结果,现在这个结果将分配给你的 num2。

    你也可以这样写

    num2=(float)5/9; //or
    num2=5/(float)9; //or
    num2=5/9.0;
    

    无论哪种方式,您都将一个操作数提升为浮动级别,因此整个操作将在浮动级别上进行。

    【讨论】:

    • 5.09.0 的类型为 double,而不是 float5/9.0 使用 double(或更好)而不是 float 进行评估。在num2=5/9.0 中,double 结果转换为float 以进行分配。在某些情况下,这将产生与在float 而不是double 中执行计算不同的结果。程序员应该对这些细节敏感。
    猜你喜欢
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多