#Use what C++ provides If you use the C++ versions of the headers: #include <cstdlib> #include <cstdio> // or better, <iostream> #include <cstring> You'll get the names safely in the `std` namespace. I see you include `<cmath>` but assume its names are exported to the global namespace - that's an error. You can't depend on that happening (it's just an artefact of your implementation). Also, prefer `new`/`delete` and `new[]/delete[]` over `malloc()`/`free()`. You might be able to avoid memory management completely by using the standard containers; that's a Good Thing. `std::max()` and `std::min()` are safer choices compared to your `maxd()` and `mind()` macros. #Avoid I/O in parallel code These prints may get interleaved in unpredictable ways: #pragma omp parallel for for (int i = 0; i < cur_root; i += 2) { fprintf (temp, "%lf %lf %lf\n", roots[i], roots[i+1], calculateDensityScalarFromDensity(min, max, densities[i / 2])); } You *might* do something like #pragma omp parallel for for (int i = 0; i < cur_root; i += 2) { auto density = calculateDensityScalarFromDensity(min, max, densities[i / 2]) #pragma omp critical fprintf (temp, "%lf %lf %lf\n", roots[i], roots[i+1], density); }