C:从整数

问题描述:

我有可能会节省大量的调试时间,很多人的问题。减去双...C:从整数

给出一个函数:

void my_func(double value) 

是否有以下的2有什么区别代码行?

double my_value = 1 - value; 

double my_value = 1.0 - value; 

即因为valuedouble,如果我使用1 - value,我可以安心地认为结果是正确的实数,就像使用1.0 - value时一样?

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

+0

非常感谢您的明确和详细的答案! – vav

+1

我认为“更清楚”是_ **非常重要_,因为_someone_稍后会出现,并且看到“1 - 值”并且感到困惑。另外,如果'double my_value = 1 - value;'是'void my_func(double value)'函数声明下面的方法,那么您可能不得不回头去看看实际是什么类型的'value'来理解语句。我会_always_使用'1.0 - 值'。 –

+0

@StephenP,我完全同意你的说法 – vav

是的,你假设正确,但对于更复杂的表达式,你必须非常小心混合整数和浮点值。例如,无辜样子代码:因为计算是在int值完成,并将结果转换为double

double x = 1/2; 

将存储0x

+0

非常感谢你 – vav

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

+2

如果其中一个操作数长双倍,那么long double。 – gnasher729

+0

我没有足够的投票声望,所以我只是感谢所有对我很好回答的人 – vav

+0

@ gnasher729“long double”仅在非SSE指令用于扩展浮点精度时才有意义。如果无法控制是使用8087协处理器(80位精确)还是SSE指令(64位精度),则不知道结果的当前精度。如果使用SSE“长双”将与“双”相同。 – cwschmidt

你是对的。 - 运算符处理相同类型的对象。这里有一个隐式类型的对话,并且int被转换为double。

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

+0

谢谢你的回答 – vav

+0

高兴地帮助:) – DevShark

在您的例子都将行为相同的方式

即考虑到这个值是双倍的,如果我使用1 - 值,我能感到安全,结果将是正确的实数,就像使用1.0值时一样?

使用1.0 - value也不能保证它将是正确的实数。请检查一些文档Floating-Point Arithmetic