我最近遇到了一个 C 代码(顺便说一下),我发现
freq_xtal = ((622.08E6 * vcxo_reg_val->hiv * vcxo_reg_val->n1)/(temp_rfreq));
从我的直觉看来, 622.08E6 应该意味着 622.08 x 10 6。从这个问题来看,这个假设是正确的。
所以我尝试将 622.08e6 替换为
uint32_t default_freq = 622080000;
由于某种原因,这似乎不起作用
任何想法或建议表示赞赏
我最近遇到了一个 C 代码(顺便说一下),我发现
freq_xtal = ((622.08E6 * vcxo_reg_val->hiv * vcxo_reg_val->n1)/(temp_rfreq));
从我的直觉看来, 622.08E6 应该意味着 622.08 x 10 6。从这个问题来看,这个假设是正确的。
所以我尝试将 622.08e6 替换为
uint32_t default_freq = 622080000;
由于某种原因,这似乎不起作用
任何想法或建议表示赞赏
您遇到的问题(我在这里推测,因为我没有您的其余代码)似乎是用整数替换浮点导致乘法和除法基于整数,而不是基于小数。结果,您现在计算了错误的值。
尝试将您的 uint32_t 类型转换为双精度,看看是否可以清除它。
原始表达式(622.08E6 * vcxo_reg_val->hiv * vcxo_reg_val->n1)/temp_rfreq(尽管您有太多不必要的括号)是double精确完成的,因为622.08E6它是double文字。这将产生一个浮点值
但是,如果您将文字替换为,622080000那么如果所有变量都是整数,则整个表达式将在整数数学中完成。但更重要的是,整数数学会溢出(至少比浮点数快得多)
请注意UINT32_MAX / 622080000.0 ≈ 6.9. 这意味着只需将常数乘以 7,它就会溢出。但是,在代码中,您将 622080000 乘以 2 个其他值,其乘积可能高于 6。您应该添加ULL后缀以进行数学运算unsigned long long
freq_xtal = (622080000ULL * vcxo_reg_val->hiv * vcxo_reg_val->n1)/temp_rfreq;
或将变量更改为uint64_t default_freq = 622080000ULL;