【问题标题】:Guarantees of data preservation between int32_t and float?int32_t 和 float 之间的数据保存保证?
【发布时间】:2019-08-20 19:16:22
【问题描述】:

我正在阅读提供的演示板代码(特别是 DC21561A)并找到了这个 sn-p 代码:

int32_t min_current_threshold_code;                                                                                                                                                                                                          
min_current_threshold_code = (min_current_threshold / LTC2946_DELTA_SENSE_lsb) * resistor;                                                                                                                                                   
ack |= LTC2946_write_16_bits(LTC2946_I2C_ADDRESS, LTC2946_MIN_DELTA_SENSE_THRESHOLD_MSB_REG, (min_current_threshold_code << 4));

在这里,第一次赋值的 RHS 上的所有内容都是浮点数。据我所知并已经测试过,使用 LHS int32_t 和 RHS float 的赋值将丢弃浮点数的小数位,只剩下整数;即'1.5 * 3.5 = 5'。

以上数据通过 I2C 写入寄存器。我假设浮点数用于更准确地估计阈值。但是,我想知道在将浮点数分配给 int32_t 时是否需要 C(或 C++)标准或特定于编译器的东西?

编辑** 有些人要求提供更多代码。虽然我的问题得到了回答,但为了彻底,这里是其余的。

在文件的顶部有

float min_current_threshold = read_float();

常量浮点 LTC2946_DELTA_SENSE_lsb = 2.5006105E-05;

const 浮动电阻 = .02;

【问题讨论】:

  • 在截断任何小数部分后将整数值左移 4 次是否有意义?还是要与位域对齐?
  • @WeatherVane 我实际上并没有编写该代码。这是供应商提供的,所以我假设它是正确的(这一点对我来说也没用,所以我并不在意)。我更好奇标准保证了什么。
  • 旁白:代码应该像min_current_threshold_code = lroundf(min_current_threshold / LTC2946_DELTA_SENSE_lsb * resistor * 16);那样在缩放后四舍五入,而不是先截断然后再缩放。
  • @chux 我同意这一点。这是供应商代码库的一部分,还有一些我认为很不稳定的东西,但是,我将重写其中的大部分内容,所以我想我们会看到......
  • 我在您的示例代码中没有看到float... 请您编辑您的问题并在代码的哪一部分指定float 编号(如果正在处理)?如果是这样,使用什么格式存储它?你能描述一下吗?谢谢(所有乘法、除法和移位都是在 32 位整数值上进行的,代码中不涉及浮点运算)

标签: c arduino avr-gcc


【解决方案1】:

是的,标准要求截断,例如在 C99 第 6.3.1.4 章第 1 段中:

当实浮点类型的有限值转换为 _Bool 以外的整数类型时,小数部分被丢弃(即,该值被截断为零)。

【讨论】:

    【解决方案2】:

    6.3.1.4 状态:

    当实浮点类型的有限值转换为整数时 _Bool 以外的类型,小数部分被丢弃(即, 值被截断为零)。如果积分部分的值 不能用整数类型表示,行为未定义。 61)

    然后有一个非规范的脚注解释了上面的文字:

    61) 整数类型的值时执行的求余运算 值转换为无符号类型时不需要执行 真正的浮点类型转换为无符号类型。因此,范围 可移植的实浮点值是 (−1, Utype_MAX+1)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 2012-05-26
      • 2013-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多