gpt4 book ai didi

c - Left Shift 和 Right Shift 防止除法丢失

转载 作者:太空宇宙 更新时间:2023-11-04 04:22:32 28 4
gpt4 key购买 nike

我不允许在我的 C 代码中使用浮点变量(出于性能原因)。我想进行整数除法运算,同时我想尽可能地防止除法损失。

我的理解是,如果分子很大,除法运算会产生很好的结果。目前我正在对分子进行左移操作以使其成为一个大数,然后我将分子除以分母。在最终结果中,我正在做右移以补偿我原来的左移操作。我的问题是,这会改善除法结果吗?

例如为了实现x = y/z,我正在编写我的“C”代码如下,

x = y << 4;
x = x / z;
x = x >> 4;

最佳答案

split 损失到底是什么意思?

如果你想要一个舍入除法,比如 div(19,10) -> 2,你知道 xy 是积极的,你可以这样做:

(x + y / 2) / y

除以 2 与除以 y 相比非常有效,除非 y 是编译时间常量,在这种情况下,除法将被编译成乘法加调整。

您还必须避免除法溢出,例如除以 0INT_MIN 除以 -1

如果你想计算缩放比例,你必须在除法之前执行乘法:

out = out * ratio_n / ratio_d;

*/ 具有相同的优先级并且是左结合的,这意味着 a * b/c 被解析为 ( a * b)/c.

您可能需要为中间结果使用更大的类型:

out = (long long)out * ratio_n / ratio_d;

你可以结合这两种技术:

out = ((long long)out * ratio_n + ratio_d / 2) / ratio_d;

如果你的系统有 16 位的 int,你应该只使用 long 作为中间类型,因为它保证至少有 32 位:

out = ((long)out * ratio_n + ratio_d / 2) / ratio_d;

但是请注意,如果结果超出类型 int 的范围,则行为由实现定义。

关于c - Left Shift 和 Right Shift 防止除法丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45154058/

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