2016-05-25 7 views
0

Я пишу программу на C++, где я хочу найти epsilon моего компьютера. Я хочу, чтобы результат был двойной точности (это 2.2204460492503131 E-16), но вместо этого выход 1.0842 E-019, который является эпсилон с длинной двойной точностью.возвращает long double вместо double

Моя программа заключается в следующем:

#include <iostream> 

double e = 1.0; 
double x; 

int main() 
{ 

    for (int i = 0; e + 1.0!=1.0 ; i++) 
    { 
     std::cout<<e<<'\n'; 
     x = e; 
     e/=2.0; 
    } 

    std::cout << "The epsilon of this Computer is "<< x <<'\n'; 

    return 0; 
} 

ответ

0

Выход std::numeric_limits<double>::epsilon() вместо этого. std::numeric_limits объявляется в стандартном заголовке <limits>.

Более обычный метод, если вы действительно должны вычислить его (а не доверяя стандартную библиотеку, чтобы обеспечить правильное значение) является

double epsilon = 1.0; 

while ((1.0 + 0.5 * epsilon) != 1.0) 
    epsilon *= 0.5; 

или сделать расчет.

Обратите внимание, что (хотя не показано, как вы это сделали) это может быть на самом деле ваш long double расчет, что является неправильным, так как буквальные значения с плавающей точкой (например 1.0) по умолчанию, чтобы быть типа double, не long double - которые могли бы предположим, что ошибка заключается в вашем расчете результата long double, а не double. Если вы хотите, чтобы результат был типа long double, было бы желательно указать все эти литеральные значения (1.0, 0.5), суффикс L, заставить их быть типа long double.

Также не забудьте использовать соответствующее форматирование при потоковой передаче результирующего значения до std::cout, чтобы гарантировать, что выход также имеет точность/точность, в которой вы нуждаетесь. Настройки по умолчанию (то, что вы получаете, если не контролируете форматирование) могут отличаться.

 Смежные вопросы

  • Нет связанных вопросов^_^