2015-07-16 4 views
2

Вы можете увидеть Ramanujan's constant.
Вот мой код:Рассчитать константу Рамануджана с C++

#include <iostream> 
#include <math.h> 
#define _USE_MATH_DEFINES 
using namespace std; 

int main() 
{ 
long double s=sqrt(163); 
long double P=M_PI; 
long double R=exp(s*P); 

cout.precision(150); 

cout<<"Pi= "<<P<<"\n"<<"sqrt(163)= "<<s<<"\n"<<"R= "<<R; 
return(0); 
} 

Это выложился из:

Pi= 3.141592653589793115997963468544185161590576171875 
sqrt(163)= 12.767145334803704059822848648764193058013916015625 
R= 262537412640768256 

Что случилось с моей программой?
Правильный выход +262537412640768743,99999999999925 ...

+0

Довольно вероятно, что это происходит потому, что [ 'ехр (...'] (http://www.cplusplus.com/reference/cmath/exp/) возвращает только двойной, который не имеет достаточной точности, чтобы справляться с вашими расчетами. –

+1

@ben Неверно. http://en.cppreference.com/w/cpp/numeric/math/exp есть перегрузка для длинного двойного –

+0

@RussellGreene Да, я просто это увидел. .. если OP не использует компилятор c90? –

ответ

5

double имеет около 15 decimal digits of precision.

Ваша программа использует M_PI, что является double, not a long double.

Ваш ответ поэтому имеет около 15 цифр точности.

+0

Является ли это стандартным или это реализация определена? –

+0

'M_PI' не определен в стандарте. –

+0

Спасибо, есть ли способ получить правильный ответ? –

0

80-битный прецизионный режим для длинного двойного с Intel C++ используется при установке опции long-double в линии компиляции. Как вы увидите в документации на Intel C++, 80-битный длинный двойник выравнивается по 16 байт, поэтому sizeof (long double) равен 16.

Все компиляторы Windows и Linux x64 берут SSE в качестве режима по умолчанию со всеми поплавками и двойные данные, взятые в виде типов данных SSE. В ранней разработке Windows x64 данные 80-бит x87 были запрещены. Это ограничение было ослаблено к моменту полного выпуска, но поддержка библиотеки Windows отсутствует. В linux длинная двойная поддержка должна быть совместима с gcc.

У 80-битного удваивания будут одинаковые проблемы с любым компилятором x64; выражения со смешанными типами данных float/long double или double/long double могут быть неэффективными из-за преобразования данных SSE и x87. Если опция gcc -mfpmath = 387 представляет частичное решение, это будет за счет многих обычных оптимизаций для типов данных double и float, но такой опции для icc нет.

От:

[IntelSupportForum][1] 
Смежные вопросы