Арифметика высокой точности в Python и / или C / C ++?

Аннотация: Какой пакет Python или C-Library является лучшим вариантом для высокоточных арифметических операций?

У меня есть некоторые функции, которые преобразуют дробные дни ( 0.0-0.99999.. ) в удобочитаемый формат (часы, минуты, секунды, но что более важно: миллисекунды, микросекунды, наносекунды).

Преобразование выполняется с помощью этих функций: (обратите внимание, что я еще не реализовал коррекцию часового пояса)

 d = lambda x: decimal.Decimal(str(x)) cdef object fractional2hms(double fractional, double timezone): cdef object total, hms, ms_mult cdef int i hms = [0,0,0,0,0,0] ms_mult = (d(3600000000000), d(60000000000), d(1000000000), d(1000000), d(1000), d(1)) # hms = [0,0,0,0,0] total = d(fractional) * d(86400000000000) for i in range(len(ms_mult)): hms[i] = (total - (total % ms_mult[i])) / ms_mult[i] total = d(total % ms_mult[i]) return ([int(x) for x in hms]) 

И до дробного:

 def to_fractional(self): output = (self.hour / d(24.0)) + (self.minute / d(1440.0)) output += (self.second / d(86400.0)) + (self.millisecond / d(86400000.0)) output += self.microsecond / d(86400000000.0) output += self.nanosecond * (d(8.64) * d(10)**d(-9)) return output 

Однако мои результаты обратного преобразования неточны:

 jdatetime.DayTime.fromfractional(d(0.567784356873)).to_fractional() Decimal('0.56779150214342592592592592592592592592592592592592592592592592592592592592592592592592592592592592592592592592592') # Difference in-out: Decimal('0.000007145270') 

Когда я изменяю d() чтобы возвращать регулярный поплавок Python:

 # Difference in-out: 7.1452704258900823e-06 (same) 

Поэтому мой вопрос: какой пакет Python или C-библиотека могут сделать это более точно?

2 Solutions collect form web for “Арифметика высокой точности в Python и / или C / C ++?”

Разница связана с ошибкой в ​​вашем коде, а не из-за какой-либо проблемы с точностью. Линия

 output += self.nanosecond * (d(8.64) * d(10)**d(-9)) 

должно быть что-то вроде

 output += self.nanosecond / d(86400000000000) 

Кроме того, Bad Idea использует литералы с плавающей запятой в вашем коде и конвертирует их в Decimal . Это сначала округляет литеральное число до точности с плавающей запятой. Более позднее преобразование в Decimal не может восстановить потерянную точность. Пытаться

 d = decimal.Decimal 

и используйте только целые литералы (просто удалите часть .0 ).

CTRL-F «Библиотеки» там: произвольная точность_арифметика

EDIT: извлечение из библиотек ссылок только для c ++ и python (и удаление некоторых, у которых нет плавающих чисел, а только целые числа)

питон

1) mpmath


C ++

1) апфлоат

2) базовый номер класса

3) bigfloat

4) Лидия

5) mapm

6) MIRACL

7) NTL

8) ttmath

  • Зачем нужно Py_INCREF (Py_None) перед возвратом Py_None в C?
  • Обтекание библиотеки C
  • Пример Numpy C-Api дает SegFault
  • ctypes error Символ атрибутаError не найден, OS X 10.7.5
  • Можете ли вы использовать C ++ DLL в коде C # в UWP?
  • Как Python может получать двоичные данные (char *) из C ++ by SWIG?
  • Именованные каналы между C # и Python
  • Как обрабатывать unique_ptr с помощью SWIG
  •  
    Interesting Posts for Van-Lav

    Использование Zip для чтения файла по вертикали и поиска по заархивированному списку

    Python и / или Perl VS bash

    правильный способ добавления пользовательской (глубокой) логики копирования в класс python

    Объекты генератора Python: __sizeof __ ()

    скрипт python для запроса веб-сайта MIT START с локальной машины

    Поддерживает ли asyncio поддержку подпроцесса из не основного потока?

    Как преобразовать строку json в словарь и сохранить порядок в ключах?

    Невозможно установить PyZMP для Python – Зависимости

    Добавить аргумент тайм-аута в queue.join () для python

    Разбор Python HTML POST-данных из BaseHTTPServer

    Как получить значащие имена сетевого интерфейса вместо GUID с netifaces под Windows?

    Как показать окно, которое было скрыто с помощью метода «снять»?

    Как я могу перенаправить вывод вывода функции в python

    Где корневой журнал регистрации Python хранит журнал?

    Matplotlib – Переместите метку X-Axis вниз, но не X-Axis Ticks

    Python - лучший язык программирования в мире.