gpt4 book ai didi

c++ - 数字的立方根,C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:13:57 39 4
gpt4 key购买 nike

我想问一个非常简短的问题,问题如下:在 C++ 中求一个数(负数和正数)的立方根时,如何将输出限制为仅实数解?我目前正在编写一个程序来使用 Cardano 公式求解立方体,我使用的其中一个中间变量随机输出复数和实数立方根 - 我只需要实数根。

(例如,在计算 -0.0127378 的立方根时,三个根将为 0.11677095+0.202253218i、−0.2335419、0.11677095−0.202253218i - 我希望忽略复杂的代入后面的公式)

谢谢!

编辑:解决了! :) 我创建了一个 signum 函数,并在取 SPrime 和 TPrime 的绝对值的幂之后调整了符号,所以现在它只携带真正的立方根。

/* ... */

#include <iostream>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cassert>

using namespace std;

int signum(std::complex<double> z)
{
if (z.real() < 0 || z.imag() < 0) return -1;
else if (z.real() >= 0 || z.imag() >= 0) return 1;
}

// POST: The function is intended to solve a cubic equation with coefficients a, b, c and d., such that
// ax^3 + bx^2 + cx + d = 0. If there exist infinitely many solutions, we output -1, i.e. if a=b=c=d=0
// (trivial solution).

void solve(std::complex<double> a, std::complex<double> b, std::complex<double> c, std::complex<double> d, std::complex<double>& x1, std::complex<double>& x2, std::complex<double>& x3)
{
complex<double> i = complex<double> (0, 1.0);
// Consider implementing Cardano's method for obtaining the solution of a degree 3 polynomial, as suggested
// We must hence define the discriminant D of such an equation through complex doubles Q and R
std::complex<double> Q;
Q = (3.0*a*c - pow(b, 2)) / (9.0*pow(a, 2));
cout << "Q=" << Q << endl;

std::complex<double> R;
R = (9.0*a*b*c - 27.0*d*pow(a, 2) - 2.0*pow(b, 3)) / (54.0*pow(a, 3));
cout << "R=" << R << endl;

std::complex<double> D;
D = pow(Q, 3) + pow(R, 2);

// Possible types of output for discriminant
if (abs(D) < 0.0)
{
cout << "The cubic has three distinct, real roots." << endl;
}

else if (abs(D) == 0.0)
{
cout << "The cubic has three real roots, at least two of which are equal." << endl;
}

else if (abs(D) > 0.0)
{
cout << "The cubic has one real root and two complex conjugate roots." << endl;
}

// Defining two further complex double variables S and T, which are required to obtain the final solution for x1, x2 and x3
std::complex<double> S;
std::complex<double> SPrime;
SPrime = R+sqrt(Q*Q*Q + R*R);
cout << "SPrime=" << SPrime << endl;

if (signum(SPrime) == -1)
{
S = (-1)*pow(abs(SPrime), 0.3333333333333);
}

else if (signum(SPrime) == 1)
{
S = pow(abs(SPrime), 0.3333333333333);
}

cout << "S=" << S << endl;

std::complex<double> T;
std::complex<double> TPrime;
TPrime = (R-sqrt(Q*Q*Q + R*R));

if (signum(TPrime) == -1)
{
T = (-1)*pow(abs(TPrime), 0.3333333333333);
}

else if (signum(TPrime) == 1)
{
T = pow(abs(TPrime), 0.3333333333333);
}

cout << "T=" << T << endl;
cout << "TPrime= " << TPrime << endl;

// Expressions for the solutions
x1 = S + T - (b/(3.0*a));
x2 = (-0.5)*(S + T) - (b/(3.0*a)) + (sqrt(3.0)*0.5)*(S - T)*i;
x3 = conj(x2);

if (abs(x1) < 0.000000000001)
{
x1 = 0;
}
}

// Driver code
int main ()
{
// Taking user input for a, b, c and d
std::complex<double> a, b, c, d, x1, x2, x3;
cout << "Please enter the coefficients of the polynomial in successive order." << endl;
cin >> a >> b >> c >> d;

solve (a, b, c, d, x1, x2, x3);
cout << x1 << ", " << x2 << ", " << x3 << "." << endl;

return 0;
}

最佳答案

你所说的问题可以很简单地解决(对于实数,-x 的立方根与 x 的立方根相反):

double cuberoot(double x) {
if (x < 0) {
return -pow(-x, 1.0/3.0);
} else if (x > 0) {
return pow(x, 1.0/3.0);
} else {
return 0;
}
}

如果输入不是一般的复数 z 并且您正在寻找“最真实的”(主)立方根,则可以使用复数 pow 应用相同的推理> 版本为 z-z 取决于实部的符号:

std::complex<double> cuberoot(std::complex<double> z) {
if (z.real() < 0) {
return -pow(-z, 1.0/3.0);
} else {
return pow(z, 1.0/3.0);
}
}

关于c++ - 数字的立方根,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40439739/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com