Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.85/254: Рейтинг темы: голосов - 254, средняя оценка - 4.85
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
1

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2010, 22:44
Ответы с готовыми решениями:

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

Вывод long double
Как вывести long double число(12+) без экспоненты?

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

Чем различаются long long и long double?
long long или long double

26
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
06.01.2010, 11:17  [ТС] 3
Хорошо, тогда как с помощью cin сделать форматный вывод: 3 цыфры после запятой, я где-то выдел, но уже не помню..
0
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
06.01.2010, 11:34 4
Цитата Сообщение от outoftime Посмотреть сообщение
Хорошо, тогда как с помощью (cin)cout сделать форматный вывод: 3 цыфры после запятой, я где-то выдел, но уже не помню..
http://www.cplusplus.com/refer... ors/fixed/
1
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
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
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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
Эксперт С++
7175 / 3234 / 81
Регистрация: 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
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
07.01.2010, 11:41  [ТС] 8
C++
1
2
double v= (double)R(n,r);
printf( "%.3f\n", v );
ээ, друг мой, это никуда не годится, пашет только для флоата, дабли выводит неверно (хотя, нет, я проверял на ввод, вводит неверно, с выводом еще не експерементировал)

Добавлено через 38 секунд
кроме того, что-то не так с возвратом функции, это я уже понял..
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
07.01.2010, 12:17 9
Если вводишь через scanf, так он и не вводит в тип double, только во float.
1
Эксперт С++
7175 / 3234 / 81
Регистрация: 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
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
07.01.2010, 18:18  [ТС] 11
ладно, можно закрыть тему, все ровно проблема в функции, она левое значение возвращает, не похожее ни на флоат ни на инт вообще ниначто не пожее..
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:20 12
outoftime, ты не знаешь какой тип возвращает функция ?
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
07.01.2010, 18:30  [ТС] 13
Цитата Сообщение от odip Посмотреть сообщение
outoftime, ты не знаешь какой тип возвращает функция ?
а вы протестите прогу у себя, введите два числа:
10
6
и сами увидите, сразу поймете что за тип)) это я его придумал))

Добавлено через 3 минуты
http://codepad.org/kTiIVTHX
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 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
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
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
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:56 16
acos( -1.29 ) как-то не считается почему-то ))

Добавлено через 1 минуту
Неправильно !
acos( x ) считается, если abs( x )<=1
1
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
07.01.2010, 18:57 17
Цитата Сообщение от valeriikozlov Посмотреть сообщение
получается что функция acos получает для вычисления число меньше 0. А значения должны быть от 0 до 2*пи.
Диапазон допустимых значений аргумента для арккосинуса от -1 до 1.
Искренне ваш, Капитан Очевидность.
1
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:58 18
И кстати компилятор у меня ругался на printf(), пока не добавил #include <stdio.h>
1
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
07.01.2010, 19:02 19
Цитата Сообщение от Nick Alte Посмотреть сообщение
Диапазон допустимых значений аргумента для арккосинуса от -1 до 1.
Искренне ваш, Капитан Очевидность
возразить нечего.
1
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 19:10 20
Еще раз: аргумент у acos() примерное -1.29
Поэтому и не считает.
1
07.01.2010, 19:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2010, 19:10
Помогаю со студенческими работами здесь

Printf ошибка вывода long double (dev c++)
ос win10х64 компилятор dev c++ (5.11) #include &lt;stdio.h&gt; int main(void) { float a...

Вывод long double
Здравствуйте. Вроде делаю как в интернетах написано, а не работает. Подскажите,пожалуйста....

Неверный вывод long double
Здравствуйте, загвоздка в том, как выводит значения тип long double. void main() { long...

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


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru