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

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

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

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

05.01.2010, 22:44. Просмотров 25888. Ответов 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()
Посмотрите здесь:
Тип long long и его ввод\вывод с использованием scanf\printf C++
Вывод константы long double C++
Почему перестает работать программа при замене double на long double? C++
C++ long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей
C++ Вывести long double число без перевода в double
C++ используя только символьный вывод printf, вывести значение целой переменной k
Double, int , long double C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.01.2010, 04:01     Вывод long double с используя printf() #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 не даст никакого результата
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
06.01.2010, 11:17  [ТС]     Вывод long double с используя printf() #3
Хорошо, тогда как с помощью cin сделать форматный вывод: 3 цыфры после запятой, я где-то выдел, но уже не помню..
ISergey
Maniac
Эксперт С++
1372 / 883 / 52
Регистрация: 02.01.2009
Сообщений: 2,652
Записей в блоге: 1
06.01.2010, 11:34     Вывод long double с используя printf() #4
Цитата Сообщение от outoftime Посмотреть сообщение
Хорошо, тогда как с помощью (cin)cout сделать форматный вывод: 3 цыфры после запятой, я где-то выдел, но уже не помню..
http://www.cplusplus.com/reference/i...ulators/fixed/
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
06.01.2010, 11:51  [ТС]     Вывод long double с используя printf() #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;
}
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.01.2010, 12:13     Вывод long double с используя printf() #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();
}
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 10:41     Вывод long double с используя printf() #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"
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2010, 11:41  [ТС]     Вывод long double с используя printf() #8
C++
1
2
double v= (double)R(n,r);
printf( "%.3f\n", v );
ээ, друг мой, это никуда не годится, пашет только для флоата, дабли выводит неверно (хотя, нет, я проверял на ввод, вводит неверно, с выводом еще не експерементировал)

Добавлено через 38 секунд
кроме того, что-то не так с возвратом функции, это я уже понял..
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,927
Завершенные тесты: 1
07.01.2010, 12:17     Вывод long double с используя printf() #9
Если вводишь через scanf, так он и не вводит в тип double, только во float.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:14     Вывод long double с используя printf() #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 );
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2010, 18:18  [ТС]     Вывод long double с используя printf() #11
ладно, можно закрыть тему, все ровно проблема в функции, она левое значение возвращает, не похожее ни на флоат ни на инт вообще ниначто не пожее..
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:20     Вывод long double с используя printf() #12
outoftime, ты не знаешь какой тип возвращает функция ?
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2010, 18:30  [ТС]     Вывод long double с используя printf() #13
Цитата Сообщение от odip Посмотреть сообщение
outoftime, ты не знаешь какой тип возвращает функция ?
а вы протестите прогу у себя, введите два числа:
10
6
и сами увидите, сразу поймете что за тип)) это я его придумал))

Добавлено через 3 минуты
http://codepad.org/kTiIVTHX
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:51     Вывод long double с используя printf() #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
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
07.01.2010, 18:52     Вывод long double с используя printf() #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*пи.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:56     Вывод long double с используя printf() #16
acos( -1.29 ) как-то не считается почему-то ))

Добавлено через 1 минуту
Неправильно !
acos( x ) считается, если abs( x )<=1
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,927
Завершенные тесты: 1
07.01.2010, 18:57     Вывод long double с используя printf() #17
Цитата Сообщение от valeriikozlov Посмотреть сообщение
получается что функция acos получает для вычисления число меньше 0. А значения должны быть от 0 до 2*пи.
Диапазон допустимых значений аргумента для арккосинуса от -1 до 1.
Искренне ваш, Капитан Очевидность.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:58     Вывод long double с используя printf() #18
И кстати компилятор у меня ругался на printf(), пока не добавил #include <stdio.h>
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
07.01.2010, 19:02     Вывод long double с используя printf() #19
Цитата Сообщение от Nick Alte Посмотреть сообщение
Диапазон допустимых значений аргумента для арккосинуса от -1 до 1.
Искренне ваш, Капитан Очевидность
возразить нечего.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2010, 19:10     Вывод long double с используя printf()
Еще ссылки по теме:
C++ Long Double
описание long double в С C++
long double и char C++
Округление Long double. C++
Long double и Borland 3.1 C++

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

Или воспользуйтесь поиском по форуму:
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 19:10     Вывод long double с используя printf() #20
Еще раз: аргумент у acos() примерное -1.29
Поэтому и не считает.
Yandex
Объявления
07.01.2010, 19:10     Вывод long double с используя printf()
Закрытая тема Создать тему
Опции темы

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