Я могу опоздать, но сработает ли 128-битный десятичный знак?
Они были приняты в C ++, и, по крайней мере, gcc имеет их начиная с gcc-4.5 (сейчас мы запускаем 4.9:
#include <iostream>
#include <decimal/decimal>
using namespace std;
int main()
{
{
std::decimal::decimal32 dn(.3), dn2(.099), dn3(1000), dn4(201);
dn-=dn2;
dn*=dn3;
cout << "decimal32 = " << (dn==dn4) << " : " << decimal32_to_double(dn) << endl;
}
{
std::decimal::decimal64 dn(.3), dn2(.099), dn3(1000), dn4(201);
dn-=dn2;
dn*=dn3;
cout << "decimal64 = " << (dn==dn4) << " : " << decimal64_to_double(dn) << endl;
}
{
std::decimal::decimal128 dn(.3), dn2(.099), dn3(1000), dn4(201);
dn-=dn2;
dn*=dn3;
cout << "decimal128 = " << (dn==dn4) << " : " << decimal128_to_double(dn) << endl;
}
return 0;
}
Обратите внимание, что десятичная дробь32 равна размеру с плавающей запятой, десятичная64 равна по размеру большинству double. Так что decimal128 довольно большой. От Википедия : Десятичное число 128 поддерживает 34 десятичных знака значимости и диапазон показателей от −6143 до +6144, то есть от ± 0,000000000000000000000000000000000 × 10−14143 до ± 9.99999999999999999999999999999999999 × 106144 (Эквивалентно, от ± 0000000000000000000000000000000000 × 10−6176 до ± 9999999999999999999999999999999999 × 106111.)
Библиотека mpfr - это двоичная с плавающей точкой произвольной точности, а не десятичная с произвольной точностью. Есть разница.