无法在codeblocks中的c ++中找到浮动的机器epsilon

时间:2016-01-24 11:35:05

标签: c++

我想通过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;

}

2 个答案:

答案 0 :(得分:4)

while(one+x != one)

one+x的计算可能是扩展的精度double。编译器可以自由地这样做。在这样的实现中,无论iterone的类型如何,您都会看到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;
}