Cubic inequality solver
This cubic inequality solver finds where a third-degree polynomial is positive, negative, nonnegative, or nonpositive.
Run — free
Enter the coefficients of ax³ + bx² + cx + d and choose a comparison with zero. The result lists the distinct real roots, shows the sign on every interval cut by those roots, and returns the complete solution set in interval notation. It handles cubics with one, two, or three distinct real zeros without relying on graphing, random guesses, or an external service.
Enter the cubic in standard form
Rewrite the inequality so that one side is zero and the other is in the form ax³ + bx² + cx + d. Then enter each real coefficient, including zeros for any missing terms. The leading coefficient a cannot be zero because that would make the expression quadratic or lower degree. Choose < or > when roots must be excluded, and choose <= or >= when equality at a real root belongs to the answer. For example, x³ - 2x² - 5x + 6 >= 0 is entered with a = 1, b = -2, c = -5, d = 6, and operator >=. Keeping the comparison against zero matters: if your original right side is not zero, first subtract it from both sides and combine like terms. That produces the exact coefficients the solver needs and prevents a sign error caused by moving only part of an expression. Decimal coefficients are accepted as long as they are finite and stay within the published coefficient limit.
Read the roots and sign chart
A continuous polynomial can change sign only where it equals zero, so its real roots divide the number line into intervals. The solver obtains all distinct real roots with the depressed-cubic form of Cardano's method, sorts them, and chooses a test value strictly inside each resulting interval. It evaluates the original polynomial at that test value and labels the whole interval positive or negative. This is the same sign-chart method taught in algebra, made explicit so you can audit the conclusion instead of receiving only a final union. A repeated root appears once in the list because it creates one boundary on the number line. If its multiplicity is even, the signs on its neighboring intervals remain the same; if its multiplicity is odd, they switch. The displayed chart reveals that behavior directly. Roots are normalized to stable decimal values, so simple integer roots remain easy to recognize while irrational real roots receive a useful deterministic approximation.
Interpret the interval notation
The solution intervals are exactly the chart regions whose sign satisfies the selected comparison. Parentheses mean an endpoint is excluded, while square brackets mean a finite root is included because the operator permits equality. Infinity always uses a parenthesis because it is a direction rather than a reachable endpoint. When several disconnected regions work, the solver joins them with the union symbol. An empty-set symbol means no real number satisfies the requested comparison. Check the `solution_intervals` array when consuming the result in code; it provides each component separately, while `solution_set` gives the familiar human-readable notation. The method is deterministic and evaluates only the supplied coefficients, so it is suitable for worked exercises, automated answer keys, and validation inside a larger algebra workflow. As with any numeric cubic calculation, irrational roots are approximate; use the accompanying sign chart rather than treating a rounded displayed root as an exact symbolic radical expression.
What you can do with it
Check algebra homework
Compare a hand-built root table and interval union with a deterministic sign chart.
Build answer keys
Generate consistent real-root boundaries and solution intervals for coefficient-based exercises.
Validate model constraints
Find where a cubic response, profit, or calibration polynomial remains above or below zero.
FAQ
What does one request cost?
One API request costs $0.002; the browser version can run locally without a network call.
Can the leading coefficient be zero?
No. A zero leading coefficient does not define a cubic inequality and is rejected as invalid input.
Are repeated roots included?
Yes. Each distinct real root is listed once, and the signs on its adjacent intervals show whether the polynomial crosses the axis there.
Why are some roots decimals?
Many cubic roots are irrational. The solver returns stable numeric approximations rather than symbolic radical expressions.
When are roots included in the answer?
Finite roots are included for <= and >= because the polynomial equals zero there; they are excluded for < and >.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/algebra/cubic-inequality \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"a":1,"b":-2,"c":-5,"d":6,"operator":">="}'const res = await fetch("https://api.kit.forhosting.com/algebra/cubic-inequality", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"a": 1,
"b": -2,
"c": -5,
"d": 6,
"operator": ">="
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/algebra/cubic-inequality",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"a": 1,
"b": -2,
"c": -5,
"d": 6,
"operator": ">="
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/algebra/cubic-inequality", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"a":1,"b":-2,"c":-5,"d":6,"operator":">="}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"a":1,"b":-2,"c":-5,"d":6,"operator":">="}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/algebra/cubic-inequality", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"a": 1,
"b": -2,
"c": -5,
"d": 6,
"operator": ">="
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "algebra.cubic_inequality",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_abs_coefficient | 1000000000000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |