Другие языки программирования и технологии
Сложный вопрос с переводом в двоичную систему!
Пара вопросов: 1. Как записать число 0.1 в двоичную систему - таким способом что бы получилось конечное число знаков (еденичек и ноликов). 2. И как выполнить арифметические действия над этим числом (в двоичной системе) - что бы получилась минимальная погрешность? Проще: Объясните метод применяемый в калькуляторах для арифметических действия с чилом 0.1 (0.1 * 5.45; 0.1\ 0.5 и т.д.)
Перевести дробную часть в двоичную систему можно так для числа 0.1:
пишем в целой части 0.
Теперь умножаем это число на 2: 0.1*2 = 0.2 .Видим нуль точка два. То есть в целой части после умножения остался нуль. Это и есть первая цифра дробной части.
То есть теперь у нас в результате получается 0.0...(в двоичной системе счисления) .
Теперь снова умножаем 0.2 * 2 = 0.4 . Снова нуль в результат. Дальше распишу в столбик: действие ---результат.
0.1*2 = 0.2 ---0.0...
0.2*2 = 0.4 ---0.00...
0.4*2 = 0.8 ---0.000....
0.8*2 = 1.6 ---0.0001....
0.6*2 = 1.2 ---0.00011...
0.2*2 = 0.4 ---0.000110...
0.4*2 = 0.8 ---0.0001100...
0.8*2 = 1.6 ---0.00011001....
0.6*2 = 1.2 ---0.000110011....
и т. к. Каждый раз, когда после умножения результат больше единицы, мы вносим очередную цифру 1 в двоичный перевод, и отнимаем эту единицу от нашего результата умножения. Чем больше цифр в двоичном разряде доступно, тем меньше погрешность. Абсолютно точно дробную часть представить неполучится, полюбому будут потери, что подтверждает периодическая последовательность результатов умножения.
Вот ещё пример:
Переведем число 2.285 в двоичную систему:
2 это 10(bin)
0.285*2 = 0.570 ---10.0...
0.570*2 = 1.140 ---10.01...
0.14*2 = 0.28 ---10.010...
0.28*2 = 0.56 ---10.0100...
0.56*2 = 1.12 ---10.01001...
0.12*2 = 0.24 ---10.010010...
0.24*2 = 0.48 ---10.0100100...
0.48*2 = 0.96 ---10.01001000...
0.96*2 = 1.92 ---10.010010001...
Теперь сложим наши два числа в десятичной:
2.285 + 0.1 = 2.385.
Переведем его в двоичную:
2.385 = ? (bin)
0.385*2 = 0.770 ---10.0...
0.77*2 = 1.54 ---10.01...
0.54*2 = 1.08 ---10.011...
0.08*2 = 0.16 ---10.0110...
0.16*2 = 0.32 ---10.01100...
0.32*2 = 0.64 ---10.011000...
0.64*2 = 1.28 ---10.0110001...
0.28*2 = 0.56 ---10.01100010...
0.56*2 = 1.12 ---10.011000101...
А теперь сложим предыдущие два числа в их двоичном представлении и сравним с полученным прямым переводом числом:
0.000110011
+
10.010010001
=
10.011000100 (это при сложении двух чисел, полученных при их отдельном переводе в двоичную)
10.011000101 (это вначале десятичное сложение 2.285 и 0.1, а потом перевод их результата в двоичную) .
Как видим, результаты отличаются всего на 0.000000001, что обусловлено потерями в точности при переводе чисел.
Насчет умножения - точно так же - умножение между обычными бинарными числами. А про отрицательные точно не скажу - там какой-то разряд за знак отвечает, наверное, самый правый из значимых. Тут не в курсе.
пишем в целой части 0.
Теперь умножаем это число на 2: 0.1*2 = 0.2 .Видим нуль точка два. То есть в целой части после умножения остался нуль. Это и есть первая цифра дробной части.
То есть теперь у нас в результате получается 0.0...(в двоичной системе счисления) .
Теперь снова умножаем 0.2 * 2 = 0.4 . Снова нуль в результат. Дальше распишу в столбик: действие ---результат.
0.1*2 = 0.2 ---0.0...
0.2*2 = 0.4 ---0.00...
0.4*2 = 0.8 ---0.000....
0.8*2 = 1.6 ---0.0001....
0.6*2 = 1.2 ---0.00011...
0.2*2 = 0.4 ---0.000110...
0.4*2 = 0.8 ---0.0001100...
0.8*2 = 1.6 ---0.00011001....
0.6*2 = 1.2 ---0.000110011....
и т. к. Каждый раз, когда после умножения результат больше единицы, мы вносим очередную цифру 1 в двоичный перевод, и отнимаем эту единицу от нашего результата умножения. Чем больше цифр в двоичном разряде доступно, тем меньше погрешность. Абсолютно точно дробную часть представить неполучится, полюбому будут потери, что подтверждает периодическая последовательность результатов умножения.
Вот ещё пример:
Переведем число 2.285 в двоичную систему:
2 это 10(bin)
0.285*2 = 0.570 ---10.0...
0.570*2 = 1.140 ---10.01...
0.14*2 = 0.28 ---10.010...
0.28*2 = 0.56 ---10.0100...
0.56*2 = 1.12 ---10.01001...
0.12*2 = 0.24 ---10.010010...
0.24*2 = 0.48 ---10.0100100...
0.48*2 = 0.96 ---10.01001000...
0.96*2 = 1.92 ---10.010010001...
Теперь сложим наши два числа в десятичной:
2.285 + 0.1 = 2.385.
Переведем его в двоичную:
2.385 = ? (bin)
0.385*2 = 0.770 ---10.0...
0.77*2 = 1.54 ---10.01...
0.54*2 = 1.08 ---10.011...
0.08*2 = 0.16 ---10.0110...
0.16*2 = 0.32 ---10.01100...
0.32*2 = 0.64 ---10.011000...
0.64*2 = 1.28 ---10.0110001...
0.28*2 = 0.56 ---10.01100010...
0.56*2 = 1.12 ---10.011000101...
А теперь сложим предыдущие два числа в их двоичном представлении и сравним с полученным прямым переводом числом:
0.000110011
+
10.010010001
=
10.011000100 (это при сложении двух чисел, полученных при их отдельном переводе в двоичную)
10.011000101 (это вначале десятичное сложение 2.285 и 0.1, а потом перевод их результата в двоичную) .
Как видим, результаты отличаются всего на 0.000000001, что обусловлено потерями в точности при переводе чисел.
Насчет умножения - точно так же - умножение между обычными бинарными числами. А про отрицательные точно не скажу - там какой-то разряд за знак отвечает, наверное, самый правый из значимых. Тут не в курсе.
0.1 не круглое число и поэтому Вам самим надо ограничивать число разрядов или рассчитывать на тип
Легко
Похожие вопросы
- Помогите с переводом в двоичную систему исчисления
- Перевод из десятичной в двоичную систему счисления.
- Как двоичная система отличает, что данное число преобразуется в букву
- Число 10 (в десятичной системе счисления) в двоичной системе счисления имеет вид???
- Переведите число 111 из десятичной системы счисления в двоичную систему счисления.
- аааа сессия горит!!! помогите написать на си(не с++): перевод числа в двоичную систему
- На свете существует 10 типов людей: те кто понимают двоичную систему счисления...
- Двоичная система счисления
- Как перевести какое либо слово в кодировке Windows - 1251 в двоичной системе счисление?)
- Двоичная система счисления