【问题标题】:64 bit division64位除法
【发布时间】:2010-09-26 20:20:00
【问题描述】:

谁能给我一个 c 代码来划分 2 个 64 位数字。我的编译器只支持 32/32 除法。

感谢和问候

玛尼

【问题讨论】:

标签: c algorithm 64-bit


【解决方案1】:

在 Linux 内核中寻找其他地方:udivdi3.c

这应该准确地提供了 GCC 在遇到 64 位除法时使用的功能。

【讨论】:

    【解决方案2】:

    除法限制很可能源于您正在为 32 位而不是 64 位进行编译。

    我不记得看到处理 x86 的 64 位整数除法指令。它会将 2 个 32 位整数相乘,然后将结果拆分到 2 个寄存器中,但据我记得不是除法..

    【讨论】:

    • C 抽象了处理器。他不打算在组装上或在处理器上进行本地划分。他只想分道扬镳。即使在没有“div”指令(或类似指令)的系统上,根据 C 标准(正确地)支持除法。
    • x86 post-Athlon64 和 P4 Xeon 上的 64 位除法是 divq
    【解决方案3】:

    更一般的想法是使用多精度库,例如GMP

    GMP 是用于任意精度算术的免费库,可对有符号整数、有理数和浮点数进行运算。除了运行 GMP 的机器中的可用内存所暗示的精度外,对精度没有实际限制。 GMP具有丰富的功能集,并且功能具有规则的接口。

    浮点除法由void mpf_div (mpf_t rop, mpf_t op1, mpf_t op2)处理

    【讨论】:

      【解决方案4】:

      您确定您的编译器不支持 64 位除法吗?如果你的 C 编译器支持 C99,这应该可以工作:

      #include <stdint.h>
      #include <stdio.h>
      int main(void)
      {
          int64_t numerator = 123;
          int64_t denominator = 10;
          int64_t quotient = numerator / denominator
          printf("%" PRId64 " / %" PRId64 " = %" PRId64 "\n",
                 numerator, denominator, quotient);
          return 0;
      }
      

      【讨论】:

      • 不,intX_t 类型是 C99 的 POSIX 扩展。即使在 POSIX 中,也只需要 opengroup.org/onlinepubs/9699919799/basedefs/stdint.h.html
      • "long long" 在 C99 中,保证至少为 64 位。
      • @ysth:intX_t 是标准 C99 的一部分,如果实现提供二进制补码 64 位整数,则需要 int64_t。您还可以使用 C99 中要求的 int_least64_t 并保证至少为 64 位。
      • @ysth:不正确! stdint.h 在 C99 标准中定义(在维基百科中搜索 stdint.h)。它曾经是 POSIX 扩展,现在变成了标准 C。顺便说一句,u_int64_t 仍然是 POSIX 扩展,只有 uint64_t 是 C 标准(注意额外的下划线)。
      【解决方案5】:

      该代码在 linux 中可用,请参阅div64.c。你能复制一下吗?

      【讨论】:

      • 此代码仅适用于 64 位/32 位。对于 64 位/64 位,它愿意接受一个“小”错误以提高速度(因此您会得到一个快速的结果,但并不准确)。
      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 2011-04-04
      • 1970-01-01
      • 2019-11-01
      • 2019-11-01
      相关资源
      最近更新 更多