Обновить

Комментарии 8

Можете пояснить эту конструкцию?
if ($this->isNegative()) {
	// 14 is the magic precision number
	$number = bcadd($number, '0', 14);
	if ('.00000000000000' !== substr($number, -15)) {
		$number = bcsub($number, '1', 0);
	}
}
Эмпирически подобранная логика для округления отрицательных чисел к меньшему значению (floor). Подобный подход применяется еще в нескольких местах для оптимизаций и/или упрощения кода.

Точность здесь учитывается только до 14 знака после запятой. Можно точнее, но вроде бы нет смысла.
Такая же логика и для положительных чисел при округлении в верхнюю сторону (ceil).
Эмпирически подобранная логика в мат. библиотеке? Кхм… Почему-то вспомнился бородатый анекдот о военной кафедре и значении синуса, которое в военное время может достигать трех. Не обижайтесь только, это просто шутка конечно же. Удачи в дальнейшем совершенствовании вашей библиотеки.
В данном случае всегда будет ограничение точности. Оно может быть жестко задано, как сейчас, или быть привязанным к общей установленной точности вычисления. А экспериментально подобранная логика может быть уместна в любых библиотеках.
НЛО прилетело и опубликовало эту надпись здесь
Нет, такого не планировалось. Погрешность еще и копится с каждой новой операцией. Не проще задать заведомо хороший запас точности? Тогда мелкие погрешности теряются при округлении результата до требуемой точности.
НЛО прилетело и опубликовало эту надпись здесь
Так можно же все вычисления проводить с точностью до 100 знака, потом округлять до двух. Погрешность будет копиться около последних ста чисел после запятой и без проблем отрезаться.
Собственно как раз так использую.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации