Pull to refresh
0
0
Спиридонов Юрий Маркович @Innotor

Изобретатель

Send message
И такое представление имеет место быть (См. здесь)
Десятичная плавучка в том виде, что вы предлагаете, это зверь тупо бессмысленный.

А чем вид моей плавучки вас не устраивает? И чем результаты вычислений у меня отличаются от BCD-арифметики?
Надо просто привыкнуть:(.
А где я утверждал обратное? У меня СДДФ.
Давайте разделим точность представления и точность вычисления. В формате сингл можно представить числа с точностью до 7 верных знаков, в дабл — с точностью 15,16 верных знаков. Но когда вы будете производить арифметические вычисления, количество верных знаков в ответе могут катастрофически быстро сокращаться (См. мой предыдущий топик) И виной тому именно те хвосты, которые мы не видим.
Что касается точности. Какая абсолютная и относительная погрешность у точного числа или у точных вычислений? Вычисления на калькуляторе, которые реализованы в BCD, какую имеют точность? И какой двоичный операционный регистр нужно иметь, чтобы обеспечить точность вычислений до, скажем 7 значащих цифр. Причем так, чтобы на очередной итерации хвосты не оказали на результат разрушающего действия?
Она определена в двух последних топиках.
Нет, я имею ввиду принципиальную невозможность представить это число в двоичном виде.
первый на двоичной мантиссе, второй на двоично-десятичной в кодировке Chen-Ho

Первый от второго отличается кодировкой ВСD-числа в формате обмена. При этом, результатом извлечения из этого формата является все тот же формат BCD. И вся десятичная арифметика строится на этом формате. Число F=М*10^e в первом случае кодируется как М и 10^e — двоичные целые числа. Во втором варианте, числа кодируются как плотно упакованные BCD. В СДДФ в формат обмена записывается двоичный эквивалент экспоненты и мантиссы.
Я не буду говорить о затратах на реализацию этого алгоритма. Сложите два числа 0.1+0.1, каждое из которых представлено 4 двоичными разрядами. 0.1= 0.0010. 0.0010+0.0010=0.0100=0.25 Вас такой ответ устроит?
В СДДФ, с 4 разрядами под мантиссу и 2 разрядами под экспоненту это будет:
0.1=10*10^-2= 1010*10^-2. 1010*10^-2+1010*10^-2=(1010+1010)*10^-2=10100*10^-2 Пронормируем: 10100/10=10100/1010=10*10^-1=2*10^-1=20*10^-2
Дело в цене вопроса. В формате сингл, при вычислениях за верные цифры ответа принимаются только 3..5 десятичных разрядов, при том, что при конвертации в двоичный код мы получаем 7 верных цифр. В дабле, вместо 15 верных цифр ограничиваются 7..8 десяиичными цифрами. Причем округление, производится в компиляторе. В СДДФ мы получаем при всех операциях ответ с точностью до 7 значащих цифр. Без хвостов.
Правильно. Но представте это число в формате двоичного числа с плавающей точкой и получите бесконечное двоичное число.
Если не ограничивать разрядность машинного слова ( в пределах разумного), то любое двоичное вещественное число можно однозначно представить в десятичном виде. Наоборот это не работает. Только представимые десятичные числа можно представить в двоичном виде и в шестьнадцатиричном тоже. Мы привыкли оперировать десятичными числами. Даже стандарт IEEE754 для двоичных чисел с плавающей точкой все основные характеристики чисел приводит в десятичном виде. Практически все тестовые программы, в конечном счете, сравнивают результаты работы с десятичными числами. Поэтому логично оперировать с десятичными числами и получать результат такой же точности, как при вычислениях вручную. Понимая это, многие производители реализуют аппаратную поддержку десятичной арифметики на аппаратном уровне, используя BCD. Правда, ценой значительных затарат.
В СДДФ все тоже представляется в двоичном коде. Десятка выплывает только при выравнивании порядков и округлении при арифметических операциях, но и здесь число 10^n представляется в двоичном коде. Необходимость деления на 10^n или умножение на 10^-n можно отнести к накладным расходам. Это плата за точность вычислений.
увеличивается диапазон представимых чисел вместе с фактическим увеличением точности (мантисса длиннее)!

Точность двоичная и точность десятичная — разные вещи. Попробуйте представить десятичное число 0.1в двоичном виде с точностью до одной значащей десятичной цифры. Сколько бы двоичных разрядов вы не брали для представления числа 0.1, вы не сможете его точно представить в этом коде. Как впрочем и в 16-ричном коде. Это связано с тем, что системы счисления с базой b=2^q, где q=1,2,3… — степень двойки, не соизмеримы с системами счисления c базой b=10^n (n=1,2..). В 16-разрядном же СДДФ число 0.1= 1100100*10^-3=100*10^-3. Т.е. число представлено точно.
Поэтому никто в здравом уме в BCD мантиссы и не хранит.

В IEEE754-2008 мантисса может храниться в двух видах. Как целое двоичное число и как упакованное BCD число.
Конечно, я имел ввиду FPU, в котором поддерживается аппаратное умножение/деление.
Нет, мантисса выражена, как целое двоичное число. Арифметическая операция выполняется над целыми двоичными числами- целочисленная мантисса и двоичный эквивалент характеристики (10^e).
Десятичная арифметика в настоящее время реализована двоично-десятичным форматом (BCD).

Здесь речь идет о том, как это реализовано в компьютере сегодня.
Извините, не сразу врубился. Конечно, должно быть так:
1.234567*10^3=1234567*10^-3
7.654321*10^-1=7654321*10^-7
1234567*10^-3+7654321*10^-7=(1234567+7654321*10^-4)*10^-3=
(1234567+765,4321)*10^-3=1235332,4321*10^-3≈1235332*10^-3
Если в первом слагаемом вместо 10^3 взять 10^-3, то получится 7666667*10^-1.

Information

Rating
Does not participate
Location
Минск, Минская обл., Беларусь
Registered
Activity