C 为什么用622080000替换622.08E6时我的代码不起作用?

C 为什么用622080000替换622.08E6时我的代码不起作用?,c,floating-point,integer,precision,C,Floating Point,Integer,Precision,我最近发现了一个C代码 freq_xtal = ((622.08E6 * vcxo_reg_val->hiv * vcxo_reg_val->n1)/(temp_rfreq)); 从我的直觉看来,622.08E6应该是622.08 x 106。从这个假设来看是正确的 因此,我尝试将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 106。从这个假设来看是正确的

因此,我尝试将622.08e6替换为

uint32_t default_freq = 622080000;
出于某种原因,这似乎不起作用


任何想法或建议都值得赞赏

您遇到的问题,我在这里猜测,因为我没有您代码的其余部分,似乎是用整数替换浮点导致乘法和除法是基于整数的,而不是基于十进制的。因此,现在计算的值是错误的

尝试将uint32\u t类型转换为double,看看这是否会清除它。

问题是由于溢出! 原始表达式622.08E6*vcxo_reg_val->hiv*vcxo_reg_val->n1/temp_rfreq您有太多不必要的括号,但它是以双精度完成的,因为622.08E6是双文本。这将产生一个浮点值

但是,如果用622080000替换文本,那么如果所有变量都是整数,则整个表达式将在整数数学中完成。但更重要的是,整数数学至少比浮点数学溢出的速度要快得多

请注意,UINT32_MAX/622080000.0≈ 6.9. 这意味着只要将常数乘以7,它就会溢出。但是,在代码中,将622080000与其他两个乘积可能大于6的值相乘。您应该添加ULL后缀来计算无符号long


或将变量更改为uint64\u t default\u freq=6220800000ll

什么不起作用,你收到错误了吗?你的值错了吗?我正在尝试编程的芯片在这一次更改中表现不符合预期。你的预期和实际结果是什么?我们没有足够的信息,一些代码可能会有所帮助,使用整数值代替浮动文字是可疑的。这里的主要问题是溢出,而不是整数数学,因为622080000已经非常大了
freq_xtal = (622080000ULL * vcxo_reg_val->hiv * vcxo_reg_val->n1)/temp_rfreq;