我想通过C ++找出浮动和双重类型的机器epsilon,但我正在使用的变量x
的每个数据类型一次又一次得到相同的答案,这是long double的数据类型和O(1e-20)的顺序。我在使用Codeblocks的Windows 10计算机上运行它。
我尝试在Ubuntu和Windows自身的DevC ++中使用相同的代码,我得到了正确的答案。我在代码块中做错了什么有默认设置吗?
#include <iostream>
#include <string>
#include <typeinfo>
using namespace std;
int main()
{
//double x = 5;
//double one = 1;
//double fac = 0.5;
float x=1;
float one = 1.0;
float fac = 0.5;
// cout <<"What is the input of number you are giving"<< endl;
// cin >> x;
cout <<"The no. you have given is: "<< x << endl;
int iter = 1;
while(one+x != one)
{
x = x * fac;
iter = iter + 1;
}
cout<<"The value of machine epsilon for the given data type is "<<x<<endl;
cout<<"The no.of iterations taken place are: "<<iter<<endl;
}
答案 0 :(得分:4)
while(one+x != one)
one+x
的计算可能是扩展的精度double。编译器可以自由地这样做。在这样的实现中,无论iter
和one
的类型如何,您都会看到x
的相同值。
以下在我的计算机上非常好地 。
#include <iostream>
#include <limits>
template <typename T> void machine_epsilon()
{
T one = 1.0;
T eps = 1.0;
T fac = 0.5;
int iter = 0;
T one_plus_eps = one + eps;
while (one_plus_eps != one)
{
++iter;
eps *= fac;
one_plus_eps = one + eps;
}
--iter;
eps /= fac;
std::cout << iter << ' '
<< eps << ' '
<< std::numeric_limits<T>::epsilon() << '\n';
}
int main ()
{
machine_epsilon<float>();
machine_epsilon<double>();
machine_epsilon<long double>();
}
答案 1 :(得分:3)
您可以尝试使用此代码获取float
值的机器epsilon:
#include<iostream>
#include<limits>
int main(){
std::cout << "machine epsilon (float): "
<< std::numeric_limits<float>::epsilon() << std::endl;
}