请考虑以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <complex.h>
int main()
{
complex double aaa = INFINITY + 0*I;
printf("%.f + %.f*I\n", creal(aaa), cimag(aaa));
complex double bbb = 1.0/aaa;
printf("%.f + %.f*I\n", creal(bbb), cimag(bbb));
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
编译时gcc -std=gnu99 -lm,我希望输出是
inf + 0*我
0 + 0*我
这在Linux上是正确的(在使用gcc 4.4.7的Scientific Linux 6.8,使用gcc 5.3.1的Fedora 23和使用gcc 4.8.4的Ubuntu 14.04.5上测试).
但是,在OS X(10.11.5与clang-602.0.53)而不是我得到
inf + 0*我
nan + nan*I
很明显,clang不符合C99标准(参见N1256,G.5.1节;严格来说,它仅仅是推荐的做法,而不是标准).事实上,clang没有clang故意这样做吗?更新:经过一些检查后,我发现我测试的几个Linux环境也没有定义这个宏,但代码仍能在那里正常工作.__STDC_IEC_559_COMPLEX__定义宏,这是在Sec.G.1.
目前,我对跨平台支持的解决方法是检查宏
#include <stdio.h>
#include <stdlib.h>
#include …Run Code Online (Sandbox Code Playgroud) 我尝试调用GSL库的蒙特卡罗积分子程序来进行一些数值计算。因为我的 for 循环相当简单,这意味着不同运行的结果是独立的,所以我预计使用 OpenMP 进行并行化应该非常简单。然而,当我编译它时,它总是显示“内部编译器错误:分段错误”,并且什么也没生成。这是我的代码:
#include <stdlib.h>
#include <omp.h>
#include <gsl/gsl_math.h>
#include <gsl/gsl_monte.h>
#include <gsl/gsl_monte_vegas.h>
#include <math.h>
double
Reg1 (double *x, double t, size_t dim, void *params)
{
return sin(x[1])*cos(t*t)*x[0]*x[0]*cos(x[0])*cos(3*x[0]);
}
void
display_results (char *title, double result, double error)
{
printf ("%s ==================\n", title);
printf ("result = % .10f\n", result);
printf ("sigma = % .10f\n\n", error);
}
void
VEGAS_integration_routine (double (*function)(double *, size_t, void *),
double xl[], double xu[], size_t calls, gsl_rng * r)
{
double res, err;
gsl_monte_function Function …Run Code Online (Sandbox Code Playgroud) 我有一个base_class没有默认构造函数,我想定义它的矢量版本(调用derived_class).我知道我应该在base_class构造函数中初始化构造derived_class函数,但下面的代码尝试初始化一个大小dim和base_class(0,1)每行的向量都无法编译(它抱怨错误:'derived_class'的构造函数必须显式初始化基类'base_class',除非我添加默认构造函数(注释行),否则没有默认构造函数)base_class.我想念或误解了什么吗?有没有办法让它工作而不定义默认base_class构造函数?
#include <iostream>
#include <vector>
class base_class
{
public:
//base_class(){};
base_class(double a, double b){a_=a; b_=b;}
private:
double a_, b_;
};
class derived_class : public base_class
{
public:
derived_class(int dim): vector_object(dim, base_class(0,1)){};
std::vector<base_class> print_vector_object() {return vector_object;}
private:
std::vector<base_class> vector_object;
};
int main()
{
int dim = 3;
derived_class abc(3);
std::cout << abc.print_vector_object().size() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更新:我理解在这个简单的例子中我可以完全避免继承,但请假设我确实需要继承实际练习,谢谢.
UPDATE2:正如 …