Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 199, средняя оценка - 4.69
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
#1

Вывод long double с используя printf() - C++

05.01.2010, 22:44. Просмотров 26237. Ответов 26
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <cmath>
 
long double R(int n, int r)
{
    long double sq = (long double) sqrt((long double)r*r - ((long double)n/2)*((long double)n/2));
    long double res = (long double) sq*2*n + 3.1415926535*r*r*4* 
        acos((long double)
        ( (long double) ((long double) n/2 - sq)/2 )*
        ( (long double) ((long double) n/2 - sq)/2 ) - 2);
    return res;
}
 
int main()
{
    int n, r;
    scanf("%d%d",&n, &r);
    if (2*r <= n) 
        printf("%.3llf\n", (long double)3.1415926535 * r * r);
    else 
        if ((2*n*n) <= (4*r*r)) 
            printf("%.3llf\n", (long double)n * n);
        else 
            printf("%.3llf\n", (long double)R(n,r));//в этом случае получаеться
                                      //галиматья какая-то попробуйте сами на тесте: 10 6
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2010, 22:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод long double с используя printf() (C++):

Тип long long и его ввод\вывод с использованием scanf\printf - C++
Добрый день! Мне в программе надо вывести и ввести, соответственно, некоторые данные с помощью scanf и printf. По сути у меня выглядит...

Вывод константы long double - C++
Доброго времени суток! Учусь программировать на С++ и возникла такая проблема: есть константа 6.626068E-034. я назначил тип long...

Почему перестает работать программа при замене double на long double? - C++
Здравствуйте! Прошу помощи чтобы разобраться в следующем вопросе: Нашел программу в интернете, запустил - все работает, но когда решил...

long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей - C++
Здравствуйте все знают что в VC long double и double одно и тоже, да и при простой проверке это легко выясняется, но нужна информация от...

Вывести long double число без перевода в double - C++
Надо вывести long double число без перевода в double. Пишу: printf(&quot;%Lf&quot;,S); и выводится неверно. Компилятор -- MinGW, та же фишка на...

используя только символьный вывод printf, вывести значение целой переменной k - C++
используя только символьный вывод, то есть функцию printf (&quot;% c&quot;, s), где s - переменная типа char, вывести значение целой переменной k....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:56 #16
acos( -1.29 ) как-то не считается почему-то ))

Добавлено через 1 минуту
Неправильно !
acos( x ) считается, если abs( x )<=1
Nick Alte
Эксперт С++
1636 / 1008 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
07.01.2010, 18:57 #17
Цитата Сообщение от valeriikozlov Посмотреть сообщение
получается что функция acos получает для вычисления число меньше 0. А значения должны быть от 0 до 2*пи.
Диапазон допустимых значений аргумента для арккосинуса от -1 до 1.
Искренне ваш, Капитан Очевидность.
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:58 #18
И кстати компилятор у меня ругался на printf(), пока не добавил #include <stdio.h>
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
07.01.2010, 19:02 #19
Цитата Сообщение от Nick Alte Посмотреть сообщение
Диапазон допустимых значений аргумента для арккосинуса от -1 до 1.
Искренне ваш, Капитан Очевидность
возразить нечего.
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 19:10 #20
Еще раз: аргумент у acos() примерное -1.29
Поэтому и не считает.
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
07.01.2010, 19:15 #21
outoftime, Самый правильный ответ написал odip
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 19:31 #22
Кстати замучился выводить long double с помощью mingw gcc.
Оказывается mingw gcc использует Windows-функцию printf() и следующий код не работает:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main( void ) {
 
double vd= 1.00001;
long double vld= 1.0000000001;
 
printf( "vd=%.30f\n", vd );
printf( "lvd=%.30Lf\n", vld );
 
return 0;
 
} /* main() */
Выдает ошибку:
Код
> gcc -Wall -o 2.exe 2.c
2.c: In function 'main':
2.c:9: warning: unknown conversion type character 'L' in format
2.c:9: warning: too many arguments for format
Добавлено через 2 минуты
Изучение проблемы показало что Windows считает что double == long double
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <float.h>
#include <limits.h>
#include <stdio.h>
int main(void)
{
printf("float is %d bits\n", CHAR_BIT * (int)sizeof(float));
printf("double is %d bits\n", CHAR_BIT * (int)sizeof(double));
printf("long double is %d bits\n", CHAR_BIT * (int)sizeof(long double));
printf("\n");
 
printf("FLT_DIG = %d\n", FLT_DIG);
printf("DBL_DIG = %d\n", DBL_DIG);
printf("LDBL_DIG = %d\n", LDBL_DIG);
printf("\n");
 
printf("FLT_MIN = %g\n", FLT_MIN);
printf("DBL_MIN = %g\n", DBL_MIN);
printf("LDBL_MIN = %Lg\n", LDBL_MIN);
printf("\n");
 
printf("FLT_MAX = %g\n", FLT_MAX);
printf("DBL_MAX = %g\n", DBL_MAX);
printf("LDBL_MAX = %Lg\n", LDBL_MAX);
 
return 0;
}
Код
> 3.exe
float is 32 bits
double is 64 bits
long double is 64 bits

FLT_DIG = 6
DBL_DIG = 15
LDBL_DIG = 15

FLT_MIN = 1.17549e-038
DBL_MIN = 2.22507e-308
LDBL_MIN = 2.22507e-308

FLT_MAX = 3.40282e+038
DBL_MAX = 1.79769e+308
LDBL_MAX = 1.79769e+308
Добавлено через 6 минут
В то время как mingw gcc считает что sizeof(long double) == 10.
Тем не менее обойти удалось
В mingw gcc есть собственная реализация printf().
Нужно указать что нужно использовать свой printf().
Следующий код уже работает правильно:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#define __USE_MINGW_ANSI_STDIO 1
 
#include <float.h>
#include <limits.h>
#include <stdio.h>
int main(void)
{
printf("float is %d bits\n", CHAR_BIT * (int)sizeof(float));
printf("double is %d bits\n", CHAR_BIT * (int)sizeof(double));
printf("long double is %d bits\n", CHAR_BIT * (int)sizeof(long double));
printf("\n");
 
printf("FLT_DIG = %d\n", FLT_DIG);
printf("DBL_DIG = %d\n", DBL_DIG);
printf("LDBL_DIG = %d\n", LDBL_DIG);
printf("\n");
 
printf("FLT_MIN = %g\n", FLT_MIN);
printf("DBL_MIN = %g\n", DBL_MIN);
printf("LDBL_MIN = %Lg\n", LDBL_MIN);
printf("\n");
 
printf("FLT_MAX = %g\n", FLT_MAX);
printf("DBL_MAX = %g\n", DBL_MAX);
printf("LDBL_MAX = %Lg\n", LDBL_MAX);
 
return 0;
}
Код
> 3.exe
float is 32 bits
double is 64 bits
long double is 96 bits

FLT_DIG = 6
DBL_DIG = 15
LDBL_DIG = 18

FLT_MIN = 1.17549e-038
DBL_MIN = 2.22507e-308
LDBL_MIN = 3.3621e-4932

FLT_MAX = 3.40282e+038
DBL_MAX = 1.79769e+308
LDBL_MAX = 1.18973e+4932
Добавлено через 1 минуту
Вывод: При работе с Visual Studio под Windows вообще нефиг использовать long double, ибо не работает
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2010, 23:06  [ТС] #23
да ладно, меня пока и дабл устаивает, мне всего-то 3 цыфры после комы нужны, правда расчеты очень приблизительные, поэтому надо перестраховатся..
никто не знает как сделать значение для арккосинуса нормальным?
accept
4821 / 3241 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.01.2010, 23:23 #24
если хочешь long double, нужно юзать acosl
иначе все вычисления пройдут в double
acosl появилась в C99, который не является подмножеством C++
Вывод long double с используя printf()
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
08.01.2010, 10:32 #25
никто не знает как сделать значение для арккосинуса нормальным?
Это в анекдоты сразу нужно помещать
Чтобы значение acos() было правильным нужно задачу правильно решить !
А чтобы решить задачу нужно хотя бы условие знать ...
outoftime
║XLR8║
509 / 431 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
08.01.2010, 12:13  [ТС] #26
http://acm.timus.ru/problem.aspx?space=1&num=1084
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
08.01.2010, 12:34 #27
Самое интересное - зачем тут long double ?
Задача простая.

Перенес в отдельную тему
Голодная коза на веревке.

Добавлено через 29 секунд
Эту тему закрываем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2010, 12:34
Привет! Вот еще темы с ответами:

Double, int , long double - C++
Как вычислить диапазоны типов вручную указанных в название темы?

Long Double - C++
Разве нет типа более емкого, чем Double в Visual studio? Long Double, как я понял, определяется как обычный Double. А мне нужен аналог по...

Long double и Borland 3.1 - C++
обнаружено на процессоре 486SX с Borland 3.1, на нем экспонента считается до 4932, далее ошибка overflow DosBox+ core i7 на win7х64 +...

long double и char - C++
Товарищи, помогите чайнику разобраться в данном теоретическом вопросе: long double* m=95; m--; m=? char* t=2; t-=4; t=?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.01.2010, 12:34
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru