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

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

05.01.2010, 22:44. Показов 54987. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2010, 22:44
Ответы с готовыми решениями:

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

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

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

26
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.01.2010, 04:01
там просто %Lf для long double потому что она для float и double юзает %f

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

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

Добавлено через 3 минуты
http://codepad.org/kTiIVTHX
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:51
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;
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
> 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
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
07.01.2010, 18:52
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
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:56
acos( -1.29 ) как-то не считается почему-то ))

Добавлено через 1 минуту
Неправильно !
acos( x ) считается, если abs( x )<=1
1
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
07.01.2010, 18:57
Цитата Сообщение от valeriikozlov Посмотреть сообщение
получается что функция acos получает для вычисления число меньше 0. А значения должны быть от 0 до 2*пи.
Диапазон допустимых значений аргумента для арккосинуса от -1 до 1.
Искренне ваш, Капитан Очевидность.
1
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 18:58
И кстати компилятор у меня ругался на printf(), пока не добавил #include <stdio.h>
1
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
07.01.2010, 19:02
Цитата Сообщение от Nick Alte Посмотреть сообщение
Диапазон допустимых значений аргумента для арккосинуса от -1 до 1.
Искренне ваш, Капитан Очевидность
возразить нечего.
1
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 19:10
Еще раз: аргумент у acos() примерное -1.29
Поэтому и не считает.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.01.2010, 19:10
Помогаю со студенческими работами здесь

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

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

Вывод long double
Здравствуйте. Вроде делаю как в интернетах написано, а не работает. Подскажите,пожалуйста. #include &lt;cstdlib&gt; ...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru