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;
即鉴于value
是double
,如果我使用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 即使在double
和long double
具有相同实现的系统上,仍然会发生类型提升——它们仍然是不同的类型。 C 的选择部分将产生与 _Generic()
和指针转换不同的结果。
@chux:这就是我想说的:如果您无法控制使用哪一个,例如通过编译器选项,要明确,不要依赖正确的提升,因为你可能会得到意想不到的结果。【参考方案4】:
你是对的。 - 运算符适用于相同类型的对象。这里有一个隐式类型的对话,int转换为double。
请注意,当混合有符号和无符号类型时,这可能是错误的来源。
【讨论】:
感谢您的回答【参考方案5】:在您的示例中,两者的行为方式相同
即鉴于该值为双倍,如果我使用 1 - 值,我是否可以放心,结果将是正确的实数,就像使用 1.0 - 值时一样?
还有1.0 - value
,你不能确保它是正确的实数。检查一些文档以获取Floating-Point Arithmetic。
【讨论】:
以上是关于C:从整数中减去双精度的主要内容,如果未能解决你的问题,请参考以下文章
C ++ 11中“auto var = condition?1:1.0”的类型是啥?它是双精度还是整数?