Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2014, 15:30   #1
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию 0.111 из 10й в 2й систему счисления, где ошибка?

Всем привет.
Имеется число, записанное в десятичной системе счисления : 0.111.

Задача перевести в двоичное представление.
Если делаю вручную по законам перевода, получается число, отличное от того, которое мне выдает онлайн система перевода систем счиления(numsys.ru).

В общем, вот что у меня получается:
Код:
0.000 111 000 110 101 001 111 110 111 110 011 101 101 100 100 010 110 100 01
А вот что выдает система онлайн перевода:
Код:
0.000 111 000 110 101 001 111 110 111 100 111 011 011 001 000 1011
Вот выхлоп моего скрипта, отличия начинаются с 10 позиции:
Код:
1) 0.111 * 2 = 0.222
2) 0.222 * 2 = 0.444
3) 0.444 * 2 = 0.888
4) 0.888 * 2 = 1.776
5) 0.776 * 2 = 1.552
6) 0.552 * 2 = 1.104
7) 0.104 * 2 = 0.208
8) 0.208 * 2 = 0.416
9) 0.416 * 2 = 0.832
10) 0.832 * 2 = 1.664
11) 0.664 * 2 = 1.328
12) 0.328 * 2 = 0.65600000000001
13) 0.65600000000001 * 2 = 1.312
14) 0.31200000000001 * 2 = 0.62400000000002
15) 0.62400000000002 * 2 = 1.248
16) 0.24800000000005 * 2 = 0.49600000000009
17) 0.49600000000009 * 2 = 0.99200000000019
18) 0.99200000000019 * 2 = 1.9840000000004
19) 0.98400000000038 * 2 = 1.9680000000008
20) 0.96800000000076 * 2 = 1.9360000000015
21) 0.93600000000151 * 2 = 1.872000000003
22) 0.87200000000303 * 2 = 1.7440000000061
23) 0.74400000000605 * 2 = 1.4880000000121
24) 0.48800000001211 * 2 = 0.97600000002421
25) 0.97600000002421 * 2 = 1.9520000000484
26) 0.95200000004843 * 2 = 1.9040000000969
27) 0.90400000009686 * 2 = 1.8080000001937
28) 0.80800000019372 * 2 = 1.6160000003874
29) 0.61600000038743 * 2 = 1.2320000007749
30) 0.23200000077486 * 2 = 0.46400000154972
31) 0.46400000154972 * 2 = 0.92800000309944
32) 0.92800000309944 * 2 = 1.8560000061989
33) 0.85600000619888 * 2 = 1.7120000123978
34) 0.71200001239777 * 2 = 1.4240000247955
35) 0.42400002479553 * 2 = 0.84800004959106
36) 0.84800004959106 * 2 = 1.6960000991821
37) 0.69600009918213 * 2 = 1.3920001983643
38) 0.39200019836426 * 2 = 0.78400039672852
39) 0.78400039672852 * 2 = 1.568000793457
40) 0.56800079345703 * 2 = 1.1360015869141
41) 0.13600158691406 * 2 = 0.27200317382812
42) 0.27200317382812 * 2 = 0.54400634765625
43) 0.54400634765625 * 2 = 1.0880126953125
44) 0.0880126953125 * 2 = 0.176025390625
45) 0.176025390625 * 2 = 0.35205078125
46) 0.35205078125 * 2 = 0.7041015625
47) 0.7041015625 * 2 = 1.408203125
48) 0.408203125 * 2 = 0.81640625
49) 0.81640625 * 2 = 1.6328125
50) 0.6328125 * 2 = 1.265625
51) 0.265625 * 2 = 0.53125
52) 0.53125 * 2 = 1.0625
53) 0.0625 * 2 = 0.125
54) 0.125 * 2 = 0.25
55) 0.25 * 2 = 0.5
56) 0.5 * 2 = 1
Вопрос : Кто прав, я со своим скриптом, или онлайн система?
Заранее спасибо за ответ.
DakotaZ вне форума Ответить с цитированием
Старый 24.10.2014, 16:05   #2
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

По-моему, все числа в памяти компьютера хранятся в формате по стандарту IEEE 754. Подробнее можно прочесть в книге "Архитектура компьютера", Таненбаум. Приложение Б "Числа с плавающей точкой"
8Observer8 вне форума Ответить с цитированием
Старый 24.10.2014, 16:36   #3
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
По-моему, все числа в памяти компьютера хранятся в формате по стандарту IEEE 754. Подробнее можно прочесть в книге "Архитектура компьютера", Таненбаум. Приложение Б "Числа с плавающей точкой"
Это не ответ на мой вопрос
Я не спрашивал как компьютер хранит числа
DakotaZ вне форума Ответить с цитированием
Старый 24.10.2014, 17:01   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Есть вероятность, что копится погрешность на операциях с плавающей точкой.
pu4koff вне форума Ответить с цитированием
Старый 24.10.2014, 17:17   #5
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Невнимательно прочитал. Тогда непонятно ничего. Мне самому интересно стало. Дальше покажу, как я вижу ситуацию, а вы поправьте, если что не так

Вот как строятся вещественные числа в десятичной системе:

18.157d = 1*10^1 + 8*10^0 + 1*10^-1 + 5*10^-2 + 7*10^-3

Наверное, так же должны и двоичные строиться. Вот как это число будет выглядеть в двоичной системе исчисления:

18d = 1*2^4 + 0*2^3 + 0*2^2 + 1*2^1 + 0*2^0

Как видите, я дошёл до точки, а что дальше? 2^-1, 2^-2 и т.д.?

Последний раз редактировалось 8Observer8; 24.10.2014 в 17:19.
8Observer8 вне форума Ответить с цитированием
Старый 24.10.2014, 17:37   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Как видите, я дошёл до точки, а что дальше? 2^-1, 2^-2 и т.д.?
именно. при переводе будет погрешность.
есть годная православная статья Антона Григорьева "Неочевидные особенности вещественных чисел". Читать всем!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 24.10.2014, 18:35   #7
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

У тебя вроде правильно.
http://www.wolframalpha.com/input/?i=0.111+to+binary
Somebody вне форума Ответить с цитированием
Старый 24.10.2014, 18:46   #8
abit
Пользователь
 
Регистрация: 21.10.2014
Сообщений: 43
По умолчанию

to DakotaZ
прогнал твой вариант - правильный http://ideone.com/yoWGeh
их число 0.11099999856948806... получается
abit вне форума Ответить с цитированием
Старый 24.10.2014, 22:46   #9
DakotaZ
Пользователь
 
Регистрация: 31.07.2014
Сообщений: 48
По умолчанию

Значит я правильно сделал, а они нет?
DakotaZ вне форума Ответить с цитированием
Старый 24.10.2014, 22:53   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от DakotaZ Посмотреть сообщение
Значит я правильно сделал, а они нет?
а какой тип переменной у тебя для хранения float-числа?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++. Ошибка при присвоении символу следующей по порядку буквы (нужно для перевода в другую систему счисления c основанием > 10) Vladislavv Помощь студентам 1 30.07.2014 13:16
Перевести число в двоичную систему счисления и вывести результат в массив, где каждый элемент – дв nzltv Помощь студентам 2 21.03.2014 08:24
Перевод из 3 в 2 систему счисления на С++ VladJAy Помощь студентам 10 25.10.2012 15:50
Перевести в 16 ричную систему счисления колянчик1712 Паскаль, Turbo Pascal, PascalABC.NET 0 26.12.2011 18:10