【发布时间】:2015-10-17 15:01:10
【问题描述】:
我需要将两个有符号的 64 位整数 a 和 b 相乘,然后将(128 位)结果转换为有符号的 64 位整数。最快的方法是什么?
我的 64 位整数实际上用fmt 小数位表示定点数。选择fmt 是为了使a * b >> fmt 不会溢出,例如abs(a) < 64<<fmt 和abs(b) < 2<<fmt 与fmt==56 在64 位中永远不会溢出,因为最终结果将是< 128<<fmt,因此适合int64。
我想这样做的原因是快速准确地以定点格式计算 ((((c5*x + c4)*x + c3)*x + c2)*x + c1)*x + c0 形式的五次多项式,每个数字都是带符号的 64 位定点数和 fmt 小数位。我正在寻找实现这一目标的最有效方法。
【问题讨论】:
-
您的问题陈述表明您可能已经尝试过实现。如果是这样,您可以发布您的代码吗?
-
我怀疑最快的方法就是这样做(假设您有一个可以利用的现有 int128 实现)。
-
@ryyker 我没有,我只用 int32、double 和 __float128 尝试过同样的事情,从来没有用过 int64,所以我从来不用处理 int128 结果。
-
@Oliver Charlesworth 这应该是可移植的代码,我不知道有一个可以广泛使用的 int128 实现。我认为不需要 int128 类型的东西是可行的,因为毕竟编译器可能做的事情是我可以在没有 int128 类型的情况下做的事情,对吧?我认为我需要转换以获得 int64 结果可能允许一些聪明的技巧。
-
了解 ISA 的一些信息会很有帮助。写成非便携式的通常要容易得多。
标签: c integer fixed-point int128