从浮动到双重,从双重到浮动的精确损失?

时间:2016-04-25 12:09:24

标签: c++ c floating-accuracy

self.buttonLeadingConstraint.constant = self.buttonLeadingConstraint.constant - 50;

 // here 50 is space between button + button width 

应该完全等于original_value吗?任何精度都可能丢失?

1 个答案:

答案 0 :(得分:16)

  

应该完全等于original_value吗?任何精度都可能   丢失?

是的,如果dv的值之间没有变化。

从C99规范转换6.3.1.5实时浮动类型部分开始:

  
      
  1. 当float被提升为double或long double时,或者double是   提升为长双,其价值不变
  2.   
  3. 双人的时候   降级为浮动,长双重降级为双倍或浮动,或者a   值以更高的精度和范围表示   通过其语义类型(见6.3.1.8)显式转换为它   语义类型,如果转换的值可以准确表示   在新类型中,它没有变化。如果转换的值是   可以表示但无法表示的值范围   确切地说,结果是最接近的更高或更接近的更低   可表示的值,以实现定义的方式选择。如果   转换的值超出了可以的值范围   表示,行为未定义
  4.   

对于C ++,请参阅 4.6 conv.fpprom (使用的草稿:n337,我相信最终规格中提供类似的行)

  

float类型的prvalue可以转换为double类型的prvalue。   值未更改。此转换称为浮点   推广。

部分 4.8 又名 conv.double

  

浮点类型的prvalue可以转换为prvalue   另一种浮点类型。 如果源值可以准确   在目的地类型中表示,转换的结果是   确切的表示。如果源值在两个相邻之间   目的地值,转换的结果是   实现定义的这两个值的选择。除此以外,   行为未定义。转换允许作为浮点   促销活动从浮点转化集中排除

所以这些值应该完全相同。