2009-08-12 2 views
2

Я пишу приложение, которое много манипулирует с помощью десятичных цифр (например, 57.65). Поскольку умножения и деления быстро ухудшают их точность, я хотел бы сохранить числа в классе, который сохраняет свою точность после манипуляций, а не полагаться на float и double.Есть ли класс библиотеки для представления чисел с плавающей запятой?

Я говорю о чем-то вроде этого:

class FloatingPointNumber { 
private: 
    long m_mantissa; 
    int m_dps; // decimal points 
    // so for example 57.65 would be represented as m_mantissa=5765, m_dps=2 
public: 
    // Overloaded function for addition 
    FloatingPointNumber operator+(FloatingPointNumber n); 
    // Other operator overloads follow 
} 

Хотя это возможно для меня, чтобы написать такой класс, он чувствует себя немного как изобретать колесо, и я уверен, что там должен быть какой-то библиотеки классов где-то это делает (хотя это, похоже, не существует в STL).

Кто-нибудь знает о такой библиотеке? Большое спасибо.

+0

Да, тип данных, который вы ищете, называется десятичным. Однако это не тип с плавающей точкой. Например, тип данных используется при представлении денег. – Skurmedel

+1

C++ не имеет десятичного числа. – GManNickG

+0

Нет, я никогда не говорил об этом. – Skurmedel

ответ

3

Существует список библиотек here.

Я никогда не пробовал ни одного из них, поэтому я не могу рекомендовать ни одного, однако this one является частью проекта GNU, поэтому он не может быть наполовину плохим.

0

Если вы хотите бросить свои собственные, Binary Coded Decimal, вероятно, лучший выбор.

0
  • A list of decimal arithmetic packages, включал Роберта Klarer в decNumber ++, который реализует интерфейсы, определенные в предстоящем ISO Технический отчет о десятичных арифметических типов в C++: ISO/IEC TR 24733: C++ с плавающей запятой Арифметические Extensions

  • The Multiple Precision Floating point with correct Rounding library, но если я правильно помню, это двоичная с плавающей запятой

5

Вы имеете в виду что-то вроде этого?

#include "ttmath/ttmath.h" 
#include <iostream> 

int main() 
{ 
    // bigdouble consists of 1024*4 bytes for the mantissa 
    // and 256*4 bytes for the exponent. 
    // This is because my machine is 32-bit! 
    typedef ttmath::Big<1024, 256> bigdouble; // <Mantissa, Exponent> 

    bigdouble x = 5.05544; 
    bigdouble y = "54145454.15484854120248541841854158417"; 
    bigdouble z = x * y * 0.01; 

    std::cout << z; 

    return 0; 
} 

Вы можете указать количество машинных слов в мантиссах и показателя, как вам нравится. Я использовал TTMath для решения головоломок Project Euler, и я очень доволен им. Я думаю, что он относительно стабилен, и автор очень добр, если у вас есть вопросы.


EDIT :: Я также использовал MAPM в прошлом. Он представляет собой большие поплавки в base 100, поэтому не было бы проблем с преобразованием десятичных чисел в базу 100, в отличие от базы 2. TTMAT использует базу 2 для представления больших поплавков. Он стабилен с 2000 года, как утверждает страница библиотеки. Он используется во многих приложениях, как вы можете видеть на странице библиотеки. Это C-библиотека с красивой оберткой C++.

MAPM nextPrime(){ 

    static MAPM prime = 3; 
    MAPM retPrime = prime; 

    prime += 2; 
    while(isPrime(prime) == false) 
     prime += 2; 

    return retPrime; 
} 

КСТАТИ Если вы заинтересованы в GMP и вы используете VS, то вы можете проверить MPIR, который GMP порт для Windows;) для меня я нахожу TTMath более приятным и легче/быстрее чем все, что я пробовал, потому что библиотека выделяет стек, не касаясь кучи в любом случае. В принципе, это не произвольная библиотека точности, вы указываете точность во время компиляции, как показано выше.

Смежные вопросы