Компенсация погрешностей при операциях с числами с плавающей запятой?

Первый пример результат стандартного printf:
long double tt = 0.00000000000000123;
printf("%d\n",  printf("%'023.60Lf\n",tt));
.......................
0,000000000000001230000000000000067967510165557714273707338505
63

Второй пример результат моего printf:
long double tt = 0.00000000000000123;
printf("%d\n",  ft_printf("%'023.60Lf\n",tt));
.......................
0,000000000000001230000000000000067996823449600896083211409859
63


Как не сложно заметить при большой точности, мой результат отличается от результата библиотечного printf.
Насколько я понимаю это возникает из-за того, что я не компенсирую погрешность при своих вычислениях.
В своем printf для перевода числа в строку я использую: деление, умножение и вычитание.

Про компенсацию погрешностей я нашел только вот это: ссылка.
Может у кого есть ссылка на больший материал про компенсацию погрешности - в частности в случае с вычитанием? Или еще лучше, если кто-нибудь в курсе как printf борется с погрешностями?
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как не сложно заметить при большой точности, мой результат отличается от результата библиотечного printf.

Как не сложно заметить, long double имеет 19 значащих цифр, т.е. 0,0000000000000012300000000000000679 -- это всё что имеет смысл печатать, и эта часть одинакова в выводе printf и ft_printf. Всё что идёт дальше -- это мусор, который не содержится в исходном числе.

long double tt = 0.00000000000000123;

Число справа от знака = имеет тип double. См.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы