【发布时间】: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 位整数值上进行的,代码中不涉及浮点运算)