mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-21 14:40:48 +08:00

Since commit 07223c5c27
(Tutorial: Update Step 5 to work on Windows,
2020-02-18, v3.18.0-rc1~655^2) the logic does not work on non-Windows
platforms when cmake is re-run on an existing build tree. It is also
more complicated than we'd like for a tutorial example. Avoid the need
to consider the `m` library case by performing the check as C++.
Since `check_cxx_symbol_exists` cannot handle overloaded functions
like `exp` and `log`, check with `check_cxx_source_compiles` instead.
This also presents a more general-purpose example in the tutorial.
Fixes: #23524
33 lines
765 B
C++
33 lines
765 B
C++
#include <cmath>
|
|
#include <iostream>
|
|
|
|
#include "MathFunctions.h"
|
|
|
|
// a hack square root calculation using simple operations
|
|
double mysqrt(double x)
|
|
{
|
|
if (x <= 0) {
|
|
return 0;
|
|
}
|
|
|
|
// if we have both log and exp then use them
|
|
#if defined(HAVE_LOG) && defined(HAVE_EXP)
|
|
double result = std::exp(std::log(x) * 0.5);
|
|
std::cout << "Computing sqrt of " << x << " to be " << result
|
|
<< " using log and exp" << std::endl;
|
|
#else
|
|
double result = x;
|
|
|
|
// do ten iterations
|
|
for (int i = 0; i < 10; ++i) {
|
|
if (result <= 0) {
|
|
result = 0.1;
|
|
}
|
|
double delta = x - (result * result);
|
|
result = result + 0.5 * delta / result;
|
|
std::cout << "Computing sqrt of " << x << " to be " << result << std::endl;
|
|
}
|
|
#endif
|
|
return result;
|
|
}
|