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

Разрядность переменных или каким образом так точно считает калькулятор Windows - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
-=MASTER=-
77 / 71 / 5
Регистрация: 15.03.2012
Сообщений: 259
15.06.2012, 12:08     Разрядность переменных или каким образом так точно считает калькулятор Windows #1
Привет! Тут вот покоя не дает один вопрос.
Думаю ни для кого не секрет, что не смотря на свою битность и соответственно возможное количество знаков после запятой, переменные типа float, double и long double разрядность (точность как бы) имеют совсем иную. Тоесть, несмотря на то переменная типа float может содержать в себе достаточно длинное число, по сути дела в случае операции над числами типа float точность будет в районе 6-7 знаков (если в начале нули - они отбрасываются), после 6-и 7-и знаков идет по хорошему мусор во всю возможную длинну этого float.

И так для справки, точность операций, производимых переменными различных типов фактический составляет:

float 6...7 цифр
double 15...16 цифр
long double 19 цифр

После этих значений идёт откровенный мусор, не смотря на то, что long double по определению может содержать в себе число 1.7e-308....1.7e308 (в 64-х битах, не в 80-и). Ну как бы мы можем вручную набить число 1,7 на 10 в 308-й стоепени , но если будем производить операции над такими числами, ну типа умножения или сложения, то co-процессор выдаст реально точные значения в пределах 19-и цифр....это факт!

Так вот вопрос, каким образом маткад или хотябы калькулятор Windows (ну 7-ки к примеру), оперирует огромными цифрами (до 33 цифр вроде - могу ошибаться) ?????? Либо он все это считает с погрешностью, либо в калькуляторе как то огромное число делится на части а потом канкатинатится?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2012, 12:08     Разрядность переменных или каким образом так точно считает калькулятор Windows
Посмотрите здесь:

Посоветуйте, пожалуйста, каким образом будет лучше реализовать мою задачу? (MFC, Win API, Windows Forms)) C++
C++ Каким образом можно сделать выключение компютера С++
C++ Каким образом записать слеш в символьную переменную
C++ Каким образом зашифровать Hex строки
Каким образом реализуется квалификатор const? C++
C++ Каким образом пройдёт передача параметров в функцию
Каким образом разархивировать gzip? C++
C++ Cygwin на windows и разрядность

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
15.06.2012, 16:24     Разрядность переменных или каким образом так точно считает калькулятор Windows #2
Цитата Сообщение от -=MASTER=- Посмотреть сообщение
мусор во всю возможную длинну этого float
Никакого мусора. У нас каждый тип данных записывается в определенное число байтов. Флоат, в частности, в 4-х байтах. 4 Байта=32 бита. Первый разряд -- флаговый (знак). Остается 31. Вот 32-й разряд (не считая флагового) уже не влезет, и потому точность типа float ограничивается 7-ю десятичными знаками (надо посмотреть, как представляются числа в типе float, не помню..).
В калькуляторе, похоже, либо используются типы с большим количеством разрядов, либо длинная арифметика (представление числа в виде массива).

Добавлено через 23 минуты
Ага, нашел. Тип 32 бита типа float распределяются так: 1-й -- знаковый (ну, точнее, номерация идет с конца и до нуля, потому по кошерному он будет называться 31-м, но я буду писать по такой номерации). Следующие 8 битов -- экспонента. Оставшиеся 23 -- дробная часть числа, полученного многократным делением\умножением на 2 исходного, целая часть которого - 1. Итого, число представляется как (-1)^sign * frac * 2^exp.
К примеру, число -11.25 будет представляться так:
Первый бит 1 -- число отрицательное. Теперь делим его на 2, пока не станет целая часть 1. 11.25=5.625*2=2.8125*4=1.40625*8. Дробная часть числа 1.40625 -- 0.40625. Ее и записываем в те 23 разряда. Далее, 8=2^3, добавляем к этой тройке 127 (этому тоже есть логическое обьяснение), получаем 130. Переводим в двоичную систему, получаем 10000010. Вот это пишем в те 8 бит.
Итого, какие же числа мы можем хранить в float'е?
По порядку(приблизительно) -- от 2^-127, до 2^+128. 2^10=1024, это примерно 10^3
Итого, по порядку -- от 10^-36 до 10^36. По настоящему, я считал грубо, и там не 36, а 38.
И с какой точностью мы можем хранить значущую часть числа? У нас 23 разряда. Ошибка будет в 24-м разряде. (1/2)^24=((1/2)^10)^2.4=(1/10)^7.2 -- примерно 1/10^7. Итого, флоат хранит 7 значущих цифр.

Добавлено через 10 минут
Таким образом, по аналогии, мы можем оперировать числами вида (пятизначное число)*10^(много-много), при этом мы вроде как оперируем очень большими числами, но на самом деле все операции происходят с пятизначными, и большой точности мы не получим.
Yandex
Объявления
15.06.2012, 16:24     Разрядность переменных или каким образом так точно считает калькулятор Windows
Ответ Создать тему
Опции темы

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