如何解决避免使用NANs处理在c ++中部分虚构的表达式
我有一个表达式,其结果为实数,但由虚构的项组成(彼此抵消)。比我考虑的例子简单得多的例子是,
z = a + 1 / [sqrt(a-b)-a]-f [sqrt(a-b)] = a
其中a和b是实数,f是表示上述表达式的某些函数。在某些情况下,例如b> a(并不总是发生,但在某些情况下可能会发生),上述表达式返回nan,这并不奇怪,因为它的某些术语是虚构的。
有时,可以计算出代数并仅使用实数来写出这种并不复杂的表达式。但是,就我而言,代数非常混乱(以至于即使Matlab的符号包和Mathematica也无法简单简化)。
我想知道是否还有其他方法可以计算出您知道是真实但部分虚构的表达式。
PS:对这个问题并不重要,但是有关我正在处理的表达式的更多信息,请参见another question I previously asked。
解决方法
tl; dr 用于评论主题:
如果您知道自己做的事涉及虚数,只需使用std::complex
。
如果您坚持要求对您知道会有虚构成分的东西(例如,sqrt
)提出真实的结果,那么您将无法避免NaN的出现。没有 它不能给您真正的答案。
在计算结束时,如果imag(result)
为零(或在适当的epsilon内),则您的虚部被抵消,并且您有real(result)
。
作为一个具体示例:
#include <complex>
#include <iostream>
int main()
{
std::complex<double> a{-5,0}; // -5 + 0i
std::complex<double> b{ 5,0}; // +5 + 0i
auto z = b + sqrt(a) - sqrt(a);
std::cout << "z = " << real(z) << " + " << imag(z) << "i\n";
}
打印
z = 5 + 0i
以您的新示例
z = a + 1/(sqrt(a-b) - a) - f(sqrt(a-b)) = a
首先创建a
类型为std::complex
的分子,并对分子使用复杂的1+0i
也是有用的。这是因为解决了重载运算符的方式:
using cx = std::complex<double>;
cx f(cx); // whatever this does,it also needs to handle complex inputs
cx foo(cx a,cx b)
{
return a + cx{1}/(sqrt(a-b) - a) - f(sqrt(a-b));
}
auto
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。