【问题标题】:c++ Can I Initialize a variable of type float with a double?c++ 我可以用双精度值初始化浮点类型的变量吗?
【发布时间】:2017-04-09 02:27:42
【问题描述】:

还没有真正能找到很多关于这个。虽然当我使用 double 初始化 float 类型的变量时编译器似乎没有抱怨,例如

double a = 1.0;
float b = a;

它工作正常,但我仍然很好奇这样做是否可以,和/或它是否安全?

(我在运行 windows 的 32 位系统上)

【问题讨论】:

  • @coddding 在答案中应该假设“安全”的定义是什么?

标签: c++ types floating-point initialization double


【解决方案1】:

4.8 浮点转换

1 浮点类型的纯右值可以转换为另一种浮点类型的纯右值。如果 源值可以精确地表示在目标类型中,转换的结果就是精确的 表示。如果源值介于两个相邻的目标值之间,则转换结果 是这些值中任何一个的实现定义的选择。否则,行为未定义。

【讨论】:

  • 最后一个子句(未定义的行为)适用于目标格式可表示范围之外的源值。因此,声明“通常”未定义的行为结果是不正确的。对于doublefloat 转换的具体情况,第一个子句适用于5.0 等源数据;第二个子句适用于3.14159265358979323 等源数据;最后一个子句适用于 1e308 等源数据。
  • 一般来说,它不是未定义的行为。
  • @njuffa 问题是“我可以用双精度值初始化浮点类型的变量吗?”。 1 只是一个样本值,1e308 可能是另一个样本。我不是母语人士,但我的意思是“在一般情况下,即没有关于floatdouble 的表示的假设,也没有对具体值的假设,它是UB”。
  • @PeteBecker 你的意思是说“一般来说float x = any_double()是UB”是不正确的吗? (我打算回答关于双浮点赋值的一般问题,不限于特定值。)
  • @AlexD - 如果您随机选择 double 值,它很可能无法转换为 float。但是,如果您选择人们通常想要转换为floatdouble 值(如这里的初始化示例中所示),则转换是有效的并且定义明确的。 “一般来说”在这里没有帮助。
【解决方案2】:

创建的变量大小不同。 “float = 4 bytes”和“double = 8 bytes”。因此,这里重要的是两种类型的值范围不同。如果您使用较小的值作为 1.0,它应该不会影响工作流程。

【讨论】:

    【解决方案3】:

    顾名思义,double 的精度是 float[1] 的 2 倍。一般来说,double 有 15 个小数位精度,而 float 有 7 个。

    位数的计算方法如下:

    double has 52 mantissa bits + 1 hidden bit: log(253)÷log(10) = 15.95 digits
    
    float has 23 mantissa bits + 1 hidden bit: log(224)÷log(10) = 7.22 digits
    

    也许你会失去精确度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 2010-12-19
      • 2018-06-16
      相关资源
      最近更新 更多