C ++: хранить большие числа в плавающем как PHP? - PullRequest
3 голосов
/ 26 сентября 2010

В PHP, если вы превысите INT_MAX, он будет преобразован в число с плавающей точкой, позволяющее формировать очень большие числа (которые также являются недесятичными), это возможно сделать в C ++ или способ их храненияРазные числа с плавающей запятой / двойной точности различаются?

Причина, по которой я желаю провести сравнительный анализ больших факториалов, но что-то типа 80! является way слишком большим для целого числа без знака ..

Ответы [ 5 ]

2 голосов
/ 26 сентября 2010

Язык не будет переключаться для вас, но имеет типы данных float и double, которые обычно являются 32-битными и 64-битными плавающими IEEE соответственно.

64-битный дубль имеет достаточный диапазон для 80 !, но не обладает достаточной точностью, чтобы точно представить его. В языке нет ничего встроенного, что может сделать это: вам нужно использовать большую целочисленную библиотеку, например GMP .

1 голос
/ 26 сентября 2010

C ++ не имеет такого рода средств "автоматического приведения", даже если бы вы могли создать класс, который имитирует такое поведение, имея int и float (double было бы еще лучше, IIRC он позволяет получить до 170!) личных полей и некоторый оператор, перегружающий черную магию.

В любом случае, переходя от целых чисел к fp, вы теряете точность, поэтому, даже если вы сможете достичь больших чисел, вы не будете представлять их точно. На самом деле, если вы идете в поля fp с факториалами, обычно вы можете просто использовать приближение Стирлинга (но я понимаю, что в этом случае это не применимо, так как это тест).

Если вы хотите получить сколь угодно большие факториалы без потери точности, обычное решение - использовать некоторую библиотеку bigint; Вы можете легко найти несколько из них с помощью Google.

1 голос
/ 26 сентября 2010

попробуйте использовать библиотеку GMP, или для C ++ предусмотрено несколько других библиотек Big Integer.Вы также можете использовать манипуляции со строками для вычисления больших факториалов.Нажмите здесь для алгоритма и его объяснения.

1 голос
/ 26 сентября 2010

Используйте одну из библиотек bigint, которые позволяют создавать произвольные прецедентные числа в стоимости производительности. Или вы должны написать свой собственный класс для эмуляции PHP-гибридной функциональности float-int

Примерно так

class IntFloat {
   union {
      float fval;
      int ival;
    } val;
    bool foatUsed;

    public:
      setVal(float val)
      {
        this->val.fval = val;
        floatUsed = true;
      }

      setVal(int val)
      {
        this->val.ival = val;
        floatUsed = false;
      }

       //additional code for getters, setters, operators etc
 }

Однако то, что делает PHP, не заслуживает подражания.

Список больших библиотек int можно найти в wikipedia

PS:

"или как они хранят числа с плавающей запятой / двойной точности?"

Да, это другое. C ++ хранит их прямо в формате целевой машины, тогда как PHP использует промежуточное представление (или байт-код, или в случае кода операции PHP). Таким образом, PHP преобразует число в формат машины под капотом.

0 голосов
/ 26 сентября 2010

Вы можете использовать __float128 (long double), если точность достаточна и ваш компилятор ее поддерживает.

...