【问题标题】:C: Substract double from integerC:从整数中减去双精度
【发布时间】:2016-06-14 14:20:40
【问题描述】:

我有一个问题可能会为很多人节省大量调试时间...

给定一个函数:

void my_func(double value)

下面两行代码有什么区别吗?

double my_value = 1 - value;

double my_value = 1.0 - value;

即鉴于valuedouble,如果我使用1 - value,我是否可以放心,结果将是正确的实数,就像使用1.0 - value 时一样?

【问题讨论】:

    标签: c arithmetic-expressions


    【解决方案1】:

    没有区别。要从int 中减去double,必须将int 提升为double。我个人更喜欢使用1.0,因为我认为这更清楚地表明它不是整数减法。但这纯粹是风格问题。

    【讨论】:

    • 非常感谢您清晰详细的回答!
    • 我认为“让它更清楚”是非常重要,因为有人稍后会出现并看到@987654326 @ 并感到困惑。此外,如果double my_value = 1 - value;void my_func(double value) 函数声明下方的一个方式,您可能需要回头看看value 实际上是什么类型才能理解该语句。我会总是使用1.0 - value
    • @StephenP,我完全同意你的看法
    【解决方案2】:

    是的,你的假设是正确的,但是对于更复杂的表达式,你必须非常小心地混合整数和浮点值。比如看起来很无辜的代码:

    double x = 1 / 2;
    

    会将0 存储到x,因为计算是在int 值上完成的,结果将转换为double

    【讨论】:

      【解决方案3】:

      如果算术运算符的任一操作数是浮点数,则计算以浮点算术进行。除非两个操作数都是浮点数,否则计算以双精度进行,在这种情况下,计算以浮点数进行。

      【讨论】:

      • 如果操作数之一是 long double,则 long double。
      • 我在投票方面没有足够的声誉,所以我只是感谢所有回答我的人
      • @gasher729 "long double" 仅在非 SSE 指令用于扩展浮点精度时才相关。如果您无法控制是使用 8087 协处理器(80 位精度)还是 SSE 指令(64 位精度),则您不知道结果的当前精度。如果使用 SSE,“long double”将与“double”相同。
      • @cwschmidt 即使在doublelong double 具有相同实现的系统上,仍然会发生类型提升——它们仍然是不同的类型。 C 的选择部分将产生与 _Generic() 和指针转换不同的结果。
      • @chux:这就是我想说的:如果您无法控制使用哪一个,例如通过编译器选项,要明确,不要依赖正确的提升,因为你可能会得到意想不到的结果。
      【解决方案4】:

      你是对的。 - 运算符适用于相同类型的对象。这里有一个隐式类型的对话,int转换为double。

      请注意,当混合有符号和无符号类型时,这可能是错误的来源。

      【讨论】:

      • 感谢您的回答
      【解决方案5】:

      在您的示例中,两者的行为方式相同

      即鉴于该值为双倍,如果我使用 1 - 值,我是否可以放心,结果将是正确的实数,就像使用 1.0 - 值时一样?

      还有1.0 - value,你不能确保它是正确的实数。检查一些文档以获取Floating-Point Arithmetic

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 2016-12-19
        相关资源
        最近更新 更多