Я уже прочитал большинство вопросов SO, связанных с «округлением до n цифр». Я считаю, что этот вопрос является отдельным, потому что он больше связан с округлением поплавков произвольной длины.
0.56714329040978387299996866221035554975381578718651250813513107922304579308668456669321944696175229455773495728285284421635951688
Приведенное выше число является примером типов чисел, с которыми я работаю.
Я понимаю, как округлить число в С++, это довольно просто. Однако я не понимаю, как можно округлять произвольно длинные числа до n цифр.
Например, у меня может быть число длиной 192 цифры, которое мне нужно округлить до 84 цифр, или число, состоящее из 1831 цифры, которое мне нужно округлить до 293 цифр. Как это можно сделать с помощью одной функции (или аналогичной)?
Псевдокод для ясности, но на самом деле я использую мульти-точность Boost cpp_dec_float для чисел с произвольной точностью вместо стандартных:
float round(float num, int digits){
//returns num rounded to n digits
}
Другая проблема, с которой я столкнулся, заключается в попытке округлить очень длинные числа с плавающей запятой до небольшого количества цифр.
Например, если у меня есть число из 1000 цифр, и я хочу округлить его до n цифр, мне нужно сделать что-то вроде floor(num * 10^1000)/10^1000)
. Это не работает, потому что 10^1000 очень велико. Решением этого было бы многократное умножение и деление с меньшими показателями.
round(0.253e+5,2digits)==0.25e+5
(родственник) илиround(0.253e+5, 100units)==0.253e+5)
? - person Adrian Colomitchi   schedule 12.10.20160.0236
, округленное до 3 цифр, возвращает0.024
, если вы об этом? - person esote   schedule 12.10.2016round(x, precision_unit)=trunc(x/precision_unit+0.5)*precision_unit;
- код в моем ответе - person Adrian Colomitchi   schedule 12.10.20160.5671432...
не произвольной длины с плавающей запятой. Это текстовое представление значения, которое будет преобразовано компилятором в значение с плавающей запятой. Значения с плавающей запятой во всех известных мне системах не поддерживают точность 192 разряда, а тем более 1000 (обычноdouble
может содержать около 16 разрядов). Как только вы выходите за пределы точности значения с плавающей запятой, любые отображаемые цифры становятся бессмысленными. Поэтому все, что вы хотите сделать со всеми этими цифрами, вам придется делать с текстовым представлением, а не с типами с плавающей запятой. - person Pete Becker   schedule 12.10.2016