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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 199, средняя оценка - 4.69
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
05.01.2010, 22:44     Вывод long double с используя printf() #1
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
07.01.2010, 19:15     Вывод long double с используя printf() #21
outoftime, Самый правильный ответ написал odip
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
07.01.2010, 19:31     Вывод long double с используя printf() #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║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
07.01.2010, 23:06  [ТС]     Вывод long double с используя printf() #23
да ладно, меня пока и дабл устаивает, мне всего-то 3 цыфры после комы нужны, правда расчеты очень приблизительные, поэтому надо перестраховатся..
никто не знает как сделать значение для арккосинуса нормальным?
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.01.2010, 23:23     Вывод long double с используя printf() #24
если хочешь long double, нужно юзать acosl
иначе все вычисления пройдут в double
acosl появилась в C99, который не является подмножеством C++
Вывод long double с используя printf()
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
08.01.2010, 10:32     Вывод long double с используя printf() #25
никто не знает как сделать значение для арккосинуса нормальным?
Это в анекдоты сразу нужно помещать
Чтобы значение acos() было правильным нужно задачу правильно решить !
А чтобы решить задачу нужно хотя бы условие знать ...
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
08.01.2010, 12:13  [ТС]     Вывод long double с используя printf() #26
http://acm.timus.ru/problem.aspx?space=1&num=1084
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2010, 12:34     Вывод long double с используя printf()
Еще ссылки по теме:

C++ Вывести long double число без перевода в double
Почему перестает работать программа при замене double на long double? C++
Тип long long и его ввод\вывод с использованием scanf\printf C++

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

Или воспользуйтесь поиском по форуму:
odip
Эксперт C++
 Аватар для odip
7224 / 3286 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
08.01.2010, 12:34     Вывод long double с используя printf() #27
Самое интересное - зачем тут long double ?
Задача простая.

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

Добавлено через 29 секунд
Эту тему закрываем.
Yandex
Объявления
08.01.2010, 12:34     Вывод long double с используя printf()
Закрытая тема Создать тему
Опции темы

Текущее время: 01:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru