gpt4 book ai didi

c - 在 int 溢出附近进行计算的聪明方法

转载 作者:行者123 更新时间:2023-12-04 11:04:45 24 4
gpt4 key购买 nike

有什么聪明的方法可以解决这个问题吗?

uint32_t a = 16637510;
uint32_t b = 45627362;
uint32_t c = 0;
c = a * 100000 / b //overflows
c = (a * 100/b)*1000 //gives 36000

我需要得到结果 c = 36463 或更好的 36464。而且需要快速的非浮点运算。 CPU是stm32f4

更新:

接受的答案是将 100000 转换为 100000ULL(64 位),但正如@PeterJ 建议的(并删除了他的答案),使用 stm32f4 FPU 比 64 次除法操作更快

Timer t;
int i;
t.start();
for(i = 1; i <= 100000; ++i) c = a * 100000ULL / b;
t.stop();
printf("64\ttakes %f seconds, du is %d\n", t.read(), c);
t.reset();
t.start();
for(i = 1; i <= 100000; ++i) c = (uint32_t)((float)a * 100000.0f / (float)b);
t.stop();
printf("float\ttakes %f seconds, du is %d\n", t.read(), c);
t.reset();

64 takes 0.086669 seconds, du is 57333
float takes 0.017779 seconds, du is 57333

最佳答案

这个怎么样?

c = a * 100000ULL / b; // gives 36463

参见 https://godbolt.org/g/aemCyw对于 gcc 为此操作生成的程序集和溢出的原始 c = a * 100000/b。请注意,使用 __aeabi_uldivmod 而不是 __aeabi_uidiv

关于c - 在 int 溢出附近进行计算的聪明方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44955688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com