64-битное деление

Может ли кто-нибудь прислать мне код c для разделения 2 64-битных чисел. Мой компилятор поддерживает только деление 32/32.

Спасибо и с уважением

Мани


person Community    schedule 14.12.2008    source источник
comment
Ваша опечатка в заголовке вопроса заставила меня подумать, что вы принимаете решение между 64 и 32 битами, а не ищете алгоритм деления.   -  person Greg D    schedule 14.12.2008
comment


Ответы (5)


Вы уверены, что ваш компилятор не поддерживает 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;
}
person Tom    schedule 14.12.2008
comment
Нет, типы intX_t являются расширением POSIX для C99. И даже в POSIX требуются только ‹ 64-битные типы. См. opengroup.org/onlinepubs/9699919799/basedefs/stdint.h.html. - person ysth; 14.12.2008
comment
long long находится в C99 и гарантированно будет не менее 64 бит. - person ShreevatsaR; 14.12.2008
comment
@ysth: intX_t являются частью стандарта C99, и int64_t требуется, если реализация предоставляет 64-битное целое число с дополнением до двух. Вы также можете использовать int_least64_t, который требуется в C99 и гарантированно будет не менее 64-битным. - person Robert Gamble; 14.12.2008
comment
@ysth: Неправда! stdint.h определен в стандарте C99 (поищите в википедии stdint.h). Раньше это было расширение POSIX, оно стало стандартом C. Кстати, u_int64_t по-прежнему является расширением POSIX, только uint64_t является стандартом C (обратите внимание на дополнительное подчеркивание). - person Mecki; 16.12.2008

Код доступен для Linux, см. div64.c. Вы можете это скопировать?

person 1800 INFORMATION    schedule 14.12.2008
comment
Этот код точен только для 64-битной/32-битной версии. Для 64-бит / 64-бит он готов принять небольшую ошибку в пользу скорости (так что вы получите быстрый результат, но это не точно). - person Mecki; 12.01.2009

Более общая идея заключается в использовании библиотеки множественной точности, такой как GMP.

GMP — это бесплатная библиотека для арифметики произвольной точности, работающая с целыми числами со знаком, рациональными числами и числами с плавающей запятой. Нет никаких практических ограничений для точности, кроме тех, которые подразумеваются доступной памятью в машине, на которой работает GMP. GMP имеет богатый набор функций, а функции имеют обычный интерфейс.

Деление с плавающей запятой обрабатывается с помощью void mpf_div (mpf_t rop, mpf_t op1, mpf_t op2)

person gimel    schedule 14.12.2008

Более чем вероятно, что ограничение деления связано с тем, что вы компилируете для 32-битной системы, а не для 64-битной.

Я не помню, чтобы видел инструкцию целочисленного деления, которая обрабатывает 64-битную для x86. Он будет умножать 2 32-битных целых числа и разделять результаты на 2 регистра, но не деление, насколько я помню.

person Calyth    schedule 17.12.2008
comment
C абстрагирует процессор. Он не ищет деления ни в сборке, ни нативно по процессору. Он просто хочет разделить. Даже в системах без инструкции 'div' (или аналогичной) деление поддерживается (правильно) в соответствии со стандартами C. - person strager; 17.12.2008
comment
64-битное разделение на x86 после Athlon64 и P4 Xeon равно divq. - person Crashworks; 17.08.2009