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

Представление double в компе(сколько знаков он может считывать) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
29.11.2012, 23:05     Представление double в компе(сколько знаков он может считывать) #1
Тип double может считывать до 15-ти символов. Но в некоторых случаях double может считывать и до 16-ти. Почему так? Как это объяснить? Покажите на примере пожалуйста примеры этих числе.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
29.11.2012, 23:15     Представление double в компе(сколько знаков он может считывать) #2
Потому что там хранится двоичное дробное число. Вот 32-битный int тоже может представлять девять десятичных цифр, но в некоторых случаях может и десять.
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
29.11.2012, 23:23  [ТС]     Представление double в компе(сколько знаков он может считывать) #3
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Потому что там хранится двоичное дробное число. Вот 32-битный int тоже может представлять девять десятичных цифр, но в некоторых случаях может и десять.
Можно пример пожалуйста, просто понять надо какие именно числа. Может диапазон какой-то их есть?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.11.2012, 00:58     Представление double в компе(сколько знаков он может считывать) #4
Мантисса стандартного double имеет размер 52+1 бит, может представлять числа от 1,0 до 1,9999999999999997779553950749686919152736663818359375 с минимальным шагом в 0,0000000000000002220446049250313080847263336181640625. То есть предыдущим представимым числом относительно максимума будет 1,999999999999999555910790149937383830547332763671875. Видите вот эту цифру после серии нулей? Она шестнадцатая. Которая изменилась с семёрки на пятёрку при вычитании. числа между 1,999999999999999555910790149937383830547332763671875 и 1,9999999999999997779553950749686919152736663818359375 double не в состоянии представить точно. Итого в среднем есть только 15 цифр (девятки) + условно та единица в начале. То есть в среднем точность (разрешающая способность) double это 15 цифр, если не считать ту единицу. Иногда точность можно условно считать равной 16: числа 1,9999999999999996 и 1,9999999999999997 double всё же может различить. А вот 1,9949999999999996 и 1,994999999999997 уже нет. Иногда может быть точность и меньше, если там того мега-хвоста набежит ошибка округления, то double не сможет представить точно одну последнюю цифру.
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
30.11.2012, 22:09  [ТС]     Представление double в компе(сколько знаков он может считывать) #5
Мантисса стандартного double имеет размер 52+1 бит, может представлять числа от 1,0 до 1,9999999999999997779553950749686919152736663818359375 с минимальным шагом в 0,0000000000000002220446049250313080847263336181640625. То есть предыдущим представимым числом относительно максимума будет 1,999999999999999555910790149937383830547332763671875. Видите вот эту цифру после серии нулей? Она шестнадцатая. Которая изменилась с семёрки на пятёрку при вычитании. числа между 1,999999999999999555910790149937383830547332763671875 и 1,9999999999999997779553950749686919152736663818359375 double не в состоянии представить точно.
Я понял всё что процитировал выше, но вот становится непонятно со следующего момента:
Итого в среднем есть только 15 цифр (девятки) + условно та единица в начале. То есть в среднем точность (разрешающая способность) double это 15 цифр, если не считать ту единицу. Иногда точность можно условно считать равной 16: числа 1,9999999999999996 и 1,9999999999999997 double всё же может различить. А вот 1,9949999999999996 и 1,994999999999997 уже нет. Иногда может быть точность и меньше, если там того мега-хвоста набежит ошибка округления, то double не сможет представить точно одну последнюю цифру.
1). Про какую единицу речь идёт в самом начале? 2). Как вы поняли, что именно числа 1,9999999999999996 и 1,9999999999999997 double всё же может различить. А вот 1,9949999999999996 и 1,994999999999997 уже нет? Как мне это самому вычислить?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.11.2012, 22:12     Представление double в компе(сколько знаков он может считывать) #6
Цитата Сообщение от aleksand Посмотреть сообщение
Про какую единицу речь идёт в самом начале?
1,999999999999999555910790149937383830547332763671875
Вот эта, красным выделена.

Цитата Сообщение от aleksand Посмотреть сообщение
Как вы поняли
Взял с потолка с третьей попытки.

Цитата Сообщение от aleksand Посмотреть сообщение
Как мне это самому вычислить?
Смотреть на представления чисел в двоичной системе. 52 цифры после запятой совпадают = числа не различимы.
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
30.11.2012, 23:19  [ТС]     Представление double в компе(сколько знаков он может считывать) #7
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
1,999999999999999555910790149937383830547332763671875
Вот эта, красным выделена.

Взял с потолка с третьей попытки.

Смотреть на представления чисел в двоичной системе. 52 цифры после запятой совпадают = числа не различимы.
Я про единицу что-то ничего не понял. Можно простым языком всё рассказать? (чтобы было доступно и понятно новичку)
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.11.2012, 23:23     Представление double в компе(сколько знаков он может считывать) #8

Не по теме:

Нугосподитыбожемой.

Если double хранит число 1,999999999999999555910790149937383830547332763671875 то на самом деле внутри хранится 0,999999999999999555910790149937383830547332763671875, а эта единица подразумевается. Фактически она не хранится в памяти, но добавляется при всех операциях. То есть она не является в этом случае значащей, не несёт какой-либо информации о числе.

Но ещё есть так называемые денормализованные числа. Для них эта единица не добавляется.

Поэтому она условно считается значащей, потому что всё же иногда может отсутствовать.
Tige
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 29
30.11.2012, 23:36     Представление double в компе(сколько знаков он может считывать) #9
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
1,9999999999999997779553950749686919152736663818359375
Откуда взялись эти числа?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
30.11.2012, 23:57     Представление double в компе(сколько знаков он может считывать) #10
1,9999999999999997779553950749686919152736663818359375 = 2 – 2–52.
Tige
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 29
01.12.2012, 00:18     Представление double в компе(сколько знаков он может считывать) #11
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
2 – 2–52.
А почему так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2012, 00:41     Представление double в компе(сколько знаков он может считывать)
Еще ссылки по теме:

C++ Двоичное представление double
Как вывести double до 2 знаков после запятой? C++
C++ Как считывать только одно число типа double за один проход

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

Или воспользуйтесь поиском по форуму:
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
01.12.2012, 00:41     Представление double в компе(сколько знаков он может считывать) #12
Есть мантисса числа. Внутри это 52-битное целое число без знака. Наибольшее представимое им значение это 252 – 1. Интервал представимых чисел [1; 2) разбивается на 252 частей размером 2–52 каждая, пронумерованных индексами от 0 до 252 – 1. Каждая i-я часть представляет округлённо все числа в полуоткрытом интервале [1 + 2–52 × i; 1 + 2–52 × (i + 1)) как число 1 + 2–52 × i. Отсюда максимальное представимое число это 1 + 2–52 × (252 – 1) = 2 – 2–52.
Yandex
Объявления
01.12.2012, 00:41     Представление double в компе(сколько знаков он может считывать)
Ответ Создать тему
Опции темы

Текущее время: 03:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru