Я недавно столкнулся с вопросом о точной реальной арифметике после прочтения этой статьи и этой статьи .
Я нашел ряд работ, в которых обсуждаются точные реализации арифметики с использованием потоков цифровых знаков со знаком. Использование бесконечных потоков для произвольной точности приводит к хорошим практическим реализациям на функциональных языках, таких как Haskell, с использованием ленивых списков. Тем не менее, статьи, в которых обсуждаются такие реализации на функциональных языках, похоже, приходят к выводу, что производительность очень низкая.
Теперь я понимаю, что точные, не аппаратные реализации, как правило, будут иметь относительно низкую производительность по сравнению со стандартным представлением с плавающей запятой, но я заинтересован в предоставлении более эффективной реализации на императивном языке (в частности, C ++) и коллекция операций / функций (арифметические операции, тригонометрические функции, exp, log и т. д.).
Мой вопрос (ы) : есть ли что-то медленное в представлении цифр / ленивых потоков со знаком, которое приводит к плохой производительности, или это Haskell? Что делает его медленным? Можно ли реализовать представление потока цифр со знаком, используя ленивые потоки в C ++, которые достигают (значительно) лучшей производительности, чем его аналог Haskell, или это бесполезное упражнение? Возможно реконструировать как итерации?
Я знаю, что существуют две библиотеки C ++, RealLib и iRRAM, которые обеспечивают эффективное вычисление действительного числа. Тем не менее, они, похоже, используют интервальную арифметику, представляющую действительные числа как сокращенные вложенные интервалы, что не кажется «чистым» подходом, как бесконечные потоки (пожалуйста, исправьте меня, если вы не согласны!). Но, может быть, это единственные подходы, обеспечивающие хорошую эффективность?
Любой вклад приветствуется!