有没有什么聪明的方法来解决这个问题?智能的方式来做近似int溢出计算
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需要0.086669秒,杜是57333
浮子需要0.017779秒,杜是57333
不用担心。你不喜欢它 - 我把它删除:) –
只有大概的32位数学解决方案存在。 'a,b'的范围是什么?什么是容忍误差(+/- 1?) – chux
溢出有多常见?他们是一个例外,还是他们发生在每个数据集? – ensc