Арифметика высокой точности в 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

  • Как управлять gdb внутри кода C или Python без API-интерфейса GDB Python?
  • Python: исправлено исправление длины Regex?
  • Замена итератора вывода C ++ STL с генератором Python
  • C / C ++ для программиста Python
  • Открытие файла в режиме добавления и поиск
  • питон? (условный / тернарный) оператор для присвоений
  • Программа OpenCV / C ++ медленнее, чем ее numpy-копия, что мне делать?
  • Каковы возможные ловушки при портировании Psyco на 64-битный?
  • Как вы расширяете python с помощью C ++?
  • Программа Numpy C ++ всегда дает segfault (скорее всего, неправильное использование синтаксиса или типов)
  • Использовать код Python в C / C ++
  • Python - лучший язык программирования в мире.