Вычитание обычно обрабатывается с помощью метода Кахана.
Для умножения существуют алгоритмы для преобразования произведения двух чисел с плавающей запятой в сумму двух чисел с плавающей запятой без округления, после чего выможно использовать суммирование по Кахану или какой-либо другой метод, в зависимости от того, что вам нужно делать с продуктом в следующий раз.
Если у вас есть FMA (слитное умножение-сложение), это легко сделать следующим образом:
p = a*b;
r = fma(a,b,-p);
После этих двух операций, если переполнение или переполнение не происходит, p + r
точно равно a * b
без округления.Это также может быть достигнуто без FMA, но это гораздо сложнее.Если вас интересуют эти алгоритмы, вы можете начать с загрузки crlibm
документации , в которой подробно описаны некоторые из них.
Деление ... ну, лучше избегать деления.Деление происходит медленно, а компенсированное деление происходит еще медленнее.Вы можете сделать это, но это безжалостно сложно без FMA, и нетривиально с этим.Лучше разрабатывать свои алгоритмы, чтобы как можно больше избегать его.
Обратите внимание, что все это довольно быстро становится проигрышной битвой.Существует очень узкая группа ситуаций, в которых эти уловки полезны - для чего-то более сложного гораздо лучше просто использовать библиотеку с плавающей точкой с более высокой точностью, такую как mpfr .Если вы не являетесь экспертом в этой области (или не хотите им стать), обычно лучше просто научиться пользоваться такой библиотекой.