13 return options.absolute_tolerance > 0.0 &&
14 options.relative_tolerance > 0.0 &&
15 std::isfinite(
options.absolute_tolerance) &&
16 std::isfinite(
options.relative_tolerance);
20 if (!std::isfinite(
value)) {
21 return std::numeric_limits<double>::infinity();
23 const double upward = std::nextafter(
24 value, std::numeric_limits<double>::infinity());
25 const double downward = std::nextafter(
26 value, -std::numeric_limits<double>::infinity());
28 if (std::isfinite(upward)) {
29 spacing = std::max(spacing, std::abs(upward -
value));
31 if (std::isfinite(downward)) {
32 spacing = std::max(spacing, std::abs(
value - downward));
43 const bool positive = isolation.
lower > Rational(0) &&
44 isolation.
upper <= Rational(2) * isolation.
lower;
45 const bool negative = isolation.
upper < Rational(0) &&
46 isolation.
lower >= Rational(2) * isolation.
upper;
47 if (positive || negative)
break;
51 const double scale = std::min(
52 std::abs(isolation.
lower.to_double()), std::abs(isolation.
upper.to_double()));
55 std::max(std::numeric_limits<double>::denorm_min(),
56 options.relative_tolerance * scale));
61 const double lower = isolation.
lower.to_double();
62 const double upper = isolation.
upper.to_double();
64 const double error = std::abs(
upper -
lower) * 0.5 +
67 if (!std::isfinite(
value) || !std::isfinite(error) ||
69 (isolation.
lower > Rational(0) || isolation.
upper < Rational(0)))) {
72 "certified root enclosure could not be represented as finite double",
80 const Rational&
lower,
81 const Rational&
upper) {
82 const double lower_value =
lower.to_double();
83 const double upper_value =
upper.to_double();
85 lower_value + (upper_value - lower_value) * 0.5;
86 const double error = std::abs(upper_value - lower_value) * 0.5 +
104 if (polynomial.
degree() <= 0) {
107 "RootOf requires a nonconstant exact rational polynomial",
112 if (polynomial.
degree() <= 0 ||
113 index >=
static_cast<std::size_t
>(polynomial.
degree())) {
116 "RootOf index exceeds the number of distinct roots",
121 }
catch (
const std::bad_alloc&) {
124 "RootOf canonicalization allocation failed",
operation);
125 }
catch (
const std::exception& error) {
135 constexpr const char*
operation =
"rootof.evaluate_real";
139 "root evaluation tolerances must be finite and positive",
145 "RootOf index exceeds the number of distinct roots",
150 if (root.
index >= real_roots.value().size()) {
153 "selected RootOf is not real",
157 return approximate_real_isolation(
166 constexpr const char*
operation =
"rootof.evaluate_complex";
170 "root evaluation tolerances must be finite and positive",
175 if (
auto*
real = std::get_if<RealIsolation>(&isolated.value())) {
176 auto approximation = approximate_real_isolation(
178 if (!approximation) {
182 approximation.value(),
185 auto complex = std::get<ComplexIsolation>(std::move(isolated.value()));
189 auto real_part = approximate_component(
191 auto imaginary_part = approximate_component(
193 if (!std::isfinite(real_part.value) ||
194 !std::isfinite(real_part.absolute_error) ||
195 !std::isfinite(imaginary_part.value) ||
196 !std::isfinite(imaginary_part.absolute_error)) {
199 "certified complex root enclosure could not be represented as finite double",
std::string variable_name
变量名
Polynomial square_free_part() const
计算无平方因子部分
int degree() const
获取多项式的次数
Polynomial make_monic() const
首一化(使首项系数为 1)
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
ApproxReal approximate_component(const Rational &lower, const Rational &upper)
bool valid_options(const NumericEvaluationOptions &options)
double conversion_ulp(double value)
Result< ApproxReal > approximate_real_isolation(ExactRealAlgebraic isolation, const NumericEvaluationOptions &options, ComputationContext &context, const std::string &operation)
Result< std::vector< RationalInterval > > isolate_real_roots_exact(const Polynomial< Rational > &polynomial, ComputationContext &context, const std::string &operation)
Result< void > refine_exact_real_algebraic_to_tolerance(ExactRealAlgebraic &value, double absolute_tolerance, double relative_tolerance, ComputationContext &context, const std::string &operation)
double absolute_tolerance
Result< RootIsolation > isolate_exact_root(const ExactRootId &root, ComputationContext &context, const std::string &operation)
Result< ExactRootId > make_exact_root_id(Polynomial< Rational > polynomial, std::size_t index, ComputationContext &context, const std::string &operation)
Result< void > refine_exact_real_algebraic(ExactRealAlgebraic &value, ComputationContext &context, const std::string &operation)
ComputationContext const std::string & operation
Result< ApproxComplex > evaluate_root_complex(const ExactRootId &root, const NumericEvaluationOptions &options, ComputationContext &context)
Result< ApproxReal > evaluate_root_real(const ExactRootId &root, const NumericEvaluationOptions &options, ComputationContext &context)
std::size_t std::size_t ComputationContext & context
Result< void > refine_complex_isolation(const Polynomial< Rational > &, ComplexIsolation &isolation, const NumericEvaluationOptions &options, ComputationContext &context, const std::string &operation)
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
ExprResult interval(ExprPtr lower, ExprPtr upper, bool lower_closed, bool upper_closed)
ExprResult real(const ExprPtr &expression, ComputationContext &context)
const std::string ComputationContext const SolveOptions & options
ExprResult complex(ExprPtr real, ExprPtr imag)
const std::string const ExprPtr & value
Polynomial< Rational > polynomial