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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Показатель прогресса http://www.cyberforum.ru/cpp-beginners/thread82875.html
Подскажите пожалуйста, как сделать в консоли показатель выполняемого процесса?? накидал такой вот код, но он не работает как хотелось бы! (( я думал, что он будет каждый раз переписывать цифру, но шиш - он выводит проценты друг за другом.. void processing(int NOW, int MAX) { cout << "0.0%"; float proc = 0; proc = 100 * NOW / MAX;
C++ Матрица, среднее колонны #include <iostream.h> #include <conio.h> #include <stdlib.h> void main() { int x,i,k,y; randomize(); for(i=0;i<4;i++) for(k=0;k<4;k++) http://www.cyberforum.ru/cpp-beginners/thread82874.html
Запись в файл, scandir C++
Записать содержимое указанного каталога в файл. Если каталог не пуст, выдать на экран сообщение. Имя каталога передается через параметр командной строки. помогите ;-)
C++ Упорядочивание квадратной матрицы методом вставки
Нужна программа на С++. 1) Упорядочить элементы строк матрицы (5*5) по убыванию методом вставки. Помогите пжл!
C++ Деревья.. http://www.cyberforum.ru/cpp-beginners/thread82837.html
Всем вечер добрый! Кого не затруднит, помогите, пожалуйста! Корректна ли функция добавления элемента к дереву? В процессе выполнения программы работает неверно... void ADD (int g, int flag, MOVIE *elem, MOVIE *p) { if (p==NULL) { if (flag==1) cout<<"\nThe new element is added."; g++; p=elem;
C++ Как задать псевдоним для указателя на структуру Подскажите. пожалуйста, можно как нибудь задать псевдоним для указателя на структуру Т.е. я пытался сделать что то вроде такого UnicodeString& DataCell = EInitialMatrixWeight->Cells; но компилятор стал ругаться подробнее

Показать сообщение отдельно
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
07.01.2010, 19:31     Вывод long double с используя printf()
Кстати замучился выводить 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, ибо не работает
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru