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

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

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

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

05.01.2010, 22:44. Просмотров 26348. Ответов 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;
}
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....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.01.2010, 04:01 #2
там просто %Lf для long double потому что она для float и double юзает %f

Код
 * An optional h specifying that a following d , i , o , u , x , or X
   conversion specifier applies to a short int or unsigned short int
   argument (the argument will have been promoted according to the
   integral promotions, and its value shall be converted to short int or
   unsigned short int before printing); an optional h specifying that a
   following n conversion specifier applies to a pointer to a short int
   argument; an optional l (ell) specifying that a following d , i , o ,
   u , x , or X conversion specifier applies to a long int or unsigned
   long int argument; an optional l specifying that a following n
   conversion specifier applies to a pointer to a long int argument; [B]or
   an optional L specifying that a following e , E , f , g , or G
   conversion specifier applies to a long double argument.  If an h , l ,
   or L appears with any other conversion specifier, [COLOR="Red"]the behavior is
   undefined[/COLOR].[/B]
Добавлено через 13 минут
то было для C89

а это для C99
Код
       l (ell)      Specifies  that a following d, i, o, u, x, or X
                    conversion specifier applies to a long  int  or
                    unsigned  long int argument; that a following n
                    conversion specifier applies to a pointer to  a
                    long   int   argument;   that   a  following  c
                    conversion  specifier  applies  to   a   wint_t
                    argument;   that   a   following  s  conversion
                    specifier applies to a  pointer  to  a  wchar_t
                    argument; or has no effect on a following a, A,
                    e, E, f, F, g, or G conversion specifier.
У Шилдта вообще, в одной книжке (краткий справочник по C и C++) написано, что l можно применять для long double
в его же книге более новой (полный справочник по C, с супер примерами, в которых утечки памяти и прочее подобное нормально) написано уже как в стандарте, что l не даст никакого результата
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
06.01.2010, 11:17  [ТС] #3
Хорошо, тогда как с помощью cin сделать форматный вывод: 3 цыфры после запятой, я где-то выдел, но уже не помню..
0
ISergey
Maniac
Эксперт С++
1374 / 885 / 52
Регистрация: 02.01.2009
Сообщений: 2,658
Записей в блоге: 1
06.01.2010, 11:34 #4
Цитата Сообщение от outoftime Посмотреть сообщение
Хорошо, тогда как с помощью (cin)cout сделать форматный вывод: 3 цыфры после запятой, я где-то выдел, но уже не помню..
http://www.cplusplus.com/reference/i...ulators/fixed/
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
06.01.2010, 11:51  [ТС] #5
немного не то, мне надо 3 знака после запятой, в случае если там целое оно откидает нули слева..

Добавлено через 14 секунд
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
29
30
#include <iostream>
#include <cmath>
 
using namespace std;
 
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;
        cin >> n >> r;
        cout.precision(5);
        if (2*r <= n) 
                cout << 3.1415926535*r*r << endl;
        else 
                if ((2*n*n) <= (4*r*r)) 
                        cout << n*n << endl;
                else 
                        cout << fixed << (R(n,r)) << endl;
        return 0;
}
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.01.2010, 12:13 #6
Цитата Сообщение от outoftime
в случае если там целое оно откидает нули слева
справа

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
 
#include <iostream>
#include <sstream>
 
using namespace std;
 
string Get(long double n);
 
int main(void)
{
    long double n;
    
    n = 456743332.123456;
    
    cout << Get(n) << endl;
    
    return 0;
}
 
string Get(long double n)
{
    ostringstream os;
        
    os.setf(ios::fixed);
    os.precision(2);
    os << n;
    return os.str();
}
1
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 10:41 #7
C
1
printf("%.3llf\n", (long double)R(n,r));//в этом случае получаеться
Если тебе нужно три цифры после запятой, то не пудри мозг:
C
1
2
double v= (double)R(n,r);
printf( "%.3f\n", v );
Добавлено через 31 минуту
А вообще для long double следует писать "%Lf"
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2010, 11:41  [ТС] #8
C++
1
2
double v= (double)R(n,r);
printf( "%.3f\n", v );
ээ, друг мой, это никуда не годится, пашет только для флоата, дабли выводит неверно (хотя, нет, я проверял на ввод, вводит неверно, с выводом еще не експерементировал)

Добавлено через 38 секунд
кроме того, что-то не так с возвратом функции, это я уже понял..
0
Nick Alte
Эксперт С++
1638 / 1010 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
07.01.2010, 12:17 #9
Если вводишь через scanf, так он и не вводит в тип double, только во float.
1
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:14 #10
ээ, друг мой, это никуда не годится, пашет только для флоата, дабли выводит неверно
Что именно неверно ?
При передаче в printf() происходит преобразование: float -> double, всех типов меньше чем int -> int
Поэтому printf() всегда получает только double, int (ну и другие большие типы).

Добавлено через 1 минуту
scanf() работает немного иначе:
scanf( "%f", &float );
scanf( "%lf", &double );

Добавлено через 1 минуту
Для полноты:
printf( "%f", double );
printf( "%Lf", long double )
printf( "%f", float ); // тут происходит преобразование float -> double

Добавлено через 1 минуту
Во - нашел еще:
scanf( "%Lf", &long_double );
3
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2010, 18:18  [ТС] #11
ладно, можно закрыть тему, все ровно проблема в функции, она левое значение возвращает, не похожее ни на флоат ни на инт вообще ниначто не пожее..
0
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:20 #12
outoftime, ты не знаешь какой тип возвращает функция ?
0
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2010, 18:30  [ТС] #13
Цитата Сообщение от odip Посмотреть сообщение
outoftime, ты не знаешь какой тип возвращает функция ?
а вы протестите прогу у себя, введите два числа:
10
6
и сами увидите, сразу поймете что за тип)) это я его придумал))

Добавлено через 3 минуты
http://codepad.org/kTiIVTHX
0
odip
Эксперт С++
7157 / 3297 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:51 #14
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <cmath>
#include <stdio.h>
 
long double R(int n, int r)
{
 
printf( "n=%d r=%d\n", n, r );  
    
long double sq = (long double) sqrt((long double)r*r - ((long double)n/2)*((long double)n/2));
 
printf( "sq=%.20Lf\n", sq );
 
long double t1= (long double) sq*2*n;
 
printf( "t1=%.20Lf\n", t1 );
 
long double t2= (long double)
                ( (long double) ((long double) n/2 - sq)/2 )*
                ( (long double) ((long double) n/2 - sq)/2 ) - 2;
 
printf( "t2=%.20Lf\n", t2 );
 
long double t3= acos( t2 );
 
printf( "t3=%.20Lf\n", t3 );
 
long double t4= 3.1415926535*r*r*4* t3;
 
printf( "t4=%.20Lf\n", t4 );
 
long double res = t1 + t4;
 
printf( "res=%.20Lf\n", res );
 
return res;
 
}
 
int main()
{
        int n = 10, r = 6;
        printf( "var1\n" );
        if (2*r <= n) {
            printf( "var2\n" );
            printf("%.3Lf\n", (long double)3.1415926535 * r * r);
        } else {
            printf( "var3\n" );
            if ((2*n*n) <= (4*r*r)) {
                printf( "var4\n" );
                printf("%.3Lf\n", (long double)n * n);
            } else {
                printf( "var5\n" );
                printf("%.3Lf\n", (long double)R(n,r));
            }
        }
        return 0;
}
Код
> thread82884.exe
var1
var3
var5
n=10 r=6
sq=3.31662479035539980000
t1=66.33249580710798900000
t2=-1.29156197588849950000
t3=-1.#IND0000000000000000
t4=-1.#IND0000000000000000
res=-1.#IND0000000000000000
-1.#IO
1
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
07.01.2010, 18:52 #15
outoftime, Если ввести 10 и 6 то вот здесь:
C++
1
2
3
4
5
6
7
8
9
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;
}
получается что функция acos получает для вычисления число меньше 0. А значения должны быть от 0 до 2*пи.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2010, 18:52
Привет! Вот еще темы с ответами:

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
Объявления
07.01.2010, 18:52
Закрытая тема Создать тему
Опции темы

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