C:从整数中减去双精度

Posted

技术标签:

【中文标题】C:从整数中减去双精度【英文标题】:C: Substract double from integer 【发布时间】: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 时一样?

【问题讨论】:

【参考方案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。

【讨论】:

以上是关于C:从整数中减去双精度的主要内容,如果未能解决你的问题,请参考以下文章

Sscanf 将读取整数而不是双精度数 (c)?

C ++ 11中“auto var = condition?1:1.0”的类型是啥?它是双精度还是整数?

如何从 XML 获取整数/双精度值

将负双精度转换为无符号整数的行为是不是在 C 标准中定义? ARM 与 x86 上的不同行为

如何从c ++中的文件中读取双精度

SSE2:将二维数组中的有符号整数与双精度数相乘并将结果相加在 C 中