Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Сколько цифр числа типа double можно вывести на экран при помощи printf в C++  (Прочитано 15579 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Nedlge

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
#include <stdio.h>
double fib(int a)
{
int i;
double f1,f2,fn;
if (a == 0)
return 0;
if (a == 1 || a == 2)
return 1;
else
f1 = 1; f2 = 1;
for (i = 3; i <= a; ++i)
{
fn = f1 + f2;
f1 = f2;
f2 = fn;
}

return fn;

}
void main()
{
int n;
double f;
printf("Vvedite nomer chisla: ");
scanf ( "%d", &n);
f = fib(n);
printf("Chislo: %.0f\n", f);
}

Эта прога по номеру числа выводит само число Фибоначчи,
под виндой можно нормально вывести тока 15(17 зависит от системы) символов числа типа double, если число превышает 15(17) символов, то вместо нужных цифр он вставляет нули. Под Ubuntu можно вывести намного больше символов.
Дак вот мне нужно узнать какое именно количество символов можно вывести и как такое количество помещается в 8 байт.

// Используйте тег код.
« Последнее редактирование: 04 Октября 2011, 23:02:56 от RazrFalcon »

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5742
  • Все по палатам!
    • Просмотр профиля
Извините, я все еще учусь

Оффлайн Nedlge

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Прошу простить, но вам стоит научится читать. Я спрашиваю, какое именно количество символов можно вывести и как такое количество помещается в 8 байт именно в Ubuntu (в Википедии говорится про винду). Я и так знал сколько бит выделяется под мантиссу, порядок и знак и то что вычисляется все по формуле m*2^p.

Оффлайн SergeyIT

  • Зануда.
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5742
  • Все по палатам!
    • Просмотр профиля
Прошу простить, но вам стоит научится читать.
(в Википедии говорится про винду)
Прежде чем заявлять такое, стоит научиться читать... где там хоть слово про винду? :idiot2:
Извините, я все еще учусь

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
int main()
{
double num = 0.000000000000000000000000000099;

printf("%.030f\n", num);
exit(0);
}
[hippi@Hippi C]$ gcc -o test2 test1.c
[hippi@Hippi C]$ ./test2
0.000000000000000000000000000099
30 знаков после запятой, еще раз в гугл читать про то, что такое число двойной точности, и как работает printf().

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 641
    • Просмотр профиля
#include <stdio.h>
#include <limits.h>
#include <float.h>

int main()
{
   printf("Double max: %lf\n", DBL_MAX);
   
   return 0;
}

На Маке вывело:
jackbook:Desktop jack$ ./a.out
Double max: 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
jackbook:Desktop jack$

То или нет?
Нейросети тебя не заменят. Тебя заменит человек, который умеет ими пользоваться.

andrey_p

  • Гость
Не то. То, что выводит printf, и то, что реально сохраняется в памяти, не одно и то же. Printf (теоретически) может выводить бесконечно, но расчитывать можно только на 15 значащих цифр (имеется в виду double стандарта IEEE). Проблема в конечном двоичном представлении в памяти и потенциально бесконечном десятичном представлении действительных чисел.

Если вас не интересуют основы, то просто примите 15 цифр. Если интересуют, то штудируйте статью из Википедии и постарайтесь понять, почему 2037035976334486086268445688409378161051468393665936250636140449354381299763336706183397376 (91 цифрa) в double храниться абсолютно точно, а вот число Пи - только с 16-ю правильными цифрами, хотя может быть выведено с гораздо большим количеством, допустим питон 2.7:
>>> import math
>>> "%.50f" % math.pi
'3.14159265358979311599796346854418516159057617187500'
« Последнее редактирование: 05 Октября 2011, 09:33:28 от andrey_p »

Оффлайн Nedlge

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Мне нужно просто узнать почему когда компилю под виндой в вижуал студио 2010 он правильно выводит только 15 цифр, а если я компилю под Ubuntu при помощи gcc или g++, то выводит около 310 цифр. И как Ubuntu это делает, под дабл выделяется абсолютно одинаковое количество байт(8).

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
И что, все 310 цифр всегда верные?  :o
Делюсь знаниями, но их у меня мало!

Оффлайн es1840

  • Активист
  • *
  • Сообщений: 328
    • Просмотр профиля
Цитировать
Эта прога по номеру числа выводит само число Фибоначчи,
под виндой можно нормально вывести тока 15(17 зависит от системы) символов числа типа double

Фибоначчи в double - очень оригинально...  :idiot2:

andrey_p

  • Гость
Цитировать
Мне нужно просто узнать почему когда компилю под виндой в вижуал студио 2010 он правильно выводит только 15 цифр, а если я компилю под Ubuntu при помощи gcc или g++, то выводит около 310 цифр.
Потому что инструкция printf - это фактически особая программа из стандартной библиотеки, которая различается в Studio и в glibc. Хранение в памяти у них должно быть одинаковое. Согласитесь, то, что если printf("%.50f\n", 1.0/3); выводит
0.33333333333333331482961625624739099293947219848633 не означает, что этому результату можно доверять после 16-й цифры.

В некоторых языках программирования можно настраивать, как будут выводится по умолчанию числа с плавающей точкой:
% awk 'BEGIN {
a=2.0/3
print a
OFMT="%.50f"
print a
}'
0.666667
0.66666666666666662965923251249478198587894439697266
Но от того, как распечатывается переменная "а", ее значение, хранящееся в памяти, никоем образом не меняется.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Фибоначчи в double - очень оригинально...  :idiot2:
Это ужасы нашего городка.

Оффлайн Jack Sparrow

  • Активист
  • *
  • Сообщений: 641
    • Просмотр профиля
andrey_p, вы, скорее всего, конечно же правы. Просто ТС спрашивал о функции printf, а не о внутреннем представлении. А я просто взял длинный пример из книжки "Beginning C" и сократил его, но, почему-то получилось не так, как нужно. А вот и полный пример. А в его выводе таки, да, говорится о 15 цифрах.

/* Program 2.11 Finding the limits */

#include <stdio.h>   /* For command line input and output */
#include <limits.h>  /* For limits on integer types */
#include <float.h>   /* For limits on floating-point types */

int main(void)
{
 
printf("Variables of type char store values from %d to %d", CHAR_MIN, CHAR_MAX);
printf("\nVariables of type unsigned char store values from 0 to %u", UCHAR_MAX);
printf("\nVariables of type short store values from %d to %d", SHRT_MIN, SHRT_MAX);
printf("\nVariables of type unsigned short store values from 0 to %u", USHRT_MAX);
printf("\nVariables of type int store values from %d to %d", INT_MIN, INT_MAX);
printf("\nVariables of type unsigned int store values from 0 to %u", UINT_MAX);
printf("\nVariables of type long store values from %ld to %ld", LONG_MIN, LONG_MAX);
printf("\nVariables of type unsigned long store values from 0 to %lu", ULONG_MAX);
printf("\nVariables of type long long store values from %lld to %lld", LLONG_MIN, LLONG_MAX);
printf("\nVariables of type unsigned long long store values from 0 to %llu", ULLONG_MAX);
printf("\n\nThe size of the smallest non-zero value of type float is %.3e", FLT_MIN);
printf("\nThe size of the largest value of type float is %.3e", FLT_MAX);
printf("\nThe size of the smallest non-zero value of type double is %.3e", DBL_MIN);
printf("\nThe size of the largest value of type double is %.3e", DBL_MAX);
printf("\nThe size of the smallest non-zero value ~CCC of type long double is %.3Le", LDBL_MIN);
printf("\nThe size of the largest value of type long double is %.3Le\n", LDBL_MAX);

printf("\nVariables of type float provide %u decimal digits precision.", FLT_DIG);
printf("\nVariables of type double provide %u decimal digits precision.", DBL_DIG);
printf("\nVariables of type long double provide %u decimal digits precision.", LDBL_DIG);

return 0;
}
Нейросети тебя не заменят. Тебя заменит человек, который умеет ими пользоваться.

Оффлайн Nedlge

  • Автор темы
  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
310 символов выдается абсолютно правильно, проверка проводиться программой действующей по тому же принципу, но помещающая по одному символу в один элемент массива. И мне интересно как с технической стороны осуществляется хранение чисел в Ubuntu, я представляю как это происходит в Винде.

 

Страница сгенерирована за 0.029 секунд. Запросов: 22.