【问题标题】:Casting in mixed type calculations in C?在 C 中进行混合类型计算?
【发布时间】:2011-02-09 05:52:19
【问题描述】:

如果我定义这些变量:

double x0, xn, h;
int n;

我有这个数学表达式:

h = (xn - x0)/n;

是否有必要在进行除法之前将 n 转换为 double 以获得最大精度,如

h = (xn - x0)/ (double) n;

我编写了一个程序来检查上述内容,但两个表达式给出了相同的答案。我知道 C 会将整数提升为 double 类型,因为变量 xn 和 x0 是 double 类型,但奇怪的是在一本书中,强调了第二个带有强制转换的表达式。

我的问题是我的想法是否正确。

非常感谢...

【问题讨论】:

  • 问题是“第二个表达式中的演员阵容有什么好处吗?”
  • 我的问题是我的想法是否正确。很抱歉没有提到这一点。感谢大家提供帮助的 cmets,这有助于澄清我的一个难点。
  • 如果我理解的很好,操作数总是被提升到最高类型。

标签: c casting types


【解决方案1】:

您的理解是正确的,您阅读的书要么是错误的,要么是过于谨慎(比如有人声称您应该始终测试 0 == x 而不是 x == 0)。没有强制转换的表达式应该总是给出与有强制转换的表达式完全相同的结果。

【讨论】:

  • 如果至少有一个操作数已经是double,则强制转换确实是不必要的。然而,写double f = 3 / 5 很容易,当f 总是为零时,你会感到非常惊讶。我怀疑在浮点表达式中始终强制转换整数参数的建议最终部分来自通常的正确形式:double f = (double)3 / 5
  • 谢谢。在您的情况下,我们也可以写为 f = 3./5 或 f = 3/5。以便启用浮点计算。
【解决方案2】:

不,这种转换是不必要的,因为分子是double。这也将n 提升为double。这本书可能提到显式转换是一个好习惯,因为如果xnx0ints,那么表达式将只使用整数除法。

【讨论】:

  • 谢谢。你的答案和我接受的一样好,但我必须做出选择。
【解决方案3】:

在这种情况下没有必要。在您想要与操作数类型不同的结果的情况下,通常需要它。一个典型的例子是在做计时。你经常会得到类似这样的代码:double(end_time-start_time)/CLOCKS_PER_SEC; 在这种情况下,确实需要强制转换,因为所有输入(通常)都是整数类型,但你想要一个浮点结果。

【讨论】:

  • 谢谢。你的答案和我接受的一样好,但我必须做出选择。
【解决方案4】:

在 C 中,任何表达式的精度都与表达式中涉及的最高精度常量/变量相同。

显式转换很有用:

  • 作为预防措施

明天你可以编辑变量 使用整数的表达式。演员表 仍然会返回正确的值

  • 作为指南

引用/修改你的代码的其他人会很容易理解你正在使用 double

即“让 Ur 代码成为它自己的注释!!”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 2014-07-19
    • 2014-08-25
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多