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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.81
Troll1
1 / 1 / 1
Регистрация: 23.09.2012
Сообщений: 91
#1

Точность числа с плавающей точкой - C++

02.12.2012, 20:38. Просмотров 3862. Ответов 13
Метки нет (Все метки)

У типа float числа одинарной точности с плавающей запятой обеспечивают относительную точность 7-8 десятичных цифр.
Внимание, вопрос! Объясните, пожалуйста, когда точность 7, а когда 8 цифр.
P.S. Примеры приветствуются)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2012, 20:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Точность числа с плавающей точкой (C++):

Конструирование значения целого числа или числа с плавающей точкой по его дампу - C++
Как сконструировать значения целого числа(char, short int, long int) или числа с плавающей точкой(float,double) по его дампу(bin,oct,hex)??

Округлить числа с плавающей точкой - C++
Подскажите почему работает неправильно! Не округляет, а выдает только числа до запятой! Исправьте пожалуйста!! Вот задание: Строка...

Вывод числа с плавающей точкой - C++
Доброго всем времени суток. Пытаюсь вывести число с плавающей запятой на LCD. long int Eb = 0x5959; char st_Ebf = ""; ...

Усечение числа с плавающей точкой - C++
Доброго времени суток! Собсно сабж. floor(v*1000)/1000 не помогает, обнуляется только несколько знаков после запятой, а остальные...

числа с плавающей точкой после деления - C++
Помогите, какая тут ошибка? мне нужно чтобы вышло числа с плавающей точкой после деления( например, 13/2=6,5), а у меня почему то выходит...

Неправильный вывод числа с плавающей точкой - C++
Здравствуйте. Почему когда я ввожу число с плавающей точкой, например, 43.2300012, а затем вывожу его, то при выводе печатается не...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
02.12.2012, 20:41 #2
числа с плавающей точкой на то и называют "с плавающей точкой", так как точка плавает в зависимости от порядка(экспоненты) числа
Troll1
1 / 1 / 1
Регистрация: 23.09.2012
Сообщений: 91
02.12.2012, 20:43  [ТС] #3
И все-таки) когда 7, а когда 8?
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
02.12.2012, 20:45 #4
какое 7-8??? Ты вообще знаешь, что такое "число с плавающей точкой", как оно хранится в памяти и почему точка "плавает"???
тут объясняется как точность меняется с изменением порядка http://habrahabr.ru/post/112953/
MaRKerNSK
24 / 11 / 1
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
02.12.2012, 20:48 #5
Точность чаще зависит от кампилятора, и от систмы в целом, хочешь большей точности используй Double - числа с двойной точностью,
а вообще как сказал
Kuzia domovenok, сначала изучите принцип их работы.
Troll1
1 / 1 / 1
Регистрация: 23.09.2012
Сообщений: 91
02.12.2012, 20:57  [ТС] #6
Я понимаю! сто раз уже читал про экспоненту, мантиссу, неявную единицу! Про то, что у double точность больше, мне также хорошо известно. Если, domovenok, ВЫ не можете ответить на конкретно заданный мною вопрос, отвечать и строить из себя крутого программиста не стоит.
MaRKerNSK
24 / 11 / 1
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
02.12.2012, 21:08 #7
Ну как я сказал если отвечать точно на ваш вопрос то ответ такой :
точность зависит от личных параметров системы и компилятора.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
02.12.2012, 21:10 #8
Цитата Сообщение от Troll1 Посмотреть сообщение
Если, domovenok, ВЫ не можете ответить на конкретно заданный мною вопрос, отвечать и строить из себя крутого программиста не стоит.
и правда тролль что ли?

Если нет, то представь такой упрощённый пример,
что переменные хранятся в десятичной системе (если тебе так проще) с одним десятичным разрядом под порядок(со знаком) и пятью под мантиссу.
В таком виде можно хранить следующие числа
0,99999*10^9=999990000,0 (точность до 5го знака слева от запятой)
0.99999*10^5=99999,0 (точность до 1го знака слева от запятой)
0.99999*10^0=0,99999 (точность до 5го знака справа от запятой)
0.99999*10^-5=0,0000099999 (точность до 10го знака справа от запятой)
0,99999*10^-9=0,00000000099999(точность до 14го знака справа от запятой)

как тут можно говорить о какой-то конкретной точности в N знаков?
+ глянь эту картинку и подумай о точности http://habrastorage.org/storage/habr...2e6c838184.gif
Troll1
1 / 1 / 1
Регистрация: 23.09.2012
Сообщений: 91
02.12.2012, 21:35  [ТС] #9
Вот смотри на мой пример z=(y-x)^1/2 при y=776644278 x=687524
при y=776644278 x=687542
Результат один и тот же(можешь проверить, если делать нечего).
Вот в чем вопрос
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
02.12.2012, 22:29 #10
Рассмотрим твоё число y=776644278 какого оно порядка? По основанию 10 порядок очевидно 9, т.к. y=0,776644278*10^9
А по основанию 2? Посчитаем, что log2(776644278)=29.533 Значит порядок числа 29
Представим число в виде 776644278=M*2^29, где 2^29=536870912, где М - мантисса
Тогда находим y=1,4466126970946788787841796875*2^29


Теперь мы готовы записать это число в переменную типа float. Об этом типе известно, что он выделяет в памяти
под мантиссу 23 бит, а под порядок 8 бит
Тогда порядок запишется в виде десятичное 29=00011101 в двоичной. (5 бит влезли в предоставленные флоатом 8)

Мантисса записывается как число с отброшенной точкой и первой единицей (т.к. в таком представлении числа, число
всегда начинается с единицы и она подразумевается по умолчанию)
То есть 4466126970946788787841796875 в десятичной это 11100110001110100000010000000101100110010010100000101100001011 в двоичной.
Имеем Аж 62 двоичных разряда! придётся обрезать с конца до 23х! Вот здесь и вносится погрешность

Аналогично считаем х, вносим ещё погрешность, при расчётах вносим ещё.. и того и получаем.
Troll1
1 / 1 / 1
Регистрация: 23.09.2012
Сообщений: 91
02.12.2012, 23:17  [ТС] #11
Добавлено через 6 минут
Спасибо за очень развернутый и подробный ответ. Только я не догнал вот это
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Тогда находим y=1,4466126970946788787841796875*2^29
Если я правильно понял y=1,4466126970946788787841796875-это мантисса. Если да, откуда берется это число 1,4466126970946788787841796875?
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
02.12.2012, 23:50 #12
твоё число y делится на два в двадцать девятой и получается мантисса
Почему именно в 29й ? Потому что если разделить на 2 в 30й получится число меньше единицы, а если на 2 в 28й, то больше. А мантисса должна иметь формат 1,ххххххх
Как я нашёл, число 29 (порядок) быстро? Взял логарифм по основанию 2 от у.
Troll1
1 / 1 / 1
Регистрация: 23.09.2012
Сообщений: 91
05.12.2012, 12:32  [ТС] #13
Почему надо обрезать с конца до 23?
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
05.12.2012, 18:44 #14
тип float выделяет в памяти под мантиссу 23 бит
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2012, 18:44
Привет! Вот еще темы с ответами:

Ifstream считать из файла числа с плавающей точкой - C++
Здравствуйте форумчане. Поток std::ifstream хорошо считывает целые числа, но когда дело доходит до числе с плавающей точкой он считывает...

Отличить целое от числа с плавающей точкой в 32-разрядном регистре - C++
Есть следующий union: union { int i; float f; } i_f; Как можно определить, какие данные в настоящий момент находятся...

При вводе числа с плавающей точкой завершается программа - C++
Вот код: #include <stdio.h> #include <math.h> #include <stdlib.h> #include <clocale> /* run this program using the...

Перевод числа с плавающей точкой из шестнадцатиричного в двоичный вид - C++
int x; cin >>hex >> x; cout << bitset<sizeof(int) * 8>(x); Что нужно изменить?)


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.12.2012, 18:44
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru