2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2  След.
 
 Математические функции в C++ over 15 знаков
Сообщение08.11.2010, 23:16 
Аватара пользователя
Как известно, мат. функции из "math.h" имеют тип double аргумента и значения. Мне же нужна точность $10^{-19}$. Как это по-простому сделать? Спасибо.
Добавлено: На всякий случай скажу, это нужно сделать без использования каких-то нестандартных библиотек.

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение08.11.2010, 23:41 
Может быть Вам хватит точности 'long double' на GCC/ICC?
Это 80-ти битный внутренний тип с плавающей точкой. Многие функции в math.h имеют вариант с этой точностью. Тип нестандартный, так что смотрите непосредственно свой хедер, хотя в манах тоже может быть.

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 00:57 
Аватара пользователя
Спасибо! Но у меня ничего не получилось. Я пока еще совсем плохо разбираюсь. Вот мой первоначальный код:
Код:
#include "stdio.h"
#include "math.h"

int main()
{
  double sup,inf,A,x;
  sup=exp(1.0);
  inf=1/exp(1.0);
  scanf("%lf",&A);
  if(A>=inf && A<=sup) {x=exp(log(A)/A); printf("%.19f",x);} else {printf("NO");}
  return 0;
}

Ищу корень уравнения $x^{x^{x^{x^{x^{...}}}}}=A$ с точностью $10^{-19}$.
Что нужно исправить? Я попробовал объявить переменные как long double, поставить постфикс l к логарифму и экспоненте, заменить ".19f" на ".19Lf", но ничего не вышло. По-прежнему после 15 знака идут нули (как минимум на одном тесте). Как правильно?

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 01:15 
Аватара пользователя
venco в сообщении #372565 писал(а):
Это 80-ти битный внутренний тип с плавающей точкой. Многие функции в math.h имеют вариант с этой точностью. Тип нестандартный, так что смотрите непосредственно свой хедер, хотя в манах тоже может быть.
Почему нестандартный? C99.

-- Вт ноя 09, 2010 01:21:52 --

Legioner93 в сообщении #372598 писал(а):
Что нужно исправить? Я попробовал объявить переменные как long double, поставить постфикс l к логарифму и экспоненте, заменить ".19f" на ".19Lf", но ничего не вышло. По-прежнему после 15 знака идут нули (как минимум на одном тесте). Как правильно?

C99 писал(а):
7.12.6 Exponential and logarithmic functions
7.12.6.1 The exp functions

Synopsis
Код:
#include <math.h>
double exp(double x);
float expf(float x);
long double expl(long double x);

Description
The exp functions compute the base-e exponential of x. A range error occurs if the magnitude of x is too large.

Returns
The exp functions return $e^x$ .
Значит, надо использовать не exp, а expl

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 01:24 
Аватара пользователя
Код:
#include "stdio.h"
#include "math.h"

int main()
{
    long double sup,inf,A,x;
    sup=expl(1.0);
   inf=1/expl(1.0);
   scanf("%Lf",&A);
   if(A>=inf && A<=sup) {x=expl(logl(A)/A); printf("%.19Lf",x);} else {printf("NO");}
   return 0;
}

Так? Не работает.

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 01:28 
Xaositect в сообщении #372603 писал(а):
Почему нестандартный? C99.
Так вопрос был про C++, а в нём long double не стандартизован.

Кстати, вопрос к Legioner93 - а почему Ваш C++ так похож на C?

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 01:34 
Аватара пользователя
Возможно потому что таким его преподносят на семинарах. И учебник у меня "Керниган, Ритчи. Язык программирования C (ANSI C)". А какую вы посоветуете книжку?

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 01:36 
Аватара пользователя
venco в сообщении #372607 писал(а):
Так вопрос был про C++, а в нём long double не стандартизован.
А, я-то на код смотрю.
Legioner93 в сообщении #372606 писал(а):
Так? Не работает.
У меня работает (Debian GNU/Linux unstable, GCC 4.5.1, eglibc 2.11.2, -std=c99). С g++ тоже работает.

-- Вт ноя 09, 2010 01:37:47 --

Legioner93 в сообщении #372611 писал(а):
Возможно потому что таким его преподносят на семинарах. И учебник у меня "Керниган, Ритчи. Язык программирования C (ANSI C)". А какую вы посоветуете книжку?
Лично я советую программировать дальше на C, но не называть его C++ :)

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 01:44 
Аватара пользователя
У меня Microsoft Visual C++ 2010 Express. На нем не работает. Сейчас попробую отправить на GNU C++ 3.3.3.
Добавлено: Компилятор принял, задачу мне засчитали, спасибо! Хотя остался вопрос, как бы мне воочию увидеть эти 19 знаков на своём Visual Studio.
Ну я думаю, у нас не зря в программе на этот семестр C++ стоит, а не C. Хотя я разницы не знаю :oops:

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 01:48 
А у меня на cygwin g++ 4.3.4 работает только с оптимизацией и с __builtin_expl и __builtin_logl. :-(
Стандартный хедер expl и logl не определяют, в библиотеке они есть, но работают, похоже с точностью double.
Если использовать builtin варианты с оптимизацией, то всё хорошо. Без оптимизации они вызывают expl и logl, и облом.
Вот такой нестандарт.

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 01:50 
Аватара пользователя
Legioner93 в сообщении #372615 писал(а):
Ну я думаю, у нас не зря в программе C++ стоит, а не C. Хотя я разницы не знаю Пока не знаю.
Ну тогда venco придет, мб посоветует что-нибудь по C++. Я C++ не люблю и знаю, соответственно, плохо.

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 11:22 
Legioner93 в сообщении #372615 писал(а):
остался вопрос, как бы мне воочию увидеть эти 19 знаков на своём Visual Studio.

только при использовании ассемблера или самому запрограммировать эту точность.

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 14:39 
Аватара пользователя
Майкрософтовский компилятор C (который в Visual C++) не поддерживает long double, точнее, считает, что long double — это просто double.

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 16:44 
Аватара пользователя
Ага. Сейчас убедился на примере новой задачи, что он еще и не поддерживает long long. А у меня в условии числа не превышают $2^{63}-1$ :-(

 
 
 
 Re: Математические функции в C++ over 15 знаков
Сообщение09.11.2010, 16:57 
Аватара пользователя
Legioner93 в сообщении #372791 писал(а):
Ага. Сейчас убедился на примере новой задачи, что он еще и не поддерживает long long. А у меня в условии числа не превышают $2^{63}-1$ :-(
ЕМНИП, там он называется int64. Ну то есть long long и int64 это разные вещи по смыслу, но в MSVC long long появился только недавно, а int64 был давно. Спецификатор формата %I64.

 
 
 [ Сообщений: 16 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group