既然你標記後C++而不是C,讓我給你一些C++提示:
- 的數學標準的頭是
<cmath>
而不是<math.h>
- 在C++中有更好的方式來聲明常量那
#define
- 浮點數不是實數的精確表示(沒有計算精確表示可以存在),所以你總是以舍入誤差結束。
更習慣的方法來結果凸輪是這樣的:
#include <cmath>
#include <iostream>
#include <iomanip>
int main()
{
const auto PI = std::acos(-1); //let the computer to find out what PI is
double rate{}, result{}; //don't let uninitialized values
rate = 90.0;
result = std::cos (rate*PI/180);
std::cout<<"The cosine of " << // set outoput precison for floating point
std::setprecision(4) << rate << " degrees is " <<
std::setprecision(4) << result <<endl;
return 0;
}
注意我如何讓std::
明確:C++ <cmath>
有比C數學函數更多超載
參見:
還要注意的是,雖然更準確PI使得result
更加精確,總有一種可能性,即結果並不完美,所以當顯示浮點值時,將精度設置到足以補償的水平e對於您的問題有意義的級別的換位錯誤。
實數的表示精度可以從std::numeric_limits<double>::digits10
(來自<limits>
表頭)獲得:切出2-3位數字總是很好。
另外,還要考慮舍入誤差,做減法或比較的時候:看到的例子在std::numeric_limits::epsilon參考文檔:
#include <cmath>
#include <limits>
#include <iomanip>
#include <iostream>
#include <type_traits>
#include <algorithm>
template<class T>
typename std::enable_if<!std::numeric_limits<T>::is_integer, bool>::type
almost_equal(T x, T y, int ulp)
{
// the machine epsilon has to be scaled to the magnitude of the values used
// and multiplied by the desired precision in ULPs (units in the last place)
return std::abs(x-y) < std::numeric_limits<T>::epsilon() * std::abs(x+y) * ulp
// unless the result is subnormal
|| std::abs(x-y) < std::numeric_limits<T>::min();
}
int main()
{
double d1 = 0.2;
double d2 = 1/std::sqrt(5)/std::sqrt(5);
if(d1 == d2)
std::cout << "d1 == d2\n";
else
std::cout << "d1 != d2\n";
if(almost_equal(d1, d2, 2))
std::cout << "d1 almost equals d2\n";
else
std::cout << "d1 does not almost equal d2\n";
}
,顯示的sqrt(5)如何平方是不是... ... 5,即使你管理看上去這麼:
(劇透:在outpu是
d1 != d2
d1 almost equals d2
);-)
溝#define PI',使用數學頭中的M_PI。 –
@ n.m。它不是一個標準化的定義 – krzaq
[相關問題](http://stackoverflow.com/questions/6566512/value-of-sine-180-is-coming-out-as-1-22465e-16) – njuffa